Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
Diff: SnCommAfar.cpp
- Revision:
- 2:e67f7c158087
- Parent:
- 1:e392595b4b76
- Child:
- 3:24c5f0f50bf1
--- a/SnCommAfar.cpp Fri Jul 20 19:04:02 2012 +0000 +++ b/SnCommAfar.cpp Tue Jul 24 02:07:23 2012 +0000 @@ -4,13 +4,15 @@ #include "SnConfigFrame.h" #include "SnEventFrame.h" #include "SnStatusFrame.h" +#include "SnHeaderFrame.h" +#include "SnSDUtils.h" Websocket& SnCommAfar::GetWS() { // only one make one socket //static Websocket* ws = new Websocket("ws://snowflake.ps.uci.edu:6767/ws"); // TODO: fix DNS // TODO: remove hardcoded IP addresses from Websocket.cpp - static Websocket* ws = new Websocket("ws://128.195.204.151:6767/ws"); + static Websocket* ws = new Websocket("ws://128.195.204.151:6776/ws"); return *ws; } @@ -37,8 +39,7 @@ const bool sendStatus, const SnConfigFrame& conf, const SnEventFrame& evt, - char* const evtBuf, - char* const statBuf) { + char* const genBuf) { // timer = timer for full window // timeout = number of seconds to try to connect (not full window) @@ -48,7 +49,7 @@ : SnCommWin::kCanNotConnect; if (canCon && sendStatus) { - ret = SendStatus(conf, evt, evtBuf, statBuf); + ret = SendStatus(conf, evt, genBuf); } return ret; @@ -64,18 +65,31 @@ SnCommWin::ECommWinResult res = SnCommWin::kUndefFail; - bool readConf = false; - while ( (readConf==false) && (time(0) < timeOut) ) { - //printf("trying to read config\r\n"); - // TODO: check if read works (for binary) - readConf = GetWS().read(confBuf, timeOut); - if (readConf) { - const char* b = confBuf; - conf.ReadFrom(b); - res = SnCommWin::kOkWithMsg; + bool redConf = false; + bool readHeader = true; + uint8_t mcode=0x0; + uint32_t mlen=0; // length of message specified in header + uint32_t mread=0; // length of messages received so far + const char* b = confBuf; + while ( (redConf==false) && (time(0) < timeOut) ) { + uint32_t msglen=0; // this message length + redConf = GetWS().read(confBuf+mread, msglen, timeOut); + mread += msglen; + if (redConf) { + if (readHeader && mread>=SnHeaderFrame::SizeOf()) { + SnHeaderFrame::ReadFrom(b, mcode, mlen); + // TODO: check that mcode is kConfigCode? What to do if not? + readHeader=false; + } + if (mread>=mlen) { + conf.ReadFrom(b); + res = SnCommWin::kOkWithMsg; + } else { + redConf=false; + } } } - if (readConf==false) { + if (redConf==false) { res = SnCommWin::kOkNoMsg; } @@ -84,78 +98,104 @@ SnCommWin::ECommWinResult SnCommAfar::SendStatus(const SnConfigFrame& conf, const SnEventFrame& evt, - char* const evtBuf, - char* const statBuf) { + char* const genBuf) { // TODO: check if connected? - SnStatusFrame::WriteTo(statBuf, SnConfigFrame::kAfar, conf, evt, evtBuf); + const uint32_t ssize = SnStatusFrame::SizeOf(conf); + SnStatusFrame::WriteTo(genBuf, SnConfigFrame::kAfar, conf, evt, genBuf); #ifdef DEBUG printf("status frame:\r\n"); - for (uint32_t i=0; i<SnStatusFrame::SizeOf(conf); i++) { - printf("%02X ",statBuf[i]); + for (uint32_t i=0; i<msize; i++) { + printf("%02X ",genBuf[i]); } printf("\r\n"); #endif - GetWS().sendBinary(statBuf, SnStatusFrame::SizeOf(conf)); - //base64enc(statBuf, SnStatusFrame::SizeOf(conf), gB64Buf); - //GetWS().send(gB64Buf); + const bool ok = GetWS().sendBinary( + SnHeaderFrame::GetHdBuf(SnHeaderFrame::kStatusCode, ssize), + SnHeaderFrame::SizeOf(), + genBuf, ssize); printf("status sent\r\n"); - return SnCommWin::kOkMsgSent; + return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent; } SnCommWin::ECommWinResult SnCommAfar::SendData(FILE* inf) { fseek(inf, 0, SEEK_END); - const uint32_t fsize = ftell(inf); + const int32_t fsize = ftell(inf); fseek(inf, 0, SEEK_SET); - const bool ok = GetWS().sendBinary(inf, fsize); - return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent; + if (fsize<0) { + return SnCommWin::kFailNoneSent; + } else { + // send file data with header + const bool ok = GetWS().sendBinary( + SnHeaderFrame::GetHdBuf(SnHeaderFrame::kFileCode, fsize), + SnHeaderFrame::SizeOf(), + inf, fsize); + return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent; + } } SnCommWin::ECommWinResult SnCommAfar::SendConfAndEvents(FILE* inf, const SnConfigFrame& curConf, SnEventFrame& evt, - char* const evtBuf, - char* const confBuf, + char* const genBuf, const uint32_t nevts, const uint32_t firstEvt) { // firstEvt==0 ==> start at beginning // nevts==0 ==> NO events! (see SnCommWin::SendData // for the fcn to send the full file) - + // TODO: check memory for temporary config/event frames? + uint64_t macadr; + uint32_t run; + uint16_t seq; + SnSDUtils::ReadFileHeader(inf, macadr, run, seq); SnConfigFrame conf; conf.ReadFrom(inf); - char* b = confBuf; + + uint8_t sLoseLSB=0, sLoseMSB=0; + uint16_t sWvBase=0; + curConf.GetPackParsFor(SnConfigFrame::kAfar, sLoseLSB, sLoseMSB, sWvBase); + // do we have to unpack & repack events? + const bool repack = (sLoseLSB != conf.GetWvLoseLSB()) + && (sLoseMSB != conf.GetWvLoseMSB()) + && (sWvBase != conf.GetWvBaseline()); + + // size of event in file + const uint32_t esize = SnEventFrame::SizeOf(conf.GetWvLoseLSB(), + conf.GetWvLoseMSB()); + // move up to first event + fseek(inf, conf.SizeOf() + (firstEvt*esize), SEEK_SET); + + // send the header and conf + char* b = genBuf; conf.WriteTo(b); - bool ok = GetWS().sendBinary(confBuf, conf.SizeOf()); - - if (ok) { - uint8_t sLoseLSB=0, sLoseMSB=0; - uint16_t sWvBase=0; - conf.GetPackParsFor(SnConfigFrame::kAfar, sLoseLSB, sLoseMSB, sWvBase); - // do we have to unpack & repack events? - const bool repack = (sLoseLSB != conf.GetWvLoseLSB()) - && (sLoseMSB != conf.GetWvLoseMSB()) - && (sWvBase != conf.GetWvBaseline()); - - // size of event in file - const uint32_t esize = SnEventFrame::SizeOf(conf.GetWvLoseLSB(), - conf.GetWvLoseMSB()); - // move up to first event - fseek(inf, conf.SizeOf() + (firstEvt*esize), SEEK_SET); + bool ok = GetWS().sendBinary( + SnHeaderFrame::GetHdBuf(SnHeaderFrame::kConfAndEvtsCode, + conf.SizeOf()), + SnHeaderFrame::SizeOf(), + genBuf, conf.SizeOf()); + + // size of event sent over afar + const uint32_t ssize = (repack) ? + SnEventFrame::SizeOf(sLoseLSB, sLoseMSB) : + esize; + + for (uint32_t i=0; (i<nevts) && ok; i++) { if (repack) { - // repack ==> send event by event - // size of event sent over afar - const uint32_t ssize = SnEventFrame::SizeOf(sLoseLSB, sLoseMSB); - for (uint32_t i=0; (i<nevts) && ok; i++) { - evt.ReadFrom(inf, evtBuf, - conf.GetWvLoseLSB(), conf.GetWvLoseMSB(), - conf.GetWvBaseline()); - evt.WriteTo(evtBuf, sLoseLSB, sLoseMSB, sWvBase); - ok = GetWS().sendBinary(evtBuf, ssize); - } + evt.ReadFrom(inf, genBuf, + conf.GetWvLoseLSB(), conf.GetWvLoseMSB(), + conf.GetWvBaseline()); + evt.WriteTo(genBuf, sLoseLSB, sLoseMSB, sWvBase); + ok &= GetWS().sendBinary( + SnHeaderFrame::GetHdBuf(SnHeaderFrame::kEventCode, + ssize), + SnHeaderFrame::SizeOf(), + genBuf, ssize); } else { - // no repacking ==> just send the bytes from the file - ok = GetWS().sendBinary(inf, nevts*esize); + ok &= GetWS().sendBinary( + SnHeaderFrame::GetHdBuf(SnHeaderFrame::kEventCode, + ssize), + SnHeaderFrame::SizeOf(), + inf, ssize); } } return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;