Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
SnCommWin.h@23:ccf39298f205, 2012-10-23 (annotated)
- Committer:
- uci1
- Date:
- Tue Oct 23 20:07:57 2012 +0000
- Revision:
- 23:ccf39298f205
- Parent:
- 21:ce51bb0ba4a5
- Child:
- 25:57b2627fe756
SBD communication enabled. Fix bug in which the SBD message number would be repeatedly increased upon failed sending attempts. Add check in SBD recv in case message is longer than buffer. Add SendString to SnCommWin
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 | 21:ce51bb0ba4a5 | 33 | |
uci1 | 21:ce51bb0ba4a5 | 34 | private: |
uci1 | 21:ce51bb0ba4a5 | 35 | SnCommWin::ECommWinResult GetFilename(const uint32_t timeout, |
uci1 | 21:ce51bb0ba4a5 | 36 | char* const buf, |
uci1 | 21:ce51bb0ba4a5 | 37 | const uint32_t namelen); |
uci1 | 21:ce51bb0ba4a5 | 38 | SnCommWin::ECommWinResult GetLocalFile(std::string fname, |
uci1 | 21:ce51bb0ba4a5 | 39 | char* const buf, |
uci1 | 21:ce51bb0ba4a5 | 40 | const uint32_t bsize, |
uci1 | 21:ce51bb0ba4a5 | 41 | const uint32_t timeout); |
uci1 | 21:ce51bb0ba4a5 | 42 | int16_t LoopLocalDirBinFiles(const bool doRemove, |
uci1 | 21:ce51bb0ba4a5 | 43 | const std::string& fname); |
uci1 | 21:ce51bb0ba4a5 | 44 | SnCommWin::ECommWinResult GetHeader(const uint32_t timeOut, |
uci1 | 21:ce51bb0ba4a5 | 45 | char* const buf, |
uci1 | 21:ce51bb0ba4a5 | 46 | const uint32_t bsize, |
uci1 | 21:ce51bb0ba4a5 | 47 | uint8_t& mcode, |
uci1 | 21:ce51bb0ba4a5 | 48 | uint32_t& mlen); |
uci1 | 21:ce51bb0ba4a5 | 49 | |
uci1 | 1:e392595b4b76 | 50 | |
uci1 | 3:24c5f0f50bf1 | 51 | protected: |
uci1 | 12:d472f9811262 | 52 | virtual int SendFileBlock(FILE* inf, |
uci1 | 12:d472f9811262 | 53 | const uint8_t blockHeaderCode, |
uci1 | 12:d472f9811262 | 54 | const uint32_t blockSize, |
uci1 | 12:d472f9811262 | 55 | char* const genBuf, |
uci1 | 12:d472f9811262 | 56 | const uint32_t timeout); |
uci1 | 12:d472f9811262 | 57 | |
uci1 | 8:95a325df1f6b | 58 | virtual ECommWinResult SendFileContents(FILE* inf, |
uci1 | 8:95a325df1f6b | 59 | const SnConfigFrame& curConf, |
uci1 | 8:95a325df1f6b | 60 | SnEventFrame& evt, |
uci1 | 8:95a325df1f6b | 61 | SnPowerFrame& pow, |
uci1 | 8:95a325df1f6b | 62 | char* const genBuf, |
uci1 | 8:95a325df1f6b | 63 | uint32_t nevts, |
uci1 | 12:d472f9811262 | 64 | const uint32_t timeout_clock); |
uci1 | 8:95a325df1f6b | 65 | |
uci1 | 21:ce51bb0ba4a5 | 66 | // send and receive must not kick the watchdog, or a bad timeout |
uci1 | 21:ce51bb0ba4a5 | 67 | // could block a station forever! |
uci1 | 8:95a325df1f6b | 68 | virtual int32_t ReceiveAll(char* const buf, const uint32_t mlen, |
uci1 | 8:95a325df1f6b | 69 | const uint32_t timeout_clock)=0; |
uci1 | 8:95a325df1f6b | 70 | virtual int32_t SendAll(char* const data, const uint32_t length, |
uci1 | 8:95a325df1f6b | 71 | const uint32_t timeout_clock)=0; |
uci1 | 12:d472f9811262 | 72 | |
uci1 | 12:d472f9811262 | 73 | bool IsTimedOut(const uint32_t timeout_clock) const; |
uci1 | 8:95a325df1f6b | 74 | |
uci1 | 12:d472f9811262 | 75 | |
uci1 | 1:e392595b4b76 | 76 | public: |
uci1 | 1:e392595b4b76 | 77 | virtual ~SnCommWin() {} |
uci1 | 1:e392595b4b76 | 78 | |
uci1 | 16:744ce85aede2 | 79 | virtual SnConfigFrame::EDatPackBit GetCommType() const=0; |
uci1 | 16:744ce85aede2 | 80 | |
uci1 | 16:744ce85aede2 | 81 | virtual bool TrySetSysTimeUnix(const uint32_t timeout) { return 0; } |
uci1 | 16:744ce85aede2 | 82 | |
uci1 | 8:95a325df1f6b | 83 | virtual void Set(const SnConfigFrame& conf)=0; |
uci1 | 8:95a325df1f6b | 84 | |
uci1 | 1:e392595b4b76 | 85 | virtual ECommWinResult OpenWindow(const uint32_t timeout, |
uci1 | 1:e392595b4b76 | 86 | const bool sendStatus, |
uci1 | 1:e392595b4b76 | 87 | const SnConfigFrame& conf, |
uci1 | 1:e392595b4b76 | 88 | const SnEventFrame& evt, |
uci1 | 8:95a325df1f6b | 89 | const SnPowerFrame& pow, |
uci1 | 10:3c93db1cfb12 | 90 | const uint16_t seq, |
uci1 | 10:3c93db1cfb12 | 91 | const float thmrate, |
uci1 | 10:3c93db1cfb12 | 92 | const float evtrate, |
uci1 | 2:e67f7c158087 | 93 | char* const genBuf)=0; |
uci1 | 1:e392595b4b76 | 94 | |
uci1 | 1:e392595b4b76 | 95 | virtual bool Connect(const uint32_t timeout)=0; |
uci1 | 15:f2569d8e4176 | 96 | virtual bool CloseConn(const uint32_t timeout)=0; |
uci1 | 16:744ce85aede2 | 97 | virtual uint32_t GetConnectTimeout() const; |
uci1 | 16:744ce85aede2 | 98 | virtual uint32_t GetListenTimeout() const; |
uci1 | 21:ce51bb0ba4a5 | 99 | virtual ECommWinResult WaitHandshake(const SnConfigFrame& conf, |
uci1 | 21:ce51bb0ba4a5 | 100 | const uint32_t timeout, |
uci1 | 3:24c5f0f50bf1 | 101 | char* const buf, |
uci1 | 6:6f002d202f59 | 102 | const uint32_t bsize, |
uci1 | 8:95a325df1f6b | 103 | uint8_t& hndShkCode); |
uci1 | 3:24c5f0f50bf1 | 104 | |
uci1 | 8:95a325df1f6b | 105 | ECommWinResult GetConfig(SnConfigFrame& conf, |
uci1 | 8:95a325df1f6b | 106 | const uint32_t timeOut, |
uci1 | 8:95a325df1f6b | 107 | char* const confBuf, |
uci1 | 8:95a325df1f6b | 108 | const uint32_t bsize); |
uci1 | 1:e392595b4b76 | 109 | |
uci1 | 8:95a325df1f6b | 110 | ECommWinResult SendStatus(const SnConfigFrame& conf, |
uci1 | 8:95a325df1f6b | 111 | const SnEventFrame& evt, |
uci1 | 8:95a325df1f6b | 112 | const SnPowerFrame& pow, |
uci1 | 10:3c93db1cfb12 | 113 | const uint16_t seq, |
uci1 | 10:3c93db1cfb12 | 114 | const float thmrate, |
uci1 | 10:3c93db1cfb12 | 115 | const float evtrate, |
uci1 | 8:95a325df1f6b | 116 | char* const genBuf, |
uci1 | 8:95a325df1f6b | 117 | const uint32_t timeout_clock); |
uci1 | 1:e392595b4b76 | 118 | |
uci1 | 23:ccf39298f205 | 119 | SnCommWin::ECommWinResult SendString(const char* str, |
uci1 | 23:ccf39298f205 | 120 | const uint32_t timeout); |
uci1 | 23:ccf39298f205 | 121 | |
uci1 | 8:95a325df1f6b | 122 | ECommWinResult SendFilename(const char* fn, |
uci1 | 8:95a325df1f6b | 123 | char* const genBuf, |
uci1 | 8:95a325df1f6b | 124 | const uint32_t timeout_clock); |
uci1 | 6:6f002d202f59 | 125 | |
uci1 | 8:95a325df1f6b | 126 | ECommWinResult SendData(FILE* inf, const char* infn, |
uci1 | 8:95a325df1f6b | 127 | const SnConfigFrame& curConf, |
uci1 | 8:95a325df1f6b | 128 | SnEventFrame& evt, |
uci1 | 8:95a325df1f6b | 129 | SnPowerFrame& pow, |
uci1 | 8:95a325df1f6b | 130 | char* const genBuf, |
uci1 | 8:95a325df1f6b | 131 | const uint32_t bsize, |
uci1 | 8:95a325df1f6b | 132 | const uint32_t nevts, |
uci1 | 8:95a325df1f6b | 133 | const uint32_t timeout_clock, |
uci1 | 12:d472f9811262 | 134 | const uint32_t handshakeTimeout); |
uci1 | 6:6f002d202f59 | 135 | |
uci1 | 8:95a325df1f6b | 136 | ECommWinResult SendData(SnConfigFrame& conf, |
uci1 | 8:95a325df1f6b | 137 | SnEventFrame& evt, |
uci1 | 8:95a325df1f6b | 138 | SnPowerFrame& pow, |
uci1 | 8:95a325df1f6b | 139 | char* const genBuf, |
uci1 | 8:95a325df1f6b | 140 | const uint32_t bsize, |
uci1 | 12:d472f9811262 | 141 | const uint32_t timeout, |
uci1 | 12:d472f9811262 | 142 | const uint32_t handshakeTimeout); |
uci1 | 8:95a325df1f6b | 143 | |
uci1 | 18:55f1581f2ee4 | 144 | // for debugging |
uci1 | 18:55f1581f2ee4 | 145 | void dispStrBytes(const char* const s, const uint32_t len) const { |
uci1 | 18:55f1581f2ee4 | 146 | const char* c = s; |
uci1 | 18:55f1581f2ee4 | 147 | for (uint32_t i=0; i<len; ++i, ++c) { |
uci1 | 18:55f1581f2ee4 | 148 | if (*c>0x1F && *c<0x7F) { |
uci1 | 18:55f1581f2ee4 | 149 | printf("%c", *c); |
uci1 | 18:55f1581f2ee4 | 150 | } else { |
uci1 | 18:55f1581f2ee4 | 151 | printf(".x%02x.", *c); |
uci1 | 18:55f1581f2ee4 | 152 | } |
uci1 | 18:55f1581f2ee4 | 153 | } |
uci1 | 18:55f1581f2ee4 | 154 | } |
uci1 | 18:55f1581f2ee4 | 155 | |
uci1 | 1:e392595b4b76 | 156 | }; |
uci1 | 1:e392595b4b76 | 157 | |
uci1 | 1:e392595b4b76 | 158 | #endif // SN_SnCommWin |