Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnSDUtils.h@10:3c93db1cfb12, 2012-08-10 (annotated)
- Committer:
- uci1
- Date:
- Fri Aug 10 18:35:43 2012 +0000
- Revision:
- 10:3c93db1cfb12
- Parent:
- 8:95a325df1f6b
- Child:
- 12:d472f9811262
Ensure that lockRegisters (p20) is 0 before accessing the SD card, for example when closing the file. This fixes an issue seen when running in power count mode. Communications still under dev. Many debug outputs.
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 | 0:664899e0b988 | 41 | static char fgCurFileName[kFNBufSize]; |
uci1 | 1:e392595b4b76 | 42 | static FILE* fgCurFile; |
uci1 | 0:664899e0b988 | 43 | |
uci1 | 0:664899e0b988 | 44 | public: |
uci1 | 0:664899e0b988 | 45 | SnSDUtils() {} |
uci1 | 0:664899e0b988 | 46 | virtual ~SnSDUtils() {} |
uci1 | 0:664899e0b988 | 47 | |
uci1 | 0:664899e0b988 | 48 | static |
uci1 | 10:3c93db1cfb12 | 49 | int CloseOutputFile(FILE* f) { |
uci1 | 10:3c93db1cfb12 | 50 | // TODO: set current file pointer to 0 |
uci1 | 10:3c93db1cfb12 | 51 | const int rt = (f!=0) ? fclose(f) : 0; |
uci1 | 10:3c93db1cfb12 | 52 | return rt; |
uci1 | 10:3c93db1cfb12 | 53 | } |
uci1 | 0:664899e0b988 | 54 | |
uci1 | 0:664899e0b988 | 55 | static |
uci1 | 0:664899e0b988 | 56 | FILE* OpenNewOutputFile(const uint64_t macadr, |
uci1 | 8:95a325df1f6b | 57 | const uint32_t run); |
uci1 | 0:664899e0b988 | 58 | |
uci1 | 0:664899e0b988 | 59 | static |
uci1 | 3:24c5f0f50bf1 | 60 | FILE* OpenExistingFile(const char* name, const bool setcurrent); |
uci1 | 0:664899e0b988 | 61 | |
uci1 | 0:664899e0b988 | 62 | static |
uci1 | 0:664899e0b988 | 63 | SnCommWin::ECommWinResult SendAllFiles(SnCommWin* comm, |
uci1 | 3:24c5f0f50bf1 | 64 | const bool doDelete, |
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 | 8:95a325df1f6b | 70 | SnPowerFrame& pow); |
uci1 | 0:664899e0b988 | 71 | |
uci1 | 0:664899e0b988 | 72 | static |
uci1 | 0:664899e0b988 | 73 | const char* GetCurFileName() { return fgCurFileName; } |
uci1 | 0:664899e0b988 | 74 | |
uci1 | 0:664899e0b988 | 75 | static |
uci1 | 1:e392595b4b76 | 76 | FILE* GetCurFile() { return fgCurFile; } |
uci1 | 1:e392595b4b76 | 77 | |
uci1 | 1:e392595b4b76 | 78 | static |
uci1 | 10:3c93db1cfb12 | 79 | uint16_t GetCurSeqNum(); |
uci1 | 10:3c93db1cfb12 | 80 | |
uci1 | 10:3c93db1cfb12 | 81 | static |
uci1 | 10:3c93db1cfb12 | 82 | uint16_t GetSeqNumFromFileName(const char* fn); |
uci1 | 10:3c93db1cfb12 | 83 | |
uci1 | 10:3c93db1cfb12 | 84 | static |
uci1 | 0:664899e0b988 | 85 | bool WriteEventTo(FILE* efile, char* const evtBuf, |
uci1 | 0:664899e0b988 | 86 | const SnEventFrame& evt, |
uci1 | 0:664899e0b988 | 87 | const SnConfigFrame& conf); |
uci1 | 0:664899e0b988 | 88 | |
uci1 | 0:664899e0b988 | 89 | static |
uci1 | 0:664899e0b988 | 90 | bool WriteConfig(FILE* efile, |
uci1 | 0:664899e0b988 | 91 | const SnConfigFrame& conf); |
uci1 | 2:e67f7c158087 | 92 | |
uci1 | 8:95a325df1f6b | 93 | template<class T> |
uci1 | 2:e67f7c158087 | 94 | static |
uci1 | 8:95a325df1f6b | 95 | SnCommWin::ECommWinResult WritePowerTo(T& f, |
uci1 | 8:95a325df1f6b | 96 | const SnPowerFrame& pow, |
uci1 | 8:95a325df1f6b | 97 | uint32_t& pnum) { |
uci1 | 8:95a325df1f6b | 98 | const SnCommWin::ECommWinResult rs = |
uci1 | 8:95a325df1f6b | 99 | SnHeaderFrame::WriteTo(f, SnHeaderFrame::kPowerCode, |
uci1 | 8:95a325df1f6b | 100 | SnPowerFrame::SizeOf(SnPowerFrame::kIOvers)); |
uci1 | 8:95a325df1f6b | 101 | const SnCommWin::ECommWinResult re = pow.WriteTo(f); |
uci1 | 8:95a325df1f6b | 102 | ++pnum; |
uci1 | 8:95a325df1f6b | 103 | return (rs<re) ? rs : re; |
uci1 | 8:95a325df1f6b | 104 | } |
uci1 | 8:95a325df1f6b | 105 | |
uci1 | 8:95a325df1f6b | 106 | template<class T> |
uci1 | 8:95a325df1f6b | 107 | static |
uci1 | 8:95a325df1f6b | 108 | SnCommWin::ECommWinResult ReadBlockHeader(T& f, |
uci1 | 8:95a325df1f6b | 109 | uint8_t& mcode, |
uci1 | 8:95a325df1f6b | 110 | uint32_t& mlen) { |
uci1 | 8:95a325df1f6b | 111 | return SnHeaderFrame::ReadFrom(f, mcode, mlen); |
uci1 | 8:95a325df1f6b | 112 | } |
uci1 | 8:95a325df1f6b | 113 | |
uci1 | 5:9cea89700c66 | 114 | template<class T> |
uci1 | 5:9cea89700c66 | 115 | static |
uci1 | 5:9cea89700c66 | 116 | SnCommWin::ECommWinResult WriteFileHeader(T& f, const uint64_t macadr, |
uci1 | 8:95a325df1f6b | 117 | const uint32_t run, const uint16_t seq) { |
uci1 | 5:9cea89700c66 | 118 | // MUST INCREMENT kIOvers if these writes are altered |
uci1 | 5:9cea89700c66 | 119 | f = SnBitUtils::WriteTo(f, kIOvers); |
uci1 | 5:9cea89700c66 | 120 | f = SnBitUtils::WriteTo(f, macadr); |
uci1 | 5:9cea89700c66 | 121 | f = SnBitUtils::WriteTo(f, run); |
uci1 | 5:9cea89700c66 | 122 | f = SnBitUtils::WriteTo(f, seq); |
uci1 | 5:9cea89700c66 | 123 | return SnCommWin::kOkMsgSent; |
uci1 | 5:9cea89700c66 | 124 | } |
uci1 | 5:9cea89700c66 | 125 | |
uci1 | 5:9cea89700c66 | 126 | template<class T> |
uci1 | 5:9cea89700c66 | 127 | static |
uci1 | 5:9cea89700c66 | 128 | SnCommWin::ECommWinResult ReadFileHeader(T& f, uint64_t& macadr, |
uci1 | 5:9cea89700c66 | 129 | uint32_t& run, uint16_t& seq, |
uci1 | 8:95a325df1f6b | 130 | SnPowerFrame* pow=0) { |
uci1 | 8:95a325df1f6b | 131 | SnCommWin::ECommWinResult res = SnCommWin::kOkWithMsg; |
uci1 | 5:9cea89700c66 | 132 | uint8_t Rv=0; |
uci1 | 5:9cea89700c66 | 133 | f = SnBitUtils::ReadFrom(f, Rv); |
uci1 | 5:9cea89700c66 | 134 | f = SnBitUtils::ReadFrom(f, macadr); |
uci1 | 5:9cea89700c66 | 135 | f = SnBitUtils::ReadFrom(f, run); |
uci1 | 5:9cea89700c66 | 136 | f = SnBitUtils::ReadFrom(f, seq); |
uci1 | 8:95a325df1f6b | 137 | if (Rv==2) { |
uci1 | 8:95a325df1f6b | 138 | uint16_t v1, v2; |
uci1 | 8:95a325df1f6b | 139 | f = SnBitUtils::ReadFrom(f, v1); |
uci1 | 8:95a325df1f6b | 140 | f = SnBitUtils::ReadFrom(f, v2); |
uci1 | 8:95a325df1f6b | 141 | if (pow!=0) { |
uci1 | 8:95a325df1f6b | 142 | pow->Set(v1, v2, 0, 0, 0); |
uci1 | 8:95a325df1f6b | 143 | } |
uci1 | 5:9cea89700c66 | 144 | } |
uci1 | 8:95a325df1f6b | 145 | return res; |
uci1 | 5:9cea89700c66 | 146 | } |
uci1 | 5:9cea89700c66 | 147 | |
uci1 | 5:9cea89700c66 | 148 | static |
uci1 | 8:95a325df1f6b | 149 | uint32_t SizeOfFileHeader(const uint8_t rv) { |
uci1 | 8:95a325df1f6b | 150 | if (rv==2) { |
uci1 | 8:95a325df1f6b | 151 | return kMaxSizeOfFileHdr; |
uci1 | 8:95a325df1f6b | 152 | } else { |
uci1 | 8:95a325df1f6b | 153 | return sizeof(uint8_t)+sizeof(uint64_t)+sizeof(uint32_t)+sizeof(uint16_t); |
uci1 | 8:95a325df1f6b | 154 | } |
uci1 | 8:95a325df1f6b | 155 | } |
uci1 | 0:664899e0b988 | 156 | |
uci1 | 0:664899e0b988 | 157 | friend class SnSDUtilsWhisperer; // to restrict access to specific functions |
uci1 | 0:664899e0b988 | 158 | }; |
uci1 | 0:664899e0b988 | 159 | |
uci1 | 0:664899e0b988 | 160 | class SnSDUtilsWhisperer { |
uci1 | 0:664899e0b988 | 161 | static |
uci1 | 0:664899e0b988 | 162 | void DeleteFile(FILE*& f, const char* fname) { |
uci1 | 0:664899e0b988 | 163 | return SnSDUtils::DeleteFile(f, fname); |
uci1 | 0:664899e0b988 | 164 | } |
uci1 | 0:664899e0b988 | 165 | |
uci1 | 0:664899e0b988 | 166 | friend class SnCommWin; // the one who's allowed to use me |
uci1 | 0:664899e0b988 | 167 | }; |
uci1 | 0:664899e0b988 | 168 | |
uci1 | 0:664899e0b988 | 169 | #endif // SN_SnSDUtils |