Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnSDUtils.h@12:d472f9811262, 2012-08-18 (annotated)
- Committer:
- uci1
- Date:
- Sat Aug 18 05:00:32 2012 +0000
- Revision:
- 12:d472f9811262
- Parent:
- 10:3c93db1cfb12
- Child:
- 15:f2569d8e4176
Fixed bug in throttling timers. Now evt stores dt of triggers but throttle works on dt of events. AfarTCP communication possibly done. Debug output put behind precompiler macros.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uci1 | 0:664899e0b988 | 1 | #ifndef SN_SnSDUtils |
uci1 | 0:664899e0b988 | 2 | #define SN_SnSDUtils |
uci1 | 0:664899e0b988 | 3 | |
uci1 | 0:664899e0b988 | 4 | #include <stdio.h> |
uci1 | 0:664899e0b988 | 5 | #include <stdint.h> |
uci1 | 0:664899e0b988 | 6 | |
uci1 | 0:664899e0b988 | 7 | #include "SnCommWin.h" |
uci1 | 5:9cea89700c66 | 8 | #include "SnBitUtils.h" |
uci1 | 5:9cea89700c66 | 9 | #include "SnPowerFrame.h" |
uci1 | 8:95a325df1f6b | 10 | #include "SnHeaderFrame.h" |
uci1 | 0:664899e0b988 | 11 | |
uci1 | 0:664899e0b988 | 12 | class SnEventFrame; |
uci1 | 0:664899e0b988 | 13 | class SnConfigFrame; |
uci1 | 0:664899e0b988 | 14 | |
uci1 | 0:664899e0b988 | 15 | // a namespace-like class to handle the i/o with the SD card |
uci1 | 0:664899e0b988 | 16 | |
uci1 | 0:664899e0b988 | 17 | class SnSDUtils { |
uci1 | 0:664899e0b988 | 18 | public: |
uci1 | 1:e392595b4b76 | 19 | static const char* const kSDsubDir; |
uci1 | 1:e392595b4b76 | 20 | static const uint8_t kFNBufSize=128; |
uci1 | 1:e392595b4b76 | 21 | static const uint8_t kIOvers; // file I/O version |
uci1 | 5:9cea89700c66 | 22 | static const uint32_t kMaxSizeOfFileHdr; |
uci1 | 0:664899e0b988 | 23 | |
uci1 | 0:664899e0b988 | 24 | private: |
uci1 | 0:664899e0b988 | 25 | |
uci1 | 0:664899e0b988 | 26 | static |
uci1 | 3:24c5f0f50bf1 | 27 | FILE* OpenSDFile(const char* name, const char* mode); |
uci1 | 1:e392595b4b76 | 28 | |
uci1 | 1:e392595b4b76 | 29 | static |
uci1 | 0:664899e0b988 | 30 | uint16_t GetSeqNum(const uint64_t macadr, |
uci1 | 0:664899e0b988 | 31 | const uint32_t run); |
uci1 | 0:664899e0b988 | 32 | |
uci1 | 0:664899e0b988 | 33 | static |
uci1 | 0:664899e0b988 | 34 | const char* GetOutFileName(const uint64_t macadr, |
uci1 | 0:664899e0b988 | 35 | const uint32_t run, |
uci1 | 0:664899e0b988 | 36 | const uint16_t seq); |
uci1 | 0:664899e0b988 | 37 | |
uci1 | 0:664899e0b988 | 38 | static |
uci1 | 0:664899e0b988 | 39 | void DeleteFile(FILE*& f, const char* fname); |
uci1 | 0:664899e0b988 | 40 | |
uci1 | 12:d472f9811262 | 41 | static char fgCurFileName[kFNBufSize]; |
uci1 | 12:d472f9811262 | 42 | static FILE* fgCurFile; |
uci1 | 12:d472f9811262 | 43 | static uint16_t fgCurSeq; |
uci1 | 0:664899e0b988 | 44 | |
uci1 | 0:664899e0b988 | 45 | public: |
uci1 | 0:664899e0b988 | 46 | SnSDUtils() {} |
uci1 | 0:664899e0b988 | 47 | virtual ~SnSDUtils() {} |
uci1 | 0:664899e0b988 | 48 | |
uci1 | 0:664899e0b988 | 49 | static |
uci1 | 10:3c93db1cfb12 | 50 | int CloseOutputFile(FILE* f) { |
uci1 | 12:d472f9811262 | 51 | // TODO: set current file pointer to 0, IF f is current file |
uci1 | 10:3c93db1cfb12 | 52 | const int rt = (f!=0) ? fclose(f) : 0; |
uci1 | 10:3c93db1cfb12 | 53 | return rt; |
uci1 | 10:3c93db1cfb12 | 54 | } |
uci1 | 0:664899e0b988 | 55 | |
uci1 | 0:664899e0b988 | 56 | static |
uci1 | 0:664899e0b988 | 57 | FILE* OpenNewOutputFile(const uint64_t macadr, |
uci1 | 8:95a325df1f6b | 58 | const uint32_t run); |
uci1 | 0:664899e0b988 | 59 | |
uci1 | 0:664899e0b988 | 60 | static |
uci1 | 3:24c5f0f50bf1 | 61 | FILE* OpenExistingFile(const char* name, const bool setcurrent); |
uci1 | 0:664899e0b988 | 62 | |
uci1 | 0:664899e0b988 | 63 | static |
uci1 | 0:664899e0b988 | 64 | SnCommWin::ECommWinResult SendAllFiles(SnCommWin* comm, |
uci1 | 3:24c5f0f50bf1 | 65 | const uint32_t timeout, |
uci1 | 3:24c5f0f50bf1 | 66 | char* const buf, |
uci1 | 6:6f002d202f59 | 67 | const uint32_t bsize, |
uci1 | 6:6f002d202f59 | 68 | const SnConfigFrame& curConf, |
uci1 | 8:95a325df1f6b | 69 | SnEventFrame& evt, |
uci1 | 12:d472f9811262 | 70 | SnPowerFrame& pow, |
uci1 | 12:d472f9811262 | 71 | const uint32_t handshakeTimeout); |
uci1 | 0:664899e0b988 | 72 | |
uci1 | 0:664899e0b988 | 73 | static |
uci1 | 0:664899e0b988 | 74 | const char* GetCurFileName() { return fgCurFileName; } |
uci1 | 0:664899e0b988 | 75 | |
uci1 | 0:664899e0b988 | 76 | static |
uci1 | 1:e392595b4b76 | 77 | FILE* GetCurFile() { return fgCurFile; } |
uci1 | 1:e392595b4b76 | 78 | |
uci1 | 1:e392595b4b76 | 79 | static |
uci1 | 12:d472f9811262 | 80 | uint16_t GetCurSeqNum() { return fgCurSeq; } |
uci1 | 10:3c93db1cfb12 | 81 | |
uci1 | 10:3c93db1cfb12 | 82 | static |
uci1 | 10:3c93db1cfb12 | 83 | uint16_t GetSeqNumFromFileName(const char* fn); |
uci1 | 10:3c93db1cfb12 | 84 | |
uci1 | 10:3c93db1cfb12 | 85 | static |
uci1 | 0:664899e0b988 | 86 | bool WriteEventTo(FILE* efile, char* const evtBuf, |
uci1 | 0:664899e0b988 | 87 | const SnEventFrame& evt, |
uci1 | 0:664899e0b988 | 88 | const SnConfigFrame& conf); |
uci1 | 0:664899e0b988 | 89 | |
uci1 | 0:664899e0b988 | 90 | static |
uci1 | 0:664899e0b988 | 91 | bool WriteConfig(FILE* efile, |
uci1 | 0:664899e0b988 | 92 | const SnConfigFrame& conf); |
uci1 | 2:e67f7c158087 | 93 | |
uci1 | 8:95a325df1f6b | 94 | template<class T> |
uci1 | 2:e67f7c158087 | 95 | static |
uci1 | 8:95a325df1f6b | 96 | SnCommWin::ECommWinResult WritePowerTo(T& f, |
uci1 | 8:95a325df1f6b | 97 | const SnPowerFrame& pow, |
uci1 | 12:d472f9811262 | 98 | uint32_t pnum) { |
uci1 | 8:95a325df1f6b | 99 | const SnCommWin::ECommWinResult rs = |
uci1 | 8:95a325df1f6b | 100 | SnHeaderFrame::WriteTo(f, SnHeaderFrame::kPowerCode, |
uci1 | 8:95a325df1f6b | 101 | SnPowerFrame::SizeOf(SnPowerFrame::kIOvers)); |
uci1 | 8:95a325df1f6b | 102 | const SnCommWin::ECommWinResult re = pow.WriteTo(f); |
uci1 | 8:95a325df1f6b | 103 | ++pnum; |
uci1 | 8:95a325df1f6b | 104 | return (rs<re) ? rs : re; |
uci1 | 8:95a325df1f6b | 105 | } |
uci1 | 8:95a325df1f6b | 106 | |
uci1 | 8:95a325df1f6b | 107 | template<class T> |
uci1 | 8:95a325df1f6b | 108 | static |
uci1 | 8:95a325df1f6b | 109 | SnCommWin::ECommWinResult ReadBlockHeader(T& f, |
uci1 | 8:95a325df1f6b | 110 | uint8_t& mcode, |
uci1 | 8:95a325df1f6b | 111 | uint32_t& mlen) { |
uci1 | 8:95a325df1f6b | 112 | return SnHeaderFrame::ReadFrom(f, mcode, mlen); |
uci1 | 8:95a325df1f6b | 113 | } |
uci1 | 8:95a325df1f6b | 114 | |
uci1 | 5:9cea89700c66 | 115 | template<class T> |
uci1 | 5:9cea89700c66 | 116 | static |
uci1 | 5:9cea89700c66 | 117 | SnCommWin::ECommWinResult WriteFileHeader(T& f, const uint64_t macadr, |
uci1 | 8:95a325df1f6b | 118 | const uint32_t run, const uint16_t seq) { |
uci1 | 5:9cea89700c66 | 119 | // MUST INCREMENT kIOvers if these writes are altered |
uci1 | 5:9cea89700c66 | 120 | f = SnBitUtils::WriteTo(f, kIOvers); |
uci1 | 5:9cea89700c66 | 121 | f = SnBitUtils::WriteTo(f, macadr); |
uci1 | 5:9cea89700c66 | 122 | f = SnBitUtils::WriteTo(f, run); |
uci1 | 5:9cea89700c66 | 123 | f = SnBitUtils::WriteTo(f, seq); |
uci1 | 5:9cea89700c66 | 124 | return SnCommWin::kOkMsgSent; |
uci1 | 5:9cea89700c66 | 125 | } |
uci1 | 5:9cea89700c66 | 126 | |
uci1 | 5:9cea89700c66 | 127 | template<class T> |
uci1 | 5:9cea89700c66 | 128 | static |
uci1 | 5:9cea89700c66 | 129 | SnCommWin::ECommWinResult ReadFileHeader(T& f, uint64_t& macadr, |
uci1 | 5:9cea89700c66 | 130 | uint32_t& run, uint16_t& seq, |
uci1 | 8:95a325df1f6b | 131 | SnPowerFrame* pow=0) { |
uci1 | 8:95a325df1f6b | 132 | SnCommWin::ECommWinResult res = SnCommWin::kOkWithMsg; |
uci1 | 5:9cea89700c66 | 133 | uint8_t Rv=0; |
uci1 | 5:9cea89700c66 | 134 | f = SnBitUtils::ReadFrom(f, Rv); |
uci1 | 5:9cea89700c66 | 135 | f = SnBitUtils::ReadFrom(f, macadr); |
uci1 | 5:9cea89700c66 | 136 | f = SnBitUtils::ReadFrom(f, run); |
uci1 | 5:9cea89700c66 | 137 | f = SnBitUtils::ReadFrom(f, seq); |
uci1 | 8:95a325df1f6b | 138 | if (Rv==2) { |
uci1 | 8:95a325df1f6b | 139 | uint16_t v1, v2; |
uci1 | 8:95a325df1f6b | 140 | f = SnBitUtils::ReadFrom(f, v1); |
uci1 | 8:95a325df1f6b | 141 | f = SnBitUtils::ReadFrom(f, v2); |
uci1 | 8:95a325df1f6b | 142 | if (pow!=0) { |
uci1 | 8:95a325df1f6b | 143 | pow->Set(v1, v2, 0, 0, 0); |
uci1 | 8:95a325df1f6b | 144 | } |
uci1 | 5:9cea89700c66 | 145 | } |
uci1 | 8:95a325df1f6b | 146 | return res; |
uci1 | 5:9cea89700c66 | 147 | } |
uci1 | 5:9cea89700c66 | 148 | |
uci1 | 5:9cea89700c66 | 149 | static |
uci1 | 8:95a325df1f6b | 150 | uint32_t SizeOfFileHeader(const uint8_t rv) { |
uci1 | 8:95a325df1f6b | 151 | if (rv==2) { |
uci1 | 8:95a325df1f6b | 152 | return kMaxSizeOfFileHdr; |
uci1 | 8:95a325df1f6b | 153 | } else { |
uci1 | 8:95a325df1f6b | 154 | return sizeof(uint8_t)+sizeof(uint64_t)+sizeof(uint32_t)+sizeof(uint16_t); |
uci1 | 8:95a325df1f6b | 155 | } |
uci1 | 8:95a325df1f6b | 156 | } |
uci1 | 0:664899e0b988 | 157 | |
uci1 | 0:664899e0b988 | 158 | friend class SnSDUtilsWhisperer; // to restrict access to specific functions |
uci1 | 0:664899e0b988 | 159 | }; |
uci1 | 0:664899e0b988 | 160 | |
uci1 | 0:664899e0b988 | 161 | class SnSDUtilsWhisperer { |
uci1 | 0:664899e0b988 | 162 | static |
uci1 | 0:664899e0b988 | 163 | void DeleteFile(FILE*& f, const char* fname) { |
uci1 | 0:664899e0b988 | 164 | return SnSDUtils::DeleteFile(f, fname); |
uci1 | 0:664899e0b988 | 165 | } |
uci1 | 0:664899e0b988 | 166 | |
uci1 | 0:664899e0b988 | 167 | friend class SnCommWin; // the one who's allowed to use me |
uci1 | 0:664899e0b988 | 168 | }; |
uci1 | 0:664899e0b988 | 169 | |
uci1 | 0:664899e0b988 | 170 | #endif // SN_SnSDUtils |