Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Wed Sep 12 04:47:22 2012 +0000
Revision:
16:744ce85aede2
Parent:
8:95a325df1f6b
Child:
18:55f1581f2ee4
SBD comm seems to be working. USB comm seems to be working (at 115200 baud). AFAR comm seems to be working. This version is set for USB communication and has zero text output.

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 16:744ce85aede2 6 #include "SnHeaderFrame.h"
uci1 0:664899e0b988 7
uci1 0:664899e0b988 8 extern "C" void mbed_mac_address(char *);
uci1 0:664899e0b988 9
uci1 0:664899e0b988 10
uci1 8:95a325df1f6b 11 const uint8_t SnConfigFrame::kIOVers = 3;
uci1 3:24c5f0f50bf1 12 const char* const SnConfigFrame::kDefConfFile = "/local/DEFCONF.DAT";
uci1 1:e392595b4b76 13 const uint32_t SnConfigFrame::kMinCommWinPrdLowPwr = 14400; // exclusive min low power comm win period (s)
uci1 1:e392595b4b76 14 const uint32_t SnConfigFrame::kMaxCommWinPrdLowPwr = 259200; // exclusive max low power comm win period (s)
uci1 1:e392595b4b76 15 const uint32_t SnConfigFrame::kMinCommWinDurLowPwr = 300; // exclusive min low power comm win duration (s)
uci1 1:e392595b4b76 16 const uint32_t SnConfigFrame::kMaxCommWinDurLowPwr = 3600; // exclusive max low power comm win duration (s)
uci1 1:e392595b4b76 17 const uint8_t SnConfigFrame::kConfLblLen;
uci1 0:664899e0b988 18
uci1 0:664899e0b988 19 uint64_t SnConfigFrame::fgMacAdr = 0;
uci1 0:664899e0b988 20
uci1 0:664899e0b988 21 void SnConfigFrame::SetMacAddress() {
uci1 0:664899e0b988 22 static const uint8_t b64 = sizeof(uint64_t);
uci1 0:664899e0b988 23 static char c[b64];
uci1 0:664899e0b988 24 mbed_mac_address(&(c[0]));
uci1 0:664899e0b988 25 // like a big endian union
uci1 0:664899e0b988 26 fgMacAdr = 0;
uci1 0:664899e0b988 27 const char* a = c+(b64-1);
uci1 0:664899e0b988 28 for (uint8_t i=0; i<b64; i++, a--) {
uci1 0:664899e0b988 29 fgMacAdr |= static_cast<uint64_t>(*a) << (i<<3);
uci1 0:664899e0b988 30 }
uci1 0:664899e0b988 31 }
uci1 0:664899e0b988 32
uci1 0:664899e0b988 33 void SnConfigFrame::SetHardDefaults() {
uci1 0:664899e0b988 34 sprintf(fLabel,"HardDefaults");
uci1 0:664899e0b988 35 fConfTime = 1338854400u; // Tue, 05 Jun 2012 00:00:00 GMT
uci1 0:664899e0b988 36 fRun = 0;
uci1 0:664899e0b988 37 fFirstEvt = 0;
uci1 8:95a325df1f6b 38 fEvtsPerSeq = 1000;
uci1 8:95a325df1f6b 39 fRunMode = 0;
uci1 1:e392595b4b76 40 fStreamHiLoPlas = 0;
uci1 0:664899e0b988 41 fWvLoseLSB = 0;
uci1 1:e392595b4b76 42 fWvLoseMSB = 4;
uci1 0:664899e0b988 43 fWvBaseline = 0;
uci1 0:664899e0b988 44 fDatPackType = ~0;
uci1 0:664899e0b988 45 uint16_t* dc = &(fDAC[0][0]);
uci1 0:664899e0b988 46 for (uint16_t i=0; i<kTotDacs; i++, dc++) {
uci1 0:664899e0b988 47 *dc = 3072u;
uci1 0:664899e0b988 48 }
uci1 0:664899e0b988 49 fNumPlas = 1;
uci1 0:664899e0b988 50 uint16_t* pl = &(fPLA[0]);
uci1 0:664899e0b988 51 for (uint8_t j=0; j<kNplas; j++, pl++) {
uci1 0:664899e0b988 52 *pl = 0x7FFFu;
uci1 0:664899e0b988 53 }
uci1 3:24c5f0f50bf1 54 fNumCardsMajLog = 1;
uci1 0:664899e0b988 55 fEnableThermTrig = 1;
uci1 1:e392595b4b76 56 fForceTrigPeriod = 67u;
uci1 0:664899e0b988 57 fHeartBeatPeriod = 0;
uci1 0:664899e0b988 58 fAmpsOn = 0x0Fu;
uci1 0:664899e0b988 59 fEvtThrtlPeriodMs = 50u;
uci1 4:a91682e19d6b 60 fPowerMode = kAmpsDatTak|kCardDatTak|kIridComWin|kAfarComWin;
uci1 0:664899e0b988 61 fBatVoltLowPwr = 0;
uci1 8:95a325df1f6b 62 fVoltCheckPeriod = 1200u;
uci1 0:664899e0b988 63 fCommWinPeriod = 3300u;
uci1 1:e392595b4b76 64 fCommWinDuration = 600u;
uci1 0:664899e0b988 65 fCommSendData = 0;
uci1 0:664899e0b988 66 fCommWinPrdLowPwr = 86100u;
uci1 0:664899e0b988 67 fCommWinDurLowPwr = 300u;
uci1 8:95a325df1f6b 68 sprintf(fRemoteServer,"%s","128.195.204.151");
uci1 8:95a325df1f6b 69 fRemotePort = 6655;
uci1 8:95a325df1f6b 70 sprintf(fMbedIP,"%s","128.195.204.148");
uci1 8:95a325df1f6b 71 sprintf(fMbedMask,"%s","255.255.255.0");
uci1 8:95a325df1f6b 72 sprintf(fMbedGate,"%s","128.195.204.1");
uci1 0:664899e0b988 73 fWatchDogPeriod = kWDFailsafe;
uci1 8:95a325df1f6b 74
uci1 8:95a325df1f6b 75 fIsLowPower = false;
uci1 8:95a325df1f6b 76 memcpy(fNormLabel, fLabel, kConfLblLen);
uci1 8:95a325df1f6b 77 fNormPowerMode = fPowerMode;
uci1 8:95a325df1f6b 78
uci1 8:95a325df1f6b 79
uci1 8:95a325df1f6b 80 }
uci1 8:95a325df1f6b 81
uci1 8:95a325df1f6b 82 void SnConfigFrame::ChangeToLowPower() {
uci1 8:95a325df1f6b 83
uci1 8:95a325df1f6b 84 // save old label
uci1 8:95a325df1f6b 85 memcpy(fNormLabel, fLabel, kConfLblLen);
uci1 8:95a325df1f6b 86
uci1 8:95a325df1f6b 87 // append label
uci1 8:95a325df1f6b 88 // this will allow the new config to be put in the DB
uci1 8:95a325df1f6b 89 int slen = strlen(fLabel);
uci1 8:95a325df1f6b 90 static const char* tag = "_LOWPOW";
uci1 8:95a325df1f6b 91 const int ml = strlen(tag)+1;
uci1 8:95a325df1f6b 92 if (slen > (kConfLblLen-ml) ) {
uci1 8:95a325df1f6b 93 memset(fLabel+kConfLblLen-ml, '\0', ml);
uci1 8:95a325df1f6b 94 }
uci1 8:95a325df1f6b 95 strncat(fLabel, tag, ml-1);
uci1 8:95a325df1f6b 96
uci1 8:95a325df1f6b 97 // save power settings
uci1 8:95a325df1f6b 98 fNormPowerMode = fPowerMode;
uci1 8:95a325df1f6b 99
uci1 8:95a325df1f6b 100 // change power settings
uci1 8:95a325df1f6b 101 DisablePowerFor(kAmpsDatTak);
uci1 8:95a325df1f6b 102 DisablePowerFor(kCardDatTak);
uci1 8:95a325df1f6b 103 DisablePowerFor(kIridDatTak);
uci1 8:95a325df1f6b 104 DisablePowerFor(kAfarDatTak);
uci1 8:95a325df1f6b 105 DisablePowerFor(kAmpsComWin);
uci1 8:95a325df1f6b 106 DisablePowerFor(kCardComWin);
uci1 8:95a325df1f6b 107 if ( (IsPoweredFor(kIridComWin)==false) &&
uci1 8:95a325df1f6b 108 (IsPoweredFor(kAfarComWin)==false) ) {
uci1 8:95a325df1f6b 109 // TODO: turn on only iridum maybe?
uci1 8:95a325df1f6b 110 EnablePowerFor(kIridComWin);
uci1 8:95a325df1f6b 111 EnablePowerFor(kAfarComWin);
uci1 8:95a325df1f6b 112 }
uci1 8:95a325df1f6b 113 // set mode to low power
uci1 8:95a325df1f6b 114 fIsLowPower = true;
uci1 8:95a325df1f6b 115 }
uci1 8:95a325df1f6b 116
uci1 8:95a325df1f6b 117 void SnConfigFrame::ChangeToNormPower() {
uci1 8:95a325df1f6b 118 // put label back
uci1 8:95a325df1f6b 119 memcpy(fLabel, fNormLabel, kConfLblLen);
uci1 8:95a325df1f6b 120 // put power settings back
uci1 8:95a325df1f6b 121 fPowerMode = fNormPowerMode;
uci1 8:95a325df1f6b 122 // set mode to normal
uci1 8:95a325df1f6b 123 fIsLowPower = false;
uci1 0:664899e0b988 124 }
uci1 0:664899e0b988 125
uci1 0:664899e0b988 126 void SnConfigFrame::GetPackParsFor(const EDatPackBit d,
uci1 0:664899e0b988 127 uint8_t& loseLSB, uint8_t& loseMSB,
uci1 0:664899e0b988 128 uint16_t& wvBase) const {
uci1 0:664899e0b988 129 const bool pack = IsDatPackedFor(d);
uci1 0:664899e0b988 130 loseLSB = pack ? GetWvLoseLSB() : 0u;
uci1 0:664899e0b988 131 loseMSB = pack ? GetWvLoseMSB() : 0u;
uci1 0:664899e0b988 132 wvBase = pack ? GetWvBaseline() : 0u;
uci1 0:664899e0b988 133 }
uci1 0:664899e0b988 134
uci1 0:664899e0b988 135 void SnConfigFrame::GetHiLoPlas(const uint16_t pla,
uci1 0:664899e0b988 136 uint16_t& hiPla,
uci1 0:664899e0b988 137 uint16_t& loPla,
uci1 0:664899e0b988 138 const bool r2l) {
uci1 0:664899e0b988 139 // split the PLA bitword into 2: one for the high threshold
uci1 0:664899e0b988 140 // and one for the low threshold. "lows" in the string will become
uci1 0:664899e0b988 141 // "highs" in the low threshold PLA.
uci1 0:664899e0b988 142 //
uci1 0:664899e0b988 143 // example 1)
uci1 0:664899e0b988 144 // PLA string = HLHL....
uci1 0:664899e0b988 145 // hi thresh = H.H.....
uci1 0:664899e0b988 146 // lo thresh = .H.H....
uci1 0:664899e0b988 147 //
uci1 0:664899e0b988 148 // example 2)
uci1 0:664899e0b988 149 // PLA string = HBL.....
uci1 0:664899e0b988 150 // hi thresh = HL......
uci1 0:664899e0b988 151 // lo thresh = .LH.....
uci1 0:664899e0b988 152 //
uci1 0:664899e0b988 153 // (with . = A here, to make the example more readable)
uci1 0:664899e0b988 154 //
uci1 0:664899e0b988 155 // A = 11, B = 00
uci1 0:664899e0b988 156 // H = 01 or 10, alternating
uci1 0:664899e0b988 157 // L = 10 or 01, alternating
uci1 0:664899e0b988 158 // 01 at leftmost bits is H
uci1 0:664899e0b988 159 // for example:
uci1 0:664899e0b988 160 // 0x7FFF = 01 11 11 11 11 11 11 11
uci1 0:664899e0b988 161 // => HAAAAAAA for LEFT TO RIGHT
uci1 0:664899e0b988 162 // => AAAAAAAH for RIGHT TO LEFT
uci1 0:664899e0b988 163 // 0x56FF = 01 01 01 10 11 11 11 11
uci1 0:664899e0b988 164 // => HLHHAAAA for LEFT TO RIGHT
uci1 0:664899e0b988 165 // => AAAAHHLH for RIGHT TO LEFT
uci1 0:664899e0b988 166 //
uci1 0:664899e0b988 167 // so HHHHHHHH is
uci1 0:664899e0b988 168 // 01 10 01 10 01 10 01 10 always (r2l or l2r)
uci1 0:664899e0b988 169 //
uci1 0:664899e0b988 170 // r2l = whether to read bits right to left (true) or not (false)
uci1 0:664899e0b988 171 // Mahshid liked right to left
uci1 0:664899e0b988 172 // Liang liked left to right
uci1 0:664899e0b988 173 // so we allow for either
uci1 0:664899e0b988 174
uci1 0:664899e0b988 175 const int8_t start = (r2l) ? 0 : BITS_IN_SHORT-2;
uci1 0:664899e0b988 176 const int8_t end = (r2l) ? BITS_IN_SHORT : -2;
uci1 0:664899e0b988 177 const int8_t step = (r2l) ? 2 : -2;
uci1 0:664899e0b988 178
uci1 0:664899e0b988 179 uint8_t hi= (r2l) ? 0x2 : 0x1;
uci1 0:664899e0b988 180 uint8_t lo= (r2l) ? 0x1 : 0x2;
uci1 0:664899e0b988 181
uci1 0:664899e0b988 182 // set all bits to 0
uci1 0:664899e0b988 183 hiPla = 0;
uci1 0:664899e0b988 184 loPla = 0;
uci1 0:664899e0b988 185
uci1 0:664899e0b988 186 for (int8_t i=start; i!=end; i+=step, hi^=0x3, lo^=0x3) {
uci1 0:664899e0b988 187 const uint8_t b = (pla & (0x3<<i)) >> i;
uci1 0:664899e0b988 188 if (b==hi) {
uci1 0:664899e0b988 189 hiPla |= hi << i;
uci1 0:664899e0b988 190 loPla |= 0x3 << i;
uci1 0:664899e0b988 191 } else if (b==lo) {
uci1 0:664899e0b988 192 hiPla |= 0x3 << i;
uci1 0:664899e0b988 193 loPla |= hi << i;
uci1 0:664899e0b988 194 } else if (b==0x3) {
uci1 0:664899e0b988 195 // any
uci1 0:664899e0b988 196 hiPla |= 0x3 << i;
uci1 0:664899e0b988 197 loPla |= 0x3 << i;
uci1 0:664899e0b988 198 } else {
uci1 0:664899e0b988 199 // no check that b is something else.. should be impossible.
uci1 0:664899e0b988 200 // between
uci1 0:664899e0b988 201 hiPla |= lo << i;
uci1 0:664899e0b988 202 loPla |= lo << i;
uci1 0:664899e0b988 203 }
uci1 0:664899e0b988 204 }
uci1 0:664899e0b988 205
uci1 0:664899e0b988 206 }
uci1 0:664899e0b988 207
uci1 0:664899e0b988 208 bool SnConfigFrame::ReadFromFile(const char* cfile) {
uci1 0:664899e0b988 209 // intended only for reading default config file
uci1 0:664899e0b988 210
uci1 3:24c5f0f50bf1 211 /*
uci1 3:24c5f0f50bf1 212 DIR* d;
uci1 3:24c5f0f50bf1 213 struct dirent* dent;
uci1 3:24c5f0f50bf1 214 printf("files in /local:\r\n");
uci1 3:24c5f0f50bf1 215 if ( (d = opendir( "/local" ))!=NULL ) {
uci1 3:24c5f0f50bf1 216 while ( (dent = readdir(d))!=NULL ) {
uci1 3:24c5f0f50bf1 217 printf("%s\r\n",dent->d_name);
uci1 3:24c5f0f50bf1 218 }
uci1 3:24c5f0f50bf1 219 closedir(d);
uci1 3:24c5f0f50bf1 220 }
uci1 3:24c5f0f50bf1 221 */
uci1 0:664899e0b988 222 bool ret = false;
uci1 0:664899e0b988 223 FILE* cf = fopen(cfile,"rb");
uci1 0:664899e0b988 224 if (cf!=0) {
uci1 16:744ce85aede2 225 // check the header and file size to be
uci1 16:744ce85aede2 226 // protect a bit against corruption
uci1 16:744ce85aede2 227 uint8_t hc; uint32_t hl;
uci1 16:744ce85aede2 228 SnHeaderFrame::ReadFrom(cf, hc, hl);
uci1 16:744ce85aede2 229 if (hc==SnHeaderFrame::kConfigCode) {
uci1 16:744ce85aede2 230 const int fpos = ftell(cf);
uci1 16:744ce85aede2 231 // how many bytes?
uci1 16:744ce85aede2 232 fseek(cf, 0, SEEK_END); // go to end
uci1 16:744ce85aede2 233 const int fend = ftell(cf);
uci1 16:744ce85aede2 234 fseek(cf, fpos, SEEK_SET); // go back
uci1 16:744ce85aede2 235
uci1 16:744ce85aede2 236 if (hl == fend-fpos) {
uci1 16:744ce85aede2 237 ReadFrom(cf);
uci1 16:744ce85aede2 238 ret = (ferror(cf)==0);
uci1 16:744ce85aede2 239 }
uci1 16:744ce85aede2 240 }
uci1 0:664899e0b988 241 fclose(cf);
uci1 0:664899e0b988 242 }
uci1 0:664899e0b988 243 return ret;
uci1 0:664899e0b988 244 }
uci1 0:664899e0b988 245
uci1 0:664899e0b988 246 bool SnConfigFrame::WriteToFile(const char* cfile) const {
uci1 0:664899e0b988 247 // intended only for writing default config file
uci1 0:664899e0b988 248
uci1 0:664899e0b988 249 bool ret = false;
uci1 0:664899e0b988 250 FILE* cf = fopen(cfile,"wb");
uci1 0:664899e0b988 251 if (cf!=0) {
uci1 0:664899e0b988 252 WriteTo(cf);
uci1 0:664899e0b988 253 ret = (ferror(cf)==0);
uci1 0:664899e0b988 254 fclose(cf);
uci1 0:664899e0b988 255 }
uci1 0:664899e0b988 256 return ret;
uci1 0:664899e0b988 257 }