Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnEventFrame.h
- Committer:
- uci1
- Date:
- 2012-06-30
- Revision:
- 0:664899e0b988
- Child:
- 1:e392595b4b76
File content as of revision 0:664899e0b988:
#ifndef SN_SnEventFrame #define SN_SnEventFrame #include <stdint.h> #include "SnConstants.h" class SnEventFrame { public: // i/o version static const int8_t kIOVers = 1; // MUST BE INCREASED if any member var changes (==> also if kNchans, etc. change!) static const uint32_t kMaxSizeOf = ((sizeof(uint32_t)*4u)+sizeof(int32_t)+sizeof(uint16_t) +(kTotSamps*sizeof(uint16_t))+1u); private: // !! // !! If any member variables change, update: SizeOf function and kIOVers value! (also if kNchans, etc. change!) // !! uint16_t fData[kTotSamps]; // the (uncompressed) waveform data uint32_t fMbedTime; // mbed time in seconds since epoch // TODO: time since last event? uint32_t fEvtNum; // written event number ... int32_t fDTms; // time since last written event (ms) uint32_t fTrgNum; // this event is trigger number ... uint16_t fTrgBits; // trigger bit word mutable uint32_t fCRC; // CRC on the uncompressed waveform data // TODO: check if other parameters should be added: // - stop position? // - card(s) producing trigger? // - power & voltage during acquisition? void CalcCRC(); static bool ReadFromFileToBuf(FILE* f, char* const evtBuf, const uint8_t loseLSB, const uint8_t loseMSB); static bool WriteToFileFromBuf(FILE* f, char* const evtBuf, const uint8_t loseLSB, const uint8_t loseMSB); public: SnEventFrame() { ClearEvent(); } virtual ~SnEventFrame() {} const uint16_t* GetData() const { return fData; } uint16_t* GetData() { return fData; } const uint16_t* GetData(const uint8_t ch) const { return fData + (ch*kNsamps); } uint16_t* GetData(const uint8_t ch) { return fData + (ch*kNsamps); } uint16_t GetData(const uint8_t ch, const uint8_t sm) const { return fData[(ch*kNsamps)+sm]; } uint16_t& GetData(const uint8_t ch, const uint8_t sm) { return fData[(ch*kNsamps)+sm]; } void ClearEvent() { fMbedTime = fEvtNum = fTrgNum = 0; fTrgBits = 0; memset(fData, 0, kTotSamps*sizeof(int16_t)); fCRC = 0; } void SetTrgBit(const ESnTrgTypes t) { fTrgBits |= kTrgBW[t]; } void SetTrgNum(const uint32_t t) { fTrgNum = t; } void SetEvtNum(const uint32_t n) { fEvtNum = n; } void SetDTms(const int32_t dtms) { fDTms = dtms; } void SetCurMbedTime() { fMbedTime = time(0); } bool IsForcedTrg() const { return (fTrgBits & kTrgBW[kFrcTrg])!=0; } void ReadWaveforms(SPI& spi, DigitalOut& cardHiBit, DigitalOut& cardLoBit) { uint16_t* dev=fData; for( uint8_t ch = 0; ch < kNchans; ch++ ) { // Pick which register to read. SnBitUtils::SetChanNumBits(ch, cardHiBit, cardLoBit); for( uint8_t i = 0; i < kNsamps; i++, dev++ ) { *dev = spi.write(0x00) >> 1; //fprintf(stderr,"ch%hhd, s%03hhd = %hd\r\n",ch,i,*dev); } } CalcCRC(); } static uint32_t SizeOf(const uint8_t loseLSB, const uint8_t loseMSB) { // size of member vars + size of packed waveform + 1 for i/o version if ((loseLSB==0) && (loseMSB==0)) { return kMaxSizeOf; } else { return (kMaxSizeOf-(kTotSamps*sizeof(uint16_t)) +SizeOfPackedWavef(loseLSB, loseMSB)); } } static uint32_t SizeOfPackedWavef(const uint8_t loseLSB, const uint8_t loseMSB) { const uint8_t p = BITS_IN_SHORT-loseLSB-loseMSB; return ((p*kTotSamps)/8u) + (((p*kTotSamps)%8u)!=0 ? 1u : 0u); } void ReadFrom(const char* const buf, const uint8_t loseLSB, const uint8_t loseMSB, const uint16_t wvBaseline); void WriteTo(char* const buf, const uint8_t loseLSB, const uint8_t loseMSB, const uint16_t wvBaseline) const; bool ReadFrom(FILE* f, char* const evtBuf, const uint8_t loseLSB, const uint8_t loseMSB, const uint16_t wvBaseline); bool WriteTo(FILE* f, char* const evtBuf, const uint8_t loseLSB, const uint8_t loseMSB, const uint16_t wvBaseline) const; static const uint8_t* UnpackWavef(const uint8_t* const buf, uint16_t* const data, const uint8_t loseLSB, const uint8_t loseMSB, const uint16_t wvBaseline); static uint8_t* PackWavef(uint8_t* const buf, const uint16_t* const data, const uint8_t loseLSB, const uint8_t loseMSB, const uint16_t wvBaseline); }; #endif // SN_SnEventFrame