ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Mon Feb 19 10:23:59 2018 +0000
Revision:
4:7c08791dcac1
Parent:
3:9c3169e549f0
Child:
5:cca17ebe4a1f
Added uart forwarding to dsp module

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 4:7c08791dcac1 99 #define DEBUG_MOD4 // serial with dsp module
Arkadi 2:5c531dfe890b 100 #define DEBUG_MOD10 // responsivity msges to gui
Arkadi 2:5c531dfe890b 101
Arkadi 1:2b61ae8e6f94 102 #define MSG_BUFFER_SIZE 512
Arkadi 1:2b61ae8e6f94 103 #define HEADER_SIZE 5
Arkadi 1:2b61ae8e6f94 104 #define FOOTER_SIZE 2
Arkadi 0:f65ba5fb350e 105 /////////////
Arkadi 0:f65ba5fb350e 106 // Objects //
Arkadi 0:f65ba5fb350e 107 /////////////
Arkadi 0:f65ba5fb350e 108
Arkadi 2:5c531dfe890b 109 // json
Arkadi 2:5c531dfe890b 110 MbedJSONValue guiCmd;
Arkadi 2:5c531dfe890b 111
Arkadi 0:f65ba5fb350e 112 // uart
Arkadi 1:2b61ae8e6f94 113 Serial pc(USBTX, USBRX);
Arkadi 0:f65ba5fb350e 114
Arkadi 4:7c08791dcac1 115 // uart switch_dsp
Arkadi 4:7c08791dcac1 116 Serial dsp(PC_10, PC_11);
Arkadi 4:7c08791dcac1 117
Arkadi 0:f65ba5fb350e 118 // digital input
Arkadi 0:f65ba5fb350e 119 DigitalIn user_button(PC_13);
Arkadi 0:f65ba5fb350e 120
Arkadi 0:f65ba5fb350e 121 // digital output
Arkadi 0:f65ba5fb350e 122 DigitalOut led(PA_5);
Arkadi 0:f65ba5fb350e 123 DigitalOut sw_trigger(PA_10);
Arkadi 0:f65ba5fb350e 124
Arkadi 0:f65ba5fb350e 125 // MUX: CD74HC4067
Arkadi 0:f65ba5fb350e 126 DigitalOut mux_s0(PC_12);
Arkadi 0:f65ba5fb350e 127 DigitalOut mux_s1(PD_2);
Arkadi 0:f65ba5fb350e 128 DigitalOut mux_s2(PH_0);
Arkadi 0:f65ba5fb350e 129 DigitalOut mux_s3(PH_1);
Arkadi 0:f65ba5fb350e 130
Arkadi 0:f65ba5fb350e 131 // speaker switch
Arkadi 0:f65ba5fb350e 132 DigitalOut en_spk_1(PB_2);
Arkadi 0:f65ba5fb350e 133 DigitalOut en_spk_2(PB_1);
Arkadi 0:f65ba5fb350e 134 DigitalOut en_spk_3(PB_15);
Arkadi 0:f65ba5fb350e 135 DigitalOut en_spk_4(PB_14);
Arkadi 0:f65ba5fb350e 136 DigitalOut en_spk_5(PB_13);
Arkadi 0:f65ba5fb350e 137
Arkadi 0:f65ba5fb350e 138 // MIC interrupts
Arkadi 0:f65ba5fb350e 139 DigitalOut inter_1(PC_15);
Arkadi 0:f65ba5fb350e 140 DigitalOut inter_2(PC_14);
Arkadi 0:f65ba5fb350e 141 DigitalOut inter_3(PA_15);
Arkadi 0:f65ba5fb350e 142 DigitalOut inter_4(PA_14);
Arkadi 0:f65ba5fb350e 143 DigitalOut inter_5(PA_13);
Arkadi 0:f65ba5fb350e 144
Arkadi 0:f65ba5fb350e 145 // analog input
Arkadi 0:f65ba5fb350e 146 AnalogIn a_data_1(PA_0);
Arkadi 0:f65ba5fb350e 147 AnalogIn a_data_2(PA_1);
Arkadi 0:f65ba5fb350e 148 AnalogIn a_data_3(PA_4);
Arkadi 0:f65ba5fb350e 149 AnalogIn a_data_4(PB_0);
Arkadi 0:f65ba5fb350e 150 AnalogIn a_data_5(PC_1);
Arkadi 0:f65ba5fb350e 151
Arkadi 0:f65ba5fb350e 152 ///////////////
Arkadi 0:f65ba5fb350e 153 // variables //
Arkadi 0:f65ba5fb350e 154 ///////////////
Arkadi 1:2b61ae8e6f94 155 // analog input from microphone
Arkadi 1:2b61ae8e6f94 156 uint16_t micAData[5]= {0};
Arkadi 0:f65ba5fb350e 157
Arkadi 1:2b61ae8e6f94 158 // json buffer
Arkadi 1:2b61ae8e6f94 159 char json[MSG_BUFFER_SIZE];
Arkadi 1:2b61ae8e6f94 160
Arkadi 1:2b61ae8e6f94 161 // packet variables
Arkadi 1:2b61ae8e6f94 162 struct packetMSG_struct {
Arkadi 1:2b61ae8e6f94 163 // recieve message variables
Arkadi 1:2b61ae8e6f94 164 uint8_t header[HEADER_SIZE];
Arkadi 1:2b61ae8e6f94 165 uint8_t footer[FOOTER_SIZE];
Arkadi 1:2b61ae8e6f94 166 uint8_t syncIndex; // sync index for header / footer
Arkadi 1:2b61ae8e6f94 167 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 168 // buffer
Arkadi 1:2b61ae8e6f94 169 uint16_t bufferIndex; // buffer index
Arkadi 1:2b61ae8e6f94 170 uint8_t buffer[MSG_BUFFER_SIZE];
Arkadi 1:2b61ae8e6f94 171 } ;
Arkadi 1:2b61ae8e6f94 172 packetMSG_struct packetMSG;
Arkadi 1:2b61ae8e6f94 173
Arkadi 0:f65ba5fb350e 174
Arkadi 0:f65ba5fb350e 175 ///////////////
Arkadi 0:f65ba5fb350e 176 // Functions //
Arkadi 0:f65ba5fb350e 177 ///////////////
Arkadi 0:f65ba5fb350e 178
Arkadi 1:2b61ae8e6f94 179 // Serial Event function
Arkadi 1:2b61ae8e6f94 180 void rxCallback(void);
Arkadi 1:2b61ae8e6f94 181
Arkadi 4:7c08791dcac1 182 // serial event from DSP
Arkadi 4:7c08791dcac1 183 void rxDspCallback(void);
Arkadi 4:7c08791dcac1 184
Arkadi 1:2b61ae8e6f94 185 // initialize packet struct
Arkadi 1:2b61ae8e6f94 186 void initPacket(void);
Arkadi 1:2b61ae8e6f94 187
Arkadi 1:2b61ae8e6f94 188 // Packet Parser
Arkadi 1:2b61ae8e6f94 189 void parsePacket(void);
Arkadi 1:2b61ae8e6f94 190
Arkadi 2:5c531dfe890b 191 // switch Packet Handler
Arkadi 2:5c531dfe890b 192 void switchPacket(void);
Arkadi 2:5c531dfe890b 193
Arkadi 1:2b61ae8e6f94 194 // initialize switch
Arkadi 1:2b61ae8e6f94 195 void initSwitch(void);
Arkadi 0:f65ba5fb350e 196 ////////////////////////
Arkadi 0:f65ba5fb350e 197 // Main Code Setup : //
Arkadi 0:f65ba5fb350e 198 ////////////////////////
Arkadi 0:f65ba5fb350e 199 int main()
Arkadi 0:f65ba5fb350e 200 {
Arkadi 1:2b61ae8e6f94 201 // init packet:
Arkadi 1:2b61ae8e6f94 202 initPacket();
Arkadi 1:2b61ae8e6f94 203 // init uart
Arkadi 0:f65ba5fb350e 204 pc.baud(57600);
Arkadi 4:7c08791dcac1 205 dsp.baud(57600);
Arkadi 1:2b61ae8e6f94 206 // attach serial event interrupt
Arkadi 1:2b61ae8e6f94 207 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 4:7c08791dcac1 208
Arkadi 4:7c08791dcac1 209 // attach serial event interrupt
Arkadi 4:7c08791dcac1 210 dsp.attach(&rxDspCallback, Serial::RxIrq);
Arkadi 4:7c08791dcac1 211
Arkadi 1:2b61ae8e6f94 212 // initialize switch
Arkadi 1:2b61ae8e6f94 213 initSwitch();
Arkadi 0:f65ba5fb350e 214 #ifdef DEBUG_MOD1
Arkadi 0:f65ba5fb350e 215 pc.printf("ReSpeaker Test \r\n");
Arkadi 0:f65ba5fb350e 216 #endif
Arkadi 0:f65ba5fb350e 217 ///////////////////////
Arkadi 0:f65ba5fb350e 218 // Main Code Loop : //
Arkadi 0:f65ba5fb350e 219 ///////////////////////
Arkadi 4:7c08791dcac1 220 while(0) { // does nothing. everything is currently in the callbacks
Arkadi 1:2b61ae8e6f94 221 if(1) {
Arkadi 1:2b61ae8e6f94 222 micAData[0] = a_data_1.read_u16();
Arkadi 1:2b61ae8e6f94 223 micAData[1] = a_data_2.read_u16();
Arkadi 1:2b61ae8e6f94 224 micAData[2] = a_data_3.read_u16();
Arkadi 1:2b61ae8e6f94 225 micAData[3] = a_data_4.read_u16();
Arkadi 1:2b61ae8e6f94 226 micAData[4] = a_data_5.read_u16();
Arkadi 1:2b61ae8e6f94 227 pc.printf("Data:%d,%d,%d,%d,%d\r\n",micAData[0],micAData[1],micAData[2],micAData[3],micAData[4]);
Arkadi 1:2b61ae8e6f94 228 wait(1);
Arkadi 1:2b61ae8e6f94 229 }
Arkadi 0:f65ba5fb350e 230
Arkadi 0:f65ba5fb350e 231 }// end main loop
Arkadi 0:f65ba5fb350e 232 }// end main
Arkadi 0:f65ba5fb350e 233 ///////////////
Arkadi 0:f65ba5fb350e 234 // Functions //
Arkadi 0:f65ba5fb350e 235 ///////////////
Arkadi 1:2b61ae8e6f94 236
Arkadi 1:2b61ae8e6f94 237 // initialize switch
Arkadi 1:2b61ae8e6f94 238 void initSwitch(void)
Arkadi 1:2b61ae8e6f94 239 {
Arkadi 1:2b61ae8e6f94 240 // attach serial event interrupt
Arkadi 1:2b61ae8e6f94 241 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 1:2b61ae8e6f94 242 // reset output / input
Arkadi 1:2b61ae8e6f94 243 mux_s0.write(0);
Arkadi 1:2b61ae8e6f94 244 mux_s1.write(0);
Arkadi 1:2b61ae8e6f94 245 mux_s2.write(0);
Arkadi 1:2b61ae8e6f94 246 mux_s3.write(0);
Arkadi 1:2b61ae8e6f94 247 en_spk_1.write(0);
Arkadi 1:2b61ae8e6f94 248 en_spk_2.write(0);
Arkadi 1:2b61ae8e6f94 249 en_spk_3.write(0);
Arkadi 1:2b61ae8e6f94 250 en_spk_4.write(0);
Arkadi 1:2b61ae8e6f94 251 en_spk_5.write(0);
Arkadi 1:2b61ae8e6f94 252 }// end init switch
Arkadi 1:2b61ae8e6f94 253
Arkadi 4:7c08791dcac1 254 // serial event from DSP
Arkadi 4:7c08791dcac1 255 void rxDspCallback(void)
Arkadi 4:7c08791dcac1 256 {
Arkadi 4:7c08791dcac1 257 while (dsp.readable()) {
Arkadi 4:7c08791dcac1 258 uint8_t in_byte = dsp.getc();
Arkadi 4:7c08791dcac1 259 #ifdef DEBUG_MOD4
Arkadi 4:7c08791dcac1 260 pc.putc(in_byte);
Arkadi 4:7c08791dcac1 261 #endif
Arkadi 4:7c08791dcac1 262 }
Arkadi 4:7c08791dcac1 263 } // end rxDspCallback
Arkadi 1:2b61ae8e6f94 264
Arkadi 1:2b61ae8e6f94 265 // Serial Event function
Arkadi 1:2b61ae8e6f94 266 void rxCallback(void)
Arkadi 1:2b61ae8e6f94 267 {
Arkadi 1:2b61ae8e6f94 268 while (pc.readable()) {
Arkadi 1:2b61ae8e6f94 269 // read icoming
Arkadi 1:2b61ae8e6f94 270 //led = !led;
Arkadi 1:2b61ae8e6f94 271 uint8_t in_byte = pc.getc();
Arkadi 1:2b61ae8e6f94 272 #ifdef DEBUG_MOD1
Arkadi 1:2b61ae8e6f94 273 pc.putc(in_byte);
Arkadi 1:2b61ae8e6f94 274 #endif
Arkadi 1:2b61ae8e6f94 275 // detect start message , end message
Arkadi 1:2b61ae8e6f94 276 switch (packetMSG.syncFlag) {
Arkadi 1:2b61ae8e6f94 277 // waiting for header
Arkadi 1:2b61ae8e6f94 278 case 0: {
Arkadi 1:2b61ae8e6f94 279 if (packetMSG.header[packetMSG.syncIndex] == in_byte) {
Arkadi 1:2b61ae8e6f94 280 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 281 if (packetMSG.syncIndex == HEADER_SIZE) { // finish header SYNC
Arkadi 1:2b61ae8e6f94 282 packetMSG.syncFlag = 1; // start collecting data, wait for footer
Arkadi 1:2b61ae8e6f94 283 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 284 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 285 }
Arkadi 1:2b61ae8e6f94 286 } else { // reinit sync
Arkadi 1:2b61ae8e6f94 287 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 288 }
Arkadi 1:2b61ae8e6f94 289 //pc.printf("case 0 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 290 break;
Arkadi 1:2b61ae8e6f94 291 }
Arkadi 1:2b61ae8e6f94 292 // waiting for footer
Arkadi 1:2b61ae8e6f94 293 case 1: {
Arkadi 1:2b61ae8e6f94 294 // add byte to buffer
Arkadi 1:2b61ae8e6f94 295 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 296 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 297 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 298 // reset buffer
Arkadi 1:2b61ae8e6f94 299 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 300 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 301 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 302 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 303 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 304 packetMSG.syncFlag=2; // move to verify footer
Arkadi 1:2b61ae8e6f94 305 }
Arkadi 1:2b61ae8e6f94 306 //pc.printf("case 2 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 307 break;
Arkadi 1:2b61ae8e6f94 308 }
Arkadi 1:2b61ae8e6f94 309 // verify footer
Arkadi 1:2b61ae8e6f94 310 case 2: {
Arkadi 1:2b61ae8e6f94 311 // add byte to buffer
Arkadi 1:2b61ae8e6f94 312 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 313 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 314 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 315 // reset buffer
Arkadi 1:2b61ae8e6f94 316 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 317 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 318 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 319 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 320 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 321 if (packetMSG.syncIndex == FOOTER_SIZE) { // finish footer SYNC
Arkadi 1:2b61ae8e6f94 322 packetMSG.syncFlag = 3;
Arkadi 1:2b61ae8e6f94 323 // copy packet to json buffer
Arkadi 1:2b61ae8e6f94 324 memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex);
Arkadi 1:2b61ae8e6f94 325 json[packetMSG.bufferIndex]=NULL; // end with NULL to indicate end of string
Arkadi 1:2b61ae8e6f94 326 // copy packet to json buffer with sprintf
Arkadi 1:2b61ae8e6f94 327 //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 1:2b61ae8e6f94 328 // send msg to parse.
Arkadi 1:2b61ae8e6f94 329 parsePacket();
Arkadi 1:2b61ae8e6f94 330 // reset buffer
Arkadi 1:2b61ae8e6f94 331 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 332 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 333 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 334 }
Arkadi 1:2b61ae8e6f94 335 } else { // footer broke restart wait for footer
Arkadi 1:2b61ae8e6f94 336 packetMSG.syncFlag=1;
Arkadi 1:2b61ae8e6f94 337 // verify that it didnt broke on first footer char
Arkadi 1:2b61ae8e6f94 338 if (packetMSG.footer[0] == in_byte) {
Arkadi 1:2b61ae8e6f94 339 packetMSG.syncIndex=1;
Arkadi 1:2b61ae8e6f94 340 } else {
Arkadi 1:2b61ae8e6f94 341 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 342 }
Arkadi 1:2b61ae8e6f94 343 }
Arkadi 1:2b61ae8e6f94 344 break;
Arkadi 1:2b61ae8e6f94 345 }
Arkadi 1:2b61ae8e6f94 346 default: {
Arkadi 1:2b61ae8e6f94 347 pc.printf("Sonmething went wrong \r\n");
Arkadi 1:2b61ae8e6f94 348 break;
Arkadi 1:2b61ae8e6f94 349 }
Arkadi 1:2b61ae8e6f94 350 } // end switch
Arkadi 1:2b61ae8e6f94 351 }// end uart readable
Arkadi 1:2b61ae8e6f94 352 } // end rxCallback
Arkadi 1:2b61ae8e6f94 353
Arkadi 1:2b61ae8e6f94 354
Arkadi 1:2b61ae8e6f94 355 // initialize packet struct
Arkadi 1:2b61ae8e6f94 356 void initPacket(void)
Arkadi 1:2b61ae8e6f94 357 {
Arkadi 1:2b61ae8e6f94 358 // init variables to default:
Arkadi 1:2b61ae8e6f94 359 packetMSG.header[0] = 'j';
Arkadi 1:2b61ae8e6f94 360 packetMSG.header[1] = 's';
Arkadi 1:2b61ae8e6f94 361 packetMSG.header[2] = 'o';
Arkadi 1:2b61ae8e6f94 362 packetMSG.header[3] = 'n';
Arkadi 1:2b61ae8e6f94 363 packetMSG.header[4] = ':';
Arkadi 1:2b61ae8e6f94 364
Arkadi 1:2b61ae8e6f94 365 packetMSG.footer[0]= 13; // /r
Arkadi 1:2b61ae8e6f94 366 packetMSG.footer[1]= 10; // /n
Arkadi 1:2b61ae8e6f94 367
Arkadi 1:2b61ae8e6f94 368 packetMSG.syncIndex=0; // sync index for header / footer
Arkadi 1:2b61ae8e6f94 369 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 370 packetMSG.bufferIndex=0; // buffer index
Arkadi 1:2b61ae8e6f94 371 }
Arkadi 1:2b61ae8e6f94 372
Arkadi 1:2b61ae8e6f94 373 // Packet Parser
Arkadi 1:2b61ae8e6f94 374 void parsePacket(void)
Arkadi 1:2b61ae8e6f94 375 {
Arkadi 2:5c531dfe890b 376 string targetName;
Arkadi 2:5c531dfe890b 377 #ifdef DEBUG_MOD2
Arkadi 1:2b61ae8e6f94 378 // write buffer to screen
Arkadi 1:2b61ae8e6f94 379 //pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 2:5c531dfe890b 380 pc.printf("%s", json);
Arkadi 2:5c531dfe890b 381 #endif
Arkadi 2:5c531dfe890b 382
Arkadi 2:5c531dfe890b 383 // GUI message format Switch: {"name":"switch","mic":0, "spk": [0,1,0,0,0]}
Arkadi 2:5c531dfe890b 384 parse(guiCmd, json);
Arkadi 2:5c531dfe890b 385
Arkadi 2:5c531dfe890b 386 // get target:
Arkadi 2:5c531dfe890b 387 targetName = guiCmd["name"].get<string>(); // switch / dsp
Arkadi 2:5c531dfe890b 388
Arkadi 2:5c531dfe890b 389 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 390 // send parsed values
Arkadi 2:5c531dfe890b 391 pc.printf("targetName: %s \r\n", targetName.c_str());
Arkadi 1:2b61ae8e6f94 392 #endif
Arkadi 1:2b61ae8e6f94 393
Arkadi 2:5c531dfe890b 394 // select handler based on target mcu
Arkadi 2:5c531dfe890b 395 if (targetName == "switch") {
Arkadi 2:5c531dfe890b 396 switchPacket();
Arkadi 2:5c531dfe890b 397 } else if (targetName == "dsp") {
Arkadi 2:5c531dfe890b 398 // send msg to dsp
Arkadi 4:7c08791dcac1 399 dsp.printf("json:%s", json);
Arkadi 4:7c08791dcac1 400 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 401 pc.printf("json:%s", json);
Arkadi 4:7c08791dcac1 402 #endif
Arkadi 2:5c531dfe890b 403 } else {
Arkadi 2:5c531dfe890b 404 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 405 // unrecognised target
Arkadi 2:5c531dfe890b 406 pc.printf("unrecognised target: %s \r\n", targetName.c_str());
Arkadi 2:5c531dfe890b 407 #endif
Arkadi 2:5c531dfe890b 408 }
Arkadi 2:5c531dfe890b 409 // led blink
Arkadi 2:5c531dfe890b 410 led = !led;
Arkadi 2:5c531dfe890b 411 }// end parse
Arkadi 1:2b61ae8e6f94 412
Arkadi 2:5c531dfe890b 413 // switch Packet Handler
Arkadi 2:5c531dfe890b 414 void switchPacket(void)
Arkadi 2:5c531dfe890b 415 {
Arkadi 2:5c531dfe890b 416 int micChannle = 0;
Arkadi 2:5c531dfe890b 417 bool spkChannle[5]= {0};
Arkadi 1:2b61ae8e6f94 418
Arkadi 2:5c531dfe890b 419 // get mic channle
Arkadi 1:2b61ae8e6f94 420 micChannle = guiCmd["mic"].get<int>();
Arkadi 2:5c531dfe890b 421 // get speakers output
Arkadi 1:2b61ae8e6f94 422 for (int ii=0 ; ii < 5 ; ii++) {
Arkadi 1:2b61ae8e6f94 423 spkChannle[ii] = guiCmd["spk"][ii].get<bool>();
Arkadi 1:2b61ae8e6f94 424 }
Arkadi 4:7c08791dcac1 425 #ifdef DEBUG_MOD10
Arkadi 1:2b61ae8e6f94 426 // send parsed values
Arkadi 2:5c531dfe890b 427 pc.printf("mic: %d , spk: [%d,%d,%d,%d,%d]\r\n", micChannle,spkChannle[0],spkChannle[1],spkChannle[2],spkChannle[3],spkChannle[4]);
Arkadi 4:7c08791dcac1 428 #endif
Arkadi 1:2b61ae8e6f94 429 // update hardware
Arkadi 1:2b61ae8e6f94 430 // update mic select mux
Arkadi 1:2b61ae8e6f94 431 uint8_t micByte = (uint8_t) micChannle;
Arkadi 1:2b61ae8e6f94 432 mux_s0.write((bool)(micByte & 0b00000001));
Arkadi 1:2b61ae8e6f94 433 mux_s1.write((bool)(micByte & 0b00000010));
Arkadi 1:2b61ae8e6f94 434 mux_s2.write((bool)(micByte & 0b00000100));
Arkadi 1:2b61ae8e6f94 435 mux_s3.write((bool)(micByte & 0b00001000));
Arkadi 1:2b61ae8e6f94 436 // update speakers:
Arkadi 1:2b61ae8e6f94 437 en_spk_1.write(spkChannle[0]);
Arkadi 1:2b61ae8e6f94 438 en_spk_2.write(spkChannle[1]);
Arkadi 1:2b61ae8e6f94 439 en_spk_3.write(spkChannle[2]);
Arkadi 1:2b61ae8e6f94 440 en_spk_4.write(spkChannle[3]);
Arkadi 1:2b61ae8e6f94 441 en_spk_5.write(spkChannle[4]);
Arkadi 2:5c531dfe890b 442 // end switch target parse
Arkadi 1:2b61ae8e6f94 443
Arkadi 2:5c531dfe890b 444 }// end switch packet
Arkadi 1:2b61ae8e6f94 445
Arkadi 1:2b61ae8e6f94 446
Arkadi 1:2b61ae8e6f94 447 //// Serial Event function simple byte parser
Arkadi 1:2b61ae8e6f94 448 //void rxCallback(void)
Arkadi 1:2b61ae8e6f94 449 //{
Arkadi 1:2b61ae8e6f94 450 // // incoming buffer
Arkadi 1:2b61ae8e6f94 451 // uint8_t in_byte;
Arkadi 1:2b61ae8e6f94 452 // // read icoming
Arkadi 1:2b61ae8e6f94 453 // led = !led;
Arkadi 1:2b61ae8e6f94 454 // in_byte = pc.getc();
Arkadi 1:2b61ae8e6f94 455 //#ifdef DEBUG_MOD1
Arkadi 1:2b61ae8e6f94 456 // pc.putc(in_byte);
Arkadi 1:2b61ae8e6f94 457 //#endif
Arkadi 1:2b61ae8e6f94 458 // // check if command of input or output
Arkadi 1:2b61ae8e6f94 459 // if ((bool)(in_byte & 0b10000000)) { // set input
Arkadi 1:2b61ae8e6f94 460 // mux_s0.write((bool)(in_byte & 0b00000001));
Arkadi 1:2b61ae8e6f94 461 // mux_s1.write((bool)(in_byte & 0b00000010));
Arkadi 1:2b61ae8e6f94 462 // mux_s2.write((bool)(in_byte & 0b00000100));
Arkadi 1:2b61ae8e6f94 463 // mux_s3.write((bool)(in_byte & 0b00001000));
Arkadi 1:2b61ae8e6f94 464 // } else { // set output
Arkadi 1:2b61ae8e6f94 465 // en_spk_1.write((bool)(in_byte & 0b00000001));
Arkadi 1:2b61ae8e6f94 466 // en_spk_2.write((bool)(in_byte & 0b00000010));
Arkadi 1:2b61ae8e6f94 467 // en_spk_3.write((bool)(in_byte & 0b00000100));
Arkadi 1:2b61ae8e6f94 468 // en_spk_4.write((bool)(in_byte & 0b00001000));
Arkadi 1:2b61ae8e6f94 469 // en_spk_5.write((bool)(in_byte & 0b00010000));
Arkadi 1:2b61ae8e6f94 470 // }
Arkadi 1:2b61ae8e6f94 471 //} // end rxCallback