ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Sun Feb 04 16:14:03 2018 +0000
Revision:
3:9c3169e549f0
Parent:
2:5c531dfe890b
Child:
4:7c08791dcac1
minor fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Arkadi 0:f65ba5fb350e 1 ////////////////////////////////////////
Arkadi 1:2b61ae8e6f94 2 // Tau_ReSpeaker_Sitch_V01 //
Arkadi 0:f65ba5fb350e 3 // Arkadiraf@gmail.com - 05/06/2017 //
Arkadi 0:f65ba5fb350e 4 ////////////////////////////////////////
Arkadi 0:f65ba5fb350e 5 /*
Arkadi 0:f65ba5fb350e 6 Receive byte from pc to reroute input outputs
Arkadi 1:2b61ae8e6f94 7 b1xxxxxxx (0x8x) - define input port; b10000000 - port 0, b10000001 - port 1, b10000010 - port 2 etc , b10000011 - port 3 etc.
Arkadi 0:f65ba5fb350e 8 b0xxxxxxx - define output ports; b10000001 - port 1, b10000011 - port 1&2, b10000000 - non.
Arkadi 1:2b61ae8e6f94 9 off all: 0x00
Arkadi 1:2b61ae8e6f94 10 All ports: 0x1f
Arkadi 1:2b61ae8e6f94 11 speaker 5: 0x10
Arkadi 1:2b61ae8e6f94 12 speaker 1: 0x01
Arkadi 1:2b61ae8e6f94 13
Arkadi 1:2b61ae8e6f94 14 Alternative json format:
Arkadi 1:2b61ae8e6f94 15 Json Format: {"mic":0, "spk": [0,1,0,0,0]}
Arkadi 1:2b61ae8e6f94 16
Arkadi 0:f65ba5fb350e 17 */
Arkadi 0:f65ba5fb350e 18
Arkadi 0:f65ba5fb350e 19 /*
Arkadi 0:f65ba5fb350e 20 Board : Nucleo STM32F446RE
Arkadi 0:f65ba5fb350e 21 Power Source : USB || Jumper 5V source from STM32 DSP board
Arkadi 0:f65ba5fb350e 22 */
Arkadi 0:f65ba5fb350e 23
Arkadi 0:f65ba5fb350e 24 /*
Arkadi 0:f65ba5fb350e 25 Nucleo board modification:
Arkadi 1:2b61ae8e6f94 26 to use PH_0(MUX_S2) as IO modify boards as followed:
Arkadi 0:f65ba5fb350e 27 SB54 and SB55 ON
Arkadi 0:f65ba5fb350e 28 SB16 and SB50 (MCO) OFF
Arkadi 1:2b61ae8e6f94 29 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
Arkadi 0:f65ba5fb350e 30 */
Arkadi 0:f65ba5fb350e 31
Arkadi 0:f65ba5fb350e 32 /*
Arkadi 0:f65ba5fb350e 33 Pinout:
Arkadi 0:f65ba5fb350e 34 PC - Serial 2
Arkadi 0:f65ba5fb350e 35 PA_2 (Tx) --> STLINK
Arkadi 0:f65ba5fb350e 36 PA_3 (Rx) --> STLINK
Arkadi 0:f65ba5fb350e 37
Arkadi 0:f65ba5fb350e 38 Switch - Serial 3
Arkadi 0:f65ba5fb350e 39 PC_10 (Tx) --> SW_Rx
Arkadi 0:f65ba5fb350e 40 PC_11 (Rx) --> SW_Tx
Arkadi 0:f65ba5fb350e 41
Arkadi 0:f65ba5fb350e 42 I2C_Bus
Arkadi 0:f65ba5fb350e 43 PB_8 --> SCL
Arkadi 0:f65ba5fb350e 44 PB_9 --> SDA
Arkadi 0:f65ba5fb350e 45
Arkadi 0:f65ba5fb350e 46 Digital output :
Arkadi 0:f65ba5fb350e 47 PA_5 --> led (DigitalOut)
Arkadi 0:f65ba5fb350e 48 PA_10 --> SW_Trigger
Arkadi 0:f65ba5fb350e 49
Arkadi 0:f65ba5fb350e 50 MUX: CD74HC4067
Arkadi 0:f65ba5fb350e 51 PC_12 --> MUX_S0
Arkadi 0:f65ba5fb350e 52 PD_2 --> MUX_S1
Arkadi 0:f65ba5fb350e 53 PH_0 --> MUX_S2
Arkadi 0:f65ba5fb350e 54 PH_1 --> MUX_S3
Arkadi 0:f65ba5fb350e 55
Arkadi 0:f65ba5fb350e 56 Speaker Switch : SN74LVC1G3157
Arkadi 0:f65ba5fb350e 57 PB_2 --> EN_SPK_1
Arkadi 0:f65ba5fb350e 58 PB_1 --> EN_SPK_2
Arkadi 0:f65ba5fb350e 59 PB_15 --> EN_SPK_3
Arkadi 0:f65ba5fb350e 60 PB_14 --> EN_SPK_4
Arkadi 0:f65ba5fb350e 61 PB_13 --> EN_SPK_5
Arkadi 0:f65ba5fb350e 62
Arkadi 0:f65ba5fb350e 63 MIC Interrupts:
Arkadi 0:f65ba5fb350e 64 PC_15 --> INTER_1
Arkadi 0:f65ba5fb350e 65 PC_14 --> INTER_2
Arkadi 0:f65ba5fb350e 66 PA_15 --> INTER_3
Arkadi 0:f65ba5fb350e 67 PA_14 --> INTER_4
Arkadi 0:f65ba5fb350e 68 PA_13 --> INTER_5
Arkadi 0:f65ba5fb350e 69
Arkadi 0:f65ba5fb350e 70 Digital Input
Arkadi 0:f65ba5fb350e 71 PC_13 --> BTN (Blue)
Arkadi 0:f65ba5fb350e 72
Arkadi 0:f65ba5fb350e 73 Analog Input
Arkadi 0:f65ba5fb350e 74 PA_0 --> A_DATA_1
Arkadi 0:f65ba5fb350e 75 PA_1 --> A_DATA_2
Arkadi 0:f65ba5fb350e 76 PA_4 --> A_DATA_3
Arkadi 0:f65ba5fb350e 77 PB_0 --> A_DATA_4
Arkadi 0:f65ba5fb350e 78 PC_1 --> A_DATA_5
Arkadi 0:f65ba5fb350e 79
Arkadi 0:f65ba5fb350e 80 Analog Output
Arkadi 0:f65ba5fb350e 81
Arkadi 0:f65ba5fb350e 82
Arkadi 0:f65ba5fb350e 83 */
Arkadi 0:f65ba5fb350e 84
Arkadi 0:f65ba5fb350e 85 ///////////////
Arkadi 0:f65ba5fb350e 86 // Libraries //
Arkadi 0:f65ba5fb350e 87 ///////////////
Arkadi 0:f65ba5fb350e 88 #include "mbed.h"
Arkadi 1:2b61ae8e6f94 89 #include "MbedJSONValue.h"
Arkadi 1:2b61ae8e6f94 90 //#include <string>
Arkadi 0:f65ba5fb350e 91
Arkadi 0:f65ba5fb350e 92 ///////////////
Arkadi 0:f65ba5fb350e 93 // #defines //
Arkadi 0:f65ba5fb350e 94 ///////////////
Arkadi 0:f65ba5fb350e 95
Arkadi 2:5c531dfe890b 96 //#define DEBUG_MOD1 // json packet recognise
Arkadi 2:5c531dfe890b 97 //#define DEBUG_MOD2 // json parse
Arkadi 2:5c531dfe890b 98 //#define DEBUG_MOD3 // switch handler
Arkadi 2:5c531dfe890b 99 #define DEBUG_MOD10 // responsivity msges to gui
Arkadi 2:5c531dfe890b 100
Arkadi 1:2b61ae8e6f94 101 #define MSG_BUFFER_SIZE 512
Arkadi 1:2b61ae8e6f94 102 #define HEADER_SIZE 5
Arkadi 1:2b61ae8e6f94 103 #define FOOTER_SIZE 2
Arkadi 0:f65ba5fb350e 104 /////////////
Arkadi 0:f65ba5fb350e 105 // Objects //
Arkadi 0:f65ba5fb350e 106 /////////////
Arkadi 0:f65ba5fb350e 107
Arkadi 2:5c531dfe890b 108 // json
Arkadi 2:5c531dfe890b 109 MbedJSONValue guiCmd;
Arkadi 2:5c531dfe890b 110
Arkadi 0:f65ba5fb350e 111 // uart
Arkadi 1:2b61ae8e6f94 112 Serial pc(USBTX, USBRX);
Arkadi 0:f65ba5fb350e 113
Arkadi 0:f65ba5fb350e 114 // digital input
Arkadi 0:f65ba5fb350e 115 DigitalIn user_button(PC_13);
Arkadi 0:f65ba5fb350e 116
Arkadi 0:f65ba5fb350e 117 // digital output
Arkadi 0:f65ba5fb350e 118 DigitalOut led(PA_5);
Arkadi 0:f65ba5fb350e 119 DigitalOut sw_trigger(PA_10);
Arkadi 0:f65ba5fb350e 120
Arkadi 0:f65ba5fb350e 121 // MUX: CD74HC4067
Arkadi 0:f65ba5fb350e 122 DigitalOut mux_s0(PC_12);
Arkadi 0:f65ba5fb350e 123 DigitalOut mux_s1(PD_2);
Arkadi 0:f65ba5fb350e 124 DigitalOut mux_s2(PH_0);
Arkadi 0:f65ba5fb350e 125 DigitalOut mux_s3(PH_1);
Arkadi 0:f65ba5fb350e 126
Arkadi 0:f65ba5fb350e 127 // speaker switch
Arkadi 0:f65ba5fb350e 128 DigitalOut en_spk_1(PB_2);
Arkadi 0:f65ba5fb350e 129 DigitalOut en_spk_2(PB_1);
Arkadi 0:f65ba5fb350e 130 DigitalOut en_spk_3(PB_15);
Arkadi 0:f65ba5fb350e 131 DigitalOut en_spk_4(PB_14);
Arkadi 0:f65ba5fb350e 132 DigitalOut en_spk_5(PB_13);
Arkadi 0:f65ba5fb350e 133
Arkadi 0:f65ba5fb350e 134 // MIC interrupts
Arkadi 0:f65ba5fb350e 135 DigitalOut inter_1(PC_15);
Arkadi 0:f65ba5fb350e 136 DigitalOut inter_2(PC_14);
Arkadi 0:f65ba5fb350e 137 DigitalOut inter_3(PA_15);
Arkadi 0:f65ba5fb350e 138 DigitalOut inter_4(PA_14);
Arkadi 0:f65ba5fb350e 139 DigitalOut inter_5(PA_13);
Arkadi 0:f65ba5fb350e 140
Arkadi 0:f65ba5fb350e 141 // analog input
Arkadi 0:f65ba5fb350e 142 AnalogIn a_data_1(PA_0);
Arkadi 0:f65ba5fb350e 143 AnalogIn a_data_2(PA_1);
Arkadi 0:f65ba5fb350e 144 AnalogIn a_data_3(PA_4);
Arkadi 0:f65ba5fb350e 145 AnalogIn a_data_4(PB_0);
Arkadi 0:f65ba5fb350e 146 AnalogIn a_data_5(PC_1);
Arkadi 0:f65ba5fb350e 147
Arkadi 0:f65ba5fb350e 148 ///////////////
Arkadi 0:f65ba5fb350e 149 // variables //
Arkadi 0:f65ba5fb350e 150 ///////////////
Arkadi 1:2b61ae8e6f94 151 // analog input from microphone
Arkadi 1:2b61ae8e6f94 152 uint16_t micAData[5]= {0};
Arkadi 0:f65ba5fb350e 153
Arkadi 1:2b61ae8e6f94 154 // json buffer
Arkadi 1:2b61ae8e6f94 155 char json[MSG_BUFFER_SIZE];
Arkadi 1:2b61ae8e6f94 156
Arkadi 1:2b61ae8e6f94 157 // packet variables
Arkadi 1:2b61ae8e6f94 158 struct packetMSG_struct {
Arkadi 1:2b61ae8e6f94 159 // recieve message variables
Arkadi 1:2b61ae8e6f94 160 uint8_t header[HEADER_SIZE];
Arkadi 1:2b61ae8e6f94 161 uint8_t footer[FOOTER_SIZE];
Arkadi 1:2b61ae8e6f94 162 uint8_t syncIndex; // sync index for header / footer
Arkadi 1:2b61ae8e6f94 163 uint8_t syncFlag; // 0 - waiting for header, 1 - waiting for footer, 2 - verify footer, 3 - finish footer send to parser, flash buffer
Arkadi 1:2b61ae8e6f94 164 // buffer
Arkadi 1:2b61ae8e6f94 165 uint16_t bufferIndex; // buffer index
Arkadi 1:2b61ae8e6f94 166 uint8_t buffer[MSG_BUFFER_SIZE];
Arkadi 1:2b61ae8e6f94 167 } ;
Arkadi 1:2b61ae8e6f94 168 packetMSG_struct packetMSG;
Arkadi 1:2b61ae8e6f94 169
Arkadi 0:f65ba5fb350e 170
Arkadi 0:f65ba5fb350e 171 ///////////////
Arkadi 0:f65ba5fb350e 172 // Functions //
Arkadi 0:f65ba5fb350e 173 ///////////////
Arkadi 0:f65ba5fb350e 174
Arkadi 1:2b61ae8e6f94 175 // Serial Event function
Arkadi 1:2b61ae8e6f94 176 void rxCallback(void);
Arkadi 1:2b61ae8e6f94 177
Arkadi 1:2b61ae8e6f94 178 // initialize packet struct
Arkadi 1:2b61ae8e6f94 179 void initPacket(void);
Arkadi 1:2b61ae8e6f94 180
Arkadi 1:2b61ae8e6f94 181 // Packet Parser
Arkadi 1:2b61ae8e6f94 182 void parsePacket(void);
Arkadi 1:2b61ae8e6f94 183
Arkadi 2:5c531dfe890b 184 // switch Packet Handler
Arkadi 2:5c531dfe890b 185 void switchPacket(void);
Arkadi 2:5c531dfe890b 186
Arkadi 1:2b61ae8e6f94 187 // initialize switch
Arkadi 1:2b61ae8e6f94 188 void initSwitch(void);
Arkadi 0:f65ba5fb350e 189 ////////////////////////
Arkadi 0:f65ba5fb350e 190 // Main Code Setup : //
Arkadi 0:f65ba5fb350e 191 ////////////////////////
Arkadi 0:f65ba5fb350e 192 int main()
Arkadi 0:f65ba5fb350e 193 {
Arkadi 1:2b61ae8e6f94 194 // init packet:
Arkadi 1:2b61ae8e6f94 195 initPacket();
Arkadi 1:2b61ae8e6f94 196 // init uart
Arkadi 0:f65ba5fb350e 197 pc.baud(57600);
Arkadi 1:2b61ae8e6f94 198 // attach serial event interrupt
Arkadi 1:2b61ae8e6f94 199 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 1:2b61ae8e6f94 200
Arkadi 1:2b61ae8e6f94 201 // initialize switch
Arkadi 1:2b61ae8e6f94 202 initSwitch();
Arkadi 0:f65ba5fb350e 203 #ifdef DEBUG_MOD1
Arkadi 0:f65ba5fb350e 204 pc.printf("ReSpeaker Test \r\n");
Arkadi 0:f65ba5fb350e 205 #endif
Arkadi 0:f65ba5fb350e 206 ///////////////////////
Arkadi 0:f65ba5fb350e 207 // Main Code Loop : //
Arkadi 0:f65ba5fb350e 208 ///////////////////////
Arkadi 1:2b61ae8e6f94 209 while(0) {
Arkadi 1:2b61ae8e6f94 210 if(1) {
Arkadi 1:2b61ae8e6f94 211 micAData[0] = a_data_1.read_u16();
Arkadi 1:2b61ae8e6f94 212 micAData[1] = a_data_2.read_u16();
Arkadi 1:2b61ae8e6f94 213 micAData[2] = a_data_3.read_u16();
Arkadi 1:2b61ae8e6f94 214 micAData[3] = a_data_4.read_u16();
Arkadi 1:2b61ae8e6f94 215 micAData[4] = a_data_5.read_u16();
Arkadi 1:2b61ae8e6f94 216 pc.printf("Data:%d,%d,%d,%d,%d\r\n",micAData[0],micAData[1],micAData[2],micAData[3],micAData[4]);
Arkadi 1:2b61ae8e6f94 217 wait(1);
Arkadi 1:2b61ae8e6f94 218 }
Arkadi 0:f65ba5fb350e 219
Arkadi 0:f65ba5fb350e 220 }// end main loop
Arkadi 0:f65ba5fb350e 221 }// end main
Arkadi 0:f65ba5fb350e 222 ///////////////
Arkadi 0:f65ba5fb350e 223 // Functions //
Arkadi 0:f65ba5fb350e 224 ///////////////
Arkadi 1:2b61ae8e6f94 225
Arkadi 1:2b61ae8e6f94 226 // initialize switch
Arkadi 1:2b61ae8e6f94 227 void initSwitch(void)
Arkadi 1:2b61ae8e6f94 228 {
Arkadi 1:2b61ae8e6f94 229 // attach serial event interrupt
Arkadi 1:2b61ae8e6f94 230 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 1:2b61ae8e6f94 231 // reset output / input
Arkadi 1:2b61ae8e6f94 232 mux_s0.write(0);
Arkadi 1:2b61ae8e6f94 233 mux_s1.write(0);
Arkadi 1:2b61ae8e6f94 234 mux_s2.write(0);
Arkadi 1:2b61ae8e6f94 235 mux_s3.write(0);
Arkadi 1:2b61ae8e6f94 236 en_spk_1.write(0);
Arkadi 1:2b61ae8e6f94 237 en_spk_2.write(0);
Arkadi 1:2b61ae8e6f94 238 en_spk_3.write(0);
Arkadi 1:2b61ae8e6f94 239 en_spk_4.write(0);
Arkadi 1:2b61ae8e6f94 240 en_spk_5.write(0);
Arkadi 1:2b61ae8e6f94 241 }// end init switch
Arkadi 1:2b61ae8e6f94 242
Arkadi 1:2b61ae8e6f94 243
Arkadi 1:2b61ae8e6f94 244 // Serial Event function
Arkadi 1:2b61ae8e6f94 245 void rxCallback(void)
Arkadi 1:2b61ae8e6f94 246 {
Arkadi 1:2b61ae8e6f94 247 while (pc.readable()) {
Arkadi 1:2b61ae8e6f94 248 // read icoming
Arkadi 1:2b61ae8e6f94 249 //led = !led;
Arkadi 1:2b61ae8e6f94 250 uint8_t in_byte = pc.getc();
Arkadi 1:2b61ae8e6f94 251 #ifdef DEBUG_MOD1
Arkadi 1:2b61ae8e6f94 252 pc.putc(in_byte);
Arkadi 1:2b61ae8e6f94 253 #endif
Arkadi 1:2b61ae8e6f94 254 // detect start message , end message
Arkadi 1:2b61ae8e6f94 255 switch (packetMSG.syncFlag) {
Arkadi 1:2b61ae8e6f94 256 // waiting for header
Arkadi 1:2b61ae8e6f94 257 case 0: {
Arkadi 1:2b61ae8e6f94 258 if (packetMSG.header[packetMSG.syncIndex] == in_byte) {
Arkadi 1:2b61ae8e6f94 259 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 260 if (packetMSG.syncIndex == HEADER_SIZE) { // finish header SYNC
Arkadi 1:2b61ae8e6f94 261 packetMSG.syncFlag = 1; // start collecting data, wait for footer
Arkadi 1:2b61ae8e6f94 262 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 263 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 264 }
Arkadi 1:2b61ae8e6f94 265 } else { // reinit sync
Arkadi 1:2b61ae8e6f94 266 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 267 }
Arkadi 1:2b61ae8e6f94 268 //pc.printf("case 0 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 269 break;
Arkadi 1:2b61ae8e6f94 270 }
Arkadi 1:2b61ae8e6f94 271 // waiting for footer
Arkadi 1:2b61ae8e6f94 272 case 1: {
Arkadi 1:2b61ae8e6f94 273 // add byte to buffer
Arkadi 1:2b61ae8e6f94 274 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 275 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 276 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 277 // reset buffer
Arkadi 1:2b61ae8e6f94 278 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 279 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 280 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 281 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 282 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 283 packetMSG.syncFlag=2; // move to verify footer
Arkadi 1:2b61ae8e6f94 284 }
Arkadi 1:2b61ae8e6f94 285 //pc.printf("case 2 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 286 break;
Arkadi 1:2b61ae8e6f94 287 }
Arkadi 1:2b61ae8e6f94 288 // verify footer
Arkadi 1:2b61ae8e6f94 289 case 2: {
Arkadi 1:2b61ae8e6f94 290 // add byte to buffer
Arkadi 1:2b61ae8e6f94 291 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 292 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 293 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 294 // reset buffer
Arkadi 1:2b61ae8e6f94 295 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 296 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 297 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 298 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 299 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 300 if (packetMSG.syncIndex == FOOTER_SIZE) { // finish footer SYNC
Arkadi 1:2b61ae8e6f94 301 packetMSG.syncFlag = 3;
Arkadi 1:2b61ae8e6f94 302 // copy packet to json buffer
Arkadi 1:2b61ae8e6f94 303 memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex);
Arkadi 1:2b61ae8e6f94 304 json[packetMSG.bufferIndex]=NULL; // end with NULL to indicate end of string
Arkadi 1:2b61ae8e6f94 305 // copy packet to json buffer with sprintf
Arkadi 1:2b61ae8e6f94 306 //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 1:2b61ae8e6f94 307 // send msg to parse.
Arkadi 1:2b61ae8e6f94 308 parsePacket();
Arkadi 1:2b61ae8e6f94 309 // reset buffer
Arkadi 1:2b61ae8e6f94 310 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 311 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 312 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 313 }
Arkadi 1:2b61ae8e6f94 314 } else { // footer broke restart wait for footer
Arkadi 1:2b61ae8e6f94 315 packetMSG.syncFlag=1;
Arkadi 1:2b61ae8e6f94 316 // verify that it didnt broke on first footer char
Arkadi 1:2b61ae8e6f94 317 if (packetMSG.footer[0] == in_byte) {
Arkadi 1:2b61ae8e6f94 318 packetMSG.syncIndex=1;
Arkadi 1:2b61ae8e6f94 319 } else {
Arkadi 1:2b61ae8e6f94 320 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 321 }
Arkadi 1:2b61ae8e6f94 322 }
Arkadi 1:2b61ae8e6f94 323 break;
Arkadi 1:2b61ae8e6f94 324 }
Arkadi 1:2b61ae8e6f94 325 default: {
Arkadi 1:2b61ae8e6f94 326 pc.printf("Sonmething went wrong \r\n");
Arkadi 1:2b61ae8e6f94 327 break;
Arkadi 1:2b61ae8e6f94 328 }
Arkadi 1:2b61ae8e6f94 329 } // end switch
Arkadi 1:2b61ae8e6f94 330 }// end uart readable
Arkadi 1:2b61ae8e6f94 331 } // end rxCallback
Arkadi 1:2b61ae8e6f94 332
Arkadi 1:2b61ae8e6f94 333
Arkadi 1:2b61ae8e6f94 334 // initialize packet struct
Arkadi 1:2b61ae8e6f94 335 void initPacket(void)
Arkadi 1:2b61ae8e6f94 336 {
Arkadi 1:2b61ae8e6f94 337 // init variables to default:
Arkadi 1:2b61ae8e6f94 338 packetMSG.header[0] = 'j';
Arkadi 1:2b61ae8e6f94 339 packetMSG.header[1] = 's';
Arkadi 1:2b61ae8e6f94 340 packetMSG.header[2] = 'o';
Arkadi 1:2b61ae8e6f94 341 packetMSG.header[3] = 'n';
Arkadi 1:2b61ae8e6f94 342 packetMSG.header[4] = ':';
Arkadi 1:2b61ae8e6f94 343
Arkadi 1:2b61ae8e6f94 344 packetMSG.footer[0]= 13; // /r
Arkadi 1:2b61ae8e6f94 345 packetMSG.footer[1]= 10; // /n
Arkadi 1:2b61ae8e6f94 346
Arkadi 1:2b61ae8e6f94 347 packetMSG.syncIndex=0; // sync index for header / footer
Arkadi 1:2b61ae8e6f94 348 packetMSG.syncFlag=0; // 0 - waiting for header, 1 - waiting for footer, 2 - verify footer, 3 - finish footer send to parser, flash buffer
Arkadi 1:2b61ae8e6f94 349 packetMSG.bufferIndex=0; // buffer index
Arkadi 1:2b61ae8e6f94 350 }
Arkadi 1:2b61ae8e6f94 351
Arkadi 1:2b61ae8e6f94 352 // Packet Parser
Arkadi 1:2b61ae8e6f94 353 void parsePacket(void)
Arkadi 1:2b61ae8e6f94 354 {
Arkadi 2:5c531dfe890b 355 string targetName;
Arkadi 2:5c531dfe890b 356 #ifdef DEBUG_MOD2
Arkadi 1:2b61ae8e6f94 357 // write buffer to screen
Arkadi 1:2b61ae8e6f94 358 //pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 2:5c531dfe890b 359 pc.printf("%s", json);
Arkadi 2:5c531dfe890b 360 #endif
Arkadi 2:5c531dfe890b 361
Arkadi 2:5c531dfe890b 362 // GUI message format Switch: {"name":"switch","mic":0, "spk": [0,1,0,0,0]}
Arkadi 2:5c531dfe890b 363 parse(guiCmd, json);
Arkadi 2:5c531dfe890b 364
Arkadi 2:5c531dfe890b 365 // get target:
Arkadi 2:5c531dfe890b 366 targetName = guiCmd["name"].get<string>(); // switch / dsp
Arkadi 2:5c531dfe890b 367
Arkadi 2:5c531dfe890b 368 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 369 // send parsed values
Arkadi 2:5c531dfe890b 370 pc.printf("targetName: %s \r\n", targetName.c_str());
Arkadi 1:2b61ae8e6f94 371 #endif
Arkadi 1:2b61ae8e6f94 372
Arkadi 2:5c531dfe890b 373 // select handler based on target mcu
Arkadi 2:5c531dfe890b 374 if (targetName == "switch") {
Arkadi 2:5c531dfe890b 375 switchPacket();
Arkadi 2:5c531dfe890b 376 } else if (targetName == "dsp") {
Arkadi 2:5c531dfe890b 377 // send msg to dsp
Arkadi 2:5c531dfe890b 378 pc.printf("json:%s", json);
Arkadi 2:5c531dfe890b 379 } else {
Arkadi 2:5c531dfe890b 380 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 381 // unrecognised target
Arkadi 2:5c531dfe890b 382 pc.printf("unrecognised target: %s \r\n", targetName.c_str());
Arkadi 2:5c531dfe890b 383 #endif
Arkadi 2:5c531dfe890b 384 }
Arkadi 2:5c531dfe890b 385 // led blink
Arkadi 2:5c531dfe890b 386 led = !led;
Arkadi 2:5c531dfe890b 387 }// end parse
Arkadi 1:2b61ae8e6f94 388
Arkadi 2:5c531dfe890b 389 // switch Packet Handler
Arkadi 2:5c531dfe890b 390 void switchPacket(void)
Arkadi 2:5c531dfe890b 391 {
Arkadi 2:5c531dfe890b 392 int micChannle = 0;
Arkadi 2:5c531dfe890b 393 bool spkChannle[5]= {0};
Arkadi 1:2b61ae8e6f94 394
Arkadi 2:5c531dfe890b 395 // get mic channle
Arkadi 1:2b61ae8e6f94 396 micChannle = guiCmd["mic"].get<int>();
Arkadi 2:5c531dfe890b 397 // get speakers output
Arkadi 1:2b61ae8e6f94 398 for (int ii=0 ; ii < 5 ; ii++) {
Arkadi 1:2b61ae8e6f94 399 spkChannle[ii] = guiCmd["spk"][ii].get<bool>();
Arkadi 1:2b61ae8e6f94 400 }
Arkadi 3:9c3169e549f0 401 #ifdef DEBUG_MOD10
Arkadi 1:2b61ae8e6f94 402 // send parsed values
Arkadi 2:5c531dfe890b 403 pc.printf("mic: %d , spk: [%d,%d,%d,%d,%d]\r\n", micChannle,spkChannle[0],spkChannle[1],spkChannle[2],spkChannle[3],spkChannle[4]);
Arkadi 2:5c531dfe890b 404 #endif
Arkadi 1:2b61ae8e6f94 405 // update hardware
Arkadi 1:2b61ae8e6f94 406 // update mic select mux
Arkadi 1:2b61ae8e6f94 407 uint8_t micByte = (uint8_t) micChannle;
Arkadi 1:2b61ae8e6f94 408 mux_s0.write((bool)(micByte & 0b00000001));
Arkadi 1:2b61ae8e6f94 409 mux_s1.write((bool)(micByte & 0b00000010));
Arkadi 1:2b61ae8e6f94 410 mux_s2.write((bool)(micByte & 0b00000100));
Arkadi 1:2b61ae8e6f94 411 mux_s3.write((bool)(micByte & 0b00001000));
Arkadi 1:2b61ae8e6f94 412 // update speakers:
Arkadi 1:2b61ae8e6f94 413 en_spk_1.write(spkChannle[0]);
Arkadi 1:2b61ae8e6f94 414 en_spk_2.write(spkChannle[1]);
Arkadi 1:2b61ae8e6f94 415 en_spk_3.write(spkChannle[2]);
Arkadi 1:2b61ae8e6f94 416 en_spk_4.write(spkChannle[3]);
Arkadi 1:2b61ae8e6f94 417 en_spk_5.write(spkChannle[4]);
Arkadi 2:5c531dfe890b 418 // end switch target parse
Arkadi 1:2b61ae8e6f94 419
Arkadi 2:5c531dfe890b 420 }// end switch packet
Arkadi 1:2b61ae8e6f94 421
Arkadi 1:2b61ae8e6f94 422
Arkadi 1:2b61ae8e6f94 423 //// Serial Event function simple byte parser
Arkadi 1:2b61ae8e6f94 424 //void rxCallback(void)
Arkadi 1:2b61ae8e6f94 425 //{
Arkadi 1:2b61ae8e6f94 426 // // incoming buffer
Arkadi 1:2b61ae8e6f94 427 // uint8_t in_byte;
Arkadi 1:2b61ae8e6f94 428 // // read icoming
Arkadi 1:2b61ae8e6f94 429 // led = !led;
Arkadi 1:2b61ae8e6f94 430 // in_byte = pc.getc();
Arkadi 1:2b61ae8e6f94 431 //#ifdef DEBUG_MOD1
Arkadi 1:2b61ae8e6f94 432 // pc.putc(in_byte);
Arkadi 1:2b61ae8e6f94 433 //#endif
Arkadi 1:2b61ae8e6f94 434 // // check if command of input or output
Arkadi 1:2b61ae8e6f94 435 // if ((bool)(in_byte & 0b10000000)) { // set input
Arkadi 1:2b61ae8e6f94 436 // mux_s0.write((bool)(in_byte & 0b00000001));
Arkadi 1:2b61ae8e6f94 437 // mux_s1.write((bool)(in_byte & 0b00000010));
Arkadi 1:2b61ae8e6f94 438 // mux_s2.write((bool)(in_byte & 0b00000100));
Arkadi 1:2b61ae8e6f94 439 // mux_s3.write((bool)(in_byte & 0b00001000));
Arkadi 1:2b61ae8e6f94 440 // } else { // set output
Arkadi 1:2b61ae8e6f94 441 // en_spk_1.write((bool)(in_byte & 0b00000001));
Arkadi 1:2b61ae8e6f94 442 // en_spk_2.write((bool)(in_byte & 0b00000010));
Arkadi 1:2b61ae8e6f94 443 // en_spk_3.write((bool)(in_byte & 0b00000100));
Arkadi 1:2b61ae8e6f94 444 // en_spk_4.write((bool)(in_byte & 0b00001000));
Arkadi 1:2b61ae8e6f94 445 // en_spk_5.write((bool)(in_byte & 0b00010000));
Arkadi 1:2b61ae8e6f94 446 // }
Arkadi 1:2b61ae8e6f94 447 //} // end rxCallback