Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Committer:
uci1
Date:
Fri Aug 03 00:04:34 2012 +0000
Revision:
5:9cea89700c66
Parent:
4:a91682e19d6b
Child:
6:6f002d202f59
Bug fix to power: set 0 for cards and amps if on. Still working on communications. Many debug printouts.

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