ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Wed Aug 22 12:57:38 2018 +0000
Revision:
9:e893fa820315
Parent:
8:5f6b8bffe9b9
Child:
10:e4e3f5af6b0a
Added parameters to modify through gui

Who changed what in which revision?

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