Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Revision:
43:28202405094d
Parent:
37:e04613e021f2
Child:
44:8ebe6b70f932
diff -r c1e7f97ab396 -r 28202405094d src/d7a_com.cpp
--- a/src/d7a_com.cpp	Thu Aug 25 09:38:40 2016 +0000
+++ b/src/d7a_com.cpp	Tue Aug 30 16:59:12 2016 +0000
@@ -101,28 +101,28 @@
         g_com_ctx.rx_buffer[g_com_ctx.write_idx] = g_com_ctx.serial->getc();
         //PRINT("-");
         
-        if (g_com_ctx.rx_started)
+        //if (g_com_ctx.rx_started)
         {
             g_com_ctx.data_available++;
             
             g_com_ctx.write_idx = (g_com_ctx.write_idx >= (g_com_ctx.rx_buffer_size-1))? 0 : g_com_ctx.write_idx+1;
             //g_com_ctx.write_idx = (g_com_ctx.write_idx + 1) % g_com_ctx.rx_buffer_size;
+            
+            // unlock data parsing thread
+            if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.data_available >= KAL_COM_HEADER_LEN)
+            {
+                g_com_ctx.state = PARSE_HEADER;
+                g_com_ctx.data_parsing->release();
+            }
+            else if (g_com_ctx.state == SEARCH_BODY && g_com_ctx.data_available >= g_com_ctx.msg.blen)
+            {
+                g_com_ctx.state = PARSE_BODY;
+                g_com_ctx.data_parsing->release();
+            }
         }
     }
     
-    //ASSERT(g_com_ctx.data_available <= g_com_ctx.rx_buffer_size, "RX Buffer overflow! (%d/%d)\r\n", g_com_ctx.data_available, g_com_ctx.rx_buffer_size);
-    
-    // unlock data parsing thread
-    if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.data_available >= KAL_COM_HEADER_LEN)
-    {
-        g_com_ctx.state = PARSE_HEADER;
-        g_com_ctx.data_parsing->release();
-    }
-    else if (g_com_ctx.state == SEARCH_BODY && g_com_ctx.data_available >= g_com_ctx.msg.blen)
-    {
-        g_com_ctx.state = PARSE_BODY;
-        g_com_ctx.data_parsing->release();
-    }
+    ASSERT(g_com_ctx.data_available <= g_com_ctx.rx_buffer_size, "RX Buffer overflow! (%d/%d)\r\n", g_com_ctx.data_available, g_com_ctx.rx_buffer_size);
 }
 
 /**
@@ -229,7 +229,8 @@
     FPRINT("\r\n");
     d7a_com_stop_rx();
     d7a_com_stop_tx();
-    
+
+    g_com_ctx.state = SEARCH_HEADER;
     g_com_ctx.data_available = 0;
     g_com_ctx.skipped_bytes = 0;
     g_com_ctx.write_idx = 0;
@@ -287,6 +288,7 @@
     d7a_com_start_tx();
 }
 
+
 static void d7a_com_copy_to_linear(uint8_t* linear_buffer, uint16_t read_start, uint16_t length)
 {
     uint16_t first_part_size;
@@ -322,13 +324,15 @@
     
     //dbg_print_data("%02X ", (uint8_t*)buffer, length);
     //DPRINT("\r\n");
-    Thread::wait(5);
+    Thread::wait(2);
     
     for (uint32_t i=0 ; i<length ; i++)
     {
         g_com_ctx.serial->putc(buffer[i]);
     }
    
+    //Thread::wait(2);
+    
     *(g_com_ctx.rts) = 0;
 }
 
@@ -438,11 +442,13 @@
             // This has to be here to avoid going to another process
             if (pkt->id == KAL_COM_FLOW_SYS_XON)
             {
+                DPRINT("XON\r\n");
                 g_com_ctx.tx_thread->signal_set(XON_SIGNAL);
                 FREE(pkt);
             }
             else if (pkt->id == KAL_COM_FLOW_SYS_XOFF)
             {
+                DPRINT("XOFF\r\n");
                 d7a_sys_xack();
                 FREE(pkt);
             }
@@ -481,6 +487,8 @@
     uint8_t header[KAL_COM_HEADER_LEN];
     uint8_t seqnum;
     
+    ASSERT(g_com_ctx.data_available >= KAL_COM_HEADER_LEN, "Not enough data for header\r\n");
+    
     g_com_ctx.skipped_bytes = 0;
     
     // Lookup fist sync byte
@@ -504,7 +512,15 @@
                 // search for body
                 d7a_com_forward_buffer(KAL_COM_HEADER_LEN);
                 g_com_ctx.state = SEARCH_BODY;
-                //DPRINT("COM header found (body %d bytes)\r\n", g_com_ctx.data_needed);
+                
+                // Start parsing if data is already available
+                if (g_com_ctx.data_available >= g_com_ctx.msg.blen)
+                {
+                    g_com_ctx.state = PARSE_BODY;
+                    g_com_ctx.data_parsing->release();
+                }
+                
+                DPRINT("COM header found (body %d/%d bytes)\r\n", g_com_ctx.data_available, g_com_ctx.msg.blen);
                 break;
             }
         }
@@ -535,6 +551,8 @@
 */
 static void parse_packet_body(void)
 {
+    ASSERT(g_com_ctx.data_available >= g_com_ctx.msg.blen, "Not enough data for body\r\n");
+    
     if (KAL_COM_FLOWID(g_com_ctx.msg.id) != KAL_COM_FLOWID_TRC)
     {
         //DPRINT("Got packet id 0x%02X len %d\r\n", id, len);
@@ -558,6 +576,13 @@
     // update buffer indexes
     d7a_com_forward_buffer(g_com_ctx.msg.blen);
     g_com_ctx.state = SEARCH_HEADER;
+    
+    // Start parsing if data is already available
+    if (g_com_ctx.data_available >= KAL_COM_HEADER_LEN)
+    {
+        g_com_ctx.state = PARSE_HEADER;
+        g_com_ctx.data_parsing->release();
+    }
 }
 
 
@@ -624,9 +649,8 @@
             
             if (KAL_COM_FLOW_SYS_XACK == flow_id)
             {
-                DPRINT("XOFF\r\n");
+                DPRINT("XACK\r\n");
                 g_com_ctx.tx_thread->signal_wait(XON_SIGNAL);
-                DPRINT("XON\r\n");
             }
         }
     }