Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Sat Aug 18 05:00:32 2012 +0000
Revision:
12:d472f9811262
Parent:
8:95a325df1f6b
Child:
13:7a1fb885a8e4
Fixed bug in throttling timers. Now evt stores dt of triggers but throttle works on dt of events. AfarTCP communication possibly done. Debug output put behind precompiler macros.

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 8:95a325df1f6b 15 static const uint8_t kIPLen=16; // length of IP string. matches MBED's Socket class (so no ipv6)
uci1 3:24c5f0f50bf1 16
uci1 3:24c5f0f50bf1 17 static const char* const kDefConfFile; // default configuration file
uci1 3:24c5f0f50bf1 18
uci1 8:95a325df1f6b 19 static const uint32_t kMaxSizeOfV1 =
uci1 8:95a325df1f6b 20 + (9u*sizeof(uint32_t)) + (6u*sizeof(uint16_t))
uci1 8:95a325df1f6b 21 + (10u*sizeof(uint8_t)) + (3u*kNplas*sizeof(uint16_t))
uci1 3:24c5f0f50bf1 22 + (kTotDacs*sizeof(uint16_t))
uci1 3:24c5f0f50bf1 23 + (kConfLblLen*sizeof(uint8_t));
uci1 8:95a325df1f6b 24 static const uint32_t kMaxSizeOfV2 =
uci1 8:95a325df1f6b 25 kMaxSizeOfV1 + sizeof(uint32_t) + sizeof(uint8_t);
uci1 8:95a325df1f6b 26 static const uint32_t kMaxSizeOfV3 =
uci1 8:95a325df1f6b 27 kMaxSizeOfV2 + (2u*sizeof(uint16_t)) + (4u*kIPLen*sizeof(char));
uci1 8:95a325df1f6b 28 static const uint32_t kMaxSizeOf = kMaxSizeOfV3;
uci1 3:24c5f0f50bf1 29
uci1 3:24c5f0f50bf1 30 enum EDatPackBit {
uci1 3:24c5f0f50bf1 31 kSDcard = BIT(0),
uci1 3:24c5f0f50bf1 32 kIrid = BIT(1),
uci1 3:24c5f0f50bf1 33 kAfar = BIT(2),
uci1 3:24c5f0f50bf1 34 kUSB = BIT(3)
uci1 3:24c5f0f50bf1 35 };
uci1 3:24c5f0f50bf1 36
uci1 3:24c5f0f50bf1 37 enum ESendDataBit {
uci1 3:24c5f0f50bf1 38 // can't use BIT(0)! (-0 = 0 => send nothing)
uci1 3:24c5f0f50bf1 39 kAllFiles = BIT(1), // if bit=0 => send most recent file
uci1 3:24c5f0f50bf1 40 kTimeout = BIT(2), // if bit=0 => ignore timeout
uci1 3:24c5f0f50bf1 41 kDelete = BIT(3), // if bit=0 => do not delete sent files
uci1 12:d472f9811262 42 kUseBits = -BIT(15) // useful to initialize fCommSendData as a bit word
uci1 3:24c5f0f50bf1 43 };
uci1 3:24c5f0f50bf1 44
uci1 4:a91682e19d6b 45 enum EPowerModeBit {
uci1 4:a91682e19d6b 46 kAmpsDatTak = BIT(0),
uci1 4:a91682e19d6b 47 kCardDatTak = BIT(1),
uci1 4:a91682e19d6b 48 kIridDatTak = BIT(2),
uci1 4:a91682e19d6b 49 kAfarDatTak = BIT(3),
uci1 4:a91682e19d6b 50 kAmpsComWin = BIT(4),
uci1 4:a91682e19d6b 51 kCardComWin = BIT(5),
uci1 4:a91682e19d6b 52 kIridComWin = BIT(6),
uci1 4:a91682e19d6b 53 kAfarComWin = BIT(7)
uci1 4:a91682e19d6b 54 };
uci1 4:a91682e19d6b 55
uci1 3:24c5f0f50bf1 56 enum ERunMode {
uci1 8:95a325df1f6b 57 kSingleSeqBit = BIT(0), // if 0, infinite sequences
uci1 8:95a325df1f6b 58 kCountPowerBit = BIT(1), // if 0, count events
uci1 3:24c5f0f50bf1 59 };
uci1 3:24c5f0f50bf1 60
uci1 3:24c5f0f50bf1 61 // i/o version
uci1 3:24c5f0f50bf1 62 static const uint8_t kIOVers; // MUST BE INCREASED if any member var changes (==> also if kNchans, etc. change!)
uci1 3:24c5f0f50bf1 63
uci1 3:24c5f0f50bf1 64 private:
uci1 3:24c5f0f50bf1 65 // !!
uci1 3:24c5f0f50bf1 66 // !! If any member variables change, update: SizeOf function and kIOVers value! (also if kNchans, etc. change!)
uci1 3:24c5f0f50bf1 67 // !!
uci1 3:24c5f0f50bf1 68
uci1 3:24c5f0f50bf1 69 // mbed mac address
uci1 3:24c5f0f50bf1 70 static uint64_t fgMacAdr; // mbed mac address
uci1 3:24c5f0f50bf1 71 // conf header
uci1 3:24c5f0f50bf1 72 char fLabel[kConfLblLen]; // configuration label
uci1 3:24c5f0f50bf1 73 uint32_t fConfTime; // cpu config time
uci1 3:24c5f0f50bf1 74 uint32_t fRun; // run number
uci1 3:24c5f0f50bf1 75 uint32_t fFirstEvt; // starting event number
uci1 3:24c5f0f50bf1 76 uint32_t fEvtsPerSeq; // number of events per file
uci1 3:24c5f0f50bf1 77 uint8_t fRunMode; // mode of running (see ERunMode)
uci1 3:24c5f0f50bf1 78 uint8_t fStreamHiLoPlas; // (1byte bool) if true, add the separated hi/lo thresh PLA patterns to the i/o
uci1 3:24c5f0f50bf1 79 // data packing
uci1 3:24c5f0f50bf1 80 uint8_t fWvLoseLSB; // number of least significant bits to lose when packing waveform data
uci1 3:24c5f0f50bf1 81 uint8_t fWvLoseMSB; // number of most significant bits to lose when packing waveform data
uci1 3:24c5f0f50bf1 82 uint16_t fWvBaseline; // global baseline to use when packing data (useful to reduce clipping on the high end)
uci1 3:24c5f0f50bf1 83 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 84 // trigger setup
uci1 3:24c5f0f50bf1 85 uint16_t fDAC[kNchans][kNfpgaDacs]; //[card id][dac id] values should be 0-4095 here (not checked tho)
uci1 3:24c5f0f50bf1 86 uint8_t fNumPlas; // number of patterns to use. must be <= kNplas.
uci1 3:24c5f0f50bf1 87 uint16_t fPLA[kNplas]; //[pattern id] (same for each card)
uci1 3:24c5f0f50bf1 88 uint8_t fNumCardsMajLog; // number of cards participating in the MajLogic trigger (1 to 4)
uci1 3:24c5f0f50bf1 89 uint8_t fEnableThermTrig; // (1byte bool) whether or not to allow thermal triggers
uci1 3:24c5f0f50bf1 90 uint16_t fForceTrigPeriod; // number of seconds between force triggers (0=none)
uci1 3:24c5f0f50bf1 91 uint16_t fHeartBeatPeriod; // number of seconds between heartbeats (0=none)
uci1 3:24c5f0f50bf1 92 uint8_t fAmpsOn; // which amps are on (bit word. uint8_t => 8 amps max)
uci1 3:24c5f0f50bf1 93 uint16_t fEvtThrtlPeriodMs; // throttle period to write events (ms)
uci1 3:24c5f0f50bf1 94 // power
uci1 4:a91682e19d6b 95 uint8_t fPowerMode; // power mode bit word: see EPowerModeBit
uci1 3:24c5f0f50bf1 96 int16_t fBatVoltLowPwr; // battery level at which to switch to low power (not used?)
uci1 8:95a325df1f6b 97 uint16_t fVoltCheckPeriod; // how often to check the voltages (s)
uci1 3:24c5f0f50bf1 98 // communication
uci1 3:24c5f0f50bf1 99 uint32_t fCommWinPeriod; // seconds between communication window startup (0=always on)
uci1 3:24c5f0f50bf1 100 uint32_t fCommWinDuration; // seconds that communication window stays open (0=always open)
uci1 3:24c5f0f50bf1 101 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 102 uint32_t fCommWinPrdLowPwr; // low power communication window period (seconds) (range enforced)
uci1 3:24c5f0f50bf1 103 uint32_t fCommWinDurLowPwr; // low power communication window duration (seconds) (range enforced)
uci1 8:95a325df1f6b 104 char fRemoteServer[kIPLen]; // IP address of remote server (for afar)
uci1 8:95a325df1f6b 105 uint16_t fRemotePort; // port number of remote server (for afar)
uci1 8:95a325df1f6b 106 char fMbedIP[kIPLen]; // IP address of this mbed
uci1 8:95a325df1f6b 107 char fMbedMask[kIPLen]; // IP address of this mbed mask
uci1 8:95a325df1f6b 108 char fMbedGate[kIPLen]; // IP address of this mbed gateway
uci1 3:24c5f0f50bf1 109 // watchdog
uci1 3:24c5f0f50bf1 110 uint32_t fWatchDogPeriod; // number of seconds of inactivity for watchdog to issue a reset
uci1 3:24c5f0f50bf1 111
uci1 8:95a325df1f6b 112 // in case of low power, store regular settings
uci1 8:95a325df1f6b 113 // these are not sent over i/o or stored in the file
uci1 8:95a325df1f6b 114 // so they are not included in SizeOf
uci1 8:95a325df1f6b 115 bool fIsLowPower;
uci1 8:95a325df1f6b 116 char fNormLabel[kConfLblLen];
uci1 8:95a325df1f6b 117 uint8_t fNormPowerMode;
uci1 8:95a325df1f6b 118
uci1 3:24c5f0f50bf1 119 void SetHardDefaults();
uci1 3:24c5f0f50bf1 120
uci1 3:24c5f0f50bf1 121 static
uci1 8:95a325df1f6b 122 uint32_t SizeOf(const uint8_t rv,
uci1 8:95a325df1f6b 123 const bool streamHiLoPlas,
uci1 3:24c5f0f50bf1 124 const uint8_t nplas,
uci1 3:24c5f0f50bf1 125 const uint8_t lblLen) {
uci1 3:24c5f0f50bf1 126 // private because it cannot be used to read from a buffer
uci1 3:24c5f0f50bf1 127 // (the label length and fStreamHiLoPlas are not known a priori)
uci1 3:24c5f0f50bf1 128 // returns the num of bytes needed to stream this object
uci1 3:24c5f0f50bf1 129 // = size of member vars + 1 for i/o version + extra PLA strings (maybe)
uci1 8:95a325df1f6b 130 uint32_t maxsize = kMaxSizeOf;
uci1 8:95a325df1f6b 131 if (rv==1) {
uci1 8:95a325df1f6b 132 maxsize = kMaxSizeOfV1;
uci1 8:95a325df1f6b 133 } else if (rv==2) {
uci1 8:95a325df1f6b 134 maxsize = kMaxSizeOfV2;
uci1 8:95a325df1f6b 135 }
uci1 8:95a325df1f6b 136 uint32_t sz = maxsize - kConfLblLen + lblLen;
uci1 3:24c5f0f50bf1 137 static const uint32_t mhlp = 2u*kNplas*sizeof(uint16_t);
uci1 3:24c5f0f50bf1 138 const int32_t dp = (nplas-kNplas)*sizeof(uint16_t);
uci1 3:24c5f0f50bf1 139 const uint8_t fac = (streamHiLoPlas) ? 3u : 1u;
uci1 3:24c5f0f50bf1 140 sz += (fac*dp);
uci1 3:24c5f0f50bf1 141 if (streamHiLoPlas==false) {
uci1 3:24c5f0f50bf1 142 sz -= mhlp;
uci1 3:24c5f0f50bf1 143 }
uci1 3:24c5f0f50bf1 144 return sz;
uci1 3:24c5f0f50bf1 145 }
uci1 3:24c5f0f50bf1 146
uci1 3:24c5f0f50bf1 147 public:
uci1 8:95a325df1f6b 148 SnConfigFrame() : fIsLowPower(false) { Reset(); }
uci1 3:24c5f0f50bf1 149 virtual ~SnConfigFrame() {}
uci1 3:24c5f0f50bf1 150
uci1 8:95a325df1f6b 151 bool IsCountingPowerReadings() const { return ((fRunMode & kCountPowerBit)!=0); }
uci1 8:95a325df1f6b 152 bool IsSingleSeqRunMode() const { return ((fRunMode & kSingleSeqBit)!=0); }
uci1 8:95a325df1f6b 153 bool IsLowPowerMode() const { return fIsLowPower; }
uci1 3:24c5f0f50bf1 154 const char* GetLabel() const { return fLabel; }
uci1 3:24c5f0f50bf1 155 uint32_t GetLabelStrLen() const { return strlen(fLabel); }
uci1 3:24c5f0f50bf1 156 uint32_t GetRun() const { return fRun; }
uci1 3:24c5f0f50bf1 157 uint32_t GetFirstEvt() const { return fFirstEvt; }
uci1 3:24c5f0f50bf1 158 uint32_t GetEvtsPerFile() const { return fEvtsPerSeq; }
uci1 3:24c5f0f50bf1 159 uint16_t GetEvtThrtlPeriodMs() const { return fEvtThrtlPeriodMs; }
uci1 3:24c5f0f50bf1 160 uint16_t GetForceTrigPeriod() const { return fForceTrigPeriod; }
uci1 3:24c5f0f50bf1 161 uint16_t GetHeartbeatPeriod() const { return fHeartBeatPeriod; }
uci1 8:95a325df1f6b 162 uint16_t GetBatVoltLowPwr() const { return fBatVoltLowPwr; }
uci1 8:95a325df1f6b 163 uint16_t GetVoltCheckPeriod() const { return fVoltCheckPeriod; }
uci1 3:24c5f0f50bf1 164 uint32_t GetWatchdogPeriod() const { return fWatchDogPeriod; }
uci1 3:24c5f0f50bf1 165 uint16_t GetDac(const uint8_t ch, const uint8_t dn) const { return fDAC[ch][dn]; }
uci1 3:24c5f0f50bf1 166 uint8_t GetNumPlas() const { return fNumPlas; }
uci1 3:24c5f0f50bf1 167 uint16_t GetPla(const uint8_t pn) const { return fPLA[pn]; }
uci1 3:24c5f0f50bf1 168 uint8_t GetNumCardsMajLog() const { return fNumCardsMajLog; }
uci1 3:24c5f0f50bf1 169 bool IsThermTrigEnabled() const { return fEnableThermTrig!=0; }
uci1 3:24c5f0f50bf1 170 bool IsEachAmpOn() const {
uci1 3:24c5f0f50bf1 171 bool allon=true;
uci1 3:24c5f0f50bf1 172 for (uint8_t i=0; (i<kNchans) && allon; i++) {
uci1 3:24c5f0f50bf1 173 allon = (fAmpsOn & BIT(i))!=0;
uci1 3:24c5f0f50bf1 174 }
uci1 3:24c5f0f50bf1 175 return allon;
uci1 3:24c5f0f50bf1 176 }
uci1 3:24c5f0f50bf1 177 // TODO: allow check for individual amps, when they can be turned on individually
uci1 3:24c5f0f50bf1 178
uci1 8:95a325df1f6b 179 const char* GetRemoteServer() const { return fRemoteServer; }
uci1 8:95a325df1f6b 180 uint16_t GetRemotePort() const { return fRemotePort; }
uci1 8:95a325df1f6b 181 const char* GetMbedIP() const { return fMbedIP; }
uci1 8:95a325df1f6b 182 const char* GetMbedMask() const { return fMbedMask; }
uci1 8:95a325df1f6b 183 const char* GetMbedGate() const { return fMbedGate; }
uci1 8:95a325df1f6b 184 uint32_t GetCommWinPeriod() const { return fIsLowPower ? fCommWinPrdLowPwr : fCommWinPeriod; }
uci1 8:95a325df1f6b 185 uint32_t GetCommWinDuration() const { return fIsLowPower ? fCommWinDurLowPwr : fCommWinDuration; }
uci1 3:24c5f0f50bf1 186 int16_t GetCommSendData() const { return fCommSendData; }
uci1 3:24c5f0f50bf1 187
uci1 3:24c5f0f50bf1 188 bool IsSendingAllFiles() const
uci1 3:24c5f0f50bf1 189 { return (fCommSendData<0) && ((fCommSendData & kAllFiles)!=0); }
uci1 3:24c5f0f50bf1 190 bool IsObeyingTimeout() const
uci1 3:24c5f0f50bf1 191 { return (fCommSendData<0) && ((fCommSendData & kTimeout)!=0); }
uci1 3:24c5f0f50bf1 192 bool IsDeletingFiles() const
uci1 3:24c5f0f50bf1 193 { return (fCommSendData<0) && ((fCommSendData & kDelete)!=0); }
uci1 3:24c5f0f50bf1 194
uci1 4:a91682e19d6b 195 uint8_t GetPowerMode() const { return fPowerMode; }
uci1 8:95a325df1f6b 196 int GetPowPinSetting(const EPowerModeBit p) const {
uci1 8:95a325df1f6b 197 // return int to correspond to what DigitalOut::operator= expects
uci1 8:95a325df1f6b 198 const bool on = IsPoweredFor(p);
uci1 5:9cea89700c66 199 if (p==kCardDatTak || p==kCardComWin ||
uci1 5:9cea89700c66 200 p==kAmpsDatTak || p==kAmpsComWin) {
uci1 5:9cea89700c66 201 return on ? 0 : 1;
uci1 5:9cea89700c66 202 } else {
uci1 5:9cea89700c66 203 return on ? 1 : 0;
uci1 5:9cea89700c66 204 }
uci1 5:9cea89700c66 205 }
uci1 8:95a325df1f6b 206 bool IsPoweredFor(const EPowerModeBit p) const {
uci1 8:95a325df1f6b 207 return ((fPowerMode & p)!=0);
uci1 8:95a325df1f6b 208 }
uci1 8:95a325df1f6b 209
uci1 8:95a325df1f6b 210 void EnablePowerFor(const EPowerModeBit p) { fPowerMode |= p; }
uci1 8:95a325df1f6b 211 void DisablePowerFor(const EPowerModeBit p) { fPowerMode &= ~p; }
uci1 8:95a325df1f6b 212
uci1 8:95a325df1f6b 213 void ChangeToLowPower();
uci1 8:95a325df1f6b 214 void ChangeToNormPower();
uci1 3:24c5f0f50bf1 215
uci1 3:24c5f0f50bf1 216 const char* GetOutFileName(const char* dir) const;
uci1 3:24c5f0f50bf1 217
uci1 3:24c5f0f50bf1 218 // waveform packing info
uci1 3:24c5f0f50bf1 219 uint16_t GetWvBaseline() const { return fWvBaseline; }
uci1 3:24c5f0f50bf1 220 uint8_t GetWvLoseLSB() const { return fWvLoseLSB; }
uci1 3:24c5f0f50bf1 221 uint8_t GetWvLoseMSB() const { return fWvLoseMSB; }
uci1 3:24c5f0f50bf1 222 bool IsDatPackedFor(const EDatPackBit d) const { return (fDatPackType & d)!=0; }
uci1 3:24c5f0f50bf1 223 void GetPackParsFor(const EDatPackBit d,
uci1 3:24c5f0f50bf1 224 uint8_t& loseLSB, uint8_t& loseMSB,
uci1 3:24c5f0f50bf1 225 uint16_t& wvBase) const;
uci1 3:24c5f0f50bf1 226
uci1 3:24c5f0f50bf1 227 // i/o
uci1 3:24c5f0f50bf1 228 template<class T>
uci1 3:24c5f0f50bf1 229 void ReadFrom(T& b) {
uci1 3:24c5f0f50bf1 230 // no check on the length of buf is done here
uci1 3:24c5f0f50bf1 231 // that should be been done already
uci1 3:24c5f0f50bf1 232 //
uci1 3:24c5f0f50bf1 233 // must match WriteTo
uci1 3:24c5f0f50bf1 234
uci1 3:24c5f0f50bf1 235 uint8_t Rv=0;
uci1 3:24c5f0f50bf1 236 b = SnBitUtils::ReadFrom(b, Rv); // i/o version
uci1 12:d472f9811262 237 #ifdef DEBUG
uci1 3:24c5f0f50bf1 238 printf("Rv=%hhu\r\n",Rv);
uci1 12:d472f9811262 239 #endif
uci1 3:24c5f0f50bf1 240 if (Rv>0) {
uci1 3:24c5f0f50bf1 241 uint32_t llen=kConfLblLen;
uci1 3:24c5f0f50bf1 242 b = SnBitUtils::ReadFrom(b, llen);
uci1 12:d472f9811262 243 #ifdef DEBUG
uci1 3:24c5f0f50bf1 244 printf("llen=%u\r\n",llen);
uci1 12:d472f9811262 245 #endif
uci1 3:24c5f0f50bf1 246 b = SnBitUtils::ReadFrom(b, fLabel, llen);
uci1 12:d472f9811262 247 #ifdef DEBUG
uci1 3:24c5f0f50bf1 248 printf("lbl=%s\r\n",fLabel);
uci1 12:d472f9811262 249 #endif
uci1 3:24c5f0f50bf1 250 b = SnBitUtils::ReadFrom(b, fConfTime);
uci1 12:d472f9811262 251 #ifdef DEBUG
uci1 3:24c5f0f50bf1 252 printf("ct=%u\r\n",fConfTime);
uci1 12:d472f9811262 253 #endif
uci1 3:24c5f0f50bf1 254 b = SnBitUtils::ReadFrom(b, fRun);
uci1 12:d472f9811262 255 #ifdef DEBUG
uci1 3:24c5f0f50bf1 256 printf("run=%u\r\n",fRun);
uci1 12:d472f9811262 257 #endif
uci1 3:24c5f0f50bf1 258 b = SnBitUtils::ReadFrom(b, fFirstEvt);
uci1 12:d472f9811262 259 #ifdef DEBUG
uci1 3:24c5f0f50bf1 260 printf("fe=%u\r\n",fFirstEvt);
uci1 12:d472f9811262 261 #endif
uci1 3:24c5f0f50bf1 262 if (Rv>1) {
uci1 3:24c5f0f50bf1 263 b = SnBitUtils::ReadFrom(b, fEvtsPerSeq);
uci1 12:d472f9811262 264 #ifdef DEBUG
uci1 3:24c5f0f50bf1 265 printf("eps=%u\r\n",fEvtsPerSeq);
uci1 12:d472f9811262 266 #endif
uci1 3:24c5f0f50bf1 267 b = SnBitUtils::ReadFrom(b, fRunMode);
uci1 12:d472f9811262 268 #ifdef DEBUG
uci1 3:24c5f0f50bf1 269 printf("rm=%hhu\r\n",fRunMode);
uci1 12:d472f9811262 270 #endif
uci1 3:24c5f0f50bf1 271 }
uci1 3:24c5f0f50bf1 272 b = SnBitUtils::ReadFrom(b, fStreamHiLoPlas);
uci1 12:d472f9811262 273 #ifdef DEBUG
uci1 3:24c5f0f50bf1 274 printf("shilo=%d\r\n",(int)fStreamHiLoPlas);
uci1 12:d472f9811262 275 #endif
uci1 3:24c5f0f50bf1 276 b = SnBitUtils::ReadFrom(b, fWvLoseLSB);
uci1 12:d472f9811262 277 #ifdef DEBUG
uci1 3:24c5f0f50bf1 278 printf("lsb=%hhu\r\n",fWvLoseLSB);
uci1 12:d472f9811262 279 #endif
uci1 3:24c5f0f50bf1 280 b = SnBitUtils::ReadFrom(b, fWvLoseMSB);
uci1 12:d472f9811262 281 #ifdef DEBUG
uci1 3:24c5f0f50bf1 282 printf("msb=%hhu\r\n",fWvLoseMSB);
uci1 12:d472f9811262 283 #endif
uci1 3:24c5f0f50bf1 284 b = SnBitUtils::ReadFrom(b, fWvBaseline);
uci1 12:d472f9811262 285 #ifdef DEBUG
uci1 3:24c5f0f50bf1 286 printf("bl=%hu\r\n",fWvBaseline);
uci1 12:d472f9811262 287 #endif
uci1 3:24c5f0f50bf1 288 b = SnBitUtils::ReadFrom(b, fDatPackType);
uci1 12:d472f9811262 289 #ifdef DEBUG
uci1 3:24c5f0f50bf1 290 printf("dp=%hhu\r\n",fDatPackType);
uci1 12:d472f9811262 291 #endif
uci1 3:24c5f0f50bf1 292 uint16_t* dc = &(fDAC[0][0]);
uci1 3:24c5f0f50bf1 293 for (uint16_t i=0; i<kTotDacs; i++, dc++) {
uci1 3:24c5f0f50bf1 294 b = SnBitUtils::ReadFrom(b, *dc);
uci1 12:d472f9811262 295 #ifdef DEBUG
uci1 3:24c5f0f50bf1 296 printf("dac[%hu]=%hu\r\n",i,*dc);
uci1 12:d472f9811262 297 #endif
uci1 3:24c5f0f50bf1 298 }
uci1 3:24c5f0f50bf1 299 b = SnBitUtils::ReadFrom(b, fNumPlas);
uci1 12:d472f9811262 300 #ifdef DEBUG
uci1 3:24c5f0f50bf1 301 printf("npla=%hhu\r\n",fNumPlas);
uci1 12:d472f9811262 302 #endif
uci1 3:24c5f0f50bf1 303 uint16_t* pl = &(fPLA[0]);
uci1 3:24c5f0f50bf1 304 for (uint8_t j=0; j<fNumPlas; j++, pl++) {
uci1 3:24c5f0f50bf1 305 b = SnBitUtils::ReadFrom(b, *pl);
uci1 12:d472f9811262 306 #ifdef DEBUG
uci1 3:24c5f0f50bf1 307 printf("pla[%hhu]=%hu\r\n",j,*pl);
uci1 12:d472f9811262 308 #endif
uci1 3:24c5f0f50bf1 309 }
uci1 3:24c5f0f50bf1 310 b = SnBitUtils::ReadFrom(b, fNumCardsMajLog);
uci1 12:d472f9811262 311 #ifdef DEBUG
uci1 3:24c5f0f50bf1 312 printf("mj=%hhu\r\n",fNumCardsMajLog);
uci1 12:d472f9811262 313 #endif
uci1 3:24c5f0f50bf1 314 b = SnBitUtils::ReadFrom(b, fEnableThermTrig);
uci1 12:d472f9811262 315 #ifdef DEBUG
uci1 3:24c5f0f50bf1 316 printf("thm=%d\r\n",(int)fEnableThermTrig);
uci1 12:d472f9811262 317 #endif
uci1 3:24c5f0f50bf1 318 b = SnBitUtils::ReadFrom(b, fForceTrigPeriod);
uci1 12:d472f9811262 319 #ifdef DEBUG
uci1 3:24c5f0f50bf1 320 printf("force=%hu\r\n",fForceTrigPeriod);
uci1 12:d472f9811262 321 #endif
uci1 3:24c5f0f50bf1 322 b = SnBitUtils::ReadFrom(b, fHeartBeatPeriod);
uci1 12:d472f9811262 323 #ifdef DEBUG
uci1 3:24c5f0f50bf1 324 printf("heart=%hu\r\n",fHeartBeatPeriod);
uci1 12:d472f9811262 325 #endif
uci1 3:24c5f0f50bf1 326 b = SnBitUtils::ReadFrom(b, fAmpsOn);
uci1 12:d472f9811262 327 #ifdef DEBUG
uci1 3:24c5f0f50bf1 328 printf("amps=%hhu\r\n",fAmpsOn);
uci1 12:d472f9811262 329 #endif
uci1 3:24c5f0f50bf1 330 b = SnBitUtils::ReadFrom(b, fEvtThrtlPeriodMs);
uci1 12:d472f9811262 331 #ifdef DEBUG
uci1 3:24c5f0f50bf1 332 printf("throt=%hu\r\n",fEvtThrtlPeriodMs);
uci1 12:d472f9811262 333 #endif
uci1 3:24c5f0f50bf1 334 b = SnBitUtils::ReadFrom(b, fPowerMode);
uci1 12:d472f9811262 335 #ifdef DEBUG
uci1 3:24c5f0f50bf1 336 printf("pow=%hhu\r\n",fPowerMode);
uci1 12:d472f9811262 337 #endif
uci1 3:24c5f0f50bf1 338 b = SnBitUtils::ReadFrom(b, fBatVoltLowPwr);
uci1 12:d472f9811262 339 #ifdef DEBUG
uci1 8:95a325df1f6b 340 printf("batlow=%hd\r\n",fBatVoltLowPwr);
uci1 12:d472f9811262 341 #endif
uci1 8:95a325df1f6b 342 if (Rv>2) {
uci1 8:95a325df1f6b 343 b = SnBitUtils::ReadFrom(b, fVoltCheckPeriod);
uci1 12:d472f9811262 344 #ifdef DEBUG
uci1 8:95a325df1f6b 345 printf("vltchk=%hu\r\n",fVoltCheckPeriod);
uci1 12:d472f9811262 346 #endif
uci1 8:95a325df1f6b 347 }
uci1 3:24c5f0f50bf1 348 b = SnBitUtils::ReadFrom(b, fCommWinPeriod);
uci1 12:d472f9811262 349 #ifdef DEBUG
uci1 3:24c5f0f50bf1 350 printf("cmper=%u\r\n",fCommWinPeriod);
uci1 12:d472f9811262 351 #endif
uci1 3:24c5f0f50bf1 352 b = SnBitUtils::ReadFrom(b, fCommWinDuration);
uci1 12:d472f9811262 353 #ifdef DEBUG
uci1 3:24c5f0f50bf1 354 printf("cmdur=%u\r\n",fCommWinDuration);
uci1 12:d472f9811262 355 #endif
uci1 3:24c5f0f50bf1 356 b = SnBitUtils::ReadFrom(b, fCommSendData);
uci1 12:d472f9811262 357 #ifdef DEBUG
uci1 3:24c5f0f50bf1 358 printf("send=%d\r\n",fCommSendData);
uci1 12:d472f9811262 359 #endif
uci1 3:24c5f0f50bf1 360 b = SnBitUtils::ReadFrom(b, fCommWinPrdLowPwr);
uci1 12:d472f9811262 361 #ifdef DEBUG
uci1 3:24c5f0f50bf1 362 printf("cmperlp=%u\r\n",fCommWinPrdLowPwr);
uci1 12:d472f9811262 363 #endif
uci1 3:24c5f0f50bf1 364 b = SnBitUtils::ReadFrom(b, fCommWinDurLowPwr);
uci1 12:d472f9811262 365 #ifdef DEBUG
uci1 3:24c5f0f50bf1 366 printf("cmdurlp=%u\r\n",fCommWinDurLowPwr);
uci1 12:d472f9811262 367 #endif
uci1 8:95a325df1f6b 368 if (Rv>2) {
uci1 8:95a325df1f6b 369 b = SnBitUtils::ReadFrom(b, fRemoteServer, kIPLen);
uci1 12:d472f9811262 370 #ifdef DEBUG
uci1 8:95a325df1f6b 371 printf("rserv=%s\r\n",fRemoteServer);
uci1 12:d472f9811262 372 #endif
uci1 8:95a325df1f6b 373 b = SnBitUtils::ReadFrom(b, fRemotePort);
uci1 12:d472f9811262 374 #ifdef DEBUG
uci1 8:95a325df1f6b 375 printf("rport=%hu\r\n",fRemotePort);
uci1 12:d472f9811262 376 #endif
uci1 8:95a325df1f6b 377 b = SnBitUtils::ReadFrom(b, fMbedIP, kIPLen);
uci1 12:d472f9811262 378 #ifdef DEBUG
uci1 8:95a325df1f6b 379 printf("mbedip=%s\r\n",fMbedIP);
uci1 12:d472f9811262 380 #endif
uci1 8:95a325df1f6b 381 b = SnBitUtils::ReadFrom(b, fMbedMask, kIPLen);
uci1 12:d472f9811262 382 #ifdef DEBUG
uci1 8:95a325df1f6b 383 printf("mbedmask=%s\r\n",fMbedMask);
uci1 12:d472f9811262 384 #endif
uci1 8:95a325df1f6b 385 b = SnBitUtils::ReadFrom(b, fMbedGate, kIPLen);
uci1 12:d472f9811262 386 #ifdef DEBUG
uci1 8:95a325df1f6b 387 printf("mbedgate=%s\r\n",fMbedGate);
uci1 12:d472f9811262 388 #endif
uci1 8:95a325df1f6b 389 }
uci1 3:24c5f0f50bf1 390 b = SnBitUtils::ReadFrom(b, fWatchDogPeriod);
uci1 12:d472f9811262 391 #ifdef DEBUG
uci1 3:24c5f0f50bf1 392 printf("watch=%u\r\n",fWatchDogPeriod);
uci1 12:d472f9811262 393 #endif
uci1 3:24c5f0f50bf1 394 if (fStreamHiLoPlas!=0) {
uci1 3:24c5f0f50bf1 395 uint16_t hi, lo;
uci1 3:24c5f0f50bf1 396 for (uint8_t j=0; j<fNumPlas; j++) {
uci1 3:24c5f0f50bf1 397 b = SnBitUtils::ReadFrom(b, hi);
uci1 12:d472f9811262 398 #ifdef DEBUG
uci1 3:24c5f0f50bf1 399 printf("hi=%hu\r\n",hi);
uci1 12:d472f9811262 400 #endif
uci1 3:24c5f0f50bf1 401 b = SnBitUtils::ReadFrom(b, lo);
uci1 12:d472f9811262 402 #ifdef DEBUG
uci1 3:24c5f0f50bf1 403 printf("lo=%hu\r\n",lo);
uci1 12:d472f9811262 404 #endif
uci1 3:24c5f0f50bf1 405 // don't save these
uci1 3:24c5f0f50bf1 406 }
uci1 3:24c5f0f50bf1 407 }
uci1 3:24c5f0f50bf1 408 }
uci1 12:d472f9811262 409 #ifdef DEBUG
uci1 3:24c5f0f50bf1 410 printf("read from done\r\n");
uci1 12:d472f9811262 411 #endif
uci1 3:24c5f0f50bf1 412 }
uci1 3:24c5f0f50bf1 413
uci1 3:24c5f0f50bf1 414 template <class T>
uci1 3:24c5f0f50bf1 415 void WriteTo(T& b) const {
uci1 3:24c5f0f50bf1 416 // no check on the length of the buf is done here
uci1 3:24c5f0f50bf1 417 // that should be done already
uci1 3:24c5f0f50bf1 418 //
uci1 3:24c5f0f50bf1 419 // must match ReadFromBuf
uci1 3:24c5f0f50bf1 420 //
uci1 3:24c5f0f50bf1 421 // intentionally not writing mac address here, so we don't have to read it in
uci1 3:24c5f0f50bf1 422
uci1 3:24c5f0f50bf1 423 const uint32_t llen = strlen(fLabel);
uci1 3:24c5f0f50bf1 424
uci1 3:24c5f0f50bf1 425 b = SnBitUtils::WriteTo(b, kIOVers); // i/o version
uci1 3:24c5f0f50bf1 426 b = SnBitUtils::WriteTo(b, llen);
uci1 3:24c5f0f50bf1 427 b = SnBitUtils::WriteTo(b, fLabel, llen);
uci1 3:24c5f0f50bf1 428 b = SnBitUtils::WriteTo(b, fConfTime);
uci1 3:24c5f0f50bf1 429 b = SnBitUtils::WriteTo(b, fRun);
uci1 3:24c5f0f50bf1 430 b = SnBitUtils::WriteTo(b, fFirstEvt);
uci1 3:24c5f0f50bf1 431 b = SnBitUtils::WriteTo(b, fEvtsPerSeq);
uci1 3:24c5f0f50bf1 432 b = SnBitUtils::WriteTo(b, fRunMode);
uci1 3:24c5f0f50bf1 433 b = SnBitUtils::WriteTo(b, fStreamHiLoPlas);
uci1 3:24c5f0f50bf1 434 b = SnBitUtils::WriteTo(b, fWvLoseLSB);
uci1 3:24c5f0f50bf1 435 b = SnBitUtils::WriteTo(b, fWvLoseMSB);
uci1 3:24c5f0f50bf1 436 b = SnBitUtils::WriteTo(b, fWvBaseline);
uci1 3:24c5f0f50bf1 437 b = SnBitUtils::WriteTo(b, fDatPackType);
uci1 3:24c5f0f50bf1 438 const uint16_t* dc = &(fDAC[0][0]);
uci1 3:24c5f0f50bf1 439 for (uint16_t i=0; i<kTotDacs; i++, dc++) {
uci1 3:24c5f0f50bf1 440 b = SnBitUtils::WriteTo(b, *dc);
uci1 3:24c5f0f50bf1 441 }
uci1 3:24c5f0f50bf1 442 b = SnBitUtils::WriteTo(b, fNumPlas);
uci1 3:24c5f0f50bf1 443 const uint16_t* pl = &(fPLA[0]);
uci1 3:24c5f0f50bf1 444 for (uint8_t j=0; j<fNumPlas; j++, pl++) {
uci1 3:24c5f0f50bf1 445 b = SnBitUtils::WriteTo(b, *pl);
uci1 3:24c5f0f50bf1 446 }
uci1 3:24c5f0f50bf1 447 b = SnBitUtils::WriteTo(b, fNumCardsMajLog);
uci1 3:24c5f0f50bf1 448 b = SnBitUtils::WriteTo(b, fEnableThermTrig);
uci1 3:24c5f0f50bf1 449 b = SnBitUtils::WriteTo(b, fForceTrigPeriod);
uci1 3:24c5f0f50bf1 450 b = SnBitUtils::WriteTo(b, fHeartBeatPeriod);
uci1 3:24c5f0f50bf1 451 b = SnBitUtils::WriteTo(b, fAmpsOn);
uci1 3:24c5f0f50bf1 452 b = SnBitUtils::WriteTo(b, fEvtThrtlPeriodMs);
uci1 3:24c5f0f50bf1 453 b = SnBitUtils::WriteTo(b, fPowerMode);
uci1 3:24c5f0f50bf1 454 b = SnBitUtils::WriteTo(b, fBatVoltLowPwr);
uci1 8:95a325df1f6b 455 b = SnBitUtils::WriteTo(b, fVoltCheckPeriod);
uci1 3:24c5f0f50bf1 456 b = SnBitUtils::WriteTo(b, fCommWinPeriod);
uci1 3:24c5f0f50bf1 457 b = SnBitUtils::WriteTo(b, fCommWinDuration);
uci1 3:24c5f0f50bf1 458 b = SnBitUtils::WriteTo(b, fCommSendData);
uci1 3:24c5f0f50bf1 459 b = SnBitUtils::WriteTo(b, fCommWinPrdLowPwr);
uci1 3:24c5f0f50bf1 460 b = SnBitUtils::WriteTo(b, fCommWinDurLowPwr);
uci1 8:95a325df1f6b 461 b = SnBitUtils::WriteTo(b, fRemoteServer, kIPLen);
uci1 8:95a325df1f6b 462 b = SnBitUtils::WriteTo(b, fRemotePort);
uci1 8:95a325df1f6b 463 b = SnBitUtils::WriteTo(b, fMbedIP, kIPLen);
uci1 8:95a325df1f6b 464 b = SnBitUtils::WriteTo(b, fMbedMask, kIPLen);
uci1 8:95a325df1f6b 465 b = SnBitUtils::WriteTo(b, fMbedGate, kIPLen);
uci1 3:24c5f0f50bf1 466 b = SnBitUtils::WriteTo(b, fWatchDogPeriod);
uci1 3:24c5f0f50bf1 467 if (fStreamHiLoPlas!=0) {
uci1 3:24c5f0f50bf1 468 pl = fPLA;
uci1 3:24c5f0f50bf1 469 uint16_t hi, lo;
uci1 3:24c5f0f50bf1 470 for (uint8_t j=0; j<fNumPlas; j++, pl++) {
uci1 3:24c5f0f50bf1 471 GetHiLoPlas(*pl, hi, lo);
uci1 3:24c5f0f50bf1 472 b = SnBitUtils::WriteTo(b, hi);
uci1 3:24c5f0f50bf1 473 b = SnBitUtils::WriteTo(b, lo);
uci1 3:24c5f0f50bf1 474 }
uci1 3:24c5f0f50bf1 475 }
uci1 3:24c5f0f50bf1 476 }
uci1 3:24c5f0f50bf1 477
uci1 3:24c5f0f50bf1 478 bool ReadFromFile(const char* cfile);
uci1 3:24c5f0f50bf1 479 bool WriteToFile(const char* cfile) const;
uci1 3:24c5f0f50bf1 480
uci1 3:24c5f0f50bf1 481 void Reset() {
uci1 3:24c5f0f50bf1 482 memset(fLabel, 0, sizeof(char)*kConfLblLen);
uci1 3:24c5f0f50bf1 483 if (ReadFromFile(kDefConfFile)==false) {
uci1 3:24c5f0f50bf1 484 // couldn't get default. use hardcoded version.
uci1 3:24c5f0f50bf1 485 SetHardDefaults();
uci1 3:24c5f0f50bf1 486 }
uci1 3:24c5f0f50bf1 487 }
uci1 3:24c5f0f50bf1 488
uci1 8:95a325df1f6b 489 uint32_t SizeOf(const uint8_t rv) const {
uci1 3:24c5f0f50bf1 490 // returns the num of bytes needed to stream this object
uci1 3:24c5f0f50bf1 491 // = size of member vars + 1 for i/o version + extra PLA strings (maybe)
uci1 3:24c5f0f50bf1 492 // + length of label string
uci1 8:95a325df1f6b 493 return SizeOf(rv, fStreamHiLoPlas!=0, fNumPlas, strlen(fLabel));
uci1 3:24c5f0f50bf1 494 }
uci1 3:24c5f0f50bf1 495
uci1 3:24c5f0f50bf1 496 static void SetMacAddress();
uci1 3:24c5f0f50bf1 497 static uint64_t GetMacAddress() {
uci1 3:24c5f0f50bf1 498 if (fgMacAdr==0) {
uci1 3:24c5f0f50bf1 499 SetMacAddress();
uci1 3:24c5f0f50bf1 500 }
uci1 3:24c5f0f50bf1 501 return fgMacAdr;
uci1 3:24c5f0f50bf1 502 }
uci1 3:24c5f0f50bf1 503
uci1 3:24c5f0f50bf1 504 static uint32_t GetLabelMaxLen() { return kConfLblLen; }
uci1 3:24c5f0f50bf1 505
uci1 3:24c5f0f50bf1 506 static void GetHiLoPlas(const uint16_t pla,
uci1 3:24c5f0f50bf1 507 uint16_t& hiPla,
uci1 3:24c5f0f50bf1 508 uint16_t& loPla,
uci1 3:24c5f0f50bf1 509 const bool r2l=false);
uci1 3:24c5f0f50bf1 510 };
uci1 3:24c5f0f50bf1 511
uci1 3:24c5f0f50bf1 512 #endif // SN_SnConfigFrame