Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Mon Feb 23 02:16:45 2015 +0000
Revision:
80:5440d12fc155
Parent:
79:97c650d58640
Child:
81:6667e2adb926
Stn 10 mac adr. Option to ignore SD card. Only access run/seq list if going to send the list.

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