ReSpeaker Test Code

Dependencies:   MbedJSONValue mbed

Committer:
Arkadi
Date:
Sun Apr 08 14:03:17 2018 +0000
Revision:
5:cca17ebe4a1f
Parent:
4:7c08791dcac1
Added Mic int signal in polling (interrupt mode has conflicts with swd)

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