Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnConfigFrame.cpp@67:ec999336fcd1, 2015-02-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |