Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Thu Oct 30 06:42:17 2014 +0000
Revision:
56:0bba0ef15697
Parent:
40:1324da35afd4
Child:
84:80b15993944e
update ext libs, add tempr, allow SST/ATWD, improve handshaking, run/seq list, req seq range, allow SBD only in low pwr, all pins start off, can collect data to ram w/o SD card, add parameters to status update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 0:664899e0b988 1 #ifndef SN_SnEventFrame
uci1 0:664899e0b988 2 #define SN_SnEventFrame
uci1 0:664899e0b988 3
uci1 0:664899e0b988 4 #include <stdint.h>
uci1 0:664899e0b988 5 #include "SnConstants.h"
uci1 0:664899e0b988 6
uci1 15:f2569d8e4176 7 //#define EVDEBUG
uci1 15:f2569d8e4176 8
uci1 0:664899e0b988 9 class SnEventFrame {
uci1 0:664899e0b988 10
uci1 0:664899e0b988 11 public:
uci1 0:664899e0b988 12 // i/o version
uci1 8:95a325df1f6b 13 static const uint8_t kIOVers; // MUST BE INCREASED if any member var changes (==> also if kNchans, etc. change!)
uci1 56:0bba0ef15697 14 static const uint32_t kMaxSizeOfV1 =
uci1 0:664899e0b988 15 ((sizeof(uint32_t)*4u)+sizeof(int32_t)+sizeof(uint16_t)
uci1 56:0bba0ef15697 16 +(kTotSampsAtwd4ch*sizeof(uint16_t))+1u);
uci1 56:0bba0ef15697 17 static const uint32_t kMaxSizeOfV2 = kMaxSizeOfV1
uci1 56:0bba0ef15697 18 - (kTotSampsAtwd4ch*sizeof(uint16_t)) + (kTotSampsSst4ch*sizeof(uint16_t))
uci1 56:0bba0ef15697 19 + (kNstopBytesSst4ch*sizeof(uint8_t));
uci1 56:0bba0ef15697 20 static const uint32_t kMaxSizeOf = kMaxSizeOfV2; // biggest one
uci1 0:664899e0b988 21
uci1 0:664899e0b988 22 private:
uci1 0:664899e0b988 23 // !!
uci1 0:664899e0b988 24 // !! If any member variables change, update: SizeOf function and kIOVers value! (also if kNchans, etc. change!)
uci1 0:664899e0b988 25 // !!
uci1 0:664899e0b988 26
uci1 0:664899e0b988 27 uint16_t fData[kTotSamps]; // the (uncompressed) waveform data
uci1 0:664899e0b988 28 uint32_t fMbedTime; // mbed time in seconds since epoch
uci1 0:664899e0b988 29 // TODO: time since last event?
uci1 0:664899e0b988 30 uint32_t fEvtNum; // written event number ...
uci1 0:664899e0b988 31 int32_t fDTms; // time since last written event (ms)
uci1 0:664899e0b988 32 uint32_t fTrgNum; // this event is trigger number ...
uci1 0:664899e0b988 33 uint16_t fTrgBits; // trigger bit word
uci1 0:664899e0b988 34 mutable uint32_t fCRC; // CRC on the uncompressed waveform data
uci1 56:0bba0ef15697 35 #if CHIPBOARD!=ATWD4CH
uci1 56:0bba0ef15697 36 uint8_t fStop[kNstopBytes];// the stop bit word (one bit per sample)
uci1 56:0bba0ef15697 37 #endif
uci1 0:664899e0b988 38 // TODO: check if other parameters should be added:
uci1 0:664899e0b988 39 // - stop position?
uci1 0:664899e0b988 40 // - card(s) producing trigger?
uci1 0:664899e0b988 41
uci1 0:664899e0b988 42 void CalcCRC();
uci1 0:664899e0b988 43
uci1 0:664899e0b988 44 static
uci1 0:664899e0b988 45 bool ReadFromFileToBuf(FILE* f,
uci1 0:664899e0b988 46 char* const evtBuf,
uci1 0:664899e0b988 47 const uint8_t loseLSB, const uint8_t loseMSB);
uci1 0:664899e0b988 48
uci1 0:664899e0b988 49 static
uci1 0:664899e0b988 50 bool WriteToFileFromBuf(FILE* f, char* const evtBuf,
uci1 0:664899e0b988 51 const uint8_t loseLSB, const uint8_t loseMSB);
uci1 0:664899e0b988 52
uci1 0:664899e0b988 53 public:
uci1 0:664899e0b988 54 SnEventFrame() { ClearEvent(); }
uci1 0:664899e0b988 55 virtual ~SnEventFrame() {}
uci1 40:1324da35afd4 56
uci1 40:1324da35afd4 57 virtual void CopyTo(SnEventFrame& evt) const {
uci1 56:0bba0ef15697 58 if (&evt!=this) {
uci1 56:0bba0ef15697 59 evt.fMbedTime = fMbedTime;
uci1 56:0bba0ef15697 60 evt.fEvtNum = fEvtNum;
uci1 56:0bba0ef15697 61 evt.fDTms = fDTms;
uci1 56:0bba0ef15697 62 evt.fTrgNum = fTrgNum;
uci1 56:0bba0ef15697 63 evt.fTrgBits = fTrgBits;
uci1 56:0bba0ef15697 64 evt.fCRC = fCRC;
uci1 56:0bba0ef15697 65 memcpy(evt.fData, fData, kTotSamps*sizeof(uint16_t));
uci1 56:0bba0ef15697 66 #if CHIPBOARD!=ATWD4CH
uci1 56:0bba0ef15697 67 memcpy(evt.fStop, fStop, kNstopBytes*sizeof(uint8_t));
uci1 56:0bba0ef15697 68 #endif
uci1 56:0bba0ef15697 69 }
uci1 40:1324da35afd4 70 }
uci1 0:664899e0b988 71
uci1 0:664899e0b988 72 const uint16_t* GetData() const { return fData; }
uci1 0:664899e0b988 73 uint16_t* GetData() { return fData; }
uci1 0:664899e0b988 74 const uint16_t* GetData(const uint8_t ch) const { return fData + (ch*kNsamps); }
uci1 0:664899e0b988 75 uint16_t* GetData(const uint8_t ch) { return fData + (ch*kNsamps); }
uci1 56:0bba0ef15697 76 uint16_t GetData(const uint8_t ch, const uint16_t sm) const
uci1 0:664899e0b988 77 { return fData[(ch*kNsamps)+sm]; }
uci1 56:0bba0ef15697 78 uint16_t& GetData(const uint8_t ch, const uint16_t sm)
uci1 0:664899e0b988 79 { return fData[(ch*kNsamps)+sm]; }
uci1 0:664899e0b988 80
uci1 56:0bba0ef15697 81 #if CHIPBOARD!=ATWD4CH
uci1 56:0bba0ef15697 82 const uint8_t* GetStop() const { return fStop; }
uci1 56:0bba0ef15697 83 uint8_t* GetStop() { return fStop; }
uci1 56:0bba0ef15697 84 #endif
uci1 56:0bba0ef15697 85
uci1 22:f957c4f840ad 86 uint32_t GetMbedTime() const { return fMbedTime; }
uci1 22:f957c4f840ad 87
uci1 8:95a325df1f6b 88 uint32_t GetEvtNum() const { return fEvtNum; }
uci1 8:95a325df1f6b 89
uci1 22:f957c4f840ad 90 void ClearEvent(const bool fully=true) {
uci1 21:ce51bb0ba4a5 91 #ifdef EVDEBUG
uci1 21:ce51bb0ba4a5 92 printf("CLEARING EVENT!\r\n");
uci1 21:ce51bb0ba4a5 93 #endif
uci1 22:f957c4f840ad 94 fMbedTime = 0;
uci1 0:664899e0b988 95 memset(fData, 0, kTotSamps*sizeof(int16_t));
uci1 56:0bba0ef15697 96 #if CHIPBOARD!=ATWD4CH
uci1 56:0bba0ef15697 97 memset(fStop, 0, kNstopBytes*sizeof(uint8_t));
uci1 56:0bba0ef15697 98 #endif
uci1 0:664899e0b988 99 fCRC = 0;
uci1 22:f957c4f840ad 100 if (fully) {
uci1 22:f957c4f840ad 101 fEvtNum = fTrgNum = 0;
uci1 22:f957c4f840ad 102 fTrgBits = 0;
uci1 22:f957c4f840ad 103 }
uci1 0:664899e0b988 104 }
uci1 0:664899e0b988 105
uci1 0:664899e0b988 106 void SetTrgBit(const ESnTrgTypes t) { fTrgBits |= kTrgBW[t]; }
uci1 0:664899e0b988 107 void SetTrgNum(const uint32_t t) { fTrgNum = t; }
uci1 0:664899e0b988 108 void SetEvtNum(const uint32_t n) { fEvtNum = n; }
uci1 0:664899e0b988 109 void SetDTms(const int32_t dtms) { fDTms = dtms; }
uci1 0:664899e0b988 110 void SetCurMbedTime() { fMbedTime = time(0); }
uci1 0:664899e0b988 111
uci1 0:664899e0b988 112 bool IsForcedTrg() const { return (fTrgBits & kTrgBW[kFrcTrg])!=0; }
uci1 0:664899e0b988 113
uci1 56:0bba0ef15697 114 #if CHIPBOARD!=ATWD4CH
uci1 56:0bba0ef15697 115 void ReadWaveformsSST(SPI& spi, DigitalOut& readingData) {
uci1 56:0bba0ef15697 116 readingData = 1; // start reading
uci1 56:0bba0ef15697 117
uci1 56:0bba0ef15697 118 // first get waveform data
uci1 56:0bba0ef15697 119 uint16_t* d = fData;
uci1 56:0bba0ef15697 120 for (uint8_t ch=0; ch<kNchans; ++ch) {
uci1 56:0bba0ef15697 121 #ifdef EVDEBUG
uci1 56:0bba0ef15697 122 printf("new channel %hhu\r\n",ch);
uci1 56:0bba0ef15697 123 #endif
uci1 56:0bba0ef15697 124
uci1 56:0bba0ef15697 125 spi.format( 5, 1 ); // throw away leading bits (1 meaningless + 4 MSB 0's bits before 12 bit ADC value)
uci1 56:0bba0ef15697 126 spi.write(0); // get the throw away bits
uci1 56:0bba0ef15697 127 spi.format( 12, 1); // read remaining
uci1 56:0bba0ef15697 128
uci1 56:0bba0ef15697 129 for (uint16_t i=0; i<kNsamps; ++i, ++d) {
uci1 56:0bba0ef15697 130 *d = spi.write(0x00)/* >> 1*/; // get rid of stop bit (TODO: is this right?)
uci1 56:0bba0ef15697 131 if (i==0) {
uci1 56:0bba0ef15697 132 spi.format( 16, 1); // back to normal
uci1 56:0bba0ef15697 133 }
uci1 56:0bba0ef15697 134 #ifdef EVDEBUG
uci1 56:0bba0ef15697 135 if (i==0 || i==1) {
uci1 56:0bba0ef15697 136 printf("d: spi gave (%hu) ",*d);
uci1 56:0bba0ef15697 137 SnBitUtils::printBits(*d, false);
uci1 56:0bba0ef15697 138 }
uci1 56:0bba0ef15697 139 #endif
uci1 56:0bba0ef15697 140 }
uci1 56:0bba0ef15697 141 }
uci1 56:0bba0ef15697 142 // now get stop data
uci1 56:0bba0ef15697 143 uint8_t* s = fStop;
uci1 56:0bba0ef15697 144 uint16_t sd(0);
uci1 56:0bba0ef15697 145 for (uint16_t i=0; i<kNstopBytes; i+=2, s+=2) {
uci1 56:0bba0ef15697 146 if (i==0) {
uci1 56:0bba0ef15697 147 // need to throw away the very first bit
uci1 56:0bba0ef15697 148 // but we can't ask spi to send only 1 bit
uci1 56:0bba0ef15697 149 spi.format( 5, 1 );
uci1 56:0bba0ef15697 150 sd = spi.write(0x00);
uci1 56:0bba0ef15697 151 // toss the first bit totally
uci1 56:0bba0ef15697 152 // move the other 4 bits to the front
uci1 56:0bba0ef15697 153 sd <<= 12;
uci1 56:0bba0ef15697 154 spi.format( 12, 1); // read the rest of the real 16 bits
uci1 56:0bba0ef15697 155 sd |= spi.write(0x00);
uci1 56:0bba0ef15697 156 spi.format( 16, 1); // normal after this
uci1 56:0bba0ef15697 157 } else {
uci1 56:0bba0ef15697 158 sd = spi.write(0x00);
uci1 56:0bba0ef15697 159 }
uci1 56:0bba0ef15697 160 #ifdef EVDEBUG
uci1 56:0bba0ef15697 161 /*
uci1 56:0bba0ef15697 162 printf("s: spi gave (%hu) ",sd);
uci1 56:0bba0ef15697 163 SnBitUtils::printBits(sd, false);
uci1 56:0bba0ef15697 164 */
uci1 56:0bba0ef15697 165 #endif
uci1 56:0bba0ef15697 166 *s = (sd & 0xFF00) >> BITS_IN_CHAR;
uci1 56:0bba0ef15697 167 *(s+1) = sd & 0x00FF;
uci1 56:0bba0ef15697 168 }
uci1 56:0bba0ef15697 169 readingData = 0; // done reading
uci1 56:0bba0ef15697 170 /*
uci1 56:0bba0ef15697 171 // get rid of stop bit (TODO: is this right?)
uci1 56:0bba0ef15697 172 *s >>= 1;
uci1 56:0bba0ef15697 173 *s <<= 1;
uci1 56:0bba0ef15697 174 */
uci1 56:0bba0ef15697 175 #ifdef EVDEBUG
uci1 56:0bba0ef15697 176 /*
uci1 56:0bba0ef15697 177 d = fData;
uci1 56:0bba0ef15697 178 for (uint8_t ch=0; ch<kNchans; ch++) {
uci1 56:0bba0ef15697 179 for (uint16_t i=0; i<kNsamps; i++, d++) {
uci1 56:0bba0ef15697 180 printf("(%hhu,%03hhu,%hu) ",ch,i,*d);
uci1 56:0bba0ef15697 181 }
uci1 56:0bba0ef15697 182 printf("\r\n");
uci1 56:0bba0ef15697 183 }
uci1 56:0bba0ef15697 184 s = fStop;
uci1 56:0bba0ef15697 185 for (uint16_t i=0; i<kNstopBytes; ++i, ++s) {
uci1 56:0bba0ef15697 186 for (int16_t j=(sizeof(uint8_t)*BITS_IN_CHAR)-1; j>-1; --j) {
uci1 56:0bba0ef15697 187 if ( (*s&(1<<j))!=0 ) {
uci1 56:0bba0ef15697 188 printf("stop bit at %hu\r\n",
uci1 56:0bba0ef15697 189 j+(BITS_IN_CHAR*sizeof(uint8_t)*i));
uci1 56:0bba0ef15697 190 }
uci1 56:0bba0ef15697 191 }
uci1 56:0bba0ef15697 192 }
uci1 56:0bba0ef15697 193 */
uci1 56:0bba0ef15697 194 #endif
uci1 56:0bba0ef15697 195 CalcCRC();
uci1 56:0bba0ef15697 196 }
uci1 56:0bba0ef15697 197 #endif
uci1 56:0bba0ef15697 198
uci1 56:0bba0ef15697 199 void ReadWaveformsATWD(SPI& spi,
uci1 56:0bba0ef15697 200 DigitalOut& cardHiBit, DigitalOut& cardLoBit) {
uci1 0:664899e0b988 201 uint16_t* dev=fData;
uci1 0:664899e0b988 202 for( uint8_t ch = 0; ch < kNchans; ch++ ) {
uci1 0:664899e0b988 203 // Pick which register to read.
uci1 0:664899e0b988 204 SnBitUtils::SetChanNumBits(ch, cardHiBit, cardLoBit);
uci1 56:0bba0ef15697 205 for( uint16_t i = 0; i < kNsamps; i++, dev++ ) {
uci1 0:664899e0b988 206 *dev = spi.write(0x00) >> 1;
uci1 0:664899e0b988 207 }
uci1 0:664899e0b988 208 }
uci1 15:f2569d8e4176 209 #ifdef EVDEBUG
uci1 15:f2569d8e4176 210 dev = fData;
uci1 15:f2569d8e4176 211 for (uint8_t ch=0; ch<kNchans; ch++) {
uci1 56:0bba0ef15697 212 for (uint16_t i=0; i<kNsamps; i++, dev++) {
uci1 56:0bba0ef15697 213 printf("(%hhu,%03hhu,%hu) ",ch,i,*dev);
uci1 15:f2569d8e4176 214 }
uci1 15:f2569d8e4176 215 printf("\r\n");
uci1 15:f2569d8e4176 216 }
uci1 15:f2569d8e4176 217 #endif
uci1 0:664899e0b988 218 CalcCRC();
uci1 0:664899e0b988 219 }
uci1 0:664899e0b988 220
uci1 56:0bba0ef15697 221
uci1 56:0bba0ef15697 222 static
uci1 56:0bba0ef15697 223 uint16_t GetTotSamplesForIOVers(const uint8_t rv) {
uci1 56:0bba0ef15697 224 if (rv<2) {
uci1 56:0bba0ef15697 225 return kTotSampsAtwd4ch;
uci1 56:0bba0ef15697 226 } else {
uci1 56:0bba0ef15697 227 return kTotSampsSst4ch;
uci1 56:0bba0ef15697 228 }
uci1 56:0bba0ef15697 229 }
uci1 56:0bba0ef15697 230
uci1 56:0bba0ef15697 231 static
uci1 56:0bba0ef15697 232 uint16_t GetStopBytesForIOVers(const uint8_t rv) {
uci1 56:0bba0ef15697 233 if (rv<2) {
uci1 56:0bba0ef15697 234 return 0;
uci1 56:0bba0ef15697 235 } else {
uci1 56:0bba0ef15697 236 return kNstopBytesSst4ch;
uci1 56:0bba0ef15697 237 }
uci1 56:0bba0ef15697 238 }
uci1 56:0bba0ef15697 239
uci1 0:664899e0b988 240 static
uci1 8:95a325df1f6b 241 uint32_t SizeOf(const uint8_t rv, const uint8_t loseLSB, const uint8_t loseMSB) {
uci1 0:664899e0b988 242 // size of member vars + size of packed waveform + 1 for i/o version
uci1 56:0bba0ef15697 243 uint32_t sz(0);
uci1 56:0bba0ef15697 244 const uint16_t ntotsamps = GetTotSamplesForIOVers(rv);
uci1 56:0bba0ef15697 245 if (rv==1) {
uci1 56:0bba0ef15697 246 sz = kMaxSizeOfV1;
uci1 56:0bba0ef15697 247 } else if (rv==2) {
uci1 56:0bba0ef15697 248 sz = kMaxSizeOfV2;
uci1 0:664899e0b988 249 } else {
uci1 56:0bba0ef15697 250 sz = kMaxSizeOf;
uci1 56:0bba0ef15697 251 }
uci1 56:0bba0ef15697 252 if ((loseLSB==0) && (loseMSB==0)) {
uci1 56:0bba0ef15697 253 return sz;
uci1 56:0bba0ef15697 254 } else {
uci1 56:0bba0ef15697 255 return (sz-(ntotsamps*sizeof(uint16_t))
uci1 56:0bba0ef15697 256 +SizeOfPackedWavef(loseLSB, loseMSB));
uci1 0:664899e0b988 257 }
uci1 0:664899e0b988 258 }
uci1 0:664899e0b988 259
uci1 0:664899e0b988 260 static
uci1 0:664899e0b988 261 uint32_t SizeOfPackedWavef(const uint8_t loseLSB,
uci1 0:664899e0b988 262 const uint8_t loseMSB) {
uci1 0:664899e0b988 263 const uint8_t p = BITS_IN_SHORT-loseLSB-loseMSB;
uci1 0:664899e0b988 264 return ((p*kTotSamps)/8u) + (((p*kTotSamps)%8u)!=0 ? 1u : 0u);
uci1 0:664899e0b988 265 }
uci1 0:664899e0b988 266
uci1 3:24c5f0f50bf1 267 const char* ReadFrom(const char* const buf,
uci1 3:24c5f0f50bf1 268 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 3:24c5f0f50bf1 269 const uint16_t wvBaseline);
uci1 0:664899e0b988 270
uci1 3:24c5f0f50bf1 271 char* WriteTo(char* const buf,
uci1 3:24c5f0f50bf1 272 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 3:24c5f0f50bf1 273 const uint16_t wvBaseline) const;
uci1 0:664899e0b988 274
uci1 0:664899e0b988 275 bool ReadFrom(FILE* f, char* const evtBuf,
uci1 0:664899e0b988 276 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 0:664899e0b988 277 const uint16_t wvBaseline);
uci1 0:664899e0b988 278 bool WriteTo(FILE* f, char* const evtBuf,
uci1 0:664899e0b988 279 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 0:664899e0b988 280 const uint16_t wvBaseline) const;
uci1 0:664899e0b988 281
uci1 0:664899e0b988 282 static
uci1 0:664899e0b988 283 const uint8_t* UnpackWavef(const uint8_t* const buf,
uci1 0:664899e0b988 284 uint16_t* const data,
uci1 0:664899e0b988 285 const uint8_t loseLSB,
uci1 0:664899e0b988 286 const uint8_t loseMSB,
uci1 56:0bba0ef15697 287 const uint16_t wvBaseline,
uci1 56:0bba0ef15697 288 const uint16_t nsamps);
uci1 0:664899e0b988 289
uci1 0:664899e0b988 290 static
uci1 0:664899e0b988 291 uint8_t* PackWavef(uint8_t* const buf, const uint16_t* const data,
uci1 0:664899e0b988 292 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 56:0bba0ef15697 293 const uint16_t wvBaseline,
uci1 56:0bba0ef15697 294 const uint16_t nsamps);
uci1 0:664899e0b988 295 };
uci1 0:664899e0b988 296
uci1 0:664899e0b988 297
uci1 0:664899e0b988 298 #endif // SN_SnEventFrame