Arianna autonomous DAQ firmware
Dependencies: mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW
Diff: SnCommWin.cpp
- Revision:
- 56:0bba0ef15697
- Parent:
- 54:ea1234a44fe8
- Child:
- 63:4820a4460f00
--- a/SnCommWin.cpp Fri Jan 03 13:03:01 2014 +0000 +++ b/SnCommWin.cpp Thu Oct 30 06:42:17 2014 +0000 @@ -22,7 +22,7 @@ const uint8_t SnCommWin::kDelAllConfCodeLen = 35; // length of the above string SnCommWin::SnCommWin(SnCommPeripheral* p) : - fComm(p) { + fSendingInHandshake(false), fComm(p) { if (p==0) { error("SnCommWin - must have peripheral! Received 0.\r\n"); } @@ -78,7 +78,19 @@ printf("no data to send\r\n"); #endif res = kOkNoMsg; + } else if (conf.IsSendingFilesRunSeqList()) { +#ifdef DEBUG + printf ("calling SendFilesInRunSeqList\r\n"); +#endif + res = SnSDUtils::SendFilesInRunSeqList( + this, timeout, + genBuf, bsize, conf, evt, pow); +#ifdef DEBUG + printf ("res = %d after SendFilesInRunSeqList\r\n", + static_cast<int>(res)); +#endif } else { + // send most recent file or a few events from that file const uint32_t nev = (conf.GetCommSendData()>0) ? conf.GetCommSendData() // send N events : 0u; // send all events in last file @@ -172,49 +184,20 @@ SnSDUtils::GetCurFile(), hndshk); #endif if (SnCommWin::kOkWithMsg==res) { - res = HandleHandshake(SnSDUtils::GetCurFile(), SnSDUtils::GetCurFileName(), + res = HandleHandshake( + //SnSDUtils::GetCurFile(), SnSDUtils::GetCurFileName(), + inf, infn, curConf, evt, pow, genBuf, bsize, timeout_clock, hndshk, hndshkLen, &nevts); didDel = (SnCommWin::kOkWthMsgDidDel==res); } -/* - if ( (res==SnCommWin::kOkWithMsg) // got handshake - && (nevts==0) // sent whole file - && (inf!=SnSDUtils::GetCurFile()) ) { // not current file - if ( curConf.IsDeletingFiles() // want to delete - && (hndshk==SnHeaderFrame::kHnShOkComplCode)) { // whole file received - - // delete it -#ifdef DEBUG - printf("deleting file %p, %s\r\n",inf,infn); -#endif - SnSDUtilsWhisperer::DeleteFile(inf, infn); - didDel=true; - } else if ( hndshk==SnHeaderFrame::kHnShOkStopCode ) { - res = SnCommWin::kOkStopComm; - } else if ( (hndshk==SnHeaderFrame::kHnShOkDelAlCode) || - (hndshk==SnHeaderFrame::kHnShOkDelRnCode) ) { - if ( GetDeleteAllConfirmCode(curConf, - kDelAllConfCodeLen, handshakeTimeout, - genBuf, bsize) ) { - if (hndshk==SnHeaderFrame::kHnShOkDelAlCode) { - SnSDUtilsWhisperer::DeleteAllFiles(); - } else if (hndshk==SnHeaderFrame::kHnShOkDelRnCode) { - SnSDUtilsWhisperer::DeleteFilesOfRun(hndshkLen); - } - res = SnCommWin::kOkStopComm; - } - } else if ( hndshk==SnHeaderFrame::kHnShOkReqRnCode ) { - res = SnCommWin::kOkWthMsgReqRun; - } - } -*/ } } // if genBuf!=0 } else { #ifdef DEBUG printf("inf=0!\r\n"); #endif + res = kOkNoMsg; } if ( (inf!=SnSDUtils::GetCurFile()) && (didDel==false) ) { SnSDUtils::CloseOutputFile(inf); @@ -250,6 +233,16 @@ res = SnCommWin::kFailPartSent; } else if (hndshk==SnHeaderFrame::kHnShOkComplCode) { // file received +#ifdef DEBUG + printf("HnShOkCompl: isdel=%d, isCurFil=%d (%p,%p), nevts_ptr=%p\r\n", + (int)(curConf.IsDeletingFiles()), + (int)(inf==SnSDUtils::GetCurFile()), + (void*)inf, (void*)(SnSDUtils::GetCurFile()), + (void*)(nevts)); + if (nevts!=0) { + printf("*nevts=%u\r\n",*nevts); + } +#endif if ( (curConf.IsDeletingFiles()) && (inf!=SnSDUtils::GetCurFile()) && ((nevts!=0) && (*nevts==0)) ) { // whole file was received @@ -283,13 +276,55 @@ } res = SnCommWin::kOkStopComm; } + } else if ( hndshk==SnHeaderFrame::kHnShOkClRSLCode ) { +#ifdef DEBUG + printf("clear run seq list requested\r\n"); +#endif + SnSDUtils::ClearRunSeqList(); } else if ( hndshk==SnHeaderFrame::kHnShOkReqRnCode ) { #ifdef DEBUG printf("run %u requested\r\n",hndlen); #endif - SnSDUtils::SendAllOfRun(this, handshakeTimeout, - genBuf, bsize, curConf, evt, pow, - hndlen); + if (fSendingInHandshake==false) { + // prevent another SendAllOfRun handshake request until we're done + // (allowing it could lead to a stack overflow) + fSendingInHandshake = true; + SnSDUtils::SendAllOfRun(this, handshakeTimeout, + genBuf, bsize, curConf, evt, pow, + hndlen); + fSendingInHandshake = false; + res = SnCommWin::kOkStopComm; + } + } else if ( hndshk==SnHeaderFrame::kHnShOkRqPtRnCode ) { +#ifdef DEBUG + printf("part of run %u requested\r\n",hndlen); +#endif + // need the seq limits -- another handshake message + SendHndshkReq(genBuf, handshakeTimeout); + uint8_t shndshk(0); uint32_t shndshkLen(0); + res = WaitHandshake(curConf, handshakeTimeout, genBuf, bsize, shndshk, + &shndshkLen); + if (SnCommWin::kOkWithMsg==res) { + if ( shndshk==SnHeaderFrame::kHnShOkRqPtSqCode ) { + // ok got the min/max seq's as expected + const uint16_t minseq = GetMinSeqFrom(shndshkLen); + const uint16_t maxseq = GetMaxSeqFrom(shndshkLen); +#ifdef DEBUG + printf("[minseq=%hu, maxseq=%hu]\r\n",minseq,maxseq); +#endif + if (fSendingInHandshake==false) { + // prevent another SendAllOfRun handshake request + // until we're done + // (allowing it could lead to a stack overflow) + fSendingInHandshake = true; + SnSDUtils::SendPartOfRun(this, handshakeTimeout, + genBuf, bsize, curConf, evt, pow, + hndlen, // the run num + minseq, maxseq); + fSendingInHandshake = false; + } + } + } res = SnCommWin::kOkStopComm; } @@ -696,6 +731,8 @@ const uint16_t seq, const float thmrate, const float evtrate, + const uint32_t powerOnTime, + const SnTempFrame& temper, char* const genBuf, const uint32_t timeout_clock) { // TODO: check if connected? @@ -708,7 +745,8 @@ const uint32_t ssize = SnStatusFrame::SizeOf(SnStatusFrame::kIOVers, conf); char* b = genBuf; SnHeaderFrame::WriteTo(b, SnHeaderFrame::kStatusCode, ssize); - SnStatusFrame::WriteTo(b, conf, evt, genBuf, seq, thmrate, evtrate, + SnStatusFrame::WriteTo(b, conf, evt, genBuf, seq, thmrate, evtrate, + powerOnTime, temper, loseLSB, loseMSB, wvBase); SnHeaderFrame::WriteTo(b, SnHeaderFrame::kPowerCode, pow.SizeOf(SnPowerFrame::kIOvers)); @@ -909,7 +947,7 @@ if (nevts>0) { if (evtsSent>=nevts) { #ifdef DEBUG - printf("send %u events. stop\r\n",evtsSent); + printf("sent %u events. stop\r\n",evtsSent); #endif break; }