Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Fri Dec 04 02:54:48 2015 +0000
Revision:
114:554fa3a956b4
Parent:
84:80b15993944e
Child:
116:8099b754fbb4
Stn31 CHIPBOARD=SST4ch1GHz. With conf name. No interface chip. Safety nets.

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