Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

SnSDUtils.h

Committer:
uci1
Date:
2012-08-03
Revision:
6:6f002d202f59
Parent:
5:9cea89700c66
Child:
8:95a325df1f6b

File content as of revision 6:6f002d202f59:

#ifndef SN_SnSDUtils
#define SN_SnSDUtils

#include <stdio.h>
#include <stdint.h>

#include "SnCommWin.h"
#include "SnBitUtils.h"
#include "SnPowerFrame.h"

class SnEventFrame;
class SnConfigFrame;

// a namespace-like class to handle the i/o with the SD card

class SnSDUtils {
 public:
    static const char* const kSDsubDir;
    static const uint8_t     kFNBufSize=128;
    static const uint8_t     kIOvers; // file I/O version
    static const uint32_t    kMaxSizeOfFileHdr;
    
 private:
    
    static
    FILE* OpenSDFile(const char* name, const char* mode);
    
    static
    uint16_t GetSeqNum(const uint64_t macadr,
                       const uint32_t run);
    
    static
    const char* GetOutFileName(const uint64_t macadr,
                               const uint32_t run,
                               const uint16_t seq);
    
    static
    void  DeleteFile(FILE*& f, const char* fname);
        
    static char fgCurFileName[kFNBufSize];
    static FILE* fgCurFile;
    
 public:
    SnSDUtils() {}
    virtual ~SnSDUtils() {}
    
    static
    int   CloseOutputFile(FILE* f)
        { return (f!=0) ? fclose(f) : 0; }
    
    static
    FILE* OpenNewOutputFile(const uint64_t macadr,
                            const uint32_t run,
                            const uint16_t v1, const uint16_t v2);
    
    static
    FILE* OpenExistingFile(const char* name, const bool setcurrent);
    
    static
    SnCommWin::ECommWinResult SendAllFiles(SnCommWin* comm,
                                           const bool doDelete,
                                           const uint32_t timeout,
                                           char* const buf,
                                           const uint32_t bsize,
                                           const SnConfigFrame& curConf,
                                                 SnEventFrame& evt);
    
    static
    const char* GetCurFileName() { return fgCurFileName; }
    
    static
    FILE*       GetCurFile() { return fgCurFile; }
    
    static
    bool  WriteEventTo(FILE* efile, char* const evtBuf,
                       const SnEventFrame& evt,
                       const SnConfigFrame& conf);
    
    static
    bool  WriteConfig(FILE* efile,
                      const SnConfigFrame& conf);
    /*
    static
    bool  WriteFileHeader(FILE* f, const uint64_t macadr,
                          const uint32_t run, const uint16_t seq,
                          const uint16_t v1, const uint16_t v2);
    
    static
    bool  ReadFileHeader(FILE* f, uint64_t& macadr,
                         uint32_t& run, uint16_t& seq,
                         uint16_t& v1, uint16_t& v2);
    */
    template<class T>
    static
    SnCommWin::ECommWinResult WriteFileHeader(T& f, const uint64_t macadr,
                      const uint32_t run, const uint16_t seq,
                      const uint16_t v1, const uint16_t v2) {
        // MUST INCREMENT kIOvers if these writes are altered
        f = SnBitUtils::WriteTo(f, kIOvers);
        f = SnBitUtils::WriteTo(f, macadr);
        f = SnBitUtils::WriteTo(f, run);
        f = SnBitUtils::WriteTo(f, seq);
        SnPowerFrame::WriteTo(f, v1, v2);
        return SnCommWin::kOkMsgSent;
    }
    
    template<class T>
    static
    SnCommWin::ECommWinResult ReadFileHeader(T& f, uint64_t& macadr,
                     uint32_t& run, uint16_t& seq,
                     uint16_t& v1, uint16_t& v2) {
        uint8_t Rv=0;
        f = SnBitUtils::ReadFrom(f, Rv);
        f = SnBitUtils::ReadFrom(f, macadr);
        f = SnBitUtils::ReadFrom(f, run);
        f = SnBitUtils::ReadFrom(f, seq);
        if (Rv>1) {
            SnPowerFrame::ReadFrom(f, v1, v2);
        }
        return SnCommWin::kOkWithMsg;
    }
    
    static
    uint32_t SizeOfFileHeader() { return kMaxSizeOfFileHdr; }
    
    friend class SnSDUtilsWhisperer; // to restrict access to specific functions
};

class SnSDUtilsWhisperer {
    static
    void  DeleteFile(FILE*& f, const char* fname) {
        return SnSDUtils::DeleteFile(f, fname);
    }
    
    friend class SnCommWin; // the one who's allowed to use me
};

#endif // SN_SnSDUtils