Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Fri Jul 20 19:04:02 2012 +0000
Revision:
1:e392595b4b76
Parent:
0:664899e0b988
Child:
2:e67f7c158087
many features checked and working. afar implemented. sending of data not yet tested. contains many debug prints

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 0:664899e0b988 1 #include "SnSDUtils.h"
uci1 0:664899e0b988 2
uci1 0:664899e0b988 3 #include "mbed.h"
uci1 0:664899e0b988 4 #include "SDFileSystem.h"
uci1 0:664899e0b988 5 #include <string.h>
uci1 0:664899e0b988 6
uci1 0:664899e0b988 7 #include "SnConfigFrame.h"
uci1 0:664899e0b988 8 #include "SnEventFrame.h"
uci1 0:664899e0b988 9
uci1 0:664899e0b988 10
uci1 1:e392595b4b76 11 const char* const SnSDUtils::kSDsubDir = "/sd";
uci1 1:e392595b4b76 12 char SnSDUtils::fgCurFileName[kFNBufSize];
uci1 1:e392595b4b76 13 FILE* SnSDUtils::fgCurFile = 0;
uci1 1:e392595b4b76 14 const uint8_t SnSDUtils::kIOvers = 1;
uci1 0:664899e0b988 15
uci1 0:664899e0b988 16 const char* SnSDUtils::GetOutFileName(const uint64_t macadr,
uci1 0:664899e0b988 17 const uint32_t run,
uci1 0:664899e0b988 18 const uint16_t seq) {
uci1 0:664899e0b988 19 // returns the formatted file name, or NULL if the directory is too long
uci1 0:664899e0b988 20 // and the full name cannot fit in the buffer
uci1 0:664899e0b988 21 // NOTE: this fcn uses a static buffer, and so should not be called
uci1 0:664899e0b988 22 // multiple times in the same line (that includes the calling of functions
uci1 0:664899e0b988 23 // that call this function!)
uci1 0:664899e0b988 24 //
uci1 0:664899e0b988 25 // filename = SnEvtsM[6-byte hex mac adr]r[6-digit run num]s[5-digit seq num].dat
uci1 0:664899e0b988 26 // 35 chars 7 + 12 +1+ 5 +1+ 5 + 4
uci1 0:664899e0b988 27
uci1 0:664899e0b988 28 if (strlen(kSDsubDir)<(kFNBufSize-37)) {
uci1 0:664899e0b988 29 static char tbuf[kFNBufSize];
uci1 0:664899e0b988 30 memset(tbuf, 0, sizeof(char)*kFNBufSize);
uci1 0:664899e0b988 31 // if file name format changes, GetSeqNum must be changed too
uci1 0:664899e0b988 32 sprintf(tbuf, "%s/SnEvtsM%012llXr%05ds%05d.dat",
uci1 0:664899e0b988 33 kSDsubDir,
uci1 0:664899e0b988 34 macadr>>16, // 64 -> 48 bits
uci1 0:664899e0b988 35 run, seq);
uci1 0:664899e0b988 36 return tbuf;
uci1 0:664899e0b988 37 } else {
uci1 0:664899e0b988 38 return NULL;
uci1 0:664899e0b988 39 }
uci1 0:664899e0b988 40 }
uci1 0:664899e0b988 41
uci1 0:664899e0b988 42 uint16_t SnSDUtils::GetSeqNum(const uint64_t macadr,
uci1 0:664899e0b988 43 const uint32_t run) {
uci1 0:664899e0b988 44 // count the files having expected filename format
uci1 0:664899e0b988 45
uci1 0:664899e0b988 46 const char* fn = GetOutFileName(macadr, run, 0)
uci1 0:664899e0b988 47 + strlen(kSDsubDir) + 1; // take out dir and '/'s
uci1 0:664899e0b988 48
uci1 0:664899e0b988 49 DIR* d;
uci1 0:664899e0b988 50 struct dirent* dent;
uci1 0:664899e0b988 51
uci1 0:664899e0b988 52 uint16_t seq=0;
uci1 0:664899e0b988 53 if ( (d = opendir( kSDsubDir ))!=NULL ) {
uci1 0:664899e0b988 54 // don't compare seq#. don't use num of chars in case seq is >999
uci1 0:664899e0b988 55 const uint32_t ncomp = strrchr(fn, 's') - fn;
uci1 0:664899e0b988 56 while ( (dent = readdir(d))!=NULL ) {
uci1 0:664899e0b988 57 if (strncmp(dent->d_name, fn, ncomp)==0) {
uci1 0:664899e0b988 58 seq++;
uci1 0:664899e0b988 59 }
uci1 0:664899e0b988 60 }
uci1 0:664899e0b988 61 closedir(d);
uci1 0:664899e0b988 62 }
uci1 0:664899e0b988 63
uci1 0:664899e0b988 64 return seq;
uci1 0:664899e0b988 65 }
uci1 0:664899e0b988 66
uci1 0:664899e0b988 67 FILE* SnSDUtils::OpenExistingFile(const char* name) {
uci1 0:664899e0b988 68 FILE* f = 0;
uci1 0:664899e0b988 69 if (name!=NULL) {
uci1 1:e392595b4b76 70 f = OpenSDFile(name);
uci1 0:664899e0b988 71 }
uci1 0:664899e0b988 72 return f;
uci1 0:664899e0b988 73 }
uci1 0:664899e0b988 74
uci1 1:e392595b4b76 75 FILE* SnSDUtils::OpenSDFile(const char* name) {
uci1 1:e392595b4b76 76 FILE* f = fopen(name, "wb");
uci1 1:e392595b4b76 77 //setvbuf(f, 0, _IONBF, 0); // no buffering
uci1 1:e392595b4b76 78 return f;
uci1 1:e392595b4b76 79 }
uci1 1:e392595b4b76 80
uci1 0:664899e0b988 81 FILE* SnSDUtils::OpenNewOutputFile(const uint64_t macadr,
uci1 0:664899e0b988 82 const uint32_t run) {
uci1 0:664899e0b988 83 // opens a new file in the specified directory and writes this
uci1 0:664899e0b988 84 // this mbed's mac address as the first sizeof(uint64_t) bytes (i.e. 4 bytes)
uci1 0:664899e0b988 85 //
uci1 0:664899e0b988 86 const uint16_t seq = GetSeqNum(macadr, run);
uci1 0:664899e0b988 87 memset(fgCurFileName, 0, sizeof(char)*kFNBufSize);
uci1 0:664899e0b988 88 strcpy(fgCurFileName,GetOutFileName(macadr, run, seq));
uci1 0:664899e0b988 89 //fprintf(stderr,"cur file = %s (%hu)\n\r",fgCurFileName,seq);
uci1 1:e392595b4b76 90 fgCurFile = 0;
uci1 0:664899e0b988 91 if (fgCurFileName!=NULL) {
uci1 1:e392595b4b76 92 fgCurFile = OpenSDFile(fgCurFileName);
uci1 0:664899e0b988 93 }
uci1 1:e392595b4b76 94 return fgCurFile;
uci1 0:664899e0b988 95 }
uci1 0:664899e0b988 96
uci1 0:664899e0b988 97 bool SnSDUtils::WriteFileHeader(FILE* f, const uint64_t macadr) {
uci1 0:664899e0b988 98 // MUST INCREMENT kIOvers if these writes are altered
uci1 0:664899e0b988 99 fwrite(&kIOvers, sizeof(uint8_t), 1, f);
uci1 0:664899e0b988 100 fwrite(&macadr, sizeof(uint64_t), 1, f);
uci1 1:e392595b4b76 101 fflush(f);
uci1 0:664899e0b988 102 return ferror(f);
uci1 0:664899e0b988 103 }
uci1 0:664899e0b988 104
uci1 0:664899e0b988 105 bool SnSDUtils::WriteEventTo(FILE* efile, char* const evtBuf,
uci1 0:664899e0b988 106 const SnEventFrame& evt,
uci1 0:664899e0b988 107 const SnConfigFrame& conf) {
uci1 0:664899e0b988 108 // write event to SD card
uci1 0:664899e0b988 109
uci1 0:664899e0b988 110 uint8_t sLoseLSB=0, sLoseMSB=0;
uci1 0:664899e0b988 111 uint16_t sWvBase=0;
uci1 0:664899e0b988 112 conf.GetPackParsFor(SnConfigFrame::kSDcard, sLoseLSB, sLoseMSB, sWvBase);
uci1 0:664899e0b988 113 const bool ret = evt.WriteTo(efile, evtBuf, sLoseLSB, sLoseMSB, sWvBase);
uci1 0:664899e0b988 114 fflush(efile);
uci1 0:664899e0b988 115 return ret;
uci1 0:664899e0b988 116 }
uci1 0:664899e0b988 117
uci1 0:664899e0b988 118 bool SnSDUtils::WriteConfig(FILE* efile,
uci1 0:664899e0b988 119 const SnConfigFrame& conf) {
uci1 0:664899e0b988 120 conf.WriteTo(efile);
uci1 0:664899e0b988 121 return true;
uci1 0:664899e0b988 122 }
uci1 0:664899e0b988 123
uci1 0:664899e0b988 124 void SnSDUtils::DeleteFile(FILE*& f, const char* fname) {
uci1 0:664899e0b988 125 fclose(f);
uci1 0:664899e0b988 126 f=0;
uci1 0:664899e0b988 127 remove(fname);
uci1 0:664899e0b988 128 }
uci1 0:664899e0b988 129
uci1 0:664899e0b988 130 SnCommWin::ECommWinResult SnSDUtils::SendAllFiles(SnCommWin* comm,
uci1 0:664899e0b988 131 const bool doDelete) {
uci1 0:664899e0b988 132
uci1 0:664899e0b988 133 DIR* d;
uci1 0:664899e0b988 134 struct dirent* dent;
uci1 0:664899e0b988 135
uci1 0:664899e0b988 136 SnCommWin::ECommWinResult rs = SnCommWin::kUndefFail;
uci1 0:664899e0b988 137
uci1 0:664899e0b988 138 if ( (d = opendir( kSDsubDir ))!=NULL ) {
uci1 0:664899e0b988 139 FILE* f;
uci1 0:664899e0b988 140 while ( (dent = readdir(d))!=NULL ) {
uci1 0:664899e0b988 141 if (strncmp(dent->d_name, "SnEvts", 6)==0) {
uci1 1:e392595b4b76 142 const bool isCurFile =
uci1 1:e392595b4b76 143 (strcmp(dent->d_name, GetCurFileName())==0);
uci1 1:e392595b4b76 144 if (isCurFile) {
uci1 1:e392595b4b76 145 f = GetCurFile();
uci1 1:e392595b4b76 146 } else {
uci1 1:e392595b4b76 147 f = OpenExistingFile(dent->d_name);
uci1 1:e392595b4b76 148 }
uci1 0:664899e0b988 149 rs = comm->SendData(f);
uci1 0:664899e0b988 150 if (rs<SnCommWin::kAllFails) {
uci1 0:664899e0b988 151 break;
uci1 1:e392595b4b76 152 } else if (doDelete && (isCurFile==false)) {
uci1 0:664899e0b988 153 DeleteFile(f, dent->d_name);
uci1 0:664899e0b988 154 }
uci1 0:664899e0b988 155 }
uci1 0:664899e0b988 156 }
uci1 0:664899e0b988 157 closedir(d);
uci1 0:664899e0b988 158 }
uci1 0:664899e0b988 159
uci1 0:664899e0b988 160 return rs;
uci1 0:664899e0b988 161 }
uci1 0:664899e0b988 162