Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnConfigFrame.h
- Committer:
- uci1
- Date:
- 2012-07-31
- Revision:
- 3:24c5f0f50bf1
- Parent:
- 1:e392595b4b76
- Child:
- 4:a91682e19d6b
File content as of revision 3:24c5f0f50bf1:
#ifndef SN_SnConfigFrame #define SN_SnConfigFrame #include <stdint.h> #include "SnConstants.h" #include "SnBitUtils.h" class SnConfigFrame { public: static const uint32_t kMinCommWinPrdLowPwr; // exclusive min low power comm win period (s) static const uint32_t kMaxCommWinPrdLowPwr; // exclusive max low power comm win period (s) static const uint32_t kMinCommWinDurLowPwr; // exclusive min low power comm win duration (s) static const uint32_t kMaxCommWinDurLowPwr; // exclusive max low power comm win duration (s) static const uint8_t kConfLblLen=64; // length of configuration label char array (63+'\0') static const char* const kDefConfFile; // default configuration file static const uint32_t kMaxSizeOf = + (10u*sizeof(uint32_t)) + (6u*sizeof(uint16_t)) + (11u*sizeof(uint8_t)) + (3u*kNplas*sizeof(uint16_t)) + (kTotDacs*sizeof(uint16_t)) + (kConfLblLen*sizeof(uint8_t)); enum EDatPackBit { kSDcard = BIT(0), kIrid = BIT(1), kAfar = BIT(2), kUSB = BIT(3) }; enum ESendDataBit { // can't use BIT(0)! (-0 = 0 => send nothing) kAllFiles = BIT(1), // if bit=0 => send most recent file kTimeout = BIT(2), // if bit=0 => ignore timeout kDelete = BIT(3), // if bit=0 => do not delete sent files kUseBits = -BIT(10) // useful to initialize fCommSendData as a bit word }; enum ERunMode { kInfSeqs = 0, kSingleSeq = 1 }; // i/o version static const uint8_t kIOVers; // MUST BE INCREASED if any member var changes (==> also if kNchans, etc. change!) private: // !! // !! If any member variables change, update: SizeOf function and kIOVers value! (also if kNchans, etc. change!) // !! // mbed mac address static uint64_t fgMacAdr; // mbed mac address // conf header char fLabel[kConfLblLen]; // configuration label uint32_t fConfTime; // cpu config time uint32_t fRun; // run number uint32_t fFirstEvt; // starting event number uint32_t fEvtsPerSeq; // number of events per file uint8_t fRunMode; // mode of running (see ERunMode) uint8_t fStreamHiLoPlas; // (1byte bool) if true, add the separated hi/lo thresh PLA patterns to the i/o // data packing uint8_t fWvLoseLSB; // number of least significant bits to lose when packing waveform data uint8_t fWvLoseMSB; // number of most significant bits to lose when packing waveform data uint16_t fWvBaseline; // global baseline to use when packing data (useful to reduce clipping on the high end) uint8_t fDatPackType; // type of data packing. OR'd bitword: if bit 1, will pack for writing. see EDatPackBit. default: always pack (all 1's) // trigger setup uint16_t fDAC[kNchans][kNfpgaDacs]; //[card id][dac id] values should be 0-4095 here (not checked tho) uint8_t fNumPlas; // number of patterns to use. must be <= kNplas. uint16_t fPLA[kNplas]; //[pattern id] (same for each card) uint8_t fNumCardsMajLog; // number of cards participating in the MajLogic trigger (1 to 4) uint8_t fEnableThermTrig; // (1byte bool) whether or not to allow thermal triggers uint16_t fForceTrigPeriod; // number of seconds between force triggers (0=none) uint16_t fHeartBeatPeriod; // number of seconds between heartbeats (0=none) uint8_t fAmpsOn; // which amps are on (bit word. uint8_t => 8 amps max) uint16_t fEvtThrtlPeriodMs; // throttle period to write events (ms) // power uint8_t fPowerMode; // power mode bit word int16_t fBatVoltLowPwr; // battery level at which to switch to low power (not used?) // communication uint32_t fCommWinPeriod; // seconds between communication window startup (0=always on) uint32_t fCommWinDuration; // seconds that communication window stays open (0=always open) int16_t fCommSendData; // data to send during comm win (=0: none, >0=send up to x events from last file until comm win closes, <0=see ESendDataBit) uint32_t fCommWinPrdLowPwr; // low power communication window period (seconds) (range enforced) uint32_t fCommWinDurLowPwr; // low power communication window duration (seconds) (range enforced) // watchdog uint32_t fWatchDogPeriod; // number of seconds of inactivity for watchdog to issue a reset void SetHardDefaults(); static uint32_t SizeOf(const bool streamHiLoPlas, const uint8_t nplas, const uint8_t lblLen) { // private because it cannot be used to read from a buffer // (the label length and fStreamHiLoPlas are not known a priori) // returns the num of bytes needed to stream this object // = size of member vars + 1 for i/o version + extra PLA strings (maybe) uint32_t sz = kMaxSizeOf - kConfLblLen + lblLen; static const uint32_t mhlp = 2u*kNplas*sizeof(uint16_t); const int32_t dp = (nplas-kNplas)*sizeof(uint16_t); const uint8_t fac = (streamHiLoPlas) ? 3u : 1u; sz += (fac*dp); if (streamHiLoPlas==false) { sz -= mhlp; } return sz; } public: SnConfigFrame() { Reset(); } virtual ~SnConfigFrame() {} const char* GetLabel() const { return fLabel; } uint32_t GetLabelStrLen() const { return strlen(fLabel); } uint32_t GetRun() const { return fRun; } uint32_t GetFirstEvt() const { return fFirstEvt; } uint32_t GetEvtsPerFile() const { return fEvtsPerSeq; } bool IsSingleSeqRunMode() const { return fRunMode==kSingleSeq; } uint16_t GetEvtThrtlPeriodMs() const { return fEvtThrtlPeriodMs; } uint16_t GetForceTrigPeriod() const { return fForceTrigPeriod; } uint16_t GetHeartbeatPeriod() const { return fHeartBeatPeriod; } uint32_t GetWatchdogPeriod() const { return fWatchDogPeriod; } uint16_t GetDac(const uint8_t ch, const uint8_t dn) const { return fDAC[ch][dn]; } uint8_t GetNumPlas() const { return fNumPlas; } uint16_t GetPla(const uint8_t pn) const { return fPLA[pn]; } uint8_t GetNumCardsMajLog() const { return fNumCardsMajLog; } bool IsThermTrigEnabled() const { return fEnableThermTrig!=0; } bool IsEachAmpOn() const { bool allon=true; for (uint8_t i=0; (i<kNchans) && allon; i++) { allon = (fAmpsOn & BIT(i))!=0; } return allon; } // TODO: allow check for individual amps, when they can be turned on individually uint32_t GetCommWinPeriod() const { return fCommWinPeriod; } uint32_t GetCommWinDuration() const { return fCommWinDuration; } int16_t GetCommSendData() const { return fCommSendData; } bool IsSendingAllFiles() const { return (fCommSendData<0) && ((fCommSendData & kAllFiles)!=0); } bool IsObeyingTimeout() const { return (fCommSendData<0) && ((fCommSendData & kTimeout)!=0); } bool IsDeletingFiles() const { return (fCommSendData<0) && ((fCommSendData & kDelete)!=0); } const char* GetOutFileName(const char* dir) const; // waveform packing info uint16_t GetWvBaseline() const { return fWvBaseline; } uint8_t GetWvLoseLSB() const { return fWvLoseLSB; } uint8_t GetWvLoseMSB() const { return fWvLoseMSB; } bool IsDatPackedFor(const EDatPackBit d) const { return (fDatPackType & d)!=0; } void GetPackParsFor(const EDatPackBit d, uint8_t& loseLSB, uint8_t& loseMSB, uint16_t& wvBase) const; // i/o template<class T> void ReadFrom(T& b) { // no check on the length of buf is done here // that should be been done already // // must match WriteTo uint8_t Rv=0; b = SnBitUtils::ReadFrom(b, Rv); // i/o version printf("Rv=%hhu\r\n",Rv); if (Rv>0) { uint32_t llen=kConfLblLen; b = SnBitUtils::ReadFrom(b, llen); printf("llen=%u\r\n",llen); b = SnBitUtils::ReadFrom(b, fLabel, llen); printf("lbl=%s\r\n",fLabel); b = SnBitUtils::ReadFrom(b, fConfTime); printf("ct=%u\r\n",fConfTime); b = SnBitUtils::ReadFrom(b, fRun); printf("run=%u\r\n",fRun); b = SnBitUtils::ReadFrom(b, fFirstEvt); printf("fe=%u\r\n",fFirstEvt); if (Rv>1) { b = SnBitUtils::ReadFrom(b, fEvtsPerSeq); printf("eps=%u\r\n",fEvtsPerSeq); b = SnBitUtils::ReadFrom(b, fRunMode); printf("rm=%hhu\r\n",fRunMode); } b = SnBitUtils::ReadFrom(b, fStreamHiLoPlas); printf("shilo=%d\r\n",(int)fStreamHiLoPlas); b = SnBitUtils::ReadFrom(b, fWvLoseLSB); printf("lsb=%hhu\r\n",fWvLoseLSB); b = SnBitUtils::ReadFrom(b, fWvLoseMSB); printf("msb=%hhu\r\n",fWvLoseMSB); b = SnBitUtils::ReadFrom(b, fWvBaseline); printf("bl=%hu\r\n",fWvBaseline); b = SnBitUtils::ReadFrom(b, fDatPackType); printf("dp=%hhu\r\n",fDatPackType); uint16_t* dc = &(fDAC[0][0]); for (uint16_t i=0; i<kTotDacs; i++, dc++) { b = SnBitUtils::ReadFrom(b, *dc); printf("dac[%hu]=%hu\r\n",i,*dc); } b = SnBitUtils::ReadFrom(b, fNumPlas); printf("npla=%hhu\r\n",fNumPlas); uint16_t* pl = &(fPLA[0]); for (uint8_t j=0; j<fNumPlas; j++, pl++) { b = SnBitUtils::ReadFrom(b, *pl); printf("pla[%hhu]=%hu\r\n",j,*pl); } b = SnBitUtils::ReadFrom(b, fNumCardsMajLog); printf("mj=%hhu\r\n",fNumCardsMajLog); b = SnBitUtils::ReadFrom(b, fEnableThermTrig); printf("thm=%d\r\n",(int)fEnableThermTrig); b = SnBitUtils::ReadFrom(b, fForceTrigPeriod); printf("force=%hu\r\n",fForceTrigPeriod); b = SnBitUtils::ReadFrom(b, fHeartBeatPeriod); printf("heart=%hu\r\n",fHeartBeatPeriod); b = SnBitUtils::ReadFrom(b, fAmpsOn); printf("amps=%hhu\r\n",fAmpsOn); b = SnBitUtils::ReadFrom(b, fEvtThrtlPeriodMs); printf("throt=%hu\r\n",fEvtThrtlPeriodMs); b = SnBitUtils::ReadFrom(b, fPowerMode); printf("pow=%hhu\r\n",fPowerMode); b = SnBitUtils::ReadFrom(b, fBatVoltLowPwr); printf("batlow=%d\r\n",fBatVoltLowPwr); b = SnBitUtils::ReadFrom(b, fCommWinPeriod); printf("cmper=%u\r\n",fCommWinPeriod); b = SnBitUtils::ReadFrom(b, fCommWinDuration); printf("cmdur=%u\r\n",fCommWinDuration); b = SnBitUtils::ReadFrom(b, fCommSendData); printf("send=%d\r\n",fCommSendData); b = SnBitUtils::ReadFrom(b, fCommWinPrdLowPwr); printf("cmperlp=%u\r\n",fCommWinPrdLowPwr); b = SnBitUtils::ReadFrom(b, fCommWinDurLowPwr); printf("cmdurlp=%u\r\n",fCommWinDurLowPwr); b = SnBitUtils::ReadFrom(b, fWatchDogPeriod); printf("watch=%u\r\n",fWatchDogPeriod); if (fStreamHiLoPlas!=0) { uint16_t hi, lo; for (uint8_t j=0; j<fNumPlas; j++) { b = SnBitUtils::ReadFrom(b, hi); printf("hi=%hu\r\n",hi); b = SnBitUtils::ReadFrom(b, lo); printf("lo=%hu\r\n",lo); // don't save these } } } printf("read from done\r\n"); } template <class T> void WriteTo(T& b) const { // no check on the length of the buf is done here // that should be done already // // must match ReadFromBuf // // intentionally not writing mac address here, so we don't have to read it in const uint32_t llen = strlen(fLabel); b = SnBitUtils::WriteTo(b, kIOVers); // i/o version b = SnBitUtils::WriteTo(b, llen); b = SnBitUtils::WriteTo(b, fLabel, llen); b = SnBitUtils::WriteTo(b, fConfTime); b = SnBitUtils::WriteTo(b, fRun); b = SnBitUtils::WriteTo(b, fFirstEvt); b = SnBitUtils::WriteTo(b, fEvtsPerSeq); b = SnBitUtils::WriteTo(b, fRunMode); b = SnBitUtils::WriteTo(b, fStreamHiLoPlas); b = SnBitUtils::WriteTo(b, fWvLoseLSB); b = SnBitUtils::WriteTo(b, fWvLoseMSB); b = SnBitUtils::WriteTo(b, fWvBaseline); b = SnBitUtils::WriteTo(b, fDatPackType); const uint16_t* dc = &(fDAC[0][0]); for (uint16_t i=0; i<kTotDacs; i++, dc++) { b = SnBitUtils::WriteTo(b, *dc); } b = SnBitUtils::WriteTo(b, fNumPlas); const uint16_t* pl = &(fPLA[0]); for (uint8_t j=0; j<fNumPlas; j++, pl++) { b = SnBitUtils::WriteTo(b, *pl); } b = SnBitUtils::WriteTo(b, fNumCardsMajLog); b = SnBitUtils::WriteTo(b, fEnableThermTrig); b = SnBitUtils::WriteTo(b, fForceTrigPeriod); b = SnBitUtils::WriteTo(b, fHeartBeatPeriod); b = SnBitUtils::WriteTo(b, fAmpsOn); b = SnBitUtils::WriteTo(b, fEvtThrtlPeriodMs); b = SnBitUtils::WriteTo(b, fPowerMode); b = SnBitUtils::WriteTo(b, fBatVoltLowPwr); b = SnBitUtils::WriteTo(b, fCommWinPeriod); b = SnBitUtils::WriteTo(b, fCommWinDuration); b = SnBitUtils::WriteTo(b, fCommSendData); b = SnBitUtils::WriteTo(b, fCommWinPrdLowPwr); b = SnBitUtils::WriteTo(b, fCommWinDurLowPwr); b = SnBitUtils::WriteTo(b, fWatchDogPeriod); if (fStreamHiLoPlas!=0) { pl = fPLA; uint16_t hi, lo; for (uint8_t j=0; j<fNumPlas; j++, pl++) { GetHiLoPlas(*pl, hi, lo); b = SnBitUtils::WriteTo(b, hi); b = SnBitUtils::WriteTo(b, lo); } } } bool ReadFromFile(const char* cfile); bool WriteToFile(const char* cfile) const; void Reset() { memset(fLabel, 0, sizeof(char)*kConfLblLen); if (ReadFromFile(kDefConfFile)==false) { // couldn't get default. use hardcoded version. SetHardDefaults(); } } uint32_t SizeOf() const { // returns the num of bytes needed to stream this object // = size of member vars + 1 for i/o version + extra PLA strings (maybe) // + length of label string return SizeOf(fStreamHiLoPlas!=0, fNumPlas, strlen(fLabel)); } static void SetMacAddress(); static uint64_t GetMacAddress() { if (fgMacAdr==0) { SetMacAddress(); } return fgMacAdr; } static uint32_t GetLabelMaxLen() { return kConfLblLen; } static void GetHiLoPlas(const uint16_t pla, uint16_t& hiPla, uint16_t& loPla, const bool r2l=false); }; #endif // SN_SnConfigFrame