Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Revision:
76:fda2e34ff19d
Parent:
71:f03727ff0f99
Child:
77:8c792719a1fc
--- a/src/d7a_com.cpp	Fri Dec 16 16:04:27 2016 +0000
+++ b/src/d7a_com.cpp	Tue Dec 20 09:30:14 2016 +0000
@@ -8,8 +8,9 @@
 #include "d7a_fs.h"
 #include "d7a_modem.h"
 #include "d7a_sys.h"
-#include "circular.h"
+#include "cbuffer.h"
 
+#define LocalCBuffer CBuffer<uint8_t, 1024>
 
 #define XON_SIGNAL              (0x0001 << 0)
 #define START_SIGNAL            (0x0001 << 1)
@@ -35,7 +36,7 @@
     DigitalOut*             rts;
     InterruptIn*            cts;
     
-    CircularBuffer*         rx_buf;
+    LocalCBuffer*           rx_buf;
     
     // min data in buffer before parsing body
     d7a_com_rx_msg_t        msg;
@@ -56,7 +57,7 @@
     
     // Data treatment threads
     Thread*                 rx_thread;
-    Serial*                 serial;
+    RawSerial*                 serial;
     
     // Tx Thread
     Thread*                 tx_thread;
@@ -75,8 +76,8 @@
     @param void
     @return void
 */
-void d7a_com_rx_thread( void const *p );
-void d7a_com_tx_thread( void const *p );
+void d7a_com_rx_thread();
+void d7a_com_tx_thread();
 
 
 /**
@@ -99,12 +100,12 @@
         //if (g_com_ctx.rx_started)
         {
             // unlock data parsing thread
-            if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN)
+            if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.rx_buf->available_data() >= 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.rx_buf->available() >= g_com_ctx.msg.blen)
+            else if (g_com_ctx.state == SEARCH_BODY && g_com_ctx.rx_buf->available_data() >= g_com_ctx.msg.blen)
             {
                 g_com_ctx.state = PARSE_BODY;
                 g_com_ctx.data_parsing->release();
@@ -142,7 +143,7 @@
     g_com_ctx.tx_seq = 0;
     g_com_ctx.rx_seq = 0;
     
-    g_com_ctx.serial =          new Serial(config->tx, config->rx);
+    g_com_ctx.serial =          new RawSerial(config->tx, config->rx);
     g_com_ctx.rts =             new DigitalOut(config->rts);
     g_com_ctx.cts =             new InterruptIn(config->cts);
     g_com_ctx.data_parsing =    new Semaphore(0);
@@ -150,21 +151,20 @@
     
     g_com_ctx.cts->rise(&cts_isr);
     
-    g_com_ctx.rx_buf =          new CircularBuffer(1024);
+    g_com_ctx.rx_buf =          new LocalCBuffer;
 
-    /* XXX: Unknown bug:
-    Baud rate can be found with high error rate (> 4%).
-    It is here manualy corrected after an oscilloscope measure.
-    Normal Baudrate should be 115200.
-    */
-    //g_com_ctx.serial->baud(117000); // XXX
-    g_com_ctx.serial->baud(115200); // XXX
-    //g_com_ctx.serial->baud(57600); // XXX
+    g_com_ctx.serial->baud(115200);
     g_com_ctx.serial->format(8, SerialBase::None, 1);
     g_com_ctx.serial->attach(&rx_isr, Serial::RxIrq);
     
-    g_com_ctx.tx_thread =       new Thread(d7a_com_tx_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE*4);
-    g_com_ctx.rx_thread =       new Thread(d7a_com_rx_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE*4);
+    g_com_ctx.tx_thread = new Thread(osPriorityHigh, DEFAULT_STACK_SIZE*2, NULL);
+    g_com_ctx.rx_thread = new Thread(osPriorityHigh, DEFAULT_STACK_SIZE*2, NULL);
+    
+    osStatus err = g_com_ctx.rx_thread->start(d7a_com_rx_thread);
+    ASSERT(err == osOK, "Failed to start d7a_com_rx_thread (err: %d)\r\n", err);
+    
+    err = g_com_ctx.tx_thread->start(d7a_com_tx_thread);
+    ASSERT(err == osOK, "Failed to start d7a_com_tx_thread (err: %d)\r\n", err);
     
     return D7A_ERR_NONE;
 }
@@ -360,16 +360,18 @@
 */
 static void parse_packet_header(void)
 {
+    FPRINT("\r\n");
+    
     uint8_t header[KAL_COM_HEADER_LEN];
     uint8_t seqnum;
     
-    ASSERT(g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN, "Not enough data for header\r\n");
+    ASSERT(g_com_ctx.rx_buf->available_data() >= KAL_COM_HEADER_LEN, "Not enough data for header\r\n");
     
     g_com_ctx.skipped_bytes = 0;
     
     header[0] = g_com_ctx.rx_buf->pop();
     
-    while (g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN - 1)
+    while (g_com_ctx.rx_buf->available_data() >= KAL_COM_HEADER_LEN - 1)
     {
         header[1] = g_com_ctx.rx_buf->pop();
         
@@ -392,13 +394,13 @@
             g_com_ctx.state = SEARCH_BODY;
             
             // Start parsing if data is already available
-            if (g_com_ctx.rx_buf->available() >= g_com_ctx.msg.blen)
+            if (g_com_ctx.rx_buf->available_data() >= g_com_ctx.msg.blen)
             {
                 g_com_ctx.state = PARSE_BODY;
                 g_com_ctx.data_parsing->release();
             }
             
-            //DPRINT("COM header found (id: %02X seq: %d body: %d/%d bytes)\r\n", g_com_ctx.msg.id, seqnum, g_com_ctx.rx_buf->available(), g_com_ctx.msg.blen);
+            //DPRINT("COM header found (id: %02X seq: %d body: %d/%d bytes)\r\n", g_com_ctx.msg.id, seqnum, g_com_ctx.rx_buf->available_data(), g_com_ctx.msg.blen);
             break;
         }
         else
@@ -418,7 +420,7 @@
 */
 static void parse_packet_body(void)
 {
-    ASSERT(g_com_ctx.rx_buf->available() >= g_com_ctx.msg.blen, "Not enough data for body\r\n");
+    ASSERT(g_com_ctx.rx_buf->available_data() >= 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)
     {
@@ -445,7 +447,7 @@
     g_com_ctx.state = SEARCH_HEADER;
     
     // Start parsing if data is already available
-    if (g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN)
+    if (g_com_ctx.rx_buf->available_data() >= KAL_COM_HEADER_LEN)
     {
         g_com_ctx.state = PARSE_HEADER;
         g_com_ctx.data_parsing->release();
@@ -454,7 +456,7 @@
 
 
 // Thread for parsing packets from RX buffer.
-void d7a_com_rx_thread( void const *p )
+void d7a_com_rx_thread()
 {
     FPRINT("(id:0x%08x)\r\n", osThreadGetId());
     while (true)
@@ -473,7 +475,7 @@
     }
 }
 
-void d7a_com_tx_thread( void const *p )
+void d7a_com_tx_thread()
 {
     FPRINT("(id:0x%08x)\r\n", osThreadGetId());