ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Sun Aug 26 09:55:45 2018 +0000
Revision:
10:e4e3f5af6b0a
Parent:
9:e893fa820315
Child:
11:db4e51a318c2
added frequency counter feature

Who changed what in which revision?

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