Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

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?

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 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 }