Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Tue Feb 03 00:04:30 2015 +0000
Revision:
67:ec999336fcd1
Parent:
59:21128cc24b04
Child:
69:357135e9b5b3
STN20 Hardcoded (mac adr and config label). Power off periphs before powering anything on. do NOT use interface chip for mac adr or files (except reprogramming)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 0:664899e0b988 1 #include "SnConfigFrame.h"
uci1 0:664899e0b988 2
uci1 0:664899e0b988 3 #include "mbed.h"
uci1 0:664899e0b988 4
uci1 59:21128cc24b04 5 //#define DEBUG
uci1 59:21128cc24b04 6
uci1 0:664899e0b988 7 #include "SnBitUtils.h"
uci1 16:744ce85aede2 8 #include "SnHeaderFrame.h"
uci1 22:f957c4f840ad 9 #include "Watchdog.h"
uci1 0:664899e0b988 10
uci1 0:664899e0b988 11 extern "C" void mbed_mac_address(char *);
uci1 0:664899e0b988 12
uci1 31:b5bd3b189150 13 bool SnConfigFrame::fgApplySafetyNets = true;
uci1 56:0bba0ef15697 14 #if CHIPBOARD==ATWD4CH
uci1 40:1324da35afd4 15 const uint8_t SnConfigFrame::kIOVers = 8;
uci1 56:0bba0ef15697 16 #else // SST
uci1 56:0bba0ef15697 17 const uint8_t SnConfigFrame::kIOVers = 10;
uci1 56:0bba0ef15697 18 #endif
uci1 67:ec999336fcd1 19
uci1 67:ec999336fcd1 20 #ifdef USE_INTERFACE_CHIP
uci1 3:24c5f0f50bf1 21 const char* const SnConfigFrame::kDefConfFile = "/local/DEFCONF.DAT";
uci1 59:21128cc24b04 22 const char* const SnConfigFrame::kDefRemIpFilen = "/local/REMOTIP.TXT";
uci1 59:21128cc24b04 23 const char* const SnConfigFrame::kDefRemPortFilen = "/local/REMOTPRT.TXT";
uci1 59:21128cc24b04 24 const char* const SnConfigFrame::kDefMbedIPFilen = "/local/MBEDIP.TXT";
uci1 59:21128cc24b04 25 const char* const SnConfigFrame::kDefMbedMaskFilen = "/local/MBEDMASK.TXT";
uci1 59:21128cc24b04 26 const char* const SnConfigFrame::kDefMbedGateFilen = "/local/MBEDGATE.TXT";
uci1 67:ec999336fcd1 27 #endif
uci1 67:ec999336fcd1 28
uci1 28:484943132bb0 29 const char* const SnConfigFrame::kDefIPflag = "DEF";
uci1 1:e392595b4b76 30 const uint32_t SnConfigFrame::kMinCommWinPrdLowPwr = 14400; // exclusive min low power comm win period (s)
uci1 1:e392595b4b76 31 const uint32_t SnConfigFrame::kMaxCommWinPrdLowPwr = 259200; // exclusive max low power comm win period (s)
uci1 1:e392595b4b76 32 const uint32_t SnConfigFrame::kMinCommWinDurLowPwr = 300; // exclusive min low power comm win duration (s)
uci1 1:e392595b4b76 33 const uint32_t SnConfigFrame::kMaxCommWinDurLowPwr = 3600; // exclusive max low power comm win duration (s)
uci1 1:e392595b4b76 34 const uint8_t SnConfigFrame::kConfLblLen;
uci1 0:664899e0b988 35
uci1 0:664899e0b988 36 uint64_t SnConfigFrame::fgMacAdr = 0;
uci1 0:664899e0b988 37
uci1 0:664899e0b988 38 void SnConfigFrame::SetMacAddress() {
uci1 0:664899e0b988 39 static const uint8_t b64 = sizeof(uint64_t);
uci1 0:664899e0b988 40 static char c[b64];
uci1 67:ec999336fcd1 41 // NOTE: the function below may not be the one provided by MBED!
uci1 67:ec999336fcd1 42 // see main.cpp
uci1 0:664899e0b988 43 mbed_mac_address(&(c[0]));
uci1 0:664899e0b988 44 // like a big endian union
uci1 0:664899e0b988 45 fgMacAdr = 0;
uci1 0:664899e0b988 46 const char* a = c+(b64-1);
uci1 0:664899e0b988 47 for (uint8_t i=0; i<b64; i++, a--) {
uci1 0:664899e0b988 48 fgMacAdr |= static_cast<uint64_t>(*a) << (i<<3);
uci1 0:664899e0b988 49 }
uci1 67:ec999336fcd1 50 #ifdef DEBUG
uci1 67:ec999336fcd1 51 printf("MAC=%012llX\r\n", fgMacAdr>>16); // 64 -> 48 bits
uci1 67:ec999336fcd1 52 #endif
uci1 0:664899e0b988 53 }
uci1 0:664899e0b988 54
uci1 0:664899e0b988 55 void SnConfigFrame::SetHardDefaults() {
uci1 67:ec999336fcd1 56 sprintf(fLabel,"Stn20HardDefaults");
uci1 0:664899e0b988 57 fConfTime = 1338854400u; // Tue, 05 Jun 2012 00:00:00 GMT
uci1 0:664899e0b988 58 fRun = 0;
uci1 40:1324da35afd4 59 fFirstSeq = 0;
uci1 54:ea1234a44fe8 60 fEvtsPerSeq = 300;
uci1 56:0bba0ef15697 61 #if CHIPBOARD==ATWD4CH
uci1 67:ec999336fcd1 62 fRunMode = kRSListOneCW;
uci1 1:e392595b4b76 63 fStreamHiLoPlas = 0;
uci1 67:ec999336fcd1 64 #else // not ATWD4CH
uci1 67:ec999336fcd1 65 fRunMode = kDualThreshBit | kDiffTrigBit | kRSListOneCW;
uci1 56:0bba0ef15697 66 #endif
uci1 0:664899e0b988 67 fWvLoseLSB = 0;
uci1 1:e392595b4b76 68 fWvLoseMSB = 4;
uci1 0:664899e0b988 69 fWvBaseline = 0;
uci1 67:ec999336fcd1 70 fDatPackType = kSDcard | kIrid | kAfar | kUSB;
uci1 0:664899e0b988 71 uint16_t* dc = &(fDAC[0][0]);
uci1 0:664899e0b988 72 for (uint16_t i=0; i<kTotDacs; i++, dc++) {
uci1 0:664899e0b988 73 *dc = 3072u;
uci1 0:664899e0b988 74 }
uci1 56:0bba0ef15697 75 #if CHIPBOARD==ATWD4CH
uci1 0:664899e0b988 76 fNumPlas = 1;
uci1 0:664899e0b988 77 uint16_t* pl = &(fPLA[0]);
uci1 0:664899e0b988 78 for (uint8_t j=0; j<kNplas; j++, pl++) {
uci1 0:664899e0b988 79 *pl = 0x7FFFu;
uci1 0:664899e0b988 80 }
uci1 56:0bba0ef15697 81 #endif
uci1 28:484943132bb0 82 fNumCardsMajLog = 2;
uci1 54:ea1234a44fe8 83 fEnableThermTrig = 0;
uci1 67:ec999336fcd1 84 fForceTrigPeriod = 0;
uci1 0:664899e0b988 85 fHeartBeatPeriod = 0;
uci1 0:664899e0b988 86 fAmpsOn = 0x0Fu;
uci1 67:ec999336fcd1 87 fEvtThrtlPeriodMs = 0;
uci1 67:ec999336fcd1 88 fPowerMode = kIridComWin;
uci1 39:2f17131d22a5 89 fBatVoltToLowPwr = 0;
uci1 39:2f17131d22a5 90 fBatVoltFromLowPwr = 0;
uci1 67:ec999336fcd1 91 fVoltCheckPeriod = 127u;
uci1 54:ea1234a44fe8 92 fCommWinPeriod = 600u;
uci1 1:e392595b4b76 93 fCommWinDuration = 600u;
uci1 28:484943132bb0 94 fCommSendData = static_cast<int16_t>(kUseBits);
uci1 0:664899e0b988 95 fCommWinPrdLowPwr = 86100u;
uci1 0:664899e0b988 96 fCommWinDurLowPwr = 300u;
uci1 40:1324da35afd4 97 fCommWinConnectTOMin = 3u;
uci1 40:1324da35afd4 98 fCommWinListenTOMin = 3u;
uci1 22:f957c4f840ad 99 fWatchDogPeriod = WDFAILSAFE;
uci1 67:ec999336fcd1 100 #if CHIPBOARD==ATWD4CH
uci1 56:0bba0ef15697 101 fTempCheckPeriod = 0;
uci1 67:ec999336fcd1 102 #else // note ATWD4CH
uci1 67:ec999336fcd1 103 fTempCheckPeriod = 8;
uci1 67:ec999336fcd1 104 #endif
uci1 28:484943132bb0 105 SetDefaultIPs();
uci1 8:95a325df1f6b 106 fIsLowPower = false;
uci1 8:95a325df1f6b 107 memcpy(fNormLabel, fLabel, kConfLblLen);
uci1 8:95a325df1f6b 108 fNormPowerMode = fPowerMode;
uci1 8:95a325df1f6b 109
uci1 54:ea1234a44fe8 110 ApplyConnectListenSafetyNets();
uci1 8:95a325df1f6b 111 }
uci1 8:95a325df1f6b 112
uci1 28:484943132bb0 113 void SnConfigFrame::SetDefaultRemoteServ() {
uci1 59:21128cc24b04 114 if (false==ReadDefaultRemoteServer()) {
uci1 59:21128cc24b04 115 sprintf(fRemoteServer,"%s","128.195.204.151");
uci1 59:21128cc24b04 116 }
uci1 28:484943132bb0 117 }
uci1 28:484943132bb0 118
uci1 28:484943132bb0 119 void SnConfigFrame::SetDefaultRemotePort() {
uci1 59:21128cc24b04 120 if (false==ReadDefaultRemotePort()) {
uci1 59:21128cc24b04 121 fRemotePort = 6655;
uci1 59:21128cc24b04 122 }
uci1 28:484943132bb0 123 }
uci1 28:484943132bb0 124
uci1 28:484943132bb0 125 void SnConfigFrame::SetDefaultMbedIP() {
uci1 59:21128cc24b04 126 // see ReadDefaultIPFile
uci1 59:21128cc24b04 127 //
uci1 59:21128cc24b04 128 // these hardcoded defaults are only here
uci1 59:21128cc24b04 129 // "in case". they make it difficult/impossible
uci1 59:21128cc24b04 130 // to swap boards in the field without internet
uci1 59:21128cc24b04 131 // access to change the mbed program
uci1 28:484943132bb0 132 const uint64_t ip = GetMacAddress();
uci1 59:21128cc24b04 133 if (false==ReadDefaultMbedIP()) {
uci1 59:21128cc24b04 134 switch (ip) {
uci1 67:ec999336fcd1 135 case 0x0002F7F0AEE00000: // stn 20, atwd mb 1
uci1 67:ec999336fcd1 136 sprintf(fMbedIP,"%s","157.132.94.30");
uci1 67:ec999336fcd1 137 break;
uci1 59:21128cc24b04 138 case 0x0002F7F2244B0000: // stn 13, board 102
uci1 59:21128cc24b04 139 sprintf(fMbedIP,"%s","157.132.94.31");
uci1 59:21128cc24b04 140 break;
uci1 59:21128cc24b04 141 case 0x0002F7F20A9C0000: // stn 14, board 104
uci1 59:21128cc24b04 142 sprintf(fMbedIP,"%s","157.132.94.33");
uci1 59:21128cc24b04 143 break;
uci1 67:ec999336fcd1 144 case 0x0002F7F21A8A0000: // board 111
uci1 67:ec999336fcd1 145 sprintf(fMbedIP,"%s","157.132.94.34");
uci1 67:ec999336fcd1 146 break;
uci1 67:ec999336fcd1 147 case 0x0002F7F0C3B60000: // station 3, atwd mb 5
uci1 59:21128cc24b04 148 sprintf(fMbedIP,"%s","157.132.94.35");
uci1 59:21128cc24b04 149 break;
uci1 59:21128cc24b04 150 case 0x0002F7F0C41C0000: // station 4
uci1 67:ec999336fcd1 151 case 0x0002F7F1F7A80000: // stn 15, board 110
uci1 59:21128cc24b04 152 sprintf(fMbedIP,"%s","157.132.94.37");
uci1 59:21128cc24b04 153 break;
uci1 67:ec999336fcd1 154 case 0x0002F7F0C61A0000: // station 10, atwd mb 8
uci1 59:21128cc24b04 155 sprintf(fMbedIP,"%s","157.132.94.39");
uci1 59:21128cc24b04 156 break;
uci1 59:21128cc24b04 157 case 0x0002F7F0C4450000: // station 6
uci1 59:21128cc24b04 158 case 0x0002F7F1E9ED0000: // board 108
uci1 67:ec999336fcd1 159 case 0x0002F7F224440000: // stn 19, board 105
uci1 59:21128cc24b04 160 sprintf(fMbedIP,"%s","157.132.94.41");
uci1 59:21128cc24b04 161 break;
uci1 59:21128cc24b04 162 case 0x0002F7F175B70000: // station 11
uci1 59:21128cc24b04 163 case 0x0002F7F1F2120000: // board 113
uci1 67:ec999336fcd1 164 case 0x0002F7F202C10000: // stn 17, board 109
uci1 59:21128cc24b04 165 sprintf(fMbedIP,"%s","157.132.94.43");
uci1 59:21128cc24b04 166 break;
uci1 59:21128cc24b04 167 default: // what??
uci1 59:21128cc24b04 168 sprintf(fMbedIP,"%s","157.132.94.45"); // usually for tent
uci1 59:21128cc24b04 169 break;
uci1 59:21128cc24b04 170 };
uci1 59:21128cc24b04 171 }
uci1 28:484943132bb0 172 }
uci1 28:484943132bb0 173 // brian dornick 3107
uci1 28:484943132bb0 174 void SnConfigFrame::SetDefaultMaskIP() {
uci1 59:21128cc24b04 175 if (false==ReadDefaultMbedMask()) {
uci1 59:21128cc24b04 176 sprintf(fMbedMask,"%s","255.255.255.0");
uci1 59:21128cc24b04 177 }
uci1 28:484943132bb0 178 }
uci1 28:484943132bb0 179
uci1 28:484943132bb0 180 void SnConfigFrame::SetDefaultGateIP() {
uci1 59:21128cc24b04 181 if (false==ReadDefaultMbedGate()) {
uci1 59:21128cc24b04 182 sprintf(fMbedGate,"%s","157.132.94.1");
uci1 59:21128cc24b04 183 }
uci1 59:21128cc24b04 184 }
uci1 59:21128cc24b04 185
uci1 67:ec999336fcd1 186 #ifdef USE_INTERFACE_CHIP
uci1 59:21128cc24b04 187 bool SnConfigFrame::ReadOneIPFrom(const char* ipfname,
uci1 59:21128cc24b04 188 char* ipstr) {
uci1 59:21128cc24b04 189 bool ok = false;
uci1 59:21128cc24b04 190 FILE* ipf = fopen(ipfname, "r");
uci1 59:21128cc24b04 191 if (ipf!=0) {
uci1 59:21128cc24b04 192 uint8_t ipbytes[4] = {0,0,0,0};
uci1 59:21128cc24b04 193 const int nr = fscanf(ipf,"%hhu.%hhu.%hhu.%hhu\n",
uci1 59:21128cc24b04 194 &(ipbytes[0]), &(ipbytes[1]),
uci1 59:21128cc24b04 195 &(ipbytes[2]), &(ipbytes[3]));
uci1 59:21128cc24b04 196 if (4==nr) {
uci1 59:21128cc24b04 197 const int nc =
uci1 59:21128cc24b04 198 sprintf(ipstr,"%hhu.%hhu.%hhu.%hhu",
uci1 59:21128cc24b04 199 ipbytes[0], ipbytes[1],
uci1 59:21128cc24b04 200 ipbytes[2], ipbytes[3]);
uci1 59:21128cc24b04 201 ok = nc>0;
uci1 59:21128cc24b04 202 }
uci1 59:21128cc24b04 203 }
uci1 59:21128cc24b04 204 fclose(ipf);
uci1 59:21128cc24b04 205 #ifdef DEBUG
uci1 59:21128cc24b04 206 printf("ReadOneIPInto : ipstr=[%s], ok=%d\r\n",
uci1 59:21128cc24b04 207 ipstr, (int)ok);
uci1 59:21128cc24b04 208 #endif
uci1 59:21128cc24b04 209 return ok;
uci1 59:21128cc24b04 210 }
uci1 67:ec999336fcd1 211 #endif
uci1 59:21128cc24b04 212
uci1 59:21128cc24b04 213 bool SnConfigFrame::ReadDefaultRemoteServer() {
uci1 67:ec999336fcd1 214 #ifdef USE_INTERFACE_CHIP
uci1 59:21128cc24b04 215 const bool ok = ReadOneIPFrom(kDefRemIpFilen, fRemoteServer);
uci1 59:21128cc24b04 216 #ifdef DEBUG
uci1 59:21128cc24b04 217 printf("remote = %s\r\n", fRemoteServer);
uci1 59:21128cc24b04 218 #endif
uci1 59:21128cc24b04 219 return ok;
uci1 67:ec999336fcd1 220 #else // do not USE_INTERFACE_CHIP
uci1 67:ec999336fcd1 221 return false;
uci1 67:ec999336fcd1 222 #endif // USE_INTERFACE_CHIP
uci1 59:21128cc24b04 223 }
uci1 59:21128cc24b04 224
uci1 59:21128cc24b04 225 bool SnConfigFrame::ReadDefaultRemotePort() {
uci1 67:ec999336fcd1 226 #ifdef USE_INTERFACE_CHIP
uci1 59:21128cc24b04 227 bool ok = false;
uci1 59:21128cc24b04 228 FILE* pf = fopen(kDefRemPortFilen, "r");
uci1 59:21128cc24b04 229 if (pf!=0) {
uci1 59:21128cc24b04 230 ok = (1==fscanf(pf, "%hu\n", &fRemotePort));
uci1 59:21128cc24b04 231 }
uci1 59:21128cc24b04 232 fclose(pf);
uci1 59:21128cc24b04 233 #ifdef DEBUG
uci1 59:21128cc24b04 234 printf("port = %hu\r\n", fRemotePort);
uci1 59:21128cc24b04 235 #endif
uci1 59:21128cc24b04 236 return ok;
uci1 67:ec999336fcd1 237 #else // do not USE_INTERFACE_CHIP
uci1 67:ec999336fcd1 238 return false;
uci1 67:ec999336fcd1 239 #endif // USE_INTERFACE_CHIP
uci1 59:21128cc24b04 240 }
uci1 59:21128cc24b04 241
uci1 59:21128cc24b04 242 bool SnConfigFrame::ReadDefaultMbedIP() {
uci1 67:ec999336fcd1 243 #ifdef USE_INTERFACE_CHIP
uci1 59:21128cc24b04 244 const bool ok = ReadOneIPFrom(kDefMbedIPFilen, fMbedIP);
uci1 59:21128cc24b04 245 #ifdef DEBUG
uci1 59:21128cc24b04 246 printf("mbed = %s\r\n", fMbedIP);
uci1 59:21128cc24b04 247 #endif
uci1 59:21128cc24b04 248 return ok;
uci1 67:ec999336fcd1 249 #else // do not USE_INTERFACE_CHIP
uci1 67:ec999336fcd1 250 return false;
uci1 67:ec999336fcd1 251 #endif // USE_INTERFACE_CHIP
uci1 59:21128cc24b04 252 }
uci1 59:21128cc24b04 253
uci1 59:21128cc24b04 254 bool SnConfigFrame::ReadDefaultMbedMask() {
uci1 67:ec999336fcd1 255 #ifdef USE_INTERFACE_CHIP
uci1 59:21128cc24b04 256 const bool ok = ReadOneIPFrom(kDefMbedMaskFilen, fMbedMask);
uci1 59:21128cc24b04 257 #ifdef DEBUG
uci1 59:21128cc24b04 258 printf("mask = %s\r\n", fMbedMask);
uci1 59:21128cc24b04 259 #endif
uci1 59:21128cc24b04 260 return ok;
uci1 67:ec999336fcd1 261 #else // do not USE_INTERFACE_CHIP
uci1 67:ec999336fcd1 262 return false;
uci1 67:ec999336fcd1 263 #endif // USE_INTERFACE_CHIP
uci1 59:21128cc24b04 264 }
uci1 59:21128cc24b04 265
uci1 59:21128cc24b04 266 bool SnConfigFrame::ReadDefaultMbedGate() {
uci1 67:ec999336fcd1 267 #ifdef USE_INTERFACE_CHIP
uci1 59:21128cc24b04 268 const bool ok = ReadOneIPFrom(kDefMbedGateFilen, fMbedGate);
uci1 59:21128cc24b04 269 #ifdef DEBUG
uci1 59:21128cc24b04 270 printf("gate = %s\r\n", fMbedGate);
uci1 59:21128cc24b04 271 #endif
uci1 59:21128cc24b04 272 return ok;
uci1 67:ec999336fcd1 273 #else // do not USE_INTERFACE_CHIP
uci1 67:ec999336fcd1 274 return false;
uci1 67:ec999336fcd1 275 #endif // USE_INTERFACE_CHIP
uci1 59:21128cc24b04 276 }
uci1 59:21128cc24b04 277
uci1 28:484943132bb0 278
uci1 28:484943132bb0 279 void SnConfigFrame::SetDefaultIPs() {
uci1 59:21128cc24b04 280 GetMacAddress(); // just to make sure it gets read
uci1 67:ec999336fcd1 281 SetDefaultRemoteServ();
uci1 67:ec999336fcd1 282 SetDefaultRemotePort();
uci1 67:ec999336fcd1 283 SetDefaultMbedIP();
uci1 67:ec999336fcd1 284 SetDefaultMaskIP();
uci1 67:ec999336fcd1 285 SetDefaultGateIP();
uci1 28:484943132bb0 286 }
uci1 28:484943132bb0 287
uci1 40:1324da35afd4 288 void SnConfigFrame::ApplyConnectListenSafetyNets() {
uci1 40:1324da35afd4 289 if (fCommWinConnectTOMin<kDefTimeoutMin) {
uci1 40:1324da35afd4 290 fCommWinConnectTOMin=kDefTimeoutMin;
uci1 40:1324da35afd4 291 }
uci1 56:0bba0ef15697 292 if (fCommWinConnectTOMin>(fCommWinDuration/(60.*static_cast<float>(kNcomms)))) {
uci1 40:1324da35afd4 293 fCommWinConnectTOMin=kDefTimeoutMin;
uci1 40:1324da35afd4 294 }
uci1 40:1324da35afd4 295 if (fCommWinListenTOMin<kDefTimeoutMin) {
uci1 40:1324da35afd4 296 fCommWinListenTOMin=kDefTimeoutMin;
uci1 40:1324da35afd4 297 }
uci1 56:0bba0ef15697 298 if (fCommWinListenTOMin>(fCommWinDuration/(60.*static_cast<float>(kNcomms)))) {
uci1 40:1324da35afd4 299 fCommWinListenTOMin=kDefTimeoutMin;
uci1 40:1324da35afd4 300 }
uci1 40:1324da35afd4 301 }
uci1 40:1324da35afd4 302
uci1 28:484943132bb0 303 void SnConfigFrame::ApplySafetyNets() {
uci1 40:1324da35afd4 304 if (fFirstSeq>kMaxFirstSeq) {
uci1 40:1324da35afd4 305 fFirstSeq=kMaxFirstSeq;
uci1 40:1324da35afd4 306 }
uci1 56:0bba0ef15697 307 #if CHIPBOARD==ATWD4CH
uci1 28:484943132bb0 308 if (fNumPlas>kNplas) {
uci1 28:484943132bb0 309 fNumPlas=kNplas;
uci1 28:484943132bb0 310 }
uci1 56:0bba0ef15697 311 #endif
uci1 28:484943132bb0 312 if (fNumCardsMajLog>kNchans) {
uci1 28:484943132bb0 313 fNumCardsMajLog=kNchans;
uci1 28:484943132bb0 314 }
uci1 28:484943132bb0 315 if (fNumCardsMajLog<1u) {
uci1 28:484943132bb0 316 fNumCardsMajLog=1u;
uci1 28:484943132bb0 317 }
uci1 28:484943132bb0 318 if ( (fForceTrigPeriod>0) &&
uci1 28:484943132bb0 319 (fForceTrigPeriod<kMinForcePer) ) {
uci1 28:484943132bb0 320 fForceTrigPeriod = kMinForcePer;
uci1 28:484943132bb0 321 }
uci1 28:484943132bb0 322 if (fEvtThrtlPeriodMs>kMaxThrottlePerMs) {
uci1 28:484943132bb0 323 fEvtThrtlPeriodMs=kMaxThrottlePerMs;
uci1 28:484943132bb0 324 }
uci1 28:484943132bb0 325 if ( (IsPoweredFor(kIridComWin)==false) &&
uci1 28:484943132bb0 326 (IsPoweredFor(kAfarComWin)==false) ) {
uci1 28:484943132bb0 327 EnablePowerFor(kIridComWin);
uci1 28:484943132bb0 328 EnablePowerFor(kAfarComWin);
uci1 28:484943132bb0 329 }
uci1 39:2f17131d22a5 330 if (fBatVoltToLowPwr>kMaxBatVoltLowPwr) {
uci1 39:2f17131d22a5 331 fBatVoltToLowPwr=kMaxBatVoltLowPwr;
uci1 39:2f17131d22a5 332 }
uci1 39:2f17131d22a5 333 if (fBatVoltFromLowPwr>kMaxBatVoltLowPwr) {
uci1 39:2f17131d22a5 334 fBatVoltFromLowPwr=kMaxBatVoltLowPwr;
uci1 39:2f17131d22a5 335 }
uci1 39:2f17131d22a5 336 if (fBatVoltFromLowPwr<fBatVoltToLowPwr) {
uci1 39:2f17131d22a5 337 fBatVoltFromLowPwr=fBatVoltToLowPwr;
uci1 28:484943132bb0 338 }
uci1 28:484943132bb0 339 if (fCommWinPeriod>kMaxCommWinPeriod) {
uci1 28:484943132bb0 340 fCommWinPeriod=kMaxCommWinPeriod;
uci1 28:484943132bb0 341 }
uci1 40:1324da35afd4 342 if (fCommWinPeriod<kMinCommWinPeriod) {
uci1 40:1324da35afd4 343 fCommWinPeriod=kMinCommWinPeriod;
uci1 40:1324da35afd4 344 }
uci1 28:484943132bb0 345 if (fCommWinDuration<kMinCommWinDur) {
uci1 28:484943132bb0 346 fCommWinDuration=kMinCommWinDur;
uci1 28:484943132bb0 347 }
uci1 28:484943132bb0 348 if (fCommWinPrdLowPwr>kMaxCommWinPeriod) {
uci1 28:484943132bb0 349 fCommWinPrdLowPwr=kMaxCommWinPeriod;
uci1 28:484943132bb0 350 }
uci1 28:484943132bb0 351 if (fCommWinDurLowPwr<kMinCommWinDur) {
uci1 28:484943132bb0 352 fCommWinDurLowPwr=kMinCommWinDur;
uci1 28:484943132bb0 353 }
uci1 40:1324da35afd4 354 ApplyConnectListenSafetyNets();
uci1 28:484943132bb0 355 if (fWatchDogPeriod>kMaxWatchDogPer) {
uci1 28:484943132bb0 356 fWatchDogPeriod=kMaxWatchDogPer;
uci1 28:484943132bb0 357 }
uci1 28:484943132bb0 358 if (fWatchDogPeriod<kMinWatchDogPer) {
uci1 28:484943132bb0 359 fWatchDogPeriod=kMinWatchDogPer;
uci1 28:484943132bb0 360 }
uci1 28:484943132bb0 361 }
uci1 28:484943132bb0 362
uci1 21:ce51bb0ba4a5 363 uint32_t SnConfigFrame::GetTimeoutTime(const uint32_t startTime,
uci1 21:ce51bb0ba4a5 364 const uint32_t delta) const {
uci1 40:1324da35afd4 365 // --.-----lst------.--delta--.--
uci1 40:1324da35afd4 366 // . . .
uci1 40:1324da35afd4 367 // start current returnVal
uci1 40:1324da35afd4 368 //
uci1 40:1324da35afd4 369 // lio=lst+delta bound by comm wind dur
uci1 40:1324da35afd4 370 // returns start + lio
uci1 40:1324da35afd4 371
uci1 21:ce51bb0ba4a5 372 const uint32_t ct = time(0);
uci1 40:1324da35afd4 373 uint32_t lst = ct-startTime;
uci1 21:ce51bb0ba4a5 374 if ( (ct<startTime) || (ct==0) ||
uci1 21:ce51bb0ba4a5 375 (lst>kSecsPerDay) ) {
uci1 21:ce51bb0ba4a5 376 // possible clock problems
uci1 40:1324da35afd4 377 lst = static_cast<uint32_t>(kDefTimeoutMin)*60u;
uci1 21:ce51bb0ba4a5 378 }
uci1 21:ce51bb0ba4a5 379 const uint32_t lio =
uci1 21:ce51bb0ba4a5 380 ((lst+delta) < GetCommWinDuration()) ?
uci1 21:ce51bb0ba4a5 381 lst+delta : GetCommWinDuration();
uci1 21:ce51bb0ba4a5 382 return lio+startTime;
uci1 21:ce51bb0ba4a5 383 }
uci1 21:ce51bb0ba4a5 384
uci1 8:95a325df1f6b 385 void SnConfigFrame::ChangeToLowPower() {
uci1 8:95a325df1f6b 386
uci1 8:95a325df1f6b 387 // save old label
uci1 8:95a325df1f6b 388 memcpy(fNormLabel, fLabel, kConfLblLen);
uci1 8:95a325df1f6b 389
uci1 8:95a325df1f6b 390 // append label
uci1 8:95a325df1f6b 391 // this will allow the new config to be put in the DB
uci1 8:95a325df1f6b 392 int slen = strlen(fLabel);
uci1 8:95a325df1f6b 393 static const char* tag = "_LOWPOW";
uci1 8:95a325df1f6b 394 const int ml = strlen(tag)+1;
uci1 8:95a325df1f6b 395 if (slen > (kConfLblLen-ml) ) {
uci1 8:95a325df1f6b 396 memset(fLabel+kConfLblLen-ml, '\0', ml);
uci1 8:95a325df1f6b 397 }
uci1 8:95a325df1f6b 398 strncat(fLabel, tag, ml-1);
uci1 8:95a325df1f6b 399
uci1 8:95a325df1f6b 400 // save power settings
uci1 8:95a325df1f6b 401 fNormPowerMode = fPowerMode;
uci1 8:95a325df1f6b 402
uci1 8:95a325df1f6b 403 // change power settings
uci1 8:95a325df1f6b 404 DisablePowerFor(kAmpsDatTak);
uci1 8:95a325df1f6b 405 DisablePowerFor(kCardDatTak);
uci1 8:95a325df1f6b 406 DisablePowerFor(kIridDatTak);
uci1 8:95a325df1f6b 407 DisablePowerFor(kAfarDatTak);
uci1 8:95a325df1f6b 408 DisablePowerFor(kAmpsComWin);
uci1 8:95a325df1f6b 409 DisablePowerFor(kCardComWin);
uci1 56:0bba0ef15697 410 if ( IsSBDonlyLowPwrMode() ) {
uci1 56:0bba0ef15697 411 EnablePowerFor(kIridComWin);
uci1 56:0bba0ef15697 412 DisablePowerFor(kAfarComWin);
uci1 56:0bba0ef15697 413 } else if ( (IsPoweredFor(kIridComWin)==false) &&
uci1 56:0bba0ef15697 414 (IsPoweredFor(kAfarComWin)==false) ) {
uci1 8:95a325df1f6b 415 // TODO: turn on only iridum maybe?
uci1 8:95a325df1f6b 416 EnablePowerFor(kIridComWin);
uci1 8:95a325df1f6b 417 EnablePowerFor(kAfarComWin);
uci1 56:0bba0ef15697 418 } // else same as normal for Irid and Afar Com Win
uci1 56:0bba0ef15697 419
uci1 8:95a325df1f6b 420 // set mode to low power
uci1 8:95a325df1f6b 421 fIsLowPower = true;
uci1 8:95a325df1f6b 422 }
uci1 8:95a325df1f6b 423
uci1 8:95a325df1f6b 424 void SnConfigFrame::ChangeToNormPower() {
uci1 8:95a325df1f6b 425 // put label back
uci1 8:95a325df1f6b 426 memcpy(fLabel, fNormLabel, kConfLblLen);
uci1 8:95a325df1f6b 427 // put power settings back
uci1 8:95a325df1f6b 428 fPowerMode = fNormPowerMode;
uci1 8:95a325df1f6b 429 // set mode to normal
uci1 8:95a325df1f6b 430 fIsLowPower = false;
uci1 0:664899e0b988 431 }
uci1 0:664899e0b988 432
uci1 0:664899e0b988 433 void SnConfigFrame::GetPackParsFor(const EDatPackBit d,
uci1 0:664899e0b988 434 uint8_t& loseLSB, uint8_t& loseMSB,
uci1 0:664899e0b988 435 uint16_t& wvBase) const {
uci1 0:664899e0b988 436 const bool pack = IsDatPackedFor(d);
uci1 0:664899e0b988 437 loseLSB = pack ? GetWvLoseLSB() : 0u;
uci1 0:664899e0b988 438 loseMSB = pack ? GetWvLoseMSB() : 0u;
uci1 0:664899e0b988 439 wvBase = pack ? GetWvBaseline() : 0u;
uci1 0:664899e0b988 440 }
uci1 0:664899e0b988 441
uci1 0:664899e0b988 442 void SnConfigFrame::GetHiLoPlas(const uint16_t pla,
uci1 0:664899e0b988 443 uint16_t& hiPla,
uci1 0:664899e0b988 444 uint16_t& loPla,
uci1 0:664899e0b988 445 const bool r2l) {
uci1 0:664899e0b988 446 // split the PLA bitword into 2: one for the high threshold
uci1 0:664899e0b988 447 // and one for the low threshold. "lows" in the string will become
uci1 0:664899e0b988 448 // "highs" in the low threshold PLA.
uci1 0:664899e0b988 449 //
uci1 0:664899e0b988 450 // example 1)
uci1 0:664899e0b988 451 // PLA string = HLHL....
uci1 0:664899e0b988 452 // hi thresh = H.H.....
uci1 0:664899e0b988 453 // lo thresh = .H.H....
uci1 0:664899e0b988 454 //
uci1 0:664899e0b988 455 // example 2)
uci1 0:664899e0b988 456 // PLA string = HBL.....
uci1 0:664899e0b988 457 // hi thresh = HL......
uci1 0:664899e0b988 458 // lo thresh = .LH.....
uci1 0:664899e0b988 459 //
uci1 0:664899e0b988 460 // (with . = A here, to make the example more readable)
uci1 0:664899e0b988 461 //
uci1 0:664899e0b988 462 // A = 11, B = 00
uci1 0:664899e0b988 463 // H = 01 or 10, alternating
uci1 0:664899e0b988 464 // L = 10 or 01, alternating
uci1 0:664899e0b988 465 // 01 at leftmost bits is H
uci1 0:664899e0b988 466 // for example:
uci1 0:664899e0b988 467 // 0x7FFF = 01 11 11 11 11 11 11 11
uci1 0:664899e0b988 468 // => HAAAAAAA for LEFT TO RIGHT
uci1 0:664899e0b988 469 // => AAAAAAAH for RIGHT TO LEFT
uci1 0:664899e0b988 470 // 0x56FF = 01 01 01 10 11 11 11 11
uci1 0:664899e0b988 471 // => HLHHAAAA for LEFT TO RIGHT
uci1 0:664899e0b988 472 // => AAAAHHLH for RIGHT TO LEFT
uci1 0:664899e0b988 473 //
uci1 0:664899e0b988 474 // so HHHHHHHH is
uci1 0:664899e0b988 475 // 01 10 01 10 01 10 01 10 always (r2l or l2r)
uci1 0:664899e0b988 476 //
uci1 0:664899e0b988 477 // r2l = whether to read bits right to left (true) or not (false)
uci1 0:664899e0b988 478 // Mahshid liked right to left
uci1 0:664899e0b988 479 // Liang liked left to right
uci1 0:664899e0b988 480 // so we allow for either
uci1 0:664899e0b988 481
uci1 0:664899e0b988 482 const int8_t start = (r2l) ? 0 : BITS_IN_SHORT-2;
uci1 0:664899e0b988 483 const int8_t end = (r2l) ? BITS_IN_SHORT : -2;
uci1 39:2f17131d22a5 484 const int8_t step = (r2l) ? 2 : -2;
uci1 0:664899e0b988 485
uci1 0:664899e0b988 486 uint8_t hi= (r2l) ? 0x2 : 0x1;
uci1 0:664899e0b988 487 uint8_t lo= (r2l) ? 0x1 : 0x2;
uci1 0:664899e0b988 488
uci1 0:664899e0b988 489 // set all bits to 0
uci1 0:664899e0b988 490 hiPla = 0;
uci1 0:664899e0b988 491 loPla = 0;
uci1 0:664899e0b988 492
uci1 0:664899e0b988 493 for (int8_t i=start; i!=end; i+=step, hi^=0x3, lo^=0x3) {
uci1 0:664899e0b988 494 const uint8_t b = (pla & (0x3<<i)) >> i;
uci1 0:664899e0b988 495 if (b==hi) {
uci1 0:664899e0b988 496 hiPla |= hi << i;
uci1 0:664899e0b988 497 loPla |= 0x3 << i;
uci1 0:664899e0b988 498 } else if (b==lo) {
uci1 0:664899e0b988 499 hiPla |= 0x3 << i;
uci1 0:664899e0b988 500 loPla |= hi << i;
uci1 0:664899e0b988 501 } else if (b==0x3) {
uci1 0:664899e0b988 502 // any
uci1 0:664899e0b988 503 hiPla |= 0x3 << i;
uci1 0:664899e0b988 504 loPla |= 0x3 << i;
uci1 0:664899e0b988 505 } else {
uci1 0:664899e0b988 506 // no check that b is something else.. should be impossible.
uci1 0:664899e0b988 507 // between
uci1 0:664899e0b988 508 hiPla |= lo << i;
uci1 0:664899e0b988 509 loPla |= lo << i;
uci1 0:664899e0b988 510 }
uci1 0:664899e0b988 511 }
uci1 0:664899e0b988 512
uci1 0:664899e0b988 513 }
uci1 0:664899e0b988 514
uci1 0:664899e0b988 515 bool SnConfigFrame::ReadFromFile(const char* cfile) {
uci1 0:664899e0b988 516 // intended only for reading default config file
uci1 0:664899e0b988 517
uci1 3:24c5f0f50bf1 518 /*
uci1 3:24c5f0f50bf1 519 DIR* d;
uci1 3:24c5f0f50bf1 520 struct dirent* dent;
uci1 3:24c5f0f50bf1 521 printf("files in /local:\r\n");
uci1 3:24c5f0f50bf1 522 if ( (d = opendir( "/local" ))!=NULL ) {
uci1 3:24c5f0f50bf1 523 while ( (dent = readdir(d))!=NULL ) {
uci1 3:24c5f0f50bf1 524 printf("%s\r\n",dent->d_name);
uci1 3:24c5f0f50bf1 525 }
uci1 3:24c5f0f50bf1 526 closedir(d);
uci1 3:24c5f0f50bf1 527 }
uci1 3:24c5f0f50bf1 528 */
uci1 56:0bba0ef15697 529 #ifdef DEBUG
uci1 56:0bba0ef15697 530 printf("trying to read config [%s]\r\n",cfile);
uci1 56:0bba0ef15697 531 #endif
uci1 0:664899e0b988 532 bool ret = false;
uci1 0:664899e0b988 533 FILE* cf = fopen(cfile,"rb");
uci1 0:664899e0b988 534 if (cf!=0) {
uci1 56:0bba0ef15697 535 #ifdef DEBUG
uci1 56:0bba0ef15697 536 printf("opened file\r\n");
uci1 56:0bba0ef15697 537 #endif
uci1 16:744ce85aede2 538 // check the header and file size to be
uci1 16:744ce85aede2 539 // protect a bit against corruption
uci1 16:744ce85aede2 540 uint8_t hc; uint32_t hl;
uci1 16:744ce85aede2 541 SnHeaderFrame::ReadFrom(cf, hc, hl);
uci1 56:0bba0ef15697 542 #ifdef DEBUG
uci1 56:0bba0ef15697 543 printf("hc=%hhu, hl=%u\r\n",hc,hl);
uci1 56:0bba0ef15697 544 #endif
uci1 16:744ce85aede2 545 if (hc==SnHeaderFrame::kConfigCode) {
uci1 16:744ce85aede2 546 const int fpos = ftell(cf);
uci1 16:744ce85aede2 547 // how many bytes?
uci1 16:744ce85aede2 548 fseek(cf, 0, SEEK_END); // go to end
uci1 16:744ce85aede2 549 const int fend = ftell(cf);
uci1 16:744ce85aede2 550 fseek(cf, fpos, SEEK_SET); // go back
uci1 56:0bba0ef15697 551
uci1 56:0bba0ef15697 552 #ifdef DEBUG
uci1 56:0bba0ef15697 553 printf("fend-fpos=%d-%d=%d\r\n",fend,fpos,fend-fpos);
uci1 56:0bba0ef15697 554 #endif
uci1 16:744ce85aede2 555 if (hl == fend-fpos) {
uci1 16:744ce85aede2 556 ReadFrom(cf);
uci1 16:744ce85aede2 557 ret = (ferror(cf)==0);
uci1 56:0bba0ef15697 558 #ifdef DEBUG
uci1 56:0bba0ef15697 559 printf("ret = %d\r\n",(int)ret);
uci1 56:0bba0ef15697 560 #endif
uci1 16:744ce85aede2 561 }
uci1 16:744ce85aede2 562 }
uci1 0:664899e0b988 563 fclose(cf);
uci1 0:664899e0b988 564 }
uci1 0:664899e0b988 565 return ret;
uci1 0:664899e0b988 566 }
uci1 0:664899e0b988 567
uci1 0:664899e0b988 568 bool SnConfigFrame::WriteToFile(const char* cfile) const {
uci1 0:664899e0b988 569 // intended only for writing default config file
uci1 0:664899e0b988 570
uci1 0:664899e0b988 571 bool ret = false;
uci1 0:664899e0b988 572 FILE* cf = fopen(cfile,"wb");
uci1 0:664899e0b988 573 if (cf!=0) {
uci1 0:664899e0b988 574 WriteTo(cf);
uci1 0:664899e0b988 575 ret = (ferror(cf)==0);
uci1 0:664899e0b988 576 fclose(cf);
uci1 0:664899e0b988 577 }
uci1 0:664899e0b988 578 return ret;
uci1 0:664899e0b988 579 }