Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Wed Nov 28 01:24:23 2012 +0000
Revision:
30:f869ed4bcc08
Parent:
28:484943132bb0
Child:
31:b5bd3b189150
Change power so to account for the Iridium being on the same relay as afar. Afar, SBD, Twitter enabled. No Debugging.

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