Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

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?

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 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