Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Sat Oct 05 04:45:22 2013 +0000
Revision:
40:1324da35afd4
Parent:
22:f957c4f840ad
Child:
56:0bba0ef15697
first commit of major overhaul to 2013-2014 mbed code. NOT YET FULLY TESTED. too many changes to list (fix local file receive, fix rates, external comm packes, big SD cards, get to comm win w/o SD, v8 config frame, v4 files, SBD buffering changes...)

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 0:664899e0b988 14 static const uint32_t kMaxSizeOf =
uci1 0:664899e0b988 15 ((sizeof(uint32_t)*4u)+sizeof(int32_t)+sizeof(uint16_t)
uci1 0:664899e0b988 16 +(kTotSamps*sizeof(uint16_t))+1u);
uci1 0:664899e0b988 17
uci1 0:664899e0b988 18 private:
uci1 0:664899e0b988 19 // !!
uci1 0:664899e0b988 20 // !! If any member variables change, update: SizeOf function and kIOVers value! (also if kNchans, etc. change!)
uci1 0:664899e0b988 21 // !!
uci1 0:664899e0b988 22
uci1 0:664899e0b988 23 uint16_t fData[kTotSamps]; // the (uncompressed) waveform data
uci1 0:664899e0b988 24 uint32_t fMbedTime; // mbed time in seconds since epoch
uci1 0:664899e0b988 25 // TODO: time since last event?
uci1 0:664899e0b988 26 uint32_t fEvtNum; // written event number ...
uci1 0:664899e0b988 27 int32_t fDTms; // time since last written event (ms)
uci1 0:664899e0b988 28 uint32_t fTrgNum; // this event is trigger number ...
uci1 0:664899e0b988 29 uint16_t fTrgBits; // trigger bit word
uci1 0:664899e0b988 30 mutable uint32_t fCRC; // CRC on the uncompressed waveform data
uci1 0:664899e0b988 31 // TODO: check if other parameters should be added:
uci1 0:664899e0b988 32 // - stop position?
uci1 0:664899e0b988 33 // - card(s) producing trigger?
uci1 0:664899e0b988 34 // - power & voltage during acquisition?
uci1 0:664899e0b988 35
uci1 0:664899e0b988 36 void CalcCRC();
uci1 0:664899e0b988 37
uci1 0:664899e0b988 38 static
uci1 0:664899e0b988 39 bool ReadFromFileToBuf(FILE* f,
uci1 0:664899e0b988 40 char* const evtBuf,
uci1 0:664899e0b988 41 const uint8_t loseLSB, const uint8_t loseMSB);
uci1 0:664899e0b988 42
uci1 0:664899e0b988 43 static
uci1 0:664899e0b988 44 bool WriteToFileFromBuf(FILE* f, char* const evtBuf,
uci1 0:664899e0b988 45 const uint8_t loseLSB, const uint8_t loseMSB);
uci1 0:664899e0b988 46
uci1 0:664899e0b988 47 public:
uci1 0:664899e0b988 48 SnEventFrame() { ClearEvent(); }
uci1 0:664899e0b988 49 virtual ~SnEventFrame() {}
uci1 40:1324da35afd4 50
uci1 40:1324da35afd4 51 virtual void CopyTo(SnEventFrame& evt) const {
uci1 40:1324da35afd4 52 evt.fMbedTime = fMbedTime;
uci1 40:1324da35afd4 53 evt.fEvtNum = fEvtNum;
uci1 40:1324da35afd4 54 evt.fDTms = fDTms;
uci1 40:1324da35afd4 55 evt.fTrgNum = fTrgNum;
uci1 40:1324da35afd4 56 evt.fTrgBits = fTrgBits;
uci1 40:1324da35afd4 57 evt.fCRC = fCRC;
uci1 40:1324da35afd4 58 memcpy(evt.fData, fData, kTotSamps*sizeof(uint16_t));
uci1 40:1324da35afd4 59 }
uci1 0:664899e0b988 60
uci1 0:664899e0b988 61 const uint16_t* GetData() const { return fData; }
uci1 0:664899e0b988 62 uint16_t* GetData() { return fData; }
uci1 0:664899e0b988 63 const uint16_t* GetData(const uint8_t ch) const { return fData + (ch*kNsamps); }
uci1 0:664899e0b988 64 uint16_t* GetData(const uint8_t ch) { return fData + (ch*kNsamps); }
uci1 0:664899e0b988 65 uint16_t GetData(const uint8_t ch, const uint8_t sm) const
uci1 0:664899e0b988 66 { return fData[(ch*kNsamps)+sm]; }
uci1 0:664899e0b988 67 uint16_t& GetData(const uint8_t ch, const uint8_t sm)
uci1 0:664899e0b988 68 { return fData[(ch*kNsamps)+sm]; }
uci1 0:664899e0b988 69
uci1 22:f957c4f840ad 70 uint32_t GetMbedTime() const { return fMbedTime; }
uci1 22:f957c4f840ad 71
uci1 8:95a325df1f6b 72 uint32_t GetEvtNum() const { return fEvtNum; }
uci1 8:95a325df1f6b 73
uci1 22:f957c4f840ad 74 void ClearEvent(const bool fully=true) {
uci1 21:ce51bb0ba4a5 75 #ifdef EVDEBUG
uci1 21:ce51bb0ba4a5 76 printf("CLEARING EVENT!\r\n");
uci1 21:ce51bb0ba4a5 77 #endif
uci1 22:f957c4f840ad 78 fMbedTime = 0;
uci1 0:664899e0b988 79 memset(fData, 0, kTotSamps*sizeof(int16_t));
uci1 0:664899e0b988 80 fCRC = 0;
uci1 22:f957c4f840ad 81 if (fully) {
uci1 22:f957c4f840ad 82 fEvtNum = fTrgNum = 0;
uci1 22:f957c4f840ad 83 fTrgBits = 0;
uci1 22:f957c4f840ad 84 }
uci1 0:664899e0b988 85 }
uci1 0:664899e0b988 86
uci1 0:664899e0b988 87 void SetTrgBit(const ESnTrgTypes t) { fTrgBits |= kTrgBW[t]; }
uci1 0:664899e0b988 88 void SetTrgNum(const uint32_t t) { fTrgNum = t; }
uci1 0:664899e0b988 89 void SetEvtNum(const uint32_t n) { fEvtNum = n; }
uci1 0:664899e0b988 90 void SetDTms(const int32_t dtms) { fDTms = dtms; }
uci1 0:664899e0b988 91 void SetCurMbedTime() { fMbedTime = time(0); }
uci1 0:664899e0b988 92
uci1 0:664899e0b988 93 bool IsForcedTrg() const { return (fTrgBits & kTrgBW[kFrcTrg])!=0; }
uci1 0:664899e0b988 94
uci1 0:664899e0b988 95 void ReadWaveforms(SPI& spi,
uci1 0:664899e0b988 96 DigitalOut& cardHiBit, DigitalOut& cardLoBit) {
uci1 0:664899e0b988 97 uint16_t* dev=fData;
uci1 0:664899e0b988 98 for( uint8_t ch = 0; ch < kNchans; ch++ ) {
uci1 0:664899e0b988 99 // Pick which register to read.
uci1 0:664899e0b988 100 SnBitUtils::SetChanNumBits(ch, cardHiBit, cardLoBit);
uci1 0:664899e0b988 101 for( uint8_t i = 0; i < kNsamps; i++, dev++ ) {
uci1 0:664899e0b988 102 *dev = spi.write(0x00) >> 1;
uci1 0:664899e0b988 103 }
uci1 0:664899e0b988 104 }
uci1 15:f2569d8e4176 105 #ifdef EVDEBUG
uci1 15:f2569d8e4176 106 dev = fData;
uci1 15:f2569d8e4176 107 for (uint8_t ch=0; ch<kNchans; ch++) {
uci1 15:f2569d8e4176 108 for (uint8_t i=0; i<kNsamps; i++, dev++) {
uci1 15:f2569d8e4176 109 printf("(%hhd,%03hhd,%hd) ",ch,i,*dev);
uci1 15:f2569d8e4176 110 }
uci1 15:f2569d8e4176 111 printf("\r\n");
uci1 15:f2569d8e4176 112 }
uci1 15:f2569d8e4176 113 #endif
uci1 0:664899e0b988 114 CalcCRC();
uci1 0:664899e0b988 115 }
uci1 0:664899e0b988 116
uci1 0:664899e0b988 117 static
uci1 8:95a325df1f6b 118 uint32_t SizeOf(const uint8_t rv, const uint8_t loseLSB, const uint8_t loseMSB) {
uci1 0:664899e0b988 119 // size of member vars + size of packed waveform + 1 for i/o version
uci1 0:664899e0b988 120 if ((loseLSB==0) && (loseMSB==0)) {
uci1 0:664899e0b988 121 return kMaxSizeOf;
uci1 0:664899e0b988 122 } else {
uci1 0:664899e0b988 123 return (kMaxSizeOf-(kTotSamps*sizeof(uint16_t))
uci1 0:664899e0b988 124 +SizeOfPackedWavef(loseLSB, loseMSB));
uci1 0:664899e0b988 125 }
uci1 0:664899e0b988 126 }
uci1 0:664899e0b988 127
uci1 0:664899e0b988 128 static
uci1 0:664899e0b988 129 uint32_t SizeOfPackedWavef(const uint8_t loseLSB,
uci1 0:664899e0b988 130 const uint8_t loseMSB) {
uci1 0:664899e0b988 131 const uint8_t p = BITS_IN_SHORT-loseLSB-loseMSB;
uci1 0:664899e0b988 132 return ((p*kTotSamps)/8u) + (((p*kTotSamps)%8u)!=0 ? 1u : 0u);
uci1 0:664899e0b988 133 }
uci1 0:664899e0b988 134
uci1 3:24c5f0f50bf1 135 const char* ReadFrom(const char* const buf,
uci1 3:24c5f0f50bf1 136 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 3:24c5f0f50bf1 137 const uint16_t wvBaseline);
uci1 0:664899e0b988 138
uci1 3:24c5f0f50bf1 139 char* WriteTo(char* const buf,
uci1 3:24c5f0f50bf1 140 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 3:24c5f0f50bf1 141 const uint16_t wvBaseline) const;
uci1 0:664899e0b988 142
uci1 0:664899e0b988 143 bool ReadFrom(FILE* f, char* const evtBuf,
uci1 0:664899e0b988 144 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 0:664899e0b988 145 const uint16_t wvBaseline);
uci1 0:664899e0b988 146 bool WriteTo(FILE* f, char* const evtBuf,
uci1 0:664899e0b988 147 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 0:664899e0b988 148 const uint16_t wvBaseline) const;
uci1 0:664899e0b988 149
uci1 0:664899e0b988 150 static
uci1 0:664899e0b988 151 const uint8_t* UnpackWavef(const uint8_t* const buf,
uci1 0:664899e0b988 152 uint16_t* const data,
uci1 0:664899e0b988 153 const uint8_t loseLSB,
uci1 0:664899e0b988 154 const uint8_t loseMSB,
uci1 0:664899e0b988 155 const uint16_t wvBaseline);
uci1 0:664899e0b988 156
uci1 0:664899e0b988 157 static
uci1 0:664899e0b988 158 uint8_t* PackWavef(uint8_t* const buf, const uint16_t* const data,
uci1 0:664899e0b988 159 const uint8_t loseLSB, const uint8_t loseMSB,
uci1 0:664899e0b988 160 const uint16_t wvBaseline);
uci1 0:664899e0b988 161 };
uci1 0:664899e0b988 162
uci1 0:664899e0b988 163
uci1 0:664899e0b988 164 #endif // SN_SnEventFrame