ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Sun Feb 04 15:24:26 2018 +0000
Revision:
2:5c531dfe890b
Parent:
1:2b61ae8e6f94
Child:
3:9c3169e549f0
Switch control with matlab gui. working version

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