ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Mon Apr 09 14:37:12 2018 +0000
Revision:
7:9153b6566524
Parent:
6:696bf69e99d2
Child:
8:5f6b8bffe9b9
ReSpeaker Switch V01

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Arkadi 0:f65ba5fb350e 1 ////////////////////////////////////////
Arkadi 1:2b61ae8e6f94 2 // Tau_ReSpeaker_Sitch_V01 //
Arkadi 7:9153b6566524 3 // Arkadiraf@gmail.com - 09/04/2018 //
Arkadi 0:f65ba5fb350e 4 ////////////////////////////////////////
Arkadi 0:f65ba5fb350e 5 /*
Arkadi 7:9153b6566524 6 json format: json:{"name":"auto"} - automatic mode
Arkadi 7:9153b6566524 7 Json Format: json:{"name":"switch","mic":0, "spk": [0,1,0,0,0]} - manual mode
Arkadi 0:f65ba5fb350e 8 */
Arkadi 0:f65ba5fb350e 9
Arkadi 6:696bf69e99d2 10 /*
Arkadi 5:cca17ebe4a1f 11 Bugs:
Arkadi 5:cca17ebe4a1f 12 PA_14 and PA_13 are share with stlink - not available as interrupt pins
Arkadi 5:cca17ebe4a1f 13 Used in polling mode instead
Arkadi 5:cca17ebe4a1f 14 */
Arkadi 0:f65ba5fb350e 15 /*
Arkadi 0:f65ba5fb350e 16 Board : Nucleo STM32F446RE
Arkadi 0:f65ba5fb350e 17 Power Source : USB || Jumper 5V source from STM32 DSP board
Arkadi 0:f65ba5fb350e 18 */
Arkadi 0:f65ba5fb350e 19
Arkadi 0:f65ba5fb350e 20 /*
Arkadi 0:f65ba5fb350e 21 Nucleo board modification:
Arkadi 1:2b61ae8e6f94 22 to use PH_0(MUX_S2) as IO modify boards as followed:
Arkadi 0:f65ba5fb350e 23 SB54 and SB55 ON
Arkadi 0:f65ba5fb350e 24 SB16 and SB50 (MCO) OFF
Arkadi 5:cca17ebe4a1f 25
Arkadi 5:cca17ebe4a1f 26 For use GPIO PC15 , PC14
Arkadi 5:cca17ebe4a1f 27 SB48 and SB49 ON
Arkadi 5:cca17ebe4a1f 28 R34 and R36 removed
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 7:9153b6566524 99 //#define DEBUG_MOD4 // serial with dsp module
Arkadi 7:9153b6566524 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 6:696bf69e99d2 109 // Time stamp timer
Arkadi 6:696bf69e99d2 110 Timer timeStamp;
Arkadi 2:5c531dfe890b 111 // json
Arkadi 2:5c531dfe890b 112 MbedJSONValue guiCmd;
Arkadi 2:5c531dfe890b 113
Arkadi 0:f65ba5fb350e 114 // uart
Arkadi 1:2b61ae8e6f94 115 Serial pc(USBTX, USBRX);
Arkadi 0:f65ba5fb350e 116
Arkadi 4:7c08791dcac1 117 // uart switch_dsp
Arkadi 4:7c08791dcac1 118 Serial dsp(PC_10, PC_11);
Arkadi 4:7c08791dcac1 119
Arkadi 0:f65ba5fb350e 120 // digital input
Arkadi 0:f65ba5fb350e 121 DigitalIn user_button(PC_13);
Arkadi 0:f65ba5fb350e 122
Arkadi 0:f65ba5fb350e 123 // digital output
Arkadi 0:f65ba5fb350e 124 DigitalOut led(PA_5);
Arkadi 0:f65ba5fb350e 125 DigitalOut sw_trigger(PA_10);
Arkadi 0:f65ba5fb350e 126
Arkadi 0:f65ba5fb350e 127 // MUX: CD74HC4067
Arkadi 0:f65ba5fb350e 128 DigitalOut mux_s0(PC_12);
Arkadi 0:f65ba5fb350e 129 DigitalOut mux_s1(PD_2);
Arkadi 0:f65ba5fb350e 130 DigitalOut mux_s2(PH_0);
Arkadi 0:f65ba5fb350e 131 DigitalOut mux_s3(PH_1);
Arkadi 0:f65ba5fb350e 132
Arkadi 0:f65ba5fb350e 133 // speaker switch
Arkadi 0:f65ba5fb350e 134 DigitalOut en_spk_1(PB_2);
Arkadi 0:f65ba5fb350e 135 DigitalOut en_spk_2(PB_1);
Arkadi 0:f65ba5fb350e 136 DigitalOut en_spk_3(PB_15);
Arkadi 0:f65ba5fb350e 137 DigitalOut en_spk_4(PB_14);
Arkadi 0:f65ba5fb350e 138 DigitalOut en_spk_5(PB_13);
Arkadi 0:f65ba5fb350e 139
Arkadi 0:f65ba5fb350e 140 // MIC interrupts
Arkadi 5:cca17ebe4a1f 141 DigitalIn inter_1(PC_15 , PullDown);
Arkadi 5:cca17ebe4a1f 142 DigitalIn inter_2(PC_14 , PullDown);
Arkadi 5:cca17ebe4a1f 143 DigitalIn inter_3(PA_15 , PullDown);
Arkadi 5:cca17ebe4a1f 144 DigitalIn inter_4(PA_14 , PullDown);
Arkadi 5:cca17ebe4a1f 145 DigitalIn inter_5(PA_13 , PullDown);
Arkadi 0:f65ba5fb350e 146
Arkadi 0:f65ba5fb350e 147 // analog input
Arkadi 0:f65ba5fb350e 148 AnalogIn a_data_1(PA_0);
Arkadi 0:f65ba5fb350e 149 AnalogIn a_data_2(PA_1);
Arkadi 0:f65ba5fb350e 150 AnalogIn a_data_3(PA_4);
Arkadi 0:f65ba5fb350e 151 AnalogIn a_data_4(PB_0);
Arkadi 0:f65ba5fb350e 152 AnalogIn a_data_5(PC_1);
Arkadi 0:f65ba5fb350e 153
Arkadi 0:f65ba5fb350e 154 ///////////////
Arkadi 0:f65ba5fb350e 155 // variables //
Arkadi 0:f65ba5fb350e 156 ///////////////
Arkadi 1:2b61ae8e6f94 157 // analog input from microphone
Arkadi 1:2b61ae8e6f94 158 uint16_t micAData[5]= {0};
Arkadi 0:f65ba5fb350e 159
Arkadi 5:cca17ebe4a1f 160 // mic interrupt flag
Arkadi 5:cca17ebe4a1f 161 int micInterrupt = 0;
Arkadi 7:9153b6566524 162 bool autoFlag = 0; // automatic mode flag
Arkadi 6:696bf69e99d2 163
Arkadi 1:2b61ae8e6f94 164 // json buffer
Arkadi 1:2b61ae8e6f94 165 char json[MSG_BUFFER_SIZE];
Arkadi 1:2b61ae8e6f94 166
Arkadi 1:2b61ae8e6f94 167 // packet variables
Arkadi 1:2b61ae8e6f94 168 struct packetMSG_struct {
Arkadi 1:2b61ae8e6f94 169 // recieve message variables
Arkadi 1:2b61ae8e6f94 170 uint8_t header[HEADER_SIZE];
Arkadi 1:2b61ae8e6f94 171 uint8_t footer[FOOTER_SIZE];
Arkadi 1:2b61ae8e6f94 172 uint8_t syncIndex; // sync index for header / footer
Arkadi 1:2b61ae8e6f94 173 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 174 // buffer
Arkadi 1:2b61ae8e6f94 175 uint16_t bufferIndex; // buffer index
Arkadi 1:2b61ae8e6f94 176 uint8_t buffer[MSG_BUFFER_SIZE];
Arkadi 1:2b61ae8e6f94 177 } ;
Arkadi 1:2b61ae8e6f94 178 packetMSG_struct packetMSG;
Arkadi 1:2b61ae8e6f94 179
Arkadi 0:f65ba5fb350e 180
Arkadi 0:f65ba5fb350e 181 ///////////////
Arkadi 0:f65ba5fb350e 182 // Functions //
Arkadi 0:f65ba5fb350e 183 ///////////////
Arkadi 0:f65ba5fb350e 184
Arkadi 6:696bf69e99d2 185 // mic interrupt functions - not used, Polling mode
Arkadi 6:696bf69e99d2 186 //void micInt_1()
Arkadi 6:696bf69e99d2 187 //{
Arkadi 6:696bf69e99d2 188 // micInterrupt = 1;
Arkadi 6:696bf69e99d2 189 //}
Arkadi 6:696bf69e99d2 190 //void micInt_2()
Arkadi 6:696bf69e99d2 191 //{
Arkadi 6:696bf69e99d2 192 // micInterrupt = 2;
Arkadi 6:696bf69e99d2 193 //}
Arkadi 6:696bf69e99d2 194 //void micInt_3()
Arkadi 6:696bf69e99d2 195 //{
Arkadi 6:696bf69e99d2 196 // micInterrupt = 3;
Arkadi 6:696bf69e99d2 197 //}
Arkadi 6:696bf69e99d2 198 //void micInt_4()
Arkadi 6:696bf69e99d2 199 //{
Arkadi 6:696bf69e99d2 200 // micInterrupt = 4;
Arkadi 6:696bf69e99d2 201 //}
Arkadi 6:696bf69e99d2 202 //void micInt_5()
Arkadi 6:696bf69e99d2 203 //{
Arkadi 6:696bf69e99d2 204 // micInterrupt = 5;
Arkadi 6:696bf69e99d2 205 //}
Arkadi 1:2b61ae8e6f94 206 // Serial Event function
Arkadi 1:2b61ae8e6f94 207 void rxCallback(void);
Arkadi 1:2b61ae8e6f94 208
Arkadi 4:7c08791dcac1 209 // serial event from DSP
Arkadi 4:7c08791dcac1 210 void rxDspCallback(void);
Arkadi 4:7c08791dcac1 211
Arkadi 1:2b61ae8e6f94 212 // initialize packet struct
Arkadi 1:2b61ae8e6f94 213 void initPacket(void);
Arkadi 1:2b61ae8e6f94 214
Arkadi 1:2b61ae8e6f94 215 // Packet Parser
Arkadi 1:2b61ae8e6f94 216 void parsePacket(void);
Arkadi 1:2b61ae8e6f94 217
Arkadi 2:5c531dfe890b 218 // switch Packet Handler
Arkadi 2:5c531dfe890b 219 void switchPacket(void);
Arkadi 2:5c531dfe890b 220
Arkadi 1:2b61ae8e6f94 221 // initialize switch
Arkadi 1:2b61ae8e6f94 222 void initSwitch(void);
Arkadi 6:696bf69e99d2 223
Arkadi 6:696bf69e99d2 224 // poll mic interrupt gpio
Arkadi 6:696bf69e99d2 225 bool micPolling(void);
Arkadi 6:696bf69e99d2 226
Arkadi 7:9153b6566524 227 // Atuomatic Switch Handler
Arkadi 7:9153b6566524 228 void autoSwitch(int micEvent);
Arkadi 7:9153b6566524 229
Arkadi 0:f65ba5fb350e 230 ////////////////////////
Arkadi 0:f65ba5fb350e 231 // Main Code Setup : //
Arkadi 0:f65ba5fb350e 232 ////////////////////////
Arkadi 0:f65ba5fb350e 233 int main()
Arkadi 0:f65ba5fb350e 234 {
Arkadi 1:2b61ae8e6f94 235 // init packet:
Arkadi 1:2b61ae8e6f94 236 initPacket();
Arkadi 1:2b61ae8e6f94 237 // init uart
Arkadi 0:f65ba5fb350e 238 pc.baud(57600);
Arkadi 4:7c08791dcac1 239 dsp.baud(57600);
Arkadi 1:2b61ae8e6f94 240 // attach serial event interrupt
Arkadi 1:2b61ae8e6f94 241 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 5:cca17ebe4a1f 242
Arkadi 4:7c08791dcac1 243 // attach serial event interrupt
Arkadi 4:7c08791dcac1 244 dsp.attach(&rxDspCallback, Serial::RxIrq);
Arkadi 5:cca17ebe4a1f 245
Arkadi 1:2b61ae8e6f94 246 // initialize switch
Arkadi 1:2b61ae8e6f94 247 initSwitch();
Arkadi 0:f65ba5fb350e 248 #ifdef DEBUG_MOD1
Arkadi 0:f65ba5fb350e 249 pc.printf("ReSpeaker Test \r\n");
Arkadi 0:f65ba5fb350e 250 #endif
Arkadi 0:f65ba5fb350e 251 ///////////////////////
Arkadi 0:f65ba5fb350e 252 // Main Code Loop : //
Arkadi 0:f65ba5fb350e 253 ///////////////////////
Arkadi 7:9153b6566524 254 while(1) { // GPIO polling for mic events
Arkadi 5:cca17ebe4a1f 255 if(0) { // no analog data to read (not implemented yet
Arkadi 1:2b61ae8e6f94 256 micAData[0] = a_data_1.read_u16();
Arkadi 1:2b61ae8e6f94 257 micAData[1] = a_data_2.read_u16();
Arkadi 1:2b61ae8e6f94 258 micAData[2] = a_data_3.read_u16();
Arkadi 1:2b61ae8e6f94 259 micAData[3] = a_data_4.read_u16();
Arkadi 1:2b61ae8e6f94 260 micAData[4] = a_data_5.read_u16();
Arkadi 1:2b61ae8e6f94 261 pc.printf("Data:%d,%d,%d,%d,%d\r\n",micAData[0],micAData[1],micAData[2],micAData[3],micAData[4]);
Arkadi 1:2b61ae8e6f94 262 wait(1);
Arkadi 1:2b61ae8e6f94 263 }
Arkadi 5:cca17ebe4a1f 264 // change to interrupt - Problematic as PA_14 and PA_13 are share with stlink
Arkadi 6:696bf69e99d2 265 if (micPolling()) { // simple polling of interrupt signals
Arkadi 7:9153b6566524 266 if (autoFlag) { // update switch based on automatic selection
Arkadi 7:9153b6566524 267 autoSwitch(micInterrupt);
Arkadi 7:9153b6566524 268 }
Arkadi 7:9153b6566524 269
Arkadi 7:9153b6566524 270 if (1) { // send to pc event time
Arkadi 7:9153b6566524 271 float callTime = timeStamp.read();
Arkadi 7:9153b6566524 272 //pc.printf("IntMic: %d time: %.3f \r\n",micInterrupt,callTime); // Printf generates delay of about 5 millis
Arkadi 7:9153b6566524 273 // send json formatted
Arkadi 7:9153b6566524 274 pc.printf("{\"event\":\"micInt\",\"mic\":%d,\"time\":%.3f}\r\n",micInterrupt,callTime); // Printf generates delay of about 5 millis
Arkadi 7:9153b6566524 275
Arkadi 7:9153b6566524 276 // led blink
Arkadi 7:9153b6566524 277 led = !led;
Arkadi 7:9153b6566524 278 //wait(0.1);
Arkadi 7:9153b6566524 279 // reset micInterrupt flag
Arkadi 7:9153b6566524 280 micInterrupt=0;
Arkadi 7:9153b6566524 281 }
Arkadi 5:cca17ebe4a1f 282 }
Arkadi 0:f65ba5fb350e 283 }// end main loop
Arkadi 0:f65ba5fb350e 284 }// end main
Arkadi 0:f65ba5fb350e 285 ///////////////
Arkadi 0:f65ba5fb350e 286 // Functions //
Arkadi 0:f65ba5fb350e 287 ///////////////
Arkadi 1:2b61ae8e6f94 288
Arkadi 7:9153b6566524 289 // Atuomatic Switch Handler
Arkadi 7:9153b6566524 290 void autoSwitch(int micEvent)
Arkadi 7:9153b6566524 291 {
Arkadi 7:9153b6566524 292 int micChannle = 0;
Arkadi 7:9153b6566524 293 bool spkChannle[5]= {0};
Arkadi 7:9153b6566524 294
Arkadi 7:9153b6566524 295 // speaker selection:
Arkadi 7:9153b6566524 296
Arkadi 7:9153b6566524 297 // simple selection mode
Arkadi 7:9153b6566524 298 micChannle = micEvent;
Arkadi 7:9153b6566524 299 if ((micChannle >= 0) && (micChannle <= 4)) {// verify mic is in the limit
Arkadi 7:9153b6566524 300 spkChannle[micChannle-1] = 1;
Arkadi 7:9153b6566524 301 }
Arkadi 7:9153b6566524 302
Arkadi 7:9153b6566524 303 // update hardware
Arkadi 7:9153b6566524 304 // update mic select mux
Arkadi 7:9153b6566524 305 uint8_t micByte = (uint8_t) micChannle;
Arkadi 7:9153b6566524 306 mux_s0.write((bool)(micByte & 0b00000001));
Arkadi 7:9153b6566524 307 mux_s1.write((bool)(micByte & 0b00000010));
Arkadi 7:9153b6566524 308 mux_s2.write((bool)(micByte & 0b00000100));
Arkadi 7:9153b6566524 309 mux_s3.write((bool)(micByte & 0b00001000));
Arkadi 7:9153b6566524 310
Arkadi 7:9153b6566524 311 // update speakers:
Arkadi 7:9153b6566524 312 en_spk_1.write(spkChannle[0]);
Arkadi 7:9153b6566524 313 en_spk_2.write(spkChannle[1]);
Arkadi 7:9153b6566524 314 en_spk_3.write(spkChannle[2]);
Arkadi 7:9153b6566524 315 en_spk_4.write(spkChannle[3]);
Arkadi 7:9153b6566524 316 en_spk_5.write(spkChannle[4]);
Arkadi 7:9153b6566524 317
Arkadi 7:9153b6566524 318 // send updated values json formatted
Arkadi 7:9153b6566524 319 pc.printf("{\"event\":\"switch\",\"mic\":%d,\"spk\":[%d,%d,%d,%d,%d]}\r\n",micChannle,spkChannle[0],spkChannle[1],spkChannle[2],spkChannle[3],spkChannle[4]); // Printf generates delay of about 5 millis
Arkadi 7:9153b6566524 320
Arkadi 7:9153b6566524 321 }// end autoSwitch
Arkadi 7:9153b6566524 322
Arkadi 1:2b61ae8e6f94 323 // initialize switch
Arkadi 1:2b61ae8e6f94 324 void initSwitch(void)
Arkadi 1:2b61ae8e6f94 325 {
Arkadi 1:2b61ae8e6f94 326 // attach serial event interrupt
Arkadi 1:2b61ae8e6f94 327 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 7:9153b6566524 328
Arkadi 6:696bf69e99d2 329 // initialize timer
Arkadi 6:696bf69e99d2 330 timeStamp.start();
Arkadi 7:9153b6566524 331
Arkadi 6:696bf69e99d2 332 // attach mic interrupts - Not used, polling mode
Arkadi 5:cca17ebe4a1f 333 //inter_1.rise(&micInt_1);
Arkadi 5:cca17ebe4a1f 334 //inter_2.rise(&micInt_2);
Arkadi 5:cca17ebe4a1f 335 //inter_3.rise(&micInt_3);
Arkadi 5:cca17ebe4a1f 336 //inter_4.rise(&micInt_4);
Arkadi 5:cca17ebe4a1f 337 //inter_5.rise(&micInt_5);
Arkadi 6:696bf69e99d2 338
Arkadi 1:2b61ae8e6f94 339 // reset output / input
Arkadi 1:2b61ae8e6f94 340 mux_s0.write(0);
Arkadi 1:2b61ae8e6f94 341 mux_s1.write(0);
Arkadi 1:2b61ae8e6f94 342 mux_s2.write(0);
Arkadi 1:2b61ae8e6f94 343 mux_s3.write(0);
Arkadi 1:2b61ae8e6f94 344 en_spk_1.write(0);
Arkadi 1:2b61ae8e6f94 345 en_spk_2.write(0);
Arkadi 1:2b61ae8e6f94 346 en_spk_3.write(0);
Arkadi 1:2b61ae8e6f94 347 en_spk_4.write(0);
Arkadi 1:2b61ae8e6f94 348 en_spk_5.write(0);
Arkadi 1:2b61ae8e6f94 349 }// end init switch
Arkadi 1:2b61ae8e6f94 350
Arkadi 6:696bf69e99d2 351 // poll mic interrupt gpio
Arkadi 6:696bf69e99d2 352 bool micPolling(void)
Arkadi 6:696bf69e99d2 353 {
Arkadi 6:696bf69e99d2 354 bool eventFlag=0;
Arkadi 6:696bf69e99d2 355 // implementation of rising interrupt in polling mode:
Arkadi 6:696bf69e99d2 356 if (inter_1.read() && (micInterrupt != 1)) {
Arkadi 6:696bf69e99d2 357 eventFlag=1;
Arkadi 6:696bf69e99d2 358 micInterrupt=1;
Arkadi 6:696bf69e99d2 359 }
Arkadi 6:696bf69e99d2 360 if (inter_2.read() && (micInterrupt != 2)) {
Arkadi 6:696bf69e99d2 361 eventFlag=1;
Arkadi 6:696bf69e99d2 362 micInterrupt=2;
Arkadi 6:696bf69e99d2 363 }
Arkadi 6:696bf69e99d2 364 if (inter_3.read() && (micInterrupt != 3)) {
Arkadi 6:696bf69e99d2 365 eventFlag=1;
Arkadi 6:696bf69e99d2 366 micInterrupt=3;
Arkadi 6:696bf69e99d2 367 }
Arkadi 6:696bf69e99d2 368 if (inter_4.read() && (micInterrupt != 4)) {
Arkadi 6:696bf69e99d2 369 eventFlag=1;
Arkadi 6:696bf69e99d2 370 micInterrupt=4;
Arkadi 6:696bf69e99d2 371 }
Arkadi 6:696bf69e99d2 372 if (inter_5.read() && (micInterrupt != 5)) {
Arkadi 6:696bf69e99d2 373 eventFlag=1;
Arkadi 6:696bf69e99d2 374 micInterrupt=5;
Arkadi 6:696bf69e99d2 375 }
Arkadi 7:9153b6566524 376 return eventFlag;
Arkadi 6:696bf69e99d2 377 }
Arkadi 6:696bf69e99d2 378
Arkadi 4:7c08791dcac1 379 // serial event from DSP
Arkadi 4:7c08791dcac1 380 void rxDspCallback(void)
Arkadi 4:7c08791dcac1 381 {
Arkadi 4:7c08791dcac1 382 while (dsp.readable()) {
Arkadi 4:7c08791dcac1 383 uint8_t in_byte = dsp.getc();
Arkadi 4:7c08791dcac1 384 #ifdef DEBUG_MOD4
Arkadi 4:7c08791dcac1 385 pc.putc(in_byte);
Arkadi 4:7c08791dcac1 386 #endif
Arkadi 4:7c08791dcac1 387 }
Arkadi 4:7c08791dcac1 388 } // end rxDspCallback
Arkadi 1:2b61ae8e6f94 389
Arkadi 1:2b61ae8e6f94 390 // Serial Event function
Arkadi 1:2b61ae8e6f94 391 void rxCallback(void)
Arkadi 1:2b61ae8e6f94 392 {
Arkadi 1:2b61ae8e6f94 393 while (pc.readable()) {
Arkadi 1:2b61ae8e6f94 394 // read icoming
Arkadi 1:2b61ae8e6f94 395 //led = !led;
Arkadi 1:2b61ae8e6f94 396 uint8_t in_byte = pc.getc();
Arkadi 1:2b61ae8e6f94 397 #ifdef DEBUG_MOD1
Arkadi 1:2b61ae8e6f94 398 pc.putc(in_byte);
Arkadi 1:2b61ae8e6f94 399 #endif
Arkadi 1:2b61ae8e6f94 400 // detect start message , end message
Arkadi 1:2b61ae8e6f94 401 switch (packetMSG.syncFlag) {
Arkadi 1:2b61ae8e6f94 402 // waiting for header
Arkadi 1:2b61ae8e6f94 403 case 0: {
Arkadi 1:2b61ae8e6f94 404 if (packetMSG.header[packetMSG.syncIndex] == in_byte) {
Arkadi 1:2b61ae8e6f94 405 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 406 if (packetMSG.syncIndex == HEADER_SIZE) { // finish header SYNC
Arkadi 1:2b61ae8e6f94 407 packetMSG.syncFlag = 1; // start collecting data, wait for footer
Arkadi 1:2b61ae8e6f94 408 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 409 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 410 }
Arkadi 1:2b61ae8e6f94 411 } else { // reinit sync
Arkadi 1:2b61ae8e6f94 412 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 413 }
Arkadi 1:2b61ae8e6f94 414 //pc.printf("case 0 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 415 break;
Arkadi 1:2b61ae8e6f94 416 }
Arkadi 1:2b61ae8e6f94 417 // waiting for footer
Arkadi 1:2b61ae8e6f94 418 case 1: {
Arkadi 1:2b61ae8e6f94 419 // add byte to buffer
Arkadi 1:2b61ae8e6f94 420 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 421 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 422 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 423 // reset buffer
Arkadi 1:2b61ae8e6f94 424 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 425 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 426 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 427 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 428 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 429 packetMSG.syncFlag=2; // move to verify footer
Arkadi 1:2b61ae8e6f94 430 }
Arkadi 1:2b61ae8e6f94 431 //pc.printf("case 2 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 432 break;
Arkadi 1:2b61ae8e6f94 433 }
Arkadi 1:2b61ae8e6f94 434 // verify footer
Arkadi 1:2b61ae8e6f94 435 case 2: {
Arkadi 1:2b61ae8e6f94 436 // add byte to buffer
Arkadi 1:2b61ae8e6f94 437 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 438 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 439 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 440 // reset buffer
Arkadi 1:2b61ae8e6f94 441 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 442 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 443 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 444 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 445 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 446 if (packetMSG.syncIndex == FOOTER_SIZE) { // finish footer SYNC
Arkadi 1:2b61ae8e6f94 447 packetMSG.syncFlag = 3;
Arkadi 1:2b61ae8e6f94 448 // copy packet to json buffer
Arkadi 1:2b61ae8e6f94 449 memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex);
Arkadi 1:2b61ae8e6f94 450 json[packetMSG.bufferIndex]=NULL; // end with NULL to indicate end of string
Arkadi 1:2b61ae8e6f94 451 // copy packet to json buffer with sprintf
Arkadi 1:2b61ae8e6f94 452 //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 1:2b61ae8e6f94 453 // send msg to parse.
Arkadi 1:2b61ae8e6f94 454 parsePacket();
Arkadi 1:2b61ae8e6f94 455 // reset buffer
Arkadi 1:2b61ae8e6f94 456 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 457 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 458 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 459 }
Arkadi 1:2b61ae8e6f94 460 } else { // footer broke restart wait for footer
Arkadi 1:2b61ae8e6f94 461 packetMSG.syncFlag=1;
Arkadi 1:2b61ae8e6f94 462 // verify that it didnt broke on first footer char
Arkadi 1:2b61ae8e6f94 463 if (packetMSG.footer[0] == in_byte) {
Arkadi 1:2b61ae8e6f94 464 packetMSG.syncIndex=1;
Arkadi 1:2b61ae8e6f94 465 } else {
Arkadi 1:2b61ae8e6f94 466 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 467 }
Arkadi 1:2b61ae8e6f94 468 }
Arkadi 1:2b61ae8e6f94 469 break;
Arkadi 1:2b61ae8e6f94 470 }
Arkadi 1:2b61ae8e6f94 471 default: {
Arkadi 1:2b61ae8e6f94 472 pc.printf("Sonmething went wrong \r\n");
Arkadi 1:2b61ae8e6f94 473 break;
Arkadi 1:2b61ae8e6f94 474 }
Arkadi 1:2b61ae8e6f94 475 } // end switch
Arkadi 1:2b61ae8e6f94 476 }// end uart readable
Arkadi 1:2b61ae8e6f94 477 } // end rxCallback
Arkadi 1:2b61ae8e6f94 478
Arkadi 1:2b61ae8e6f94 479
Arkadi 1:2b61ae8e6f94 480 // initialize packet struct
Arkadi 1:2b61ae8e6f94 481 void initPacket(void)
Arkadi 1:2b61ae8e6f94 482 {
Arkadi 1:2b61ae8e6f94 483 // init variables to default:
Arkadi 1:2b61ae8e6f94 484 packetMSG.header[0] = 'j';
Arkadi 1:2b61ae8e6f94 485 packetMSG.header[1] = 's';
Arkadi 1:2b61ae8e6f94 486 packetMSG.header[2] = 'o';
Arkadi 1:2b61ae8e6f94 487 packetMSG.header[3] = 'n';
Arkadi 1:2b61ae8e6f94 488 packetMSG.header[4] = ':';
Arkadi 1:2b61ae8e6f94 489
Arkadi 1:2b61ae8e6f94 490 packetMSG.footer[0]= 13; // /r
Arkadi 1:2b61ae8e6f94 491 packetMSG.footer[1]= 10; // /n
Arkadi 1:2b61ae8e6f94 492
Arkadi 1:2b61ae8e6f94 493 packetMSG.syncIndex=0; // sync index for header / footer
Arkadi 1:2b61ae8e6f94 494 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 495 packetMSG.bufferIndex=0; // buffer index
Arkadi 1:2b61ae8e6f94 496 }
Arkadi 1:2b61ae8e6f94 497
Arkadi 1:2b61ae8e6f94 498 // Packet Parser
Arkadi 1:2b61ae8e6f94 499 void parsePacket(void)
Arkadi 1:2b61ae8e6f94 500 {
Arkadi 2:5c531dfe890b 501 string targetName;
Arkadi 2:5c531dfe890b 502 #ifdef DEBUG_MOD2
Arkadi 1:2b61ae8e6f94 503 // write buffer to screen
Arkadi 1:2b61ae8e6f94 504 //pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 2:5c531dfe890b 505 pc.printf("%s", json);
Arkadi 2:5c531dfe890b 506 #endif
Arkadi 2:5c531dfe890b 507
Arkadi 2:5c531dfe890b 508 // GUI message format Switch: {"name":"switch","mic":0, "spk": [0,1,0,0,0]}
Arkadi 2:5c531dfe890b 509 parse(guiCmd, json);
Arkadi 2:5c531dfe890b 510
Arkadi 2:5c531dfe890b 511 // get target:
Arkadi 2:5c531dfe890b 512 targetName = guiCmd["name"].get<string>(); // switch / dsp
Arkadi 2:5c531dfe890b 513
Arkadi 2:5c531dfe890b 514 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 515 // send parsed values
Arkadi 2:5c531dfe890b 516 pc.printf("targetName: %s \r\n", targetName.c_str());
Arkadi 1:2b61ae8e6f94 517 #endif
Arkadi 1:2b61ae8e6f94 518
Arkadi 2:5c531dfe890b 519 // select handler based on target mcu
Arkadi 2:5c531dfe890b 520 if (targetName == "switch") {
Arkadi 7:9153b6566524 521 // disable automatic mode
Arkadi 7:9153b6566524 522 autoFlag=0;
Arkadi 7:9153b6566524 523 // update controls
Arkadi 2:5c531dfe890b 524 switchPacket();
Arkadi 2:5c531dfe890b 525 } else if (targetName == "dsp") {
Arkadi 2:5c531dfe890b 526 // send msg to dsp
Arkadi 4:7c08791dcac1 527 dsp.printf("json:%s", json);
Arkadi 4:7c08791dcac1 528 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 529 pc.printf("json:%s", json);
Arkadi 4:7c08791dcac1 530 #endif
Arkadi 7:9153b6566524 531 }
Arkadi 7:9153b6566524 532 if (targetName == "auto") {
Arkadi 7:9153b6566524 533 // automatic mode
Arkadi 7:9153b6566524 534 autoFlag=1;
Arkadi 7:9153b6566524 535 } else {
Arkadi 2:5c531dfe890b 536 #ifdef DEBUG_MOD2
Arkadi 2:5c531dfe890b 537 // unrecognised target
Arkadi 2:5c531dfe890b 538 pc.printf("unrecognised target: %s \r\n", targetName.c_str());
Arkadi 2:5c531dfe890b 539 #endif
Arkadi 2:5c531dfe890b 540 }
Arkadi 2:5c531dfe890b 541 // led blink
Arkadi 2:5c531dfe890b 542 led = !led;
Arkadi 2:5c531dfe890b 543 }// end parse
Arkadi 1:2b61ae8e6f94 544
Arkadi 2:5c531dfe890b 545 // switch Packet Handler
Arkadi 2:5c531dfe890b 546 void switchPacket(void)
Arkadi 2:5c531dfe890b 547 {
Arkadi 2:5c531dfe890b 548 int micChannle = 0;
Arkadi 2:5c531dfe890b 549 bool spkChannle[5]= {0};
Arkadi 1:2b61ae8e6f94 550
Arkadi 2:5c531dfe890b 551 // get mic channle
Arkadi 1:2b61ae8e6f94 552 micChannle = guiCmd["mic"].get<int>();
Arkadi 2:5c531dfe890b 553 // get speakers output
Arkadi 1:2b61ae8e6f94 554 for (int ii=0 ; ii < 5 ; ii++) {
Arkadi 1:2b61ae8e6f94 555 spkChannle[ii] = guiCmd["spk"][ii].get<bool>();
Arkadi 1:2b61ae8e6f94 556 }
Arkadi 4:7c08791dcac1 557 #ifdef DEBUG_MOD10
Arkadi 1:2b61ae8e6f94 558 // send parsed values
Arkadi 2:5c531dfe890b 559 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 560 #endif
Arkadi 1:2b61ae8e6f94 561 // update hardware
Arkadi 1:2b61ae8e6f94 562 // update mic select mux
Arkadi 1:2b61ae8e6f94 563 uint8_t micByte = (uint8_t) micChannle;
Arkadi 1:2b61ae8e6f94 564 mux_s0.write((bool)(micByte & 0b00000001));
Arkadi 1:2b61ae8e6f94 565 mux_s1.write((bool)(micByte & 0b00000010));
Arkadi 1:2b61ae8e6f94 566 mux_s2.write((bool)(micByte & 0b00000100));
Arkadi 1:2b61ae8e6f94 567 mux_s3.write((bool)(micByte & 0b00001000));
Arkadi 1:2b61ae8e6f94 568 // update speakers:
Arkadi 1:2b61ae8e6f94 569 en_spk_1.write(spkChannle[0]);
Arkadi 1:2b61ae8e6f94 570 en_spk_2.write(spkChannle[1]);
Arkadi 1:2b61ae8e6f94 571 en_spk_3.write(spkChannle[2]);
Arkadi 1:2b61ae8e6f94 572 en_spk_4.write(spkChannle[3]);
Arkadi 1:2b61ae8e6f94 573 en_spk_5.write(spkChannle[4]);
Arkadi 2:5c531dfe890b 574 // end switch target parse
Arkadi 1:2b61ae8e6f94 575
Arkadi 7:9153b6566524 576 }// end switch packet