Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Tue Oct 30 05:23:57 2012 +0000
Revision:
25:57b2627fe756
Parent:
23:ccf39298f205
Child:
27:efc4d654b139
AFAR comms. Upped baud to 921600. Store data in run-seq subdirs, max of 100 files per dir, to prevent station grinding to a halt due when 800 files are in one directory. Cache file size count. Stagger tickers. Fixed some gcc warnings.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 1:e392595b4b76 1 #ifndef SN_SnCommWin
uci1 1:e392595b4b76 2 #define SN_SnCommWin
uci1 1:e392595b4b76 3
uci1 1:e392595b4b76 4 #include "mbed.h"
uci1 1:e392595b4b76 5 #include <stdint.h>
uci1 21:ce51bb0ba4a5 6 #include <string>
uci1 1:e392595b4b76 7
uci1 8:95a325df1f6b 8 #include "SnConfigFrame.h"
uci1 1:e392595b4b76 9 class SnEventFrame;
uci1 8:95a325df1f6b 10 class SnPowerFrame;
uci1 1:e392595b4b76 11
uci1 1:e392595b4b76 12 // ABC for communication types
uci1 1:e392595b4b76 13
uci1 1:e392595b4b76 14 class SnCommWin {
uci1 1:e392595b4b76 15 public:
uci1 1:e392595b4b76 16 enum ECommWinResult {
uci1 1:e392595b4b76 17 kUndefFail, // undefined fail type
uci1 1:e392595b4b76 18 kCanNotConnect, // unable to connect to port
uci1 1:e392595b4b76 19 kFailTimeout, // timed out but message required
uci1 2:e67f7c158087 20 kFailNoneSent, // none of the message sent
uci1 1:e392595b4b76 21 kFailPartSent, // only part of the message sent
uci1 3:24c5f0f50bf1 22 kUnexpectedRec, // unexpected / unhandled message received
uci1 1:e392595b4b76 23 kAllFails, // to be used for "if (ret > kAllFails) ==> success"
uci1 1:e392595b4b76 24 // only successes should go below
uci1 1:e392595b4b76 25 kConnected, // connection established, no messaging attempted
uci1 1:e392595b4b76 26 kOkMsgSent, // message sent without waiting for "received" handshake
uci1 1:e392595b4b76 27 kOkNoMsg, // timed out with no message, but that is ok
uci1 12:d472f9811262 28 kOkWithMsg, // successfully received message
uci1 12:d472f9811262 29 kOkWthMsgNoConf // successfully received message and it says to stick with the same config
uci1 1:e392595b4b76 30 };
uci1 23:ccf39298f205 31
uci1 23:ccf39298f205 32 static const size_t kMaxStrLen = 512; // max bytes for a string send. prevent something crazy
uci1 25:57b2627fe756 33 static const char* kLocalDir; // the local mbed directory
uci1 21:ce51bb0ba4a5 34
uci1 21:ce51bb0ba4a5 35 private:
uci1 21:ce51bb0ba4a5 36 SnCommWin::ECommWinResult GetFilename(const uint32_t timeout,
uci1 21:ce51bb0ba4a5 37 char* const buf,
uci1 21:ce51bb0ba4a5 38 const uint32_t namelen);
uci1 21:ce51bb0ba4a5 39 SnCommWin::ECommWinResult GetLocalFile(std::string fname,
uci1 21:ce51bb0ba4a5 40 char* const buf,
uci1 21:ce51bb0ba4a5 41 const uint32_t bsize,
uci1 21:ce51bb0ba4a5 42 const uint32_t timeout);
uci1 21:ce51bb0ba4a5 43 int16_t LoopLocalDirBinFiles(const bool doRemove,
uci1 21:ce51bb0ba4a5 44 const std::string& fname);
uci1 21:ce51bb0ba4a5 45 SnCommWin::ECommWinResult GetHeader(const uint32_t timeOut,
uci1 21:ce51bb0ba4a5 46 char* const buf,
uci1 21:ce51bb0ba4a5 47 const uint32_t bsize,
uci1 21:ce51bb0ba4a5 48 uint8_t& mcode,
uci1 21:ce51bb0ba4a5 49 uint32_t& mlen);
uci1 21:ce51bb0ba4a5 50
uci1 1:e392595b4b76 51
uci1 3:24c5f0f50bf1 52 protected:
uci1 12:d472f9811262 53 virtual int SendFileBlock(FILE* inf,
uci1 12:d472f9811262 54 const uint8_t blockHeaderCode,
uci1 12:d472f9811262 55 const uint32_t blockSize,
uci1 12:d472f9811262 56 char* const genBuf,
uci1 12:d472f9811262 57 const uint32_t timeout);
uci1 12:d472f9811262 58
uci1 8:95a325df1f6b 59 virtual ECommWinResult SendFileContents(FILE* inf,
uci1 8:95a325df1f6b 60 const SnConfigFrame& curConf,
uci1 8:95a325df1f6b 61 SnEventFrame& evt,
uci1 8:95a325df1f6b 62 SnPowerFrame& pow,
uci1 8:95a325df1f6b 63 char* const genBuf,
uci1 8:95a325df1f6b 64 uint32_t nevts,
uci1 12:d472f9811262 65 const uint32_t timeout_clock);
uci1 8:95a325df1f6b 66
uci1 21:ce51bb0ba4a5 67 // send and receive must not kick the watchdog, or a bad timeout
uci1 21:ce51bb0ba4a5 68 // could block a station forever!
uci1 8:95a325df1f6b 69 virtual int32_t ReceiveAll(char* const buf, const uint32_t mlen,
uci1 8:95a325df1f6b 70 const uint32_t timeout_clock)=0;
uci1 8:95a325df1f6b 71 virtual int32_t SendAll(char* const data, const uint32_t length,
uci1 8:95a325df1f6b 72 const uint32_t timeout_clock)=0;
uci1 12:d472f9811262 73
uci1 12:d472f9811262 74 bool IsTimedOut(const uint32_t timeout_clock) const;
uci1 8:95a325df1f6b 75
uci1 12:d472f9811262 76
uci1 1:e392595b4b76 77 public:
uci1 1:e392595b4b76 78 virtual ~SnCommWin() {}
uci1 1:e392595b4b76 79
uci1 16:744ce85aede2 80 virtual SnConfigFrame::EDatPackBit GetCommType() const=0;
uci1 16:744ce85aede2 81
uci1 16:744ce85aede2 82 virtual bool TrySetSysTimeUnix(const uint32_t timeout) { return 0; }
uci1 16:744ce85aede2 83
uci1 8:95a325df1f6b 84 virtual void Set(const SnConfigFrame& conf)=0;
uci1 8:95a325df1f6b 85
uci1 1:e392595b4b76 86 virtual ECommWinResult OpenWindow(const uint32_t timeout,
uci1 1:e392595b4b76 87 const bool sendStatus,
uci1 1:e392595b4b76 88 const SnConfigFrame& conf,
uci1 1:e392595b4b76 89 const SnEventFrame& evt,
uci1 8:95a325df1f6b 90 const SnPowerFrame& pow,
uci1 10:3c93db1cfb12 91 const uint16_t seq,
uci1 10:3c93db1cfb12 92 const float thmrate,
uci1 10:3c93db1cfb12 93 const float evtrate,
uci1 2:e67f7c158087 94 char* const genBuf)=0;
uci1 1:e392595b4b76 95
uci1 1:e392595b4b76 96 virtual bool Connect(const uint32_t timeout)=0;
uci1 15:f2569d8e4176 97 virtual bool CloseConn(const uint32_t timeout)=0;
uci1 16:744ce85aede2 98 virtual uint32_t GetConnectTimeout() const;
uci1 16:744ce85aede2 99 virtual uint32_t GetListenTimeout() const;
uci1 21:ce51bb0ba4a5 100 virtual ECommWinResult WaitHandshake(const SnConfigFrame& conf,
uci1 21:ce51bb0ba4a5 101 const uint32_t timeout,
uci1 3:24c5f0f50bf1 102 char* const buf,
uci1 6:6f002d202f59 103 const uint32_t bsize,
uci1 8:95a325df1f6b 104 uint8_t& hndShkCode);
uci1 3:24c5f0f50bf1 105
uci1 8:95a325df1f6b 106 ECommWinResult GetConfig(SnConfigFrame& conf,
uci1 8:95a325df1f6b 107 const uint32_t timeOut,
uci1 8:95a325df1f6b 108 char* const confBuf,
uci1 8:95a325df1f6b 109 const uint32_t bsize);
uci1 1:e392595b4b76 110
uci1 8:95a325df1f6b 111 ECommWinResult SendStatus(const SnConfigFrame& conf,
uci1 8:95a325df1f6b 112 const SnEventFrame& evt,
uci1 8:95a325df1f6b 113 const SnPowerFrame& pow,
uci1 10:3c93db1cfb12 114 const uint16_t seq,
uci1 10:3c93db1cfb12 115 const float thmrate,
uci1 10:3c93db1cfb12 116 const float evtrate,
uci1 8:95a325df1f6b 117 char* const genBuf,
uci1 8:95a325df1f6b 118 const uint32_t timeout_clock);
uci1 1:e392595b4b76 119
uci1 23:ccf39298f205 120 SnCommWin::ECommWinResult SendString(const char* str,
uci1 23:ccf39298f205 121 const uint32_t timeout);
uci1 23:ccf39298f205 122
uci1 8:95a325df1f6b 123 ECommWinResult SendFilename(const char* fn,
uci1 8:95a325df1f6b 124 char* const genBuf,
uci1 8:95a325df1f6b 125 const uint32_t timeout_clock);
uci1 6:6f002d202f59 126
uci1 8:95a325df1f6b 127 ECommWinResult SendData(FILE* inf, const char* infn,
uci1 8:95a325df1f6b 128 const SnConfigFrame& curConf,
uci1 8:95a325df1f6b 129 SnEventFrame& evt,
uci1 8:95a325df1f6b 130 SnPowerFrame& pow,
uci1 8:95a325df1f6b 131 char* const genBuf,
uci1 8:95a325df1f6b 132 const uint32_t bsize,
uci1 8:95a325df1f6b 133 const uint32_t nevts,
uci1 8:95a325df1f6b 134 const uint32_t timeout_clock,
uci1 25:57b2627fe756 135 const uint32_t handshakeTimeout,
uci1 25:57b2627fe756 136 uint8_t* hndres=0);
uci1 6:6f002d202f59 137
uci1 8:95a325df1f6b 138 ECommWinResult SendData(SnConfigFrame& conf,
uci1 8:95a325df1f6b 139 SnEventFrame& evt,
uci1 8:95a325df1f6b 140 SnPowerFrame& pow,
uci1 8:95a325df1f6b 141 char* const genBuf,
uci1 8:95a325df1f6b 142 const uint32_t bsize,
uci1 12:d472f9811262 143 const uint32_t timeout,
uci1 12:d472f9811262 144 const uint32_t handshakeTimeout);
uci1 8:95a325df1f6b 145
uci1 25:57b2627fe756 146 static
uci1 25:57b2627fe756 147 void CapitalizeInPlace(std::string::iterator s,
uci1 25:57b2627fe756 148 const std::string::const_iterator send);
uci1 25:57b2627fe756 149
uci1 18:55f1581f2ee4 150 // for debugging
uci1 18:55f1581f2ee4 151 void dispStrBytes(const char* const s, const uint32_t len) const {
uci1 18:55f1581f2ee4 152 const char* c = s;
uci1 18:55f1581f2ee4 153 for (uint32_t i=0; i<len; ++i, ++c) {
uci1 18:55f1581f2ee4 154 if (*c>0x1F && *c<0x7F) {
uci1 18:55f1581f2ee4 155 printf("%c", *c);
uci1 18:55f1581f2ee4 156 } else {
uci1 18:55f1581f2ee4 157 printf(".x%02x.", *c);
uci1 18:55f1581f2ee4 158 }
uci1 18:55f1581f2ee4 159 }
uci1 18:55f1581f2ee4 160 }
uci1 18:55f1581f2ee4 161
uci1 1:e392595b4b76 162 };
uci1 1:e392595b4b76 163
uci1 1:e392595b4b76 164 #endif // SN_SnCommWin