Serial Packet Handler

Dependencies:   MbedJSONValue mbed

Revision:
0:6080c5029b3f
Child:
1:711a27baa42d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 15 10:40:06 2018 +0000
@@ -0,0 +1,215 @@
+////////////////////////////////////////
+//      Serial Packet - picojson      //
+//  Arkadiraf@gmail.com - 05/06/2017  //
+////////////////////////////////////////
+/*
+    Construct packet from uart and parse with json format
+    json:<PACKET>\r\n
+*/
+
+/*
+   Board : Nucleo STM32F446RE
+*/
+
+/*
+    Pinout:
+    PC - Serial 2
+    PA_2 (Tx) --> STLINK
+    PA_3 (Rx) --> STLINK
+*/
+
+///////////////
+// Libraries //
+///////////////
+#include "mbed.h"
+#include "picojson.h"
+//#include "BufferedSerial.h" // uart handler library
+///////////////
+// #defines  //
+///////////////
+
+#define DEBUG_MOD1
+#define MSG_BUFFER_SIZE 512
+#define HEADER_SIZE 5
+#define FOOTER_SIZE 2
+
+/////////////
+// Objects //
+/////////////
+
+// uart
+Serial pc(USBTX, USBRX);
+
+// digital output
+DigitalOut led(PA_5);
+///////////////
+// variables //
+///////////////
+
+// json buffer
+char json[MSG_BUFFER_SIZE];
+
+// packet variables
+struct packetMSG_struct {
+    // recieve message variables
+    uint8_t header[HEADER_SIZE];
+    uint8_t footer[FOOTER_SIZE];
+    uint8_t syncIndex; // sync index for header / footer
+    uint8_t syncFlag; // 0 - waiting for header, 1 -  waiting for footer, 2 - verify footer, 3 - finish footer send to parser, flash buffer
+    // buffer
+    uint16_t bufferIndex; // buffer index
+    uint8_t buffer[MSG_BUFFER_SIZE];
+} ;
+packetMSG_struct packetMSG;
+///////////////
+// Functions //
+///////////////
+
+// Serial Event function
+void rxCallback(void);
+
+// initialize packet struct
+void initPacket(void);
+////////////////////////
+//  Main Code Setup : //
+////////////////////////
+int main()
+{
+    // init packet:
+    initPacket();
+    // init uart
+    pc.baud(57600);
+    // attach serial event interrupt
+    pc.attach(&rxCallback, Serial::RxIrq);
+
+#ifdef DEBUG_MOD1
+    pc.printf("UART Test \r\n");
+#endif
+    ///////////////////////
+    //  Main Code Loop : //
+    ///////////////////////
+    while(1) {
+        //sleep();
+    }// end main loop
+}// end main
+///////////////
+// Functions //
+///////////////
+
+// Serial Event function
+void rxCallback(void)
+{
+    while (pc.readable()) {
+        // read icoming
+        led = !led;
+        uint8_t in_byte = pc.getc();
+#ifdef DEBUG_MOD1
+        pc.putc(in_byte);
+#endif
+        // detect start message , end message
+        switch (packetMSG.syncFlag) {
+                // waiting for header
+            case 0: {
+                if (packetMSG.header[packetMSG.syncIndex] == in_byte) {
+                    packetMSG.syncIndex++;
+                    if (packetMSG.syncIndex == HEADER_SIZE) { // finish header SYNC
+                        packetMSG.syncFlag = 1; // start collecting data, wait for footer
+                        packetMSG.bufferIndex = 0;
+                        packetMSG.syncIndex=0;
+                    }
+                } else { // reinit sync
+                    packetMSG.syncIndex=0;
+                }
+                //pc.printf("case 0 , %d  \r\n",packetMSG.syncIndex);
+                break;
+
+            } // waiting for header
+
+            // waiting for footer
+            case 1: {
+                // add byte to buffer
+                packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
+                packetMSG.bufferIndex++;
+                if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
+                    // reset buffer
+                    packetMSG.bufferIndex = 0;
+                    packetMSG.syncIndex = 0;
+                    packetMSG.syncFlag = 0;
+                } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
+                    packetMSG.syncIndex++;
+                    packetMSG.syncFlag=2; // move to verify footer
+                }
+                //pc.printf("case 2 , %d  \r\n",packetMSG.syncIndex);
+                break;
+            } // waiting for footer
+
+            // verify footer
+            case 2: {
+                // add byte to buffer
+                packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
+                packetMSG.bufferIndex++;
+                if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
+                    // reset buffer
+                    packetMSG.bufferIndex = 0;
+                    packetMSG.syncIndex = 0;
+                    packetMSG.syncFlag = 0;
+                } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
+                    packetMSG.syncIndex++;
+                    if (packetMSG.syncIndex == FOOTER_SIZE) { // finish footer SYNC
+                        packetMSG.syncFlag = 3;
+
+                        // copy packet to json buffer - failed attempt
+                        //char *json = (char*) malloc(packetMSG.bufferIndex+1);
+                        memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex);
+                        json[packetMSG.bufferIndex]=NULL; // end NULL to indicate end of string
+
+                        // copy packet to json buffer with sprintf
+                        //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer );
+
+                        // send msg to parse.
+                        pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer );
+                        pc.printf("%d, %s", sizeof(json), json);
+                        //free(json);
+                        // reset buffer
+                        packetMSG.bufferIndex = 0;
+                        packetMSG.syncIndex = 0;
+                        packetMSG.syncFlag = 0;
+                    }
+                } else { // footer broke restart wait for footer
+                    packetMSG.syncFlag=1;
+                    // verify that it didnt broke on first footer char
+                    if (packetMSG.footer[0] == in_byte) {
+                        packetMSG.syncIndex=1;
+                    } else {
+                        packetMSG.syncIndex=0;
+                    }
+                }
+                break;
+
+            } // verify footer
+            default: {
+                pc.printf("Sonmething went wrong \r\n");
+                break;
+            }
+        } // end switch
+    }// end uart readable
+} // end rxCallback
+
+
+// initialize packet struct
+void initPacket(void)
+{
+    // init variables to default:
+    packetMSG.header[0] = 'j';
+    packetMSG.header[1] = 's';
+    packetMSG.header[2] = 'o';
+    packetMSG.header[3] = 'n';
+    packetMSG.header[4] = ':';
+
+    packetMSG.footer[0]= 13; // /r
+    packetMSG.footer[1]= 10; // /n
+
+    packetMSG.syncIndex=0; // sync index for header / footer
+    packetMSG.syncFlag=0; // 0 - waiting for header, 1 -  waiting for footer, 2 - verify footer, 3 - finish footer send to parser, flash buffer
+    packetMSG.bufferIndex=0; // buffer index
+}
\ No newline at end of file