Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnCommWin.h@25:57b2627fe756, 2012-10-30 (annotated)
- 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?
User | Revision | Line number | New 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 |