ReSpeaker Switch V02
Dependencies: mbed MbedJSONValue
Diff: main.cpp
- 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