Arianna autonomous DAQ firmware

Dependencies:   mbed SDFileSystemFilinfo AriSnProtocol NetServicesMin AriSnComm MODSERIAL PowerControlClkPatch DS1820OW

Revision:
3:24c5f0f50bf1
Parent:
2:e67f7c158087
Child:
4:a91682e19d6b
--- a/SnCommAfar.cpp	Tue Jul 24 02:07:23 2012 +0000
+++ b/SnCommAfar.cpp	Tue Jul 31 04:59:16 2012 +0000
@@ -40,8 +40,6 @@
                                                  const SnConfigFrame& conf,
                                                  const SnEventFrame& evt,
                                                  char* const genBuf) {
-    // timer = timer for full window
-    // timeout = number of seconds to try to connect (not full window)
     
     const bool canCon = Connect(timeout);
     
@@ -55,10 +53,32 @@
     return ret;
 }
 
+SnCommWin::ECommWinResult SnCommAfar::WaitHandshake(const uint32_t timeout,
+                                                    char* const buf,
+                                                    const uint32_t bsize) {
+    printf("WaitHandshake, to=%u\r\n",timeout);
+    
+    uint32_t mlen=0; // this message length
+    const bool rd = GetWS().read(buf, mlen, bsize, timeout, fB64buf, fbblen);
+    if (rd) {
+        uint32_t msgLen=0;
+        uint8_t  msgCode=0;
+        const char* b = buf;
+        SnHeaderFrame::ReadFrom(b, msgCode, msgLen);
+        if (msgCode==SnHeaderFrame::kHandshakeCode) {
+            return SnCommWin::kOkWithMsg;
+        } else {
+            // TODO: somehow handle unexpected message?
+            return SnCommWin::kUnexpectedRec;
+        }
+    }
+    return SnCommWin::kOkNoMsg;
+}
 
 SnCommWin::ECommWinResult SnCommAfar::GetConfig(SnConfigFrame& conf,
                                                 const uint32_t timeOut,
-                                                char* const confBuf) {
+                                                char* const confBuf,
+                                                const uint32_t bsize) {
     // confBuf assumed to alread be of allocated size
     
     printf("GetConfig, to=%u\r\n",timeOut);
@@ -73,16 +93,23 @@
     const char* b = confBuf;
     while ( (redConf==false) && (time(0) < timeOut) ) {
         uint32_t msglen=0; // this message length
-        redConf = GetWS().read(confBuf+mread, msglen, timeOut);
+        redConf = GetWS().read(confBuf+mread, msglen, bsize, timeOut, fB64buf, fbblen);
         mread += msglen;
         if (redConf) {
             if (readHeader && mread>=SnHeaderFrame::SizeOf()) {
+                printf("read head from %x\r\n",b);
                 SnHeaderFrame::ReadFrom(b, mcode, mlen);
                 // TODO: check that mcode is kConfigCode? What to do if not?
+                printf("mcode=%02x, mlen=%u\r\n", mcode, mlen);
                 readHeader=false;
             }
-            if (mread>=mlen) {
+            printf("mread=%u, mlen=%u\r\n", mread, mlen);
+            if (readHeader==false &&
+                 ((mread-SnHeaderFrame::SizeOf())>=mlen)) {
+                printf("read config from %x\r\n",b);
                 conf.ReadFrom(b);
+                printf("after read conf, b=%x (%d)\r\n",
+                    b, int(b-confBuf));
                 res = SnCommWin::kOkWithMsg;
             } else {
                 redConf=false;
@@ -101,7 +128,9 @@
                                                  char* const genBuf) {
     // TODO: check if connected?
     const uint32_t ssize = SnStatusFrame::SizeOf(conf);
-    SnStatusFrame::WriteTo(genBuf, SnConfigFrame::kAfar, conf, evt, genBuf);
+    char* b = genBuf;
+    SnHeaderFrame::WriteTo(b, SnHeaderFrame::kStatusCode, ssize);
+    SnStatusFrame::WriteTo(b, SnConfigFrame::kAfar, conf, evt, genBuf);
 #ifdef DEBUG
     printf("status frame:\r\n");
     for (uint32_t i=0; i<msize; i++) {
@@ -110,14 +139,24 @@
     printf("\r\n");
 #endif
     const bool ok = GetWS().sendBinary(
-        SnHeaderFrame::GetHdBuf(SnHeaderFrame::kStatusCode, ssize),
-        SnHeaderFrame::SizeOf(),
-        genBuf, ssize);
+        genBuf, b-genBuf, fB64buf);
     printf("status sent\r\n");
     return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
 }
 
+SnCommWin::ECommWinResult SnCommAfar::SendFilename(const char* fn, char* const genBuf) {
+    printf("afar send filename %s\r\n",fn);
+    const size_t flen = strlen(fn);
+    char* b = genBuf;
+    SnHeaderFrame::WriteTo(b, SnHeaderFrame::kFilenameCode, flen);
+    sprintf(b, "%s", fn);
+    const bool ok = GetWS().sendBinary(
+        genBuf, SnHeaderFrame::SizeOf()+flen, fB64buf);
+    return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
+}
+
 SnCommWin::ECommWinResult SnCommAfar::SendData(FILE* inf) {
+    printf("afar send whole file\r\n");
     fseek(inf, 0, SEEK_END);
     const int32_t fsize = ftell(inf);
     fseek(inf, 0, SEEK_SET);
@@ -128,7 +167,8 @@
         const bool ok = GetWS().sendBinary(
             SnHeaderFrame::GetHdBuf(SnHeaderFrame::kFileCode, fsize),
             SnHeaderFrame::SizeOf(),
-            inf, fsize);
+            inf, fsize,
+            fB64buf);
         return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
     }
 }
@@ -139,10 +179,18 @@
                                                     char* const genBuf,
                                                     const uint32_t nevts,
                                                     const uint32_t firstEvt) {
+    printf("afar send conf and events\r\n");
     // firstEvt==0 ==> start at beginning
     // nevts==0 ==> NO events! (see SnCommWin::SendData
     //    for the fcn to send the full file)
-
+    
+    const int fpos = ftell(inf);
+    if (fpos>0) {
+        fseek(inf, 0, SEEK_SET);
+    }
+    
+    printf("fpos=%d\r\n",fpos);
+    
     // TODO: check memory for temporary config/event frames?
     uint64_t macadr;
     uint32_t run;
@@ -162,41 +210,66 @@
     // 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);
+    
+    printf("repack=%d, esize=%u\r\n",(int)repack,esize);
     
     // send the header and conf
     char* b = genBuf;
+    SnHeaderFrame::WriteTo(b, SnHeaderFrame::kConfAndEvtsCode, conf.SizeOf());
     conf.WriteTo(b);
+    
     bool ok  = GetWS().sendBinary(
-        SnHeaderFrame::GetHdBuf(SnHeaderFrame::kConfAndEvtsCode,
-                                conf.SizeOf()),
-        SnHeaderFrame::SizeOf(),
-        genBuf, conf.SizeOf());
+        genBuf, conf.SizeOf()+SnHeaderFrame::SizeOf(),
+        fB64buf);
+    
+    printf("ok=%d, nevts=%u\r\n",(int)ok,nevts);
     
     // size of event sent over afar
     const uint32_t ssize = (repack) ?
         SnEventFrame::SizeOf(sLoseLSB, sLoseMSB) :
         esize;
     
+    // move up to first event
+    if (firstEvt>0) {
+        printf("skip ahead %d\r\n",firstEvt*esize);
+        fseek(inf, (firstEvt*esize), SEEK_CUR);
+    }
+    
+    // get file size
+    const int fcur = ftell(inf);
+    fseek(inf, 0, SEEK_END);
+    const int fend = ftell(inf);
+    fseek(inf, fcur, SEEK_SET);
+    
     for (uint32_t i=0; (i<nevts) && ok; i++) {
-        if (repack) {
-            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);
+        if (feof(inf)==0 && ferror(inf)==0 && ((ftell(inf)+ssize)<=fend)) {
+            printf("sending evt %u\r\n",i);
+            if (repack) {
+                evt.ReadFrom(inf, genBuf,
+                    conf.GetWvLoseLSB(), conf.GetWvLoseMSB(),
+                    conf.GetWvBaseline());
+                // must be after evt.Read, since that uses the buffer
+                b = genBuf;
+                SnHeaderFrame::WriteTo(b, SnHeaderFrame::kEventCode, ssize);
+                evt.WriteTo(b, sLoseLSB, sLoseMSB, sWvBase);
+                ok &= GetWS().sendBinary(
+                    genBuf, ssize+SnHeaderFrame::SizeOf(),
+                    fB64buf);
+            } else {
+                ok &= GetWS().sendBinary(
+                    SnHeaderFrame::GetHdBuf(SnHeaderFrame::kEventCode,
+                                            ssize),
+                    SnHeaderFrame::SizeOf(),
+                    inf, ssize,
+                    fB64buf);
+            }
         } else {
-            ok &= GetWS().sendBinary(
-                SnHeaderFrame::GetHdBuf(SnHeaderFrame::kEventCode,
-                                        ssize),
-                SnHeaderFrame::SizeOf(),
-                inf, ssize);
+            printf("cannot send requested event\r\n");
+            ok=false;
         }
     }
+    
+    fseek(inf, fpos, SEEK_SET);
+    
     return ok ? SnCommWin::kOkMsgSent : SnCommWin::kFailPartSent;
 }