Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnConfigFrame.cpp@3:24c5f0f50bf1, 2012-07-31 (annotated)
- Committer:
- uci1
- Date:
- Tue Jul 31 04:59:16 2012 +0000
- Revision:
- 3:24c5f0f50bf1
- Parent:
- 1:e392595b4b76
- Child:
- 4:a91682e19d6b
Test bench version. Communications not completed. Debugging output present. But will read the local config file and save events that can be used for testing.
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 | 0:664899e0b988 | 5 | #include "SnBitUtils.h" |
uci1 | 0:664899e0b988 | 6 | |
uci1 | 0:664899e0b988 | 7 | extern "C" void mbed_mac_address(char *); |
uci1 | 0:664899e0b988 | 8 | |
uci1 | 0:664899e0b988 | 9 | |
uci1 | 3:24c5f0f50bf1 | 10 | const uint8_t SnConfigFrame::kIOVers = 2; |
uci1 | 3:24c5f0f50bf1 | 11 | const char* const SnConfigFrame::kDefConfFile = "/local/DEFCONF.DAT"; |
uci1 | 1:e392595b4b76 | 12 | const uint32_t SnConfigFrame::kMinCommWinPrdLowPwr = 14400; // exclusive min low power comm win period (s) |
uci1 | 1:e392595b4b76 | 13 | const uint32_t SnConfigFrame::kMaxCommWinPrdLowPwr = 259200; // exclusive max low power comm win period (s) |
uci1 | 1:e392595b4b76 | 14 | const uint32_t SnConfigFrame::kMinCommWinDurLowPwr = 300; // exclusive min low power comm win duration (s) |
uci1 | 1:e392595b4b76 | 15 | const uint32_t SnConfigFrame::kMaxCommWinDurLowPwr = 3600; // exclusive max low power comm win duration (s) |
uci1 | 1:e392595b4b76 | 16 | const uint8_t SnConfigFrame::kConfLblLen; |
uci1 | 0:664899e0b988 | 17 | |
uci1 | 0:664899e0b988 | 18 | uint64_t SnConfigFrame::fgMacAdr = 0; |
uci1 | 0:664899e0b988 | 19 | |
uci1 | 0:664899e0b988 | 20 | void SnConfigFrame::SetMacAddress() { |
uci1 | 0:664899e0b988 | 21 | static const uint8_t b64 = sizeof(uint64_t); |
uci1 | 0:664899e0b988 | 22 | static char c[b64]; |
uci1 | 0:664899e0b988 | 23 | mbed_mac_address(&(c[0])); |
uci1 | 0:664899e0b988 | 24 | // like a big endian union |
uci1 | 0:664899e0b988 | 25 | fgMacAdr = 0; |
uci1 | 0:664899e0b988 | 26 | const char* a = c+(b64-1); |
uci1 | 0:664899e0b988 | 27 | for (uint8_t i=0; i<b64; i++, a--) { |
uci1 | 0:664899e0b988 | 28 | fgMacAdr |= static_cast<uint64_t>(*a) << (i<<3); |
uci1 | 0:664899e0b988 | 29 | } |
uci1 | 0:664899e0b988 | 30 | } |
uci1 | 0:664899e0b988 | 31 | |
uci1 | 0:664899e0b988 | 32 | void SnConfigFrame::SetHardDefaults() { |
uci1 | 0:664899e0b988 | 33 | sprintf(fLabel,"HardDefaults"); |
uci1 | 0:664899e0b988 | 34 | fConfTime = 1338854400u; // Tue, 05 Jun 2012 00:00:00 GMT |
uci1 | 0:664899e0b988 | 35 | fRun = 0; |
uci1 | 0:664899e0b988 | 36 | fFirstEvt = 0; |
uci1 | 3:24c5f0f50bf1 | 37 | fEvtsPerSeq = 0; |
uci1 | 3:24c5f0f50bf1 | 38 | fRunMode = kInfSeqs; |
uci1 | 1:e392595b4b76 | 39 | fStreamHiLoPlas = 0; |
uci1 | 0:664899e0b988 | 40 | fWvLoseLSB = 0; |
uci1 | 1:e392595b4b76 | 41 | fWvLoseMSB = 4; |
uci1 | 0:664899e0b988 | 42 | fWvBaseline = 0; |
uci1 | 0:664899e0b988 | 43 | fDatPackType = ~0; |
uci1 | 0:664899e0b988 | 44 | uint16_t* dc = &(fDAC[0][0]); |
uci1 | 0:664899e0b988 | 45 | for (uint16_t i=0; i<kTotDacs; i++, dc++) { |
uci1 | 0:664899e0b988 | 46 | *dc = 3072u; |
uci1 | 0:664899e0b988 | 47 | } |
uci1 | 0:664899e0b988 | 48 | fNumPlas = 1; |
uci1 | 0:664899e0b988 | 49 | uint16_t* pl = &(fPLA[0]); |
uci1 | 0:664899e0b988 | 50 | for (uint8_t j=0; j<kNplas; j++, pl++) { |
uci1 | 0:664899e0b988 | 51 | *pl = 0x7FFFu; |
uci1 | 0:664899e0b988 | 52 | } |
uci1 | 3:24c5f0f50bf1 | 53 | fNumCardsMajLog = 1; |
uci1 | 0:664899e0b988 | 54 | fEnableThermTrig = 1; |
uci1 | 1:e392595b4b76 | 55 | fForceTrigPeriod = 67u; |
uci1 | 0:664899e0b988 | 56 | fHeartBeatPeriod = 0; |
uci1 | 0:664899e0b988 | 57 | fAmpsOn = 0x0Fu; |
uci1 | 0:664899e0b988 | 58 | fEvtThrtlPeriodMs = 50u; |
uci1 | 0:664899e0b988 | 59 | fPowerMode = 0; |
uci1 | 0:664899e0b988 | 60 | fBatVoltLowPwr = 0; |
uci1 | 0:664899e0b988 | 61 | fCommWinPeriod = 3300u; |
uci1 | 1:e392595b4b76 | 62 | fCommWinDuration = 600u; |
uci1 | 0:664899e0b988 | 63 | fCommSendData = 0; |
uci1 | 0:664899e0b988 | 64 | fCommWinPrdLowPwr = 86100u; |
uci1 | 0:664899e0b988 | 65 | fCommWinDurLowPwr = 300u; |
uci1 | 0:664899e0b988 | 66 | fWatchDogPeriod = kWDFailsafe; |
uci1 | 0:664899e0b988 | 67 | } |
uci1 | 0:664899e0b988 | 68 | |
uci1 | 0:664899e0b988 | 69 | void SnConfigFrame::GetPackParsFor(const EDatPackBit d, |
uci1 | 0:664899e0b988 | 70 | uint8_t& loseLSB, uint8_t& loseMSB, |
uci1 | 0:664899e0b988 | 71 | uint16_t& wvBase) const { |
uci1 | 0:664899e0b988 | 72 | const bool pack = IsDatPackedFor(d); |
uci1 | 0:664899e0b988 | 73 | loseLSB = pack ? GetWvLoseLSB() : 0u; |
uci1 | 0:664899e0b988 | 74 | loseMSB = pack ? GetWvLoseMSB() : 0u; |
uci1 | 0:664899e0b988 | 75 | wvBase = pack ? GetWvBaseline() : 0u; |
uci1 | 0:664899e0b988 | 76 | } |
uci1 | 0:664899e0b988 | 77 | |
uci1 | 0:664899e0b988 | 78 | void SnConfigFrame::GetHiLoPlas(const uint16_t pla, |
uci1 | 0:664899e0b988 | 79 | uint16_t& hiPla, |
uci1 | 0:664899e0b988 | 80 | uint16_t& loPla, |
uci1 | 0:664899e0b988 | 81 | const bool r2l) { |
uci1 | 0:664899e0b988 | 82 | // split the PLA bitword into 2: one for the high threshold |
uci1 | 0:664899e0b988 | 83 | // and one for the low threshold. "lows" in the string will become |
uci1 | 0:664899e0b988 | 84 | // "highs" in the low threshold PLA. |
uci1 | 0:664899e0b988 | 85 | // |
uci1 | 0:664899e0b988 | 86 | // example 1) |
uci1 | 0:664899e0b988 | 87 | // PLA string = HLHL.... |
uci1 | 0:664899e0b988 | 88 | // hi thresh = H.H..... |
uci1 | 0:664899e0b988 | 89 | // lo thresh = .H.H.... |
uci1 | 0:664899e0b988 | 90 | // |
uci1 | 0:664899e0b988 | 91 | // example 2) |
uci1 | 0:664899e0b988 | 92 | // PLA string = HBL..... |
uci1 | 0:664899e0b988 | 93 | // hi thresh = HL...... |
uci1 | 0:664899e0b988 | 94 | // lo thresh = .LH..... |
uci1 | 0:664899e0b988 | 95 | // |
uci1 | 0:664899e0b988 | 96 | // (with . = A here, to make the example more readable) |
uci1 | 0:664899e0b988 | 97 | // |
uci1 | 0:664899e0b988 | 98 | // A = 11, B = 00 |
uci1 | 0:664899e0b988 | 99 | // H = 01 or 10, alternating |
uci1 | 0:664899e0b988 | 100 | // L = 10 or 01, alternating |
uci1 | 0:664899e0b988 | 101 | // 01 at leftmost bits is H |
uci1 | 0:664899e0b988 | 102 | // for example: |
uci1 | 0:664899e0b988 | 103 | // 0x7FFF = 01 11 11 11 11 11 11 11 |
uci1 | 0:664899e0b988 | 104 | // => HAAAAAAA for LEFT TO RIGHT |
uci1 | 0:664899e0b988 | 105 | // => AAAAAAAH for RIGHT TO LEFT |
uci1 | 0:664899e0b988 | 106 | // 0x56FF = 01 01 01 10 11 11 11 11 |
uci1 | 0:664899e0b988 | 107 | // => HLHHAAAA for LEFT TO RIGHT |
uci1 | 0:664899e0b988 | 108 | // => AAAAHHLH for RIGHT TO LEFT |
uci1 | 0:664899e0b988 | 109 | // |
uci1 | 0:664899e0b988 | 110 | // so HHHHHHHH is |
uci1 | 0:664899e0b988 | 111 | // 01 10 01 10 01 10 01 10 always (r2l or l2r) |
uci1 | 0:664899e0b988 | 112 | // |
uci1 | 0:664899e0b988 | 113 | // r2l = whether to read bits right to left (true) or not (false) |
uci1 | 0:664899e0b988 | 114 | // Mahshid liked right to left |
uci1 | 0:664899e0b988 | 115 | // Liang liked left to right |
uci1 | 0:664899e0b988 | 116 | // so we allow for either |
uci1 | 0:664899e0b988 | 117 | |
uci1 | 0:664899e0b988 | 118 | const int8_t start = (r2l) ? 0 : BITS_IN_SHORT-2; |
uci1 | 0:664899e0b988 | 119 | const int8_t end = (r2l) ? BITS_IN_SHORT : -2; |
uci1 | 0:664899e0b988 | 120 | const int8_t step = (r2l) ? 2 : -2; |
uci1 | 0:664899e0b988 | 121 | |
uci1 | 0:664899e0b988 | 122 | uint8_t hi= (r2l) ? 0x2 : 0x1; |
uci1 | 0:664899e0b988 | 123 | uint8_t lo= (r2l) ? 0x1 : 0x2; |
uci1 | 0:664899e0b988 | 124 | |
uci1 | 0:664899e0b988 | 125 | // set all bits to 0 |
uci1 | 0:664899e0b988 | 126 | hiPla = 0; |
uci1 | 0:664899e0b988 | 127 | loPla = 0; |
uci1 | 0:664899e0b988 | 128 | |
uci1 | 0:664899e0b988 | 129 | for (int8_t i=start; i!=end; i+=step, hi^=0x3, lo^=0x3) { |
uci1 | 0:664899e0b988 | 130 | const uint8_t b = (pla & (0x3<<i)) >> i; |
uci1 | 0:664899e0b988 | 131 | if (b==hi) { |
uci1 | 0:664899e0b988 | 132 | hiPla |= hi << i; |
uci1 | 0:664899e0b988 | 133 | loPla |= 0x3 << i; |
uci1 | 0:664899e0b988 | 134 | } else if (b==lo) { |
uci1 | 0:664899e0b988 | 135 | hiPla |= 0x3 << i; |
uci1 | 0:664899e0b988 | 136 | loPla |= hi << i; |
uci1 | 0:664899e0b988 | 137 | } else if (b==0x3) { |
uci1 | 0:664899e0b988 | 138 | // any |
uci1 | 0:664899e0b988 | 139 | hiPla |= 0x3 << i; |
uci1 | 0:664899e0b988 | 140 | loPla |= 0x3 << i; |
uci1 | 0:664899e0b988 | 141 | } else { |
uci1 | 0:664899e0b988 | 142 | // no check that b is something else.. should be impossible. |
uci1 | 0:664899e0b988 | 143 | // between |
uci1 | 0:664899e0b988 | 144 | hiPla |= lo << i; |
uci1 | 0:664899e0b988 | 145 | loPla |= lo << i; |
uci1 | 0:664899e0b988 | 146 | } |
uci1 | 0:664899e0b988 | 147 | } |
uci1 | 0:664899e0b988 | 148 | |
uci1 | 0:664899e0b988 | 149 | } |
uci1 | 0:664899e0b988 | 150 | |
uci1 | 0:664899e0b988 | 151 | bool SnConfigFrame::ReadFromFile(const char* cfile) { |
uci1 | 0:664899e0b988 | 152 | // intended only for reading default config file |
uci1 | 0:664899e0b988 | 153 | |
uci1 | 3:24c5f0f50bf1 | 154 | /* |
uci1 | 3:24c5f0f50bf1 | 155 | DIR* d; |
uci1 | 3:24c5f0f50bf1 | 156 | struct dirent* dent; |
uci1 | 3:24c5f0f50bf1 | 157 | printf("files in /local:\r\n"); |
uci1 | 3:24c5f0f50bf1 | 158 | if ( (d = opendir( "/local" ))!=NULL ) { |
uci1 | 3:24c5f0f50bf1 | 159 | while ( (dent = readdir(d))!=NULL ) { |
uci1 | 3:24c5f0f50bf1 | 160 | printf("%s\r\n",dent->d_name); |
uci1 | 3:24c5f0f50bf1 | 161 | } |
uci1 | 3:24c5f0f50bf1 | 162 | closedir(d); |
uci1 | 3:24c5f0f50bf1 | 163 | } |
uci1 | 3:24c5f0f50bf1 | 164 | */ |
uci1 | 0:664899e0b988 | 165 | bool ret = false; |
uci1 | 0:664899e0b988 | 166 | FILE* cf = fopen(cfile,"rb"); |
uci1 | 0:664899e0b988 | 167 | if (cf!=0) { |
uci1 | 0:664899e0b988 | 168 | ReadFrom(cf); |
uci1 | 0:664899e0b988 | 169 | ret = (ferror(cf)==0); |
uci1 | 0:664899e0b988 | 170 | fclose(cf); |
uci1 | 0:664899e0b988 | 171 | } |
uci1 | 0:664899e0b988 | 172 | return ret; |
uci1 | 0:664899e0b988 | 173 | } |
uci1 | 0:664899e0b988 | 174 | |
uci1 | 0:664899e0b988 | 175 | bool SnConfigFrame::WriteToFile(const char* cfile) const { |
uci1 | 0:664899e0b988 | 176 | // intended only for writing default config file |
uci1 | 0:664899e0b988 | 177 | |
uci1 | 0:664899e0b988 | 178 | bool ret = false; |
uci1 | 0:664899e0b988 | 179 | FILE* cf = fopen(cfile,"wb"); |
uci1 | 0:664899e0b988 | 180 | if (cf!=0) { |
uci1 | 0:664899e0b988 | 181 | WriteTo(cf); |
uci1 | 0:664899e0b988 | 182 | ret = (ferror(cf)==0); |
uci1 | 0:664899e0b988 | 183 | fclose(cf); |
uci1 | 0:664899e0b988 | 184 | } |
uci1 | 0:664899e0b988 | 185 | return ret; |
uci1 | 0:664899e0b988 | 186 | } |