Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

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;
                         }