Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Sat Aug 04 01:48:55 2012 +0000
Revision:
7:079617408fec
Parent:
6:6f002d202f59
Child:
8:95a325df1f6b
Bug fix to seq finder. Comms totally disabled. Many debug messages.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 7:079617408fec 1
uci1 3:24c5f0f50bf1 2 #include "SnCommAfarTCP.h"
uci1 3:24c5f0f50bf1 3
uci1 6:6f002d202f59 4 #include "EthernetInterface.h"
uci1 6:6f002d202f59 5 #include "TCPSocketConnection.h"
uci1 6:6f002d202f59 6
uci1 6:6f002d202f59 7 #include "SnSDUtils.h"
uci1 6:6f002d202f59 8 #include "SnHeaderFrame.h"
uci1 6:6f002d202f59 9 #include "SnConfigFrame.h"
uci1 6:6f002d202f59 10 #include "SnEventFrame.h"
uci1 6:6f002d202f59 11 #include "SnStatusFrame.h"
uci1 6:6f002d202f59 12
uci1 5:9cea89700c66 13 #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))
uci1 5:9cea89700c66 14
uci1 6:6f002d202f59 15 SnCommAfarTCP::SnCommAfarTCP(const bool useb64, const char* remote, const int32_t rport) :
uci1 6:6f002d202f59 16 fUseB64(useb64), fRserv(remote), fRport(rport),
uci1 3:24c5f0f50bf1 17 fEth(new EthernetInterface), fSock(new TCPSocketConnection) {
uci1 3:24c5f0f50bf1 18
uci1 3:24c5f0f50bf1 19 fEth->init("128.195.204.148", // my IP
uci1 3:24c5f0f50bf1 20 "255.255.255.0", // mask
uci1 3:24c5f0f50bf1 21 "128.195.204.1"); // gateway
uci1 3:24c5f0f50bf1 22
uci1 6:6f002d202f59 23 //fRserv = "128.195.204.151";
uci1 6:6f002d202f59 24 //fRport = 6655;
uci1 3:24c5f0f50bf1 25
uci1 3:24c5f0f50bf1 26 }
uci1 3:24c5f0f50bf1 27
uci1 3:24c5f0f50bf1 28 SnCommAfarTCP::~SnCommAfarTCP() {
uci1 3:24c5f0f50bf1 29 delete fEth;
uci1 3:24c5f0f50bf1 30 delete fSock;
uci1 3:24c5f0f50bf1 31 }
uci1 3:24c5f0f50bf1 32
uci1 6:6f002d202f59 33 int SnCommAfarTCP::DoIO(char* const data,
uci1 5:9cea89700c66 34 const uint32_t length,
uci1 5:9cea89700c66 35 const uint32_t timeout_clock,
uci1 5:9cea89700c66 36 TCPSendRecv fcn) {
uci1 5:9cea89700c66 37 // TODO: if B64, must return number of bytes of raw (non encoded) message
uci1 3:24c5f0f50bf1 38 int res=0;
uci1 3:24c5f0f50bf1 39 uint32_t b=0;
uci1 3:24c5f0f50bf1 40 while ( (length>b) && (time(0)<timeout_clock) ) {
uci1 6:6f002d202f59 41 res = CALL_MEMBER_FN(*fSock, fcn)(data+b, length-b);
uci1 4:a91682e19d6b 42 switch (res) {
uci1 4:a91682e19d6b 43 case -1:
uci1 4:a91682e19d6b 44 // TODO: how to check the error?
uci1 4:a91682e19d6b 45 continue;
uci1 4:a91682e19d6b 46 case 0:
uci1 4:a91682e19d6b 47 return res;
uci1 4:a91682e19d6b 48 default:
uci1 4:a91682e19d6b 49 b += res;
uci1 4:a91682e19d6b 50 };
uci1 3:24c5f0f50bf1 51 }
uci1 4:a91682e19d6b 52 return res; // timeout
uci1 3:24c5f0f50bf1 53 }
uci1 3:24c5f0f50bf1 54
uci1 6:6f002d202f59 55 int SnCommAfarTCP::ReceiveAll(char* const buf, const uint32_t mlen,
uci1 5:9cea89700c66 56 const uint32_t timeout_clock) {
uci1 5:9cea89700c66 57 // TODO: if B64, must return number of bytes of raw (non encoded) message
uci1 6:6f002d202f59 58 return DoIO(buf, mlen, timeout_clock, &TCPSocketConnection::receive_all);
uci1 5:9cea89700c66 59 }
uci1 5:9cea89700c66 60
uci1 6:6f002d202f59 61 int SnCommAfarTCP::SendAll(char* const data, const uint32_t length,
uci1 5:9cea89700c66 62 const uint32_t timeout_clock) {
uci1 5:9cea89700c66 63 // TODO: if B64, must return number of bytes of raw (non encoded) message
uci1 6:6f002d202f59 64 return DoIO(data, length, timeout_clock, &TCPSocketConnection::send_all);
uci1 5:9cea89700c66 65 }
uci1 5:9cea89700c66 66
uci1 3:24c5f0f50bf1 67
uci1 3:24c5f0f50bf1 68 bool SnCommAfarTCP::Connect(const uint32_t timeout) {
uci1 3:24c5f0f50bf1 69 bool isConn = false;
uci1 3:24c5f0f50bf1 70
uci1 3:24c5f0f50bf1 71 while ( (isConn==false) && ( time(0) < timeout) ) {
uci1 3:24c5f0f50bf1 72 wait_ms(250);
uci1 3:24c5f0f50bf1 73 isConn = (fEth->connect()==0);
uci1 3:24c5f0f50bf1 74 }
uci1 3:24c5f0f50bf1 75
uci1 3:24c5f0f50bf1 76 while ( (isConn==false) && ( time(0) < timeout) ) {
uci1 3:24c5f0f50bf1 77 wait_ms(250);
uci1 6:6f002d202f59 78 isConn = (fSock->connect(fRserv.c_str(), fRport)==0);
uci1 3:24c5f0f50bf1 79 }
uci1 3:24c5f0f50bf1 80
uci1 3:24c5f0f50bf1 81 return isConn;
uci1 3:24c5f0f50bf1 82 }
uci1 3:24c5f0f50bf1 83
uci1 3:24c5f0f50bf1 84 SnCommWin::ECommWinResult SnCommAfarTCP::OpenWindow(const uint32_t timeout,
uci1 3:24c5f0f50bf1 85 const bool sendStatus,
uci1 3:24c5f0f50bf1 86 const SnConfigFrame& conf,
uci1 3:24c5f0f50bf1 87 const SnEventFrame& evt,
uci1 3:24c5f0f50bf1 88 char* const genBuf) {
uci1 3:24c5f0f50bf1 89 const bool canCon = Connect(timeout);
uci1 3:24c5f0f50bf1 90
uci1 3:24c5f0f50bf1 91 SnCommWin::ECommWinResult ret = canCon ? SnCommWin::kConnected
uci1 3:24c5f0f50bf1 92 : SnCommWin::kCanNotConnect;
uci1 3:24c5f0f50bf1 93
uci1 3:24c5f0f50bf1 94 if (canCon && sendStatus) {
uci1 6:6f002d202f59 95 ret = SendStatus(conf, evt, genBuf, timeout);
uci1 3:24c5f0f50bf1 96 }
uci1 3:24c5f0f50bf1 97
uci1 3:24c5f0f50bf1 98 return ret;
uci1 3:24c5f0f50bf1 99 }
uci1 4:a91682e19d6b 100
uci1 4:a91682e19d6b 101 SnCommWin::ECommWinResult SnCommAfarTCP::WaitHandshake(const uint32_t timeout,
uci1 4:a91682e19d6b 102 char* const buf,
uci1 5:9cea89700c66 103 const uint32_t bsize,
uci1 5:9cea89700c66 104 uint8_t& hndShkCode) {
uci1 4:a91682e19d6b 105 printf("WaitHandshake, to=%u\r\n",timeout);
uci1 4:a91682e19d6b 106
uci1 5:9cea89700c66 107 const int mlen = ReceiveAll(buf, SnHeaderFrame::SizeOf(), timeout);
uci1 5:9cea89700c66 108 if (mlen>0 && static_cast<uint32_t>(mlen) == SnHeaderFrame::SizeOf()) {
uci1 4:a91682e19d6b 109 uint32_t msgLen=0;
uci1 4:a91682e19d6b 110 const char* b = buf;
uci1 5:9cea89700c66 111 SnHeaderFrame::ReadFrom(b, hndShkCode, msgLen);
uci1 5:9cea89700c66 112 if ((hndShkCode & SnHeaderFrame::kHndShkBits)!=0) {
uci1 4:a91682e19d6b 113 return SnCommWin::kOkWithMsg;
uci1 4:a91682e19d6b 114 } else {
uci1 4:a91682e19d6b 115 // TODO: somehow handle unexpected message?
uci1 4:a91682e19d6b 116 return SnCommWin::kUnexpectedRec;
uci1 4:a91682e19d6b 117 }
uci1 4:a91682e19d6b 118 }
uci1 4:a91682e19d6b 119 return SnCommWin::kOkNoMsg;
uci1 4:a91682e19d6b 120 }
uci1 5:9cea89700c66 121
uci1 5:9cea89700c66 122 SnCommWin::ECommWinResult SnCommAfarTCP::GetConfig(SnConfigFrame& conf,
uci1 5:9cea89700c66 123 const uint32_t timeOut,
uci1 5:9cea89700c66 124 char* const confBuf,
uci1 5:9cea89700c66 125 const uint32_t bsize) {
uci1 5:9cea89700c66 126 // confBuf assumed to alread be of allocated size
uci1 5:9cea89700c66 127
uci1 5:9cea89700c66 128 printf("GetConfig, to=%u\r\n",timeOut);
uci1 5:9cea89700c66 129
uci1 5:9cea89700c66 130 SnCommWin::ECommWinResult res = SnCommWin::kUndefFail;
uci1 5:9cea89700c66 131 if (bsize<SnHeaderFrame::SizeOf() || bsize<conf.SizeOf()) {
uci1 5:9cea89700c66 132 res = SnCommWin::kUndefFail;
uci1 5:9cea89700c66 133 } else {
uci1 5:9cea89700c66 134 // get header
uci1 5:9cea89700c66 135 const int hlen = ReceiveAll(confBuf, SnHeaderFrame::SizeOf(), timeOut);
uci1 5:9cea89700c66 136 if (hlen>0 && static_cast<uint32_t>(hlen)==SnHeaderFrame::SizeOf()) {
uci1 5:9cea89700c66 137 uint8_t mcode=0; uint32_t mlen=0;
uci1 7:079617408fec 138 const char* b = confBuf;
uci1 7:079617408fec 139 SnHeaderFrame::ReadFrom(b, mcode, mlen);
uci1 5:9cea89700c66 140 printf("mcode=%02x, mlen=%u\r\n", mcode, mlen);
uci1 5:9cea89700c66 141 if (mcode!=SnHeaderFrame::kConfigCode) {
uci1 5:9cea89700c66 142 res = SnCommWin::kUnexpectedRec;
uci1 5:9cea89700c66 143 } else {
uci1 5:9cea89700c66 144 // get config
uci1 5:9cea89700c66 145 const int clen = ReceiveAll(confBuf, mlen, timeOut);
uci1 5:9cea89700c66 146 if (clen>0 && static_cast<uint32_t>(clen)==mlen) {
uci1 7:079617408fec 147 b = confBuf;
uci1 7:079617408fec 148 conf.ReadFrom(b);
uci1 5:9cea89700c66 149 res = SnCommWin::kOkWithMsg;
uci1 5:9cea89700c66 150 } else {
uci1 5:9cea89700c66 151 res = SnCommWin::kUnexpectedRec;
uci1 5:9cea89700c66 152 }
uci1 5:9cea89700c66 153 }
uci1 5:9cea89700c66 154 } else {
uci1 5:9cea89700c66 155 res = SnCommWin::kUnexpectedRec;
uci1 5:9cea89700c66 156 }
uci1 5:9cea89700c66 157 }
uci1 5:9cea89700c66 158 return res;
uci1 5:9cea89700c66 159 }
uci1 5:9cea89700c66 160
uci1 5:9cea89700c66 161 SnCommWin::ECommWinResult SnCommAfarTCP::SendStatus(const SnConfigFrame& conf,
uci1 5:9cea89700c66 162 const SnEventFrame& evt,
uci1 5:9cea89700c66 163 char* const genBuf,
uci1 5:9cea89700c66 164 const uint32_t timeout_clock) {
uci1 5:9cea89700c66 165 // TODO: check if connected?
uci1 5:9cea89700c66 166 const uint32_t ssize = SnStatusFrame::SizeOf(conf);
uci1 5:9cea89700c66 167 char* b = genBuf;
uci1 5:9cea89700c66 168 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kStatusCode, ssize);
uci1 5:9cea89700c66 169 SnStatusFrame::WriteTo(b, SnConfigFrame::kAfar, conf, evt, genBuf);
uci1 5:9cea89700c66 170 #ifdef DEBUG
uci1 5:9cea89700c66 171 printf("status frame:\r\n");
uci1 5:9cea89700c66 172 for (uint32_t i=0; i<msize; i++) {
uci1 5:9cea89700c66 173 printf("%02X ",genBuf[i]);
uci1 5:9cea89700c66 174 }
uci1 5:9cea89700c66 175 printf("\r\n");
uci1 5:9cea89700c66 176 #endif
uci1 5:9cea89700c66 177 const int mlen = SendAll(genBuf, b-genBuf, timeout_clock);
uci1 5:9cea89700c66 178 printf("status sent\r\n");
uci1 5:9cea89700c66 179 return (b-genBuf==mlen) ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 5:9cea89700c66 180 }
uci1 5:9cea89700c66 181
uci1 5:9cea89700c66 182 SnCommWin::ECommWinResult SnCommAfarTCP::SendFilename(const char* fn,
uci1 5:9cea89700c66 183 char* const genBuf,
uci1 5:9cea89700c66 184 const uint32_t timeout_clock) {
uci1 5:9cea89700c66 185 printf("afar send filename %s\r\n",fn);
uci1 5:9cea89700c66 186 const size_t flen = strlen(fn);
uci1 5:9cea89700c66 187 char* b = genBuf;
uci1 5:9cea89700c66 188 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFilenameCode, flen);
uci1 5:9cea89700c66 189 sprintf(b, "%s", fn);
uci1 5:9cea89700c66 190 const int msiz = SnHeaderFrame::SizeOf()+flen;
uci1 5:9cea89700c66 191 const int mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 5:9cea89700c66 192 return (msiz==mlen) ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 5:9cea89700c66 193 }
uci1 5:9cea89700c66 194
uci1 6:6f002d202f59 195 SnCommWin::ECommWinResult SnCommAfarTCP::SendFileContents(FILE* inf,
uci1 5:9cea89700c66 196 const SnConfigFrame& curConf,
uci1 5:9cea89700c66 197 SnEventFrame& evt,
uci1 5:9cea89700c66 198 char* const genBuf,
uci1 5:9cea89700c66 199 uint32_t nevts,
uci1 5:9cea89700c66 200 const uint32_t timeout_clock,
uci1 5:9cea89700c66 201 const uint32_t firstEvt) {
uci1 5:9cea89700c66 202 printf("afar send conf and events\r\n");
uci1 5:9cea89700c66 203 // firstEvt==0 ==> start at beginning
uci1 5:9cea89700c66 204 // nevts==0 ==> all events
uci1 5:9cea89700c66 205
uci1 5:9cea89700c66 206 const int fpos = ftell(inf);
uci1 5:9cea89700c66 207 if (fpos>0) {
uci1 5:9cea89700c66 208 fseek(inf, 0, SEEK_SET);
uci1 5:9cea89700c66 209 }
uci1 5:9cea89700c66 210
uci1 5:9cea89700c66 211 printf("fpos=%d\r\n",fpos);
uci1 5:9cea89700c66 212
uci1 5:9cea89700c66 213 // get file header
uci1 5:9cea89700c66 214 uint64_t macadr;
uci1 5:9cea89700c66 215 uint32_t run;
uci1 5:9cea89700c66 216 uint16_t seq, v1, v2;
uci1 5:9cea89700c66 217 SnSDUtils::ReadFileHeader(inf, macadr, run, seq, v1, v2);
uci1 5:9cea89700c66 218
uci1 5:9cea89700c66 219 // TODO: check memory for temporary config/event frames?
uci1 5:9cea89700c66 220 // get config
uci1 5:9cea89700c66 221 SnConfigFrame conf;
uci1 5:9cea89700c66 222 conf.ReadFrom(inf);
uci1 5:9cea89700c66 223
uci1 5:9cea89700c66 224 // get event size
uci1 5:9cea89700c66 225 uint8_t sLoseLSB=0, sLoseMSB=0;
uci1 5:9cea89700c66 226 uint16_t sWvBase=0;
uci1 5:9cea89700c66 227 curConf.GetPackParsFor(SnConfigFrame::kAfar, sLoseLSB, sLoseMSB, sWvBase);
uci1 5:9cea89700c66 228 // size of event in file
uci1 5:9cea89700c66 229 const uint32_t esize = SnEventFrame::SizeOf(conf.GetWvLoseLSB(),
uci1 5:9cea89700c66 230 conf.GetWvLoseMSB());
uci1 5:9cea89700c66 231
uci1 6:6f002d202f59 232 printf("esize=%u\r\n",esize);
uci1 5:9cea89700c66 233
uci1 5:9cea89700c66 234 // how many events?
uci1 5:9cea89700c66 235 // move up to first event
uci1 5:9cea89700c66 236 if (firstEvt>0) {
uci1 5:9cea89700c66 237 printf("skip ahead %d\r\n",firstEvt*esize);
uci1 5:9cea89700c66 238 fseek(inf, (firstEvt*esize), SEEK_CUR);
uci1 5:9cea89700c66 239 }
uci1 5:9cea89700c66 240 // get remaining file size
uci1 5:9cea89700c66 241 const int fcur = ftell(inf);
uci1 5:9cea89700c66 242 fseek(inf, 0, SEEK_END);
uci1 5:9cea89700c66 243 const int fend = ftell(inf);
uci1 5:9cea89700c66 244 fseek(inf, fcur, SEEK_SET);
uci1 5:9cea89700c66 245 const int nevtsLeft = (fend-fcur)/esize; // TODO: check for remainder?
uci1 5:9cea89700c66 246 if (nevts==0 || nevtsLeft<nevts) {
uci1 5:9cea89700c66 247 nevts = nevtsLeft;
uci1 5:9cea89700c66 248 }
uci1 5:9cea89700c66 249
uci1 5:9cea89700c66 250 // send number of events to expect
uci1 5:9cea89700c66 251 bool ok = false;
uci1 6:6f002d202f59 252 char* b = genBuf;
uci1 7:079617408fec 253 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileNevtsCode, nevts);
uci1 6:6f002d202f59 254 int msiz;
uci1 5:9cea89700c66 255 int mlen = SendAll(genBuf, SnHeaderFrame::SizeOf(), timeout_clock);
uci1 5:9cea89700c66 256 if (mlen==SnHeaderFrame::SizeOf()) {
uci1 5:9cea89700c66 257 // send the file header
uci1 7:079617408fec 258 b = genBuf;
uci1 5:9cea89700c66 259 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileHeadrCode, SnSDUtils::SizeOfFileHeader());
uci1 5:9cea89700c66 260 SnSDUtils::WriteFileHeader(b, macadr, run, seq, v1, v2);
uci1 6:6f002d202f59 261 msiz = SnHeaderFrame::SizeOf()+SnSDUtils::SizeOfFileHeader();
uci1 5:9cea89700c66 262 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 5:9cea89700c66 263 if (mlen==msiz) {
uci1 5:9cea89700c66 264 // send the config
uci1 5:9cea89700c66 265 b = genBuf;
uci1 6:6f002d202f59 266 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kConfigCode, conf.SizeOf());
uci1 5:9cea89700c66 267 conf.WriteTo(b);
uci1 5:9cea89700c66 268 msiz = SnHeaderFrame::SizeOf()+conf.SizeOf();
uci1 5:9cea89700c66 269 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 5:9cea89700c66 270 if (mlen==msiz) {
uci1 5:9cea89700c66 271 ok = true;
uci1 5:9cea89700c66 272 }
uci1 5:9cea89700c66 273 }
uci1 5:9cea89700c66 274 }
uci1 5:9cea89700c66 275
uci1 5:9cea89700c66 276 printf("ok=%d, nevts=%u\r\n",(int)ok,nevts);
uci1 5:9cea89700c66 277
uci1 5:9cea89700c66 278 if (ok) {
uci1 5:9cea89700c66 279 // size of event sent over afar
uci1 6:6f002d202f59 280 const uint32_t ssize = SnEventFrame::SizeOf(sLoseLSB, sLoseMSB);
uci1 5:9cea89700c66 281
uci1 5:9cea89700c66 282 for (uint32_t i=0; (i<nevts) && ok; i++) {
uci1 5:9cea89700c66 283 if (feof(inf)==0 && ferror(inf)==0 && ((ftell(inf)+ssize)<=fend)) {
uci1 5:9cea89700c66 284 printf("sending evt %u\r\n",i);
uci1 6:6f002d202f59 285 evt.ReadFrom(inf, genBuf,
uci1 6:6f002d202f59 286 conf.GetWvLoseLSB(), conf.GetWvLoseMSB(),
uci1 6:6f002d202f59 287 conf.GetWvBaseline());
uci1 6:6f002d202f59 288 // must be after evt.Read, since that uses the buffer
uci1 6:6f002d202f59 289 b = genBuf;
uci1 6:6f002d202f59 290 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kEventCode, ssize);
uci1 6:6f002d202f59 291 evt.WriteTo(b, sLoseLSB, sLoseMSB, sWvBase); // will repack if necessary
uci1 6:6f002d202f59 292 msiz = SnHeaderFrame::SizeOf()+ssize;
uci1 6:6f002d202f59 293 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 6:6f002d202f59 294 ok &= mlen==msiz;
uci1 5:9cea89700c66 295 } else {
uci1 5:9cea89700c66 296 printf("cannot send requested event\r\n");
uci1 5:9cea89700c66 297 ok=false;
uci1 5:9cea89700c66 298 }
uci1 5:9cea89700c66 299 }
uci1 5:9cea89700c66 300 }
uci1 5:9cea89700c66 301
uci1 5:9cea89700c66 302 fseek(inf, fpos, SEEK_SET);
uci1 5:9cea89700c66 303
uci1 5:9cea89700c66 304 return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 5:9cea89700c66 305 }