ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Revision:
1:2b61ae8e6f94
Parent:
0:f65ba5fb350e
Child:
2:5c531dfe890b
--- a/main.cpp	Mon Jun 05 14:30:13 2017 +0000
+++ b/main.cpp	Sun Feb 04 11:43:12 2018 +0000
@@ -1,11 +1,19 @@
 ////////////////////////////////////////
-//      Tau_ReSpeaker_DSP_Test        //
+//      Tau_ReSpeaker_Sitch_V01       //
 //  Arkadiraf@gmail.com - 05/06/2017  //
 ////////////////////////////////////////
 /*
  Receive byte from pc to reroute input outputs
- b1xxxxxxx - define input port; b10000000 - port 0,  b10000001 - port 1, b10000010 - port 2 etc , b10000011 - port 3 etc.
+ b1xxxxxxx (0x8x) - define input port; b10000000 - port 0,  b10000001 - port 1, b10000010 - port 2 etc , b10000011 - port 3 etc.
  b0xxxxxxx - define output ports; b10000001 - port 1,  b10000011 - port 1&2, b10000000 - non.
+ off all:   0x00
+ All ports: 0x1f
+ speaker 5: 0x10
+ speaker 1: 0x01
+
+ Alternative json format:
+ Json Format: {"mic":0, "spk": [0,1,0,0,0]}
+
 */
 
 /*
@@ -15,10 +23,10 @@
 
 /*
     Nucleo board modification:
-    to use PH_0 as IO modify boards as followed:
+    to use PH_0(MUX_S2) as IO modify boards as followed:
     SB54 and SB55 ON
     SB16 and SB50 (MCO) OFF
-    http://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf 
+    http://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf
 */
 
 /*
@@ -78,20 +86,23 @@
 // Libraries //
 ///////////////
 #include "mbed.h"
-#include "BufferedSerial.h"  // solves issues of loosing data. alternative doing it yourself
+#include "MbedJSONValue.h"
+//#include <string>
 
 ///////////////
 // #defines  //
 ///////////////
 
 #define DEBUG_MOD1
-
+#define MSG_BUFFER_SIZE 512
+#define HEADER_SIZE 5
+#define FOOTER_SIZE 2
 /////////////
 // Objects //
 /////////////
 
 // uart
-BufferedSerial pc(USBTX, USBRX);
+Serial pc(USBTX, USBRX);
 
 // digital input
 DigitalIn user_button(PC_13);
@@ -130,65 +141,279 @@
 ///////////////
 // variables //
 ///////////////
+// analog input from microphone
+uint16_t micAData[5]= {0};
 
-uint8_t in_byte=0;
+// 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);
+
+// Packet Parser
+void parsePacket(void);
+
+// initialize switch
+void initSwitch(void);
 ////////////////////////
 //  Main Code Setup : //
 ////////////////////////
 int main()
 {
+    // init packet:
+    initPacket();
+    // init uart
     pc.baud(57600);
+    // attach serial event interrupt
+    pc.attach(&rxCallback, Serial::RxIrq);
+
+    // initialize switch
+    initSwitch();
 #ifdef DEBUG_MOD1
     pc.printf("ReSpeaker Test \r\n");
 #endif
     ///////////////////////
     //  Main Code Loop : //
     ///////////////////////
-    while(1) {
-        // check button state
-        if (user_button) {
-            if (pc.readable()) {
-                in_byte=pc.getc();
-#ifdef DEBUG_MOD1
-                pc.putc(in_byte);
-#endif
-                // check if command of input or output
-                if ((bool)(in_byte & 0b10000000)) { // set input
-                    mux_s0.write((bool)(in_byte & 0b00000001));
-                    mux_s1.write((bool)(in_byte & 0b00000010));
-                    mux_s2.write((bool)(in_byte & 0b00000100));
-                    mux_s3.write((bool)(in_byte & 0b00001000));
-                } else { // set output
-                    en_spk_1.write((bool)(in_byte & 0b00000001));
-                    en_spk_2.write((bool)(in_byte & 0b00000010));
-                    en_spk_3.write((bool)(in_byte & 0b00000100));
-                    en_spk_4.write((bool)(in_byte & 0b00001000));
-                    en_spk_5.write((bool)(in_byte & 0b00010000));
-                }
-            }
-        } else {
-            // set default input / output
-            en_spk_1.write(1);
-            en_spk_2.write(1);
-            en_spk_3.write(1);
-            en_spk_4.write(1);
-            en_spk_5.write(1);
+    while(0) {
+        if(1) {
+            micAData[0] = a_data_1.read_u16();
+            micAData[1] = a_data_2.read_u16();
+            micAData[2] = a_data_3.read_u16();
+            micAData[3] = a_data_4.read_u16();
+            micAData[4] = a_data_5.read_u16();
+            pc.printf("Data:%d,%d,%d,%d,%d\r\n",micAData[0],micAData[1],micAData[2],micAData[3],micAData[4]);
+            wait(1);
+        }
 
-            // mux input
-            mux_s0.write(0);
-            mux_s1.write(0);
-            mux_s2.write(0);
-            mux_s3.write(0);
-
-        }
     }// end main loop
 }// end main
-
 ///////////////
 // Functions //
 ///////////////
+
+// initialize switch
+void initSwitch(void)
+{
+    // attach serial event interrupt
+    pc.attach(&rxCallback, Serial::RxIrq);
+    // reset output / input
+    mux_s0.write(0);
+    mux_s1.write(0);
+    mux_s2.write(0);
+    mux_s3.write(0);
+    en_spk_1.write(0);
+    en_spk_2.write(0);
+    en_spk_3.write(0);
+    en_spk_4.write(0);
+    en_spk_5.write(0);
+}// end init switch
+
+
+// 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 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;
+            }
+            // 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
+                        memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex);
+                        json[packetMSG.bufferIndex]=NULL; // end with NULL to indicate end of string
+                        // copy packet to json buffer with sprintf
+                        //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer );
+                        // send msg to parse.
+                        parsePacket();
+                        // 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;
+            }
+            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
+}
+
+// Packet Parser
+void parsePacket(void)
+{
+    static int micChannle = 0;
+    static bool spkChannle[5]= {0};
+#ifdef DEBUG_MOD1
+    // write buffer to screen
+    //pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer );
+    //pc.printf("%s", json);
+#endif
+
+    MbedJSONValue guiCmd;
+
+    //const  char * json = "{\"my_array\": [\"demo_string\", 10], \"my_boolean\": true}";
+    // json:{"my_array": ["demo_string", 10], "my_boolean": true}
+    //parse the previous string and fill the object demo
+
+    // GUI message format: {"mic":0, "spk": [0,1,0,0,0]}
+    parse(guiCmd, json);
+
+    micChannle = guiCmd["mic"].get<int>();
+    for (int ii=0 ; ii < 5 ; ii++) {
+        spkChannle[ii] = guiCmd["spk"][ii].get<bool>();
+    }
+
+#ifdef DEBUG_MOD1
+    // send parsed values
+    printf("mic: %d , spk: [%d,%d,%d,%d,%d]\r\n", micChannle,spkChannle[0],spkChannle[1],spkChannle[2],spkChannle[3],spkChannle[4]);
+#endif
+
+
+    // update hardware
+    
+    // update mic select mux
+    uint8_t micByte = (uint8_t) micChannle;
+    mux_s0.write((bool)(micByte & 0b00000001));
+    mux_s1.write((bool)(micByte & 0b00000010));
+    mux_s2.write((bool)(micByte & 0b00000100));
+    mux_s3.write((bool)(micByte & 0b00001000));
+
+    // update speakers:
+    en_spk_1.write(spkChannle[0]);
+    en_spk_2.write(spkChannle[1]);
+    en_spk_3.write(spkChannle[2]);
+    en_spk_4.write(spkChannle[3]);
+    en_spk_5.write(spkChannle[4]);
+    
+    // led blink
+    led = !led;
+}// end parse
+
+
+
+//// Serial Event function  simple byte parser
+//void rxCallback(void)
+//{
+//    // incoming buffer
+//    uint8_t in_byte;
+//    // read icoming
+//    led = !led;
+//    in_byte = pc.getc();
+//#ifdef DEBUG_MOD1
+//    pc.putc(in_byte);
+//#endif
+//    // check if command of input or output
+//    if ((bool)(in_byte & 0b10000000)) { // set input
+//        mux_s0.write((bool)(in_byte & 0b00000001));
+//        mux_s1.write((bool)(in_byte & 0b00000010));
+//        mux_s2.write((bool)(in_byte & 0b00000100));
+//        mux_s3.write((bool)(in_byte & 0b00001000));
+//    } else { // set output
+//        en_spk_1.write((bool)(in_byte & 0b00000001));
+//        en_spk_2.write((bool)(in_byte & 0b00000010));
+//        en_spk_3.write((bool)(in_byte & 0b00000100));
+//        en_spk_4.write((bool)(in_byte & 0b00001000));
+//        en_spk_5.write((bool)(in_byte & 0b00010000));
+//    }
+//} // end rxCallback
\ No newline at end of file