Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Wed Sep 12 04:47:22 2012 +0000
Revision:
16:744ce85aede2
Parent:
15:f2569d8e4176
Child:
18:55f1581f2ee4
SBD comm seems to be working. USB comm seems to be working (at 115200 baud). AFAR comm seems to be working. This version is set for USB communication and has zero text output.

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