Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Tue Jul 31 04:59:16 2012 +0000
Revision:
3:24c5f0f50bf1
Parent:
1:e392595b4b76
Child:
4:a91682e19d6b
Test bench version. Communications not completed. Debugging output present. But will read the local config file and save events that can be used for testing.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 3:24c5f0f50bf1 1 #ifndef SN_SnConfigFrame
uci1 3:24c5f0f50bf1 2 #define SN_SnConfigFrame
uci1 3:24c5f0f50bf1 3
uci1 3:24c5f0f50bf1 4 #include <stdint.h>
uci1 3:24c5f0f50bf1 5 #include "SnConstants.h"
uci1 3:24c5f0f50bf1 6 #include "SnBitUtils.h"
uci1 3:24c5f0f50bf1 7
uci1 3:24c5f0f50bf1 8 class SnConfigFrame {
uci1 3:24c5f0f50bf1 9 public:
uci1 3:24c5f0f50bf1 10 static const uint32_t kMinCommWinPrdLowPwr; // exclusive min low power comm win period (s)
uci1 3:24c5f0f50bf1 11 static const uint32_t kMaxCommWinPrdLowPwr; // exclusive max low power comm win period (s)
uci1 3:24c5f0f50bf1 12 static const uint32_t kMinCommWinDurLowPwr; // exclusive min low power comm win duration (s)
uci1 3:24c5f0f50bf1 13 static const uint32_t kMaxCommWinDurLowPwr; // exclusive max low power comm win duration (s)
uci1 3:24c5f0f50bf1 14 static const uint8_t kConfLblLen=64; // length of configuration label char array (63+'\0')
uci1 3:24c5f0f50bf1 15
uci1 3:24c5f0f50bf1 16 static const char* const kDefConfFile; // default configuration file
uci1 3:24c5f0f50bf1 17
uci1 3:24c5f0f50bf1 18 static const uint32_t kMaxSizeOf =
uci1 3:24c5f0f50bf1 19 + (10u*sizeof(uint32_t)) + (6u*sizeof(uint16_t))
uci1 3:24c5f0f50bf1 20 + (11u*sizeof(uint8_t)) + (3u*kNplas*sizeof(uint16_t))
uci1 3:24c5f0f50bf1 21 + (kTotDacs*sizeof(uint16_t))
uci1 3:24c5f0f50bf1 22 + (kConfLblLen*sizeof(uint8_t));
uci1 3:24c5f0f50bf1 23
uci1 3:24c5f0f50bf1 24
uci1 3:24c5f0f50bf1 25 enum EDatPackBit {
uci1 3:24c5f0f50bf1 26 kSDcard = BIT(0),
uci1 3:24c5f0f50bf1 27 kIrid = BIT(1),
uci1 3:24c5f0f50bf1 28 kAfar = BIT(2),
uci1 3:24c5f0f50bf1 29 kUSB = BIT(3)
uci1 3:24c5f0f50bf1 30 };
uci1 3:24c5f0f50bf1 31
uci1 3:24c5f0f50bf1 32 enum ESendDataBit {
uci1 3:24c5f0f50bf1 33 // can't use BIT(0)! (-0 = 0 => send nothing)
uci1 3:24c5f0f50bf1 34 kAllFiles = BIT(1), // if bit=0 => send most recent file
uci1 3:24c5f0f50bf1 35 kTimeout = BIT(2), // if bit=0 => ignore timeout
uci1 3:24c5f0f50bf1 36 kDelete = BIT(3), // if bit=0 => do not delete sent files
uci1 3:24c5f0f50bf1 37 kUseBits = -BIT(10) // useful to initialize fCommSendData as a bit word
uci1 3:24c5f0f50bf1 38 };
uci1 3:24c5f0f50bf1 39
uci1 3:24c5f0f50bf1 40 enum ERunMode {
uci1 3:24c5f0f50bf1 41 kInfSeqs = 0,
uci1 3:24c5f0f50bf1 42 kSingleSeq = 1
uci1 3:24c5f0f50bf1 43 };
uci1 3:24c5f0f50bf1 44
uci1 3:24c5f0f50bf1 45 // i/o version
uci1 3:24c5f0f50bf1 46 static const uint8_t kIOVers; // MUST BE INCREASED if any member var changes (==> also if kNchans, etc. change!)
uci1 3:24c5f0f50bf1 47
uci1 3:24c5f0f50bf1 48 private:
uci1 3:24c5f0f50bf1 49 // !!
uci1 3:24c5f0f50bf1 50 // !! If any member variables change, update: SizeOf function and kIOVers value! (also if kNchans, etc. change!)
uci1 3:24c5f0f50bf1 51 // !!
uci1 3:24c5f0f50bf1 52
uci1 3:24c5f0f50bf1 53 // mbed mac address
uci1 3:24c5f0f50bf1 54 static uint64_t fgMacAdr; // mbed mac address
uci1 3:24c5f0f50bf1 55 // conf header
uci1 3:24c5f0f50bf1 56 char fLabel[kConfLblLen]; // configuration label
uci1 3:24c5f0f50bf1 57 uint32_t fConfTime; // cpu config time
uci1 3:24c5f0f50bf1 58 uint32_t fRun; // run number
uci1 3:24c5f0f50bf1 59 uint32_t fFirstEvt; // starting event number
uci1 3:24c5f0f50bf1 60 uint32_t fEvtsPerSeq; // number of events per file
uci1 3:24c5f0f50bf1 61 uint8_t fRunMode; // mode of running (see ERunMode)
uci1 3:24c5f0f50bf1 62 uint8_t fStreamHiLoPlas; // (1byte bool) if true, add the separated hi/lo thresh PLA patterns to the i/o
uci1 3:24c5f0f50bf1 63 // data packing
uci1 3:24c5f0f50bf1 64 uint8_t fWvLoseLSB; // number of least significant bits to lose when packing waveform data
uci1 3:24c5f0f50bf1 65 uint8_t fWvLoseMSB; // number of most significant bits to lose when packing waveform data
uci1 3:24c5f0f50bf1 66 uint16_t fWvBaseline; // global baseline to use when packing data (useful to reduce clipping on the high end)
uci1 3:24c5f0f50bf1 67 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)
uci1 3:24c5f0f50bf1 68 // trigger setup
uci1 3:24c5f0f50bf1 69 uint16_t fDAC[kNchans][kNfpgaDacs]; //[card id][dac id] values should be 0-4095 here (not checked tho)
uci1 3:24c5f0f50bf1 70 uint8_t fNumPlas; // number of patterns to use. must be <= kNplas.
uci1 3:24c5f0f50bf1 71 uint16_t fPLA[kNplas]; //[pattern id] (same for each card)
uci1 3:24c5f0f50bf1 72 uint8_t fNumCardsMajLog; // number of cards participating in the MajLogic trigger (1 to 4)
uci1 3:24c5f0f50bf1 73 uint8_t fEnableThermTrig; // (1byte bool) whether or not to allow thermal triggers
uci1 3:24c5f0f50bf1 74 uint16_t fForceTrigPeriod; // number of seconds between force triggers (0=none)
uci1 3:24c5f0f50bf1 75 uint16_t fHeartBeatPeriod; // number of seconds between heartbeats (0=none)
uci1 3:24c5f0f50bf1 76 uint8_t fAmpsOn; // which amps are on (bit word. uint8_t => 8 amps max)
uci1 3:24c5f0f50bf1 77 uint16_t fEvtThrtlPeriodMs; // throttle period to write events (ms)
uci1 3:24c5f0f50bf1 78 // power
uci1 3:24c5f0f50bf1 79 uint8_t fPowerMode; // power mode bit word
uci1 3:24c5f0f50bf1 80 int16_t fBatVoltLowPwr; // battery level at which to switch to low power (not used?)
uci1 3:24c5f0f50bf1 81 // communication
uci1 3:24c5f0f50bf1 82 uint32_t fCommWinPeriod; // seconds between communication window startup (0=always on)
uci1 3:24c5f0f50bf1 83 uint32_t fCommWinDuration; // seconds that communication window stays open (0=always open)
uci1 3:24c5f0f50bf1 84 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)
uci1 3:24c5f0f50bf1 85 uint32_t fCommWinPrdLowPwr; // low power communication window period (seconds) (range enforced)
uci1 3:24c5f0f50bf1 86 uint32_t fCommWinDurLowPwr; // low power communication window duration (seconds) (range enforced)
uci1 3:24c5f0f50bf1 87 // watchdog
uci1 3:24c5f0f50bf1 88 uint32_t fWatchDogPeriod; // number of seconds of inactivity for watchdog to issue a reset
uci1 3:24c5f0f50bf1 89
uci1 3:24c5f0f50bf1 90 void SetHardDefaults();
uci1 3:24c5f0f50bf1 91
uci1 3:24c5f0f50bf1 92 static
uci1 3:24c5f0f50bf1 93 uint32_t SizeOf(const bool streamHiLoPlas,
uci1 3:24c5f0f50bf1 94 const uint8_t nplas,
uci1 3:24c5f0f50bf1 95 const uint8_t lblLen) {
uci1 3:24c5f0f50bf1 96 // private because it cannot be used to read from a buffer
uci1 3:24c5f0f50bf1 97 // (the label length and fStreamHiLoPlas are not known a priori)
uci1 3:24c5f0f50bf1 98 // returns the num of bytes needed to stream this object
uci1 3:24c5f0f50bf1 99 // = size of member vars + 1 for i/o version + extra PLA strings (maybe)
uci1 3:24c5f0f50bf1 100 uint32_t sz = kMaxSizeOf - kConfLblLen + lblLen;
uci1 3:24c5f0f50bf1 101 static const uint32_t mhlp = 2u*kNplas*sizeof(uint16_t);
uci1 3:24c5f0f50bf1 102 const int32_t dp = (nplas-kNplas)*sizeof(uint16_t);
uci1 3:24c5f0f50bf1 103 const uint8_t fac = (streamHiLoPlas) ? 3u : 1u;
uci1 3:24c5f0f50bf1 104 sz += (fac*dp);
uci1 3:24c5f0f50bf1 105 if (streamHiLoPlas==false) {
uci1 3:24c5f0f50bf1 106 sz -= mhlp;
uci1 3:24c5f0f50bf1 107 }
uci1 3:24c5f0f50bf1 108 return sz;
uci1 3:24c5f0f50bf1 109 }
uci1 3:24c5f0f50bf1 110
uci1 3:24c5f0f50bf1 111 public:
uci1 3:24c5f0f50bf1 112 SnConfigFrame() { Reset(); }
uci1 3:24c5f0f50bf1 113 virtual ~SnConfigFrame() {}
uci1 3:24c5f0f50bf1 114
uci1 3:24c5f0f50bf1 115 const char* GetLabel() const { return fLabel; }
uci1 3:24c5f0f50bf1 116 uint32_t GetLabelStrLen() const { return strlen(fLabel); }
uci1 3:24c5f0f50bf1 117 uint32_t GetRun() const { return fRun; }
uci1 3:24c5f0f50bf1 118 uint32_t GetFirstEvt() const { return fFirstEvt; }
uci1 3:24c5f0f50bf1 119 uint32_t GetEvtsPerFile() const { return fEvtsPerSeq; }
uci1 3:24c5f0f50bf1 120 bool IsSingleSeqRunMode() const { return fRunMode==kSingleSeq; }
uci1 3:24c5f0f50bf1 121 uint16_t GetEvtThrtlPeriodMs() const { return fEvtThrtlPeriodMs; }
uci1 3:24c5f0f50bf1 122 uint16_t GetForceTrigPeriod() const { return fForceTrigPeriod; }
uci1 3:24c5f0f50bf1 123 uint16_t GetHeartbeatPeriod() const { return fHeartBeatPeriod; }
uci1 3:24c5f0f50bf1 124 uint32_t GetWatchdogPeriod() const { return fWatchDogPeriod; }
uci1 3:24c5f0f50bf1 125 uint16_t GetDac(const uint8_t ch, const uint8_t dn) const { return fDAC[ch][dn]; }
uci1 3:24c5f0f50bf1 126 uint8_t GetNumPlas() const { return fNumPlas; }
uci1 3:24c5f0f50bf1 127 uint16_t GetPla(const uint8_t pn) const { return fPLA[pn]; }
uci1 3:24c5f0f50bf1 128 uint8_t GetNumCardsMajLog() const { return fNumCardsMajLog; }
uci1 3:24c5f0f50bf1 129 bool IsThermTrigEnabled() const { return fEnableThermTrig!=0; }
uci1 3:24c5f0f50bf1 130 bool IsEachAmpOn() const {
uci1 3:24c5f0f50bf1 131 bool allon=true;
uci1 3:24c5f0f50bf1 132 for (uint8_t i=0; (i<kNchans) && allon; i++) {
uci1 3:24c5f0f50bf1 133 allon = (fAmpsOn & BIT(i))!=0;
uci1 3:24c5f0f50bf1 134 }
uci1 3:24c5f0f50bf1 135 return allon;
uci1 3:24c5f0f50bf1 136 }
uci1 3:24c5f0f50bf1 137 // TODO: allow check for individual amps, when they can be turned on individually
uci1 3:24c5f0f50bf1 138
uci1 3:24c5f0f50bf1 139 uint32_t GetCommWinPeriod() const { return fCommWinPeriod; }
uci1 3:24c5f0f50bf1 140 uint32_t GetCommWinDuration() const { return fCommWinDuration; }
uci1 3:24c5f0f50bf1 141 int16_t GetCommSendData() const { return fCommSendData; }
uci1 3:24c5f0f50bf1 142
uci1 3:24c5f0f50bf1 143 bool IsSendingAllFiles() const
uci1 3:24c5f0f50bf1 144 { return (fCommSendData<0) && ((fCommSendData & kAllFiles)!=0); }
uci1 3:24c5f0f50bf1 145 bool IsObeyingTimeout() const
uci1 3:24c5f0f50bf1 146 { return (fCommSendData<0) && ((fCommSendData & kTimeout)!=0); }
uci1 3:24c5f0f50bf1 147 bool IsDeletingFiles() const
uci1 3:24c5f0f50bf1 148 { return (fCommSendData<0) && ((fCommSendData & kDelete)!=0); }
uci1 3:24c5f0f50bf1 149
uci1 3:24c5f0f50bf1 150
uci1 3:24c5f0f50bf1 151 const char* GetOutFileName(const char* dir) const;
uci1 3:24c5f0f50bf1 152
uci1 3:24c5f0f50bf1 153 // waveform packing info
uci1 3:24c5f0f50bf1 154 uint16_t GetWvBaseline() const { return fWvBaseline; }
uci1 3:24c5f0f50bf1 155 uint8_t GetWvLoseLSB() const { return fWvLoseLSB; }
uci1 3:24c5f0f50bf1 156 uint8_t GetWvLoseMSB() const { return fWvLoseMSB; }
uci1 3:24c5f0f50bf1 157 bool IsDatPackedFor(const EDatPackBit d) const { return (fDatPackType & d)!=0; }
uci1 3:24c5f0f50bf1 158 void GetPackParsFor(const EDatPackBit d,
uci1 3:24c5f0f50bf1 159 uint8_t& loseLSB, uint8_t& loseMSB,
uci1 3:24c5f0f50bf1 160 uint16_t& wvBase) const;
uci1 3:24c5f0f50bf1 161
uci1 3:24c5f0f50bf1 162 // i/o
uci1 3:24c5f0f50bf1 163 template<class T>
uci1 3:24c5f0f50bf1 164 void ReadFrom(T& b) {
uci1 3:24c5f0f50bf1 165 // no check on the length of buf is done here
uci1 3:24c5f0f50bf1 166 // that should be been done already
uci1 3:24c5f0f50bf1 167 //
uci1 3:24c5f0f50bf1 168 // must match WriteTo
uci1 3:24c5f0f50bf1 169
uci1 3:24c5f0f50bf1 170 uint8_t Rv=0;
uci1 3:24c5f0f50bf1 171 b = SnBitUtils::ReadFrom(b, Rv); // i/o version
uci1 3:24c5f0f50bf1 172 printf("Rv=%hhu\r\n",Rv);
uci1 3:24c5f0f50bf1 173 if (Rv>0) {
uci1 3:24c5f0f50bf1 174 uint32_t llen=kConfLblLen;
uci1 3:24c5f0f50bf1 175 b = SnBitUtils::ReadFrom(b, llen);
uci1 3:24c5f0f50bf1 176 printf("llen=%u\r\n",llen);
uci1 3:24c5f0f50bf1 177 b = SnBitUtils::ReadFrom(b, fLabel, llen);
uci1 3:24c5f0f50bf1 178 printf("lbl=%s\r\n",fLabel);
uci1 3:24c5f0f50bf1 179 b = SnBitUtils::ReadFrom(b, fConfTime);
uci1 3:24c5f0f50bf1 180 printf("ct=%u\r\n",fConfTime);
uci1 3:24c5f0f50bf1 181 b = SnBitUtils::ReadFrom(b, fRun);
uci1 3:24c5f0f50bf1 182 printf("run=%u\r\n",fRun);
uci1 3:24c5f0f50bf1 183 b = SnBitUtils::ReadFrom(b, fFirstEvt);
uci1 3:24c5f0f50bf1 184 printf("fe=%u\r\n",fFirstEvt);
uci1 3:24c5f0f50bf1 185 if (Rv>1) {
uci1 3:24c5f0f50bf1 186 b = SnBitUtils::ReadFrom(b, fEvtsPerSeq);
uci1 3:24c5f0f50bf1 187 printf("eps=%u\r\n",fEvtsPerSeq);
uci1 3:24c5f0f50bf1 188 b = SnBitUtils::ReadFrom(b, fRunMode);
uci1 3:24c5f0f50bf1 189 printf("rm=%hhu\r\n",fRunMode);
uci1 3:24c5f0f50bf1 190 }
uci1 3:24c5f0f50bf1 191 b = SnBitUtils::ReadFrom(b, fStreamHiLoPlas);
uci1 3:24c5f0f50bf1 192 printf("shilo=%d\r\n",(int)fStreamHiLoPlas);
uci1 3:24c5f0f50bf1 193 b = SnBitUtils::ReadFrom(b, fWvLoseLSB);
uci1 3:24c5f0f50bf1 194 printf("lsb=%hhu\r\n",fWvLoseLSB);
uci1 3:24c5f0f50bf1 195 b = SnBitUtils::ReadFrom(b, fWvLoseMSB);
uci1 3:24c5f0f50bf1 196 printf("msb=%hhu\r\n",fWvLoseMSB);
uci1 3:24c5f0f50bf1 197 b = SnBitUtils::ReadFrom(b, fWvBaseline);
uci1 3:24c5f0f50bf1 198 printf("bl=%hu\r\n",fWvBaseline);
uci1 3:24c5f0f50bf1 199 b = SnBitUtils::ReadFrom(b, fDatPackType);
uci1 3:24c5f0f50bf1 200 printf("dp=%hhu\r\n",fDatPackType);
uci1 3:24c5f0f50bf1 201 uint16_t* dc = &(fDAC[0][0]);
uci1 3:24c5f0f50bf1 202 for (uint16_t i=0; i<kTotDacs; i++, dc++) {
uci1 3:24c5f0f50bf1 203 b = SnBitUtils::ReadFrom(b, *dc);
uci1 3:24c5f0f50bf1 204 printf("dac[%hu]=%hu\r\n",i,*dc);
uci1 3:24c5f0f50bf1 205 }
uci1 3:24c5f0f50bf1 206 b = SnBitUtils::ReadFrom(b, fNumPlas);
uci1 3:24c5f0f50bf1 207 printf("npla=%hhu\r\n",fNumPlas);
uci1 3:24c5f0f50bf1 208 uint16_t* pl = &(fPLA[0]);
uci1 3:24c5f0f50bf1 209 for (uint8_t j=0; j<fNumPlas; j++, pl++) {
uci1 3:24c5f0f50bf1 210 b = SnBitUtils::ReadFrom(b, *pl);
uci1 3:24c5f0f50bf1 211 printf("pla[%hhu]=%hu\r\n",j,*pl);
uci1 3:24c5f0f50bf1 212 }
uci1 3:24c5f0f50bf1 213 b = SnBitUtils::ReadFrom(b, fNumCardsMajLog);
uci1 3:24c5f0f50bf1 214 printf("mj=%hhu\r\n",fNumCardsMajLog);
uci1 3:24c5f0f50bf1 215 b = SnBitUtils::ReadFrom(b, fEnableThermTrig);
uci1 3:24c5f0f50bf1 216 printf("thm=%d\r\n",(int)fEnableThermTrig);
uci1 3:24c5f0f50bf1 217 b = SnBitUtils::ReadFrom(b, fForceTrigPeriod);
uci1 3:24c5f0f50bf1 218 printf("force=%hu\r\n",fForceTrigPeriod);
uci1 3:24c5f0f50bf1 219 b = SnBitUtils::ReadFrom(b, fHeartBeatPeriod);
uci1 3:24c5f0f50bf1 220 printf("heart=%hu\r\n",fHeartBeatPeriod);
uci1 3:24c5f0f50bf1 221 b = SnBitUtils::ReadFrom(b, fAmpsOn);
uci1 3:24c5f0f50bf1 222 printf("amps=%hhu\r\n",fAmpsOn);
uci1 3:24c5f0f50bf1 223 b = SnBitUtils::ReadFrom(b, fEvtThrtlPeriodMs);
uci1 3:24c5f0f50bf1 224 printf("throt=%hu\r\n",fEvtThrtlPeriodMs);
uci1 3:24c5f0f50bf1 225 b = SnBitUtils::ReadFrom(b, fPowerMode);
uci1 3:24c5f0f50bf1 226 printf("pow=%hhu\r\n",fPowerMode);
uci1 3:24c5f0f50bf1 227 b = SnBitUtils::ReadFrom(b, fBatVoltLowPwr);
uci1 3:24c5f0f50bf1 228 printf("batlow=%d\r\n",fBatVoltLowPwr);
uci1 3:24c5f0f50bf1 229 b = SnBitUtils::ReadFrom(b, fCommWinPeriod);
uci1 3:24c5f0f50bf1 230 printf("cmper=%u\r\n",fCommWinPeriod);
uci1 3:24c5f0f50bf1 231 b = SnBitUtils::ReadFrom(b, fCommWinDuration);
uci1 3:24c5f0f50bf1 232 printf("cmdur=%u\r\n",fCommWinDuration);
uci1 3:24c5f0f50bf1 233 b = SnBitUtils::ReadFrom(b, fCommSendData);
uci1 3:24c5f0f50bf1 234 printf("send=%d\r\n",fCommSendData);
uci1 3:24c5f0f50bf1 235 b = SnBitUtils::ReadFrom(b, fCommWinPrdLowPwr);
uci1 3:24c5f0f50bf1 236 printf("cmperlp=%u\r\n",fCommWinPrdLowPwr);
uci1 3:24c5f0f50bf1 237 b = SnBitUtils::ReadFrom(b, fCommWinDurLowPwr);
uci1 3:24c5f0f50bf1 238 printf("cmdurlp=%u\r\n",fCommWinDurLowPwr);
uci1 3:24c5f0f50bf1 239 b = SnBitUtils::ReadFrom(b, fWatchDogPeriod);
uci1 3:24c5f0f50bf1 240 printf("watch=%u\r\n",fWatchDogPeriod);
uci1 3:24c5f0f50bf1 241 if (fStreamHiLoPlas!=0) {
uci1 3:24c5f0f50bf1 242 uint16_t hi, lo;
uci1 3:24c5f0f50bf1 243 for (uint8_t j=0; j<fNumPlas; j++) {
uci1 3:24c5f0f50bf1 244 b = SnBitUtils::ReadFrom(b, hi);
uci1 3:24c5f0f50bf1 245 printf("hi=%hu\r\n",hi);
uci1 3:24c5f0f50bf1 246 b = SnBitUtils::ReadFrom(b, lo);
uci1 3:24c5f0f50bf1 247 printf("lo=%hu\r\n",lo);
uci1 3:24c5f0f50bf1 248 // don't save these
uci1 3:24c5f0f50bf1 249 }
uci1 3:24c5f0f50bf1 250 }
uci1 3:24c5f0f50bf1 251 }
uci1 3:24c5f0f50bf1 252 printf("read from done\r\n");
uci1 3:24c5f0f50bf1 253 }
uci1 3:24c5f0f50bf1 254
uci1 3:24c5f0f50bf1 255 template <class T>
uci1 3:24c5f0f50bf1 256 void WriteTo(T& b) const {
uci1 3:24c5f0f50bf1 257 // no check on the length of the buf is done here
uci1 3:24c5f0f50bf1 258 // that should be done already
uci1 3:24c5f0f50bf1 259 //
uci1 3:24c5f0f50bf1 260 // must match ReadFromBuf
uci1 3:24c5f0f50bf1 261 //
uci1 3:24c5f0f50bf1 262 // intentionally not writing mac address here, so we don't have to read it in
uci1 3:24c5f0f50bf1 263
uci1 3:24c5f0f50bf1 264 const uint32_t llen = strlen(fLabel);
uci1 3:24c5f0f50bf1 265
uci1 3:24c5f0f50bf1 266 b = SnBitUtils::WriteTo(b, kIOVers); // i/o version
uci1 3:24c5f0f50bf1 267 b = SnBitUtils::WriteTo(b, llen);
uci1 3:24c5f0f50bf1 268 b = SnBitUtils::WriteTo(b, fLabel, llen);
uci1 3:24c5f0f50bf1 269 b = SnBitUtils::WriteTo(b, fConfTime);
uci1 3:24c5f0f50bf1 270 b = SnBitUtils::WriteTo(b, fRun);
uci1 3:24c5f0f50bf1 271 b = SnBitUtils::WriteTo(b, fFirstEvt);
uci1 3:24c5f0f50bf1 272 b = SnBitUtils::WriteTo(b, fEvtsPerSeq);
uci1 3:24c5f0f50bf1 273 b = SnBitUtils::WriteTo(b, fRunMode);
uci1 3:24c5f0f50bf1 274 b = SnBitUtils::WriteTo(b, fStreamHiLoPlas);
uci1 3:24c5f0f50bf1 275 b = SnBitUtils::WriteTo(b, fWvLoseLSB);
uci1 3:24c5f0f50bf1 276 b = SnBitUtils::WriteTo(b, fWvLoseMSB);
uci1 3:24c5f0f50bf1 277 b = SnBitUtils::WriteTo(b, fWvBaseline);
uci1 3:24c5f0f50bf1 278 b = SnBitUtils::WriteTo(b, fDatPackType);
uci1 3:24c5f0f50bf1 279 const uint16_t* dc = &(fDAC[0][0]);
uci1 3:24c5f0f50bf1 280 for (uint16_t i=0; i<kTotDacs; i++, dc++) {
uci1 3:24c5f0f50bf1 281 b = SnBitUtils::WriteTo(b, *dc);
uci1 3:24c5f0f50bf1 282 }
uci1 3:24c5f0f50bf1 283 b = SnBitUtils::WriteTo(b, fNumPlas);
uci1 3:24c5f0f50bf1 284 const uint16_t* pl = &(fPLA[0]);
uci1 3:24c5f0f50bf1 285 for (uint8_t j=0; j<fNumPlas; j++, pl++) {
uci1 3:24c5f0f50bf1 286 b = SnBitUtils::WriteTo(b, *pl);
uci1 3:24c5f0f50bf1 287 }
uci1 3:24c5f0f50bf1 288 b = SnBitUtils::WriteTo(b, fNumCardsMajLog);
uci1 3:24c5f0f50bf1 289 b = SnBitUtils::WriteTo(b, fEnableThermTrig);
uci1 3:24c5f0f50bf1 290 b = SnBitUtils::WriteTo(b, fForceTrigPeriod);
uci1 3:24c5f0f50bf1 291 b = SnBitUtils::WriteTo(b, fHeartBeatPeriod);
uci1 3:24c5f0f50bf1 292 b = SnBitUtils::WriteTo(b, fAmpsOn);
uci1 3:24c5f0f50bf1 293 b = SnBitUtils::WriteTo(b, fEvtThrtlPeriodMs);
uci1 3:24c5f0f50bf1 294 b = SnBitUtils::WriteTo(b, fPowerMode);
uci1 3:24c5f0f50bf1 295 b = SnBitUtils::WriteTo(b, fBatVoltLowPwr);
uci1 3:24c5f0f50bf1 296 b = SnBitUtils::WriteTo(b, fCommWinPeriod);
uci1 3:24c5f0f50bf1 297 b = SnBitUtils::WriteTo(b, fCommWinDuration);
uci1 3:24c5f0f50bf1 298 b = SnBitUtils::WriteTo(b, fCommSendData);
uci1 3:24c5f0f50bf1 299 b = SnBitUtils::WriteTo(b, fCommWinPrdLowPwr);
uci1 3:24c5f0f50bf1 300 b = SnBitUtils::WriteTo(b, fCommWinDurLowPwr);
uci1 3:24c5f0f50bf1 301 b = SnBitUtils::WriteTo(b, fWatchDogPeriod);
uci1 3:24c5f0f50bf1 302 if (fStreamHiLoPlas!=0) {
uci1 3:24c5f0f50bf1 303 pl = fPLA;
uci1 3:24c5f0f50bf1 304 uint16_t hi, lo;
uci1 3:24c5f0f50bf1 305 for (uint8_t j=0; j<fNumPlas; j++, pl++) {
uci1 3:24c5f0f50bf1 306 GetHiLoPlas(*pl, hi, lo);
uci1 3:24c5f0f50bf1 307 b = SnBitUtils::WriteTo(b, hi);
uci1 3:24c5f0f50bf1 308 b = SnBitUtils::WriteTo(b, lo);
uci1 3:24c5f0f50bf1 309 }
uci1 3:24c5f0f50bf1 310 }
uci1 3:24c5f0f50bf1 311 }
uci1 3:24c5f0f50bf1 312
uci1 3:24c5f0f50bf1 313 bool ReadFromFile(const char* cfile);
uci1 3:24c5f0f50bf1 314 bool WriteToFile(const char* cfile) const;
uci1 3:24c5f0f50bf1 315
uci1 3:24c5f0f50bf1 316 void Reset() {
uci1 3:24c5f0f50bf1 317 memset(fLabel, 0, sizeof(char)*kConfLblLen);
uci1 3:24c5f0f50bf1 318 if (ReadFromFile(kDefConfFile)==false) {
uci1 3:24c5f0f50bf1 319 // couldn't get default. use hardcoded version.
uci1 3:24c5f0f50bf1 320 SetHardDefaults();
uci1 3:24c5f0f50bf1 321 }
uci1 3:24c5f0f50bf1 322 }
uci1 3:24c5f0f50bf1 323
uci1 3:24c5f0f50bf1 324 uint32_t SizeOf() const {
uci1 3:24c5f0f50bf1 325 // returns the num of bytes needed to stream this object
uci1 3:24c5f0f50bf1 326 // = size of member vars + 1 for i/o version + extra PLA strings (maybe)
uci1 3:24c5f0f50bf1 327 // + length of label string
uci1 3:24c5f0f50bf1 328 return SizeOf(fStreamHiLoPlas!=0, fNumPlas, strlen(fLabel));
uci1 3:24c5f0f50bf1 329 }
uci1 3:24c5f0f50bf1 330
uci1 3:24c5f0f50bf1 331 static void SetMacAddress();
uci1 3:24c5f0f50bf1 332 static uint64_t GetMacAddress() {
uci1 3:24c5f0f50bf1 333 if (fgMacAdr==0) {
uci1 3:24c5f0f50bf1 334 SetMacAddress();
uci1 3:24c5f0f50bf1 335 }
uci1 3:24c5f0f50bf1 336 return fgMacAdr;
uci1 3:24c5f0f50bf1 337 }
uci1 3:24c5f0f50bf1 338
uci1 3:24c5f0f50bf1 339 static uint32_t GetLabelMaxLen() { return kConfLblLen; }
uci1 3:24c5f0f50bf1 340
uci1 3:24c5f0f50bf1 341 static void GetHiLoPlas(const uint16_t pla,
uci1 3:24c5f0f50bf1 342 uint16_t& hiPla,
uci1 3:24c5f0f50bf1 343 uint16_t& loPla,
uci1 3:24c5f0f50bf1 344 const bool r2l=false);
uci1 3:24c5f0f50bf1 345 };
uci1 3:24c5f0f50bf1 346
uci1 3:24c5f0f50bf1 347 #endif // SN_SnConfigFrame