Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
Diff: SnClockSetFrame.h
- Revision:
- 40:1324da35afd4
- Child:
- 84:80b15993944e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SnClockSetFrame.h Sat Oct 05 04:45:22 2013 +0000 @@ -0,0 +1,71 @@ +#ifndef SNS_SnClockSetFrame +#define SNS_SnClockSetFrame + +#include "mbed.h" +#include <stdint.h> + +#include "SnCommWin.h" + +class SnClockSetFrame { + public: + static const uint8_t kIOVers; // MUST BE INCREASED if any member var changes + static const uint32_t kMaxSizeOf = sizeof(uint8_t) + (3u*sizeof(uint32_t)) + + sizeof(int); + + + private: + uint32_t fPrevTime; + uint32_t fSetTime; + Timer fSinceSet; + + void ResetCCtimer() { fSinceSet.reset(); fSinceSet.start(); } + + public: + SnClockSetFrame() : + fPrevTime(0), fSetTime(0) {} + virtual ~SnClockSetFrame() {} + + void SetClocks(const uint32_t prev, const uint32_t stim) { + ResetCCtimer(); + fPrevTime = prev; + fSetTime = stim; + } + + static + uint32_t SizeOf(const uint8_t rv=SnClockSetFrame::kIOVers) + { return kMaxSizeOf; } + + template<class T> + SnCommWin::ECommWinResult WriteTo(T& x) { + // expect 'x' to be a MODSERIAL or a char const* or a FILE* + x = SnBitUtils::WriteTo(x, kIOVers); + x = SnBitUtils::WriteTo(x, fPrevTime); + x = SnBitUtils::WriteTo(x, fSetTime); + x = SnBitUtils::WriteTo(x, static_cast<uint32_t>(time(0))); + x = SnBitUtils::WriteTo(x, static_cast<int32_t>(fSinceSet.read_us())); + // read_us returns a signed int for some reason. so we keep that + // convention and merely make the number of bits explicit via the + // cast. changing to an unsigned int is left for later. + return SnCommWin::kOkMsgSent; + } + + template<class T> + static + SnCommWin::ECommWinResult ReadFrom(T& b, + uint32_t& prev, + uint32_t& stim, + uint32_t& ctim, + int32_t& ss) { + uint8_t Rv=0; + b = SnBitUtils::ReadFrom(b, Rv); + b = SnBitUtils::ReadFrom(b, prev); + b = SnBitUtils::ReadFrom(b, stim); + b = SnBitUtils::ReadFrom(b, ctim); + b = SnBitUtils::ReadFrom(b, ss); + return SnCommWin::kOkWithMsg; + } + + +}; + +#endif // SNS_SnClockSetFrame