Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

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?

UserRevisionLine numberNew 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