Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Fri Aug 03 23:50:57 2012 +0000
Revision:
6:6f002d202f59
Parent:
5:9cea89700c66
Child:
7:079617408fec
Remove line that powered amps outside of SetPower. Still lots of debugging output. Communication systems totally unimplemented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uci1 3:24c5f0f50bf1 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 6:6f002d202f59 138 SnHeaderFrame::ReadFrom(confBuf, mcode, mlen);
uci1 5:9cea89700c66 139 printf("mcode=%02x, mlen=%u\r\n", mcode, mlen);
uci1 5:9cea89700c66 140 if (mcode!=SnHeaderFrame::kConfigCode) {
uci1 5:9cea89700c66 141 res = SnCommWin::kUnexpectedRec;
uci1 5:9cea89700c66 142 } else {
uci1 5:9cea89700c66 143 // get config
uci1 5:9cea89700c66 144 const int clen = ReceiveAll(confBuf, mlen, timeOut);
uci1 5:9cea89700c66 145 if (clen>0 && static_cast<uint32_t>(clen)==mlen) {
uci1 5:9cea89700c66 146 conf.ReadFrom(confBuf);
uci1 5:9cea89700c66 147 res = SnCommWin::kOkWithMsg;
uci1 5:9cea89700c66 148 } else {
uci1 5:9cea89700c66 149 res = SnCommWin::kUnexpectedRec;
uci1 5:9cea89700c66 150 }
uci1 5:9cea89700c66 151 }
uci1 5:9cea89700c66 152 } else {
uci1 5:9cea89700c66 153 res = SnCommWin::kUnexpectedRec;
uci1 5:9cea89700c66 154 }
uci1 5:9cea89700c66 155 }
uci1 5:9cea89700c66 156 return res;
uci1 5:9cea89700c66 157 }
uci1 5:9cea89700c66 158
uci1 5:9cea89700c66 159 SnCommWin::ECommWinResult SnCommAfarTCP::SendStatus(const SnConfigFrame& conf,
uci1 5:9cea89700c66 160 const SnEventFrame& evt,
uci1 5:9cea89700c66 161 char* const genBuf,
uci1 5:9cea89700c66 162 const uint32_t timeout_clock) {
uci1 5:9cea89700c66 163 // TODO: check if connected?
uci1 5:9cea89700c66 164 const uint32_t ssize = SnStatusFrame::SizeOf(conf);
uci1 5:9cea89700c66 165 char* b = genBuf;
uci1 5:9cea89700c66 166 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kStatusCode, ssize);
uci1 5:9cea89700c66 167 SnStatusFrame::WriteTo(b, SnConfigFrame::kAfar, conf, evt, genBuf);
uci1 5:9cea89700c66 168 #ifdef DEBUG
uci1 5:9cea89700c66 169 printf("status frame:\r\n");
uci1 5:9cea89700c66 170 for (uint32_t i=0; i<msize; i++) {
uci1 5:9cea89700c66 171 printf("%02X ",genBuf[i]);
uci1 5:9cea89700c66 172 }
uci1 5:9cea89700c66 173 printf("\r\n");
uci1 5:9cea89700c66 174 #endif
uci1 5:9cea89700c66 175 const int mlen = SendAll(genBuf, b-genBuf, timeout_clock);
uci1 5:9cea89700c66 176 printf("status sent\r\n");
uci1 5:9cea89700c66 177 return (b-genBuf==mlen) ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 5:9cea89700c66 178 }
uci1 5:9cea89700c66 179
uci1 5:9cea89700c66 180 SnCommWin::ECommWinResult SnCommAfarTCP::SendFilename(const char* fn,
uci1 5:9cea89700c66 181 char* const genBuf,
uci1 5:9cea89700c66 182 const uint32_t timeout_clock) {
uci1 5:9cea89700c66 183 printf("afar send filename %s\r\n",fn);
uci1 5:9cea89700c66 184 const size_t flen = strlen(fn);
uci1 5:9cea89700c66 185 char* b = genBuf;
uci1 5:9cea89700c66 186 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFilenameCode, flen);
uci1 5:9cea89700c66 187 sprintf(b, "%s", fn);
uci1 5:9cea89700c66 188 const int msiz = SnHeaderFrame::SizeOf()+flen;
uci1 5:9cea89700c66 189 const int mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 5:9cea89700c66 190 return (msiz==mlen) ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 5:9cea89700c66 191 }
uci1 5:9cea89700c66 192
uci1 6:6f002d202f59 193 SnCommWin::ECommWinResult SnCommAfarTCP::SendFileContents(FILE* inf,
uci1 5:9cea89700c66 194 const SnConfigFrame& curConf,
uci1 5:9cea89700c66 195 SnEventFrame& evt,
uci1 5:9cea89700c66 196 char* const genBuf,
uci1 5:9cea89700c66 197 uint32_t nevts,
uci1 5:9cea89700c66 198 const uint32_t timeout_clock,
uci1 5:9cea89700c66 199 const uint32_t firstEvt) {
uci1 5:9cea89700c66 200 printf("afar send conf and events\r\n");
uci1 5:9cea89700c66 201 // firstEvt==0 ==> start at beginning
uci1 5:9cea89700c66 202 // nevts==0 ==> all events
uci1 5:9cea89700c66 203
uci1 5:9cea89700c66 204 const int fpos = ftell(inf);
uci1 5:9cea89700c66 205 if (fpos>0) {
uci1 5:9cea89700c66 206 fseek(inf, 0, SEEK_SET);
uci1 5:9cea89700c66 207 }
uci1 5:9cea89700c66 208
uci1 5:9cea89700c66 209 printf("fpos=%d\r\n",fpos);
uci1 5:9cea89700c66 210
uci1 5:9cea89700c66 211 // get file header
uci1 5:9cea89700c66 212 uint64_t macadr;
uci1 5:9cea89700c66 213 uint32_t run;
uci1 5:9cea89700c66 214 uint16_t seq, v1, v2;
uci1 5:9cea89700c66 215 SnSDUtils::ReadFileHeader(inf, macadr, run, seq, v1, v2);
uci1 5:9cea89700c66 216
uci1 5:9cea89700c66 217 // TODO: check memory for temporary config/event frames?
uci1 5:9cea89700c66 218 // get config
uci1 5:9cea89700c66 219 SnConfigFrame conf;
uci1 5:9cea89700c66 220 conf.ReadFrom(inf);
uci1 5:9cea89700c66 221
uci1 5:9cea89700c66 222 // get event size
uci1 5:9cea89700c66 223 uint8_t sLoseLSB=0, sLoseMSB=0;
uci1 5:9cea89700c66 224 uint16_t sWvBase=0;
uci1 5:9cea89700c66 225 curConf.GetPackParsFor(SnConfigFrame::kAfar, sLoseLSB, sLoseMSB, sWvBase);
uci1 5:9cea89700c66 226 // size of event in file
uci1 5:9cea89700c66 227 const uint32_t esize = SnEventFrame::SizeOf(conf.GetWvLoseLSB(),
uci1 5:9cea89700c66 228 conf.GetWvLoseMSB());
uci1 5:9cea89700c66 229
uci1 6:6f002d202f59 230 printf("esize=%u\r\n",esize);
uci1 5:9cea89700c66 231
uci1 5:9cea89700c66 232 // how many events?
uci1 5:9cea89700c66 233 // move up to first event
uci1 5:9cea89700c66 234 if (firstEvt>0) {
uci1 5:9cea89700c66 235 printf("skip ahead %d\r\n",firstEvt*esize);
uci1 5:9cea89700c66 236 fseek(inf, (firstEvt*esize), SEEK_CUR);
uci1 5:9cea89700c66 237 }
uci1 5:9cea89700c66 238 // get remaining file size
uci1 5:9cea89700c66 239 const int fcur = ftell(inf);
uci1 5:9cea89700c66 240 fseek(inf, 0, SEEK_END);
uci1 5:9cea89700c66 241 const int fend = ftell(inf);
uci1 5:9cea89700c66 242 fseek(inf, fcur, SEEK_SET);
uci1 5:9cea89700c66 243 const int nevtsLeft = (fend-fcur)/esize; // TODO: check for remainder?
uci1 5:9cea89700c66 244 if (nevts==0 || nevtsLeft<nevts) {
uci1 5:9cea89700c66 245 nevts = nevtsLeft;
uci1 5:9cea89700c66 246 }
uci1 5:9cea89700c66 247
uci1 5:9cea89700c66 248 // send number of events to expect
uci1 5:9cea89700c66 249 bool ok = false;
uci1 6:6f002d202f59 250 char* b = genBuf;
uci1 5:9cea89700c66 251 SnHeaderFrame::WriteTo(genBuf, SnHeaderFrame::kFileNevtsCode, nevts);
uci1 6:6f002d202f59 252 int msiz;
uci1 5:9cea89700c66 253 int mlen = SendAll(genBuf, SnHeaderFrame::SizeOf(), timeout_clock);
uci1 5:9cea89700c66 254 if (mlen==SnHeaderFrame::SizeOf()) {
uci1 5:9cea89700c66 255 // send the file header
uci1 5:9cea89700c66 256 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFileHeadrCode, SnSDUtils::SizeOfFileHeader());
uci1 5:9cea89700c66 257 SnSDUtils::WriteFileHeader(b, macadr, run, seq, v1, v2);
uci1 6:6f002d202f59 258 msiz = SnHeaderFrame::SizeOf()+SnSDUtils::SizeOfFileHeader();
uci1 5:9cea89700c66 259 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 5:9cea89700c66 260 if (mlen==msiz) {
uci1 5:9cea89700c66 261 // send the config
uci1 5:9cea89700c66 262 b = genBuf;
uci1 6:6f002d202f59 263 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kConfigCode, conf.SizeOf());
uci1 5:9cea89700c66 264 conf.WriteTo(b);
uci1 5:9cea89700c66 265 msiz = SnHeaderFrame::SizeOf()+conf.SizeOf();
uci1 5:9cea89700c66 266 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 5:9cea89700c66 267 if (mlen==msiz) {
uci1 5:9cea89700c66 268 ok = true;
uci1 5:9cea89700c66 269 }
uci1 5:9cea89700c66 270 }
uci1 5:9cea89700c66 271 }
uci1 5:9cea89700c66 272
uci1 5:9cea89700c66 273 printf("ok=%d, nevts=%u\r\n",(int)ok,nevts);
uci1 5:9cea89700c66 274
uci1 5:9cea89700c66 275 if (ok) {
uci1 5:9cea89700c66 276 // size of event sent over afar
uci1 6:6f002d202f59 277 const uint32_t ssize = SnEventFrame::SizeOf(sLoseLSB, sLoseMSB);
uci1 5:9cea89700c66 278
uci1 5:9cea89700c66 279 for (uint32_t i=0; (i<nevts) && ok; i++) {
uci1 5:9cea89700c66 280 if (feof(inf)==0 && ferror(inf)==0 && ((ftell(inf)+ssize)<=fend)) {
uci1 5:9cea89700c66 281 printf("sending evt %u\r\n",i);
uci1 6:6f002d202f59 282 evt.ReadFrom(inf, genBuf,
uci1 6:6f002d202f59 283 conf.GetWvLoseLSB(), conf.GetWvLoseMSB(),
uci1 6:6f002d202f59 284 conf.GetWvBaseline());
uci1 6:6f002d202f59 285 // must be after evt.Read, since that uses the buffer
uci1 6:6f002d202f59 286 b = genBuf;
uci1 6:6f002d202f59 287 SnHeaderFrame::WriteTo(b, SnHeaderFrame::kEventCode, ssize);
uci1 6:6f002d202f59 288 evt.WriteTo(b, sLoseLSB, sLoseMSB, sWvBase); // will repack if necessary
uci1 6:6f002d202f59 289 msiz = SnHeaderFrame::SizeOf()+ssize;
uci1 6:6f002d202f59 290 mlen = SendAll(genBuf, msiz, timeout_clock);
uci1 6:6f002d202f59 291 ok &= mlen==msiz;
uci1 5:9cea89700c66 292 } else {
uci1 5:9cea89700c66 293 printf("cannot send requested event\r\n");
uci1 5:9cea89700c66 294 ok=false;
uci1 5:9cea89700c66 295 }
uci1 5:9cea89700c66 296 }
uci1 5:9cea89700c66 297 }
uci1 5:9cea89700c66 298
uci1 5:9cea89700c66 299 fseek(inf, fpos, SEEK_SET);
uci1 5:9cea89700c66 300
uci1 5:9cea89700c66 301 return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
uci1 5:9cea89700c66 302 }
uci1 3:24c5f0f50bf1 303 */