Arkadi Rafalovich / Mbed 2 deprecated Serial_Packet

Dependencies:   mbed MbedJSONValue

Files at this revision

API Documentation at this revision

Comitter:
Arkadi
Date:
Mon Jan 15 10:40:06 2018 +0000
Child:
1:711a27baa42d
Commit message:
Serial Packet Handler

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
picojson.lib Show annotated file Show diff for this revision Revisions of this file
--- /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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Jan 15 10:40:06 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/7130f322cb7e
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/picojson.lib	Mon Jan 15 10:40:06 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mimil/code/picojson/#2bb500b021e2