ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Mon Aug 27 10:32:28 2018 +0000
Revision:
11:db4e51a318c2
Parent:
10:e4e3f5af6b0a
Child:
12:1b8560db3dff
Added filter and communication supports

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 11:db4e51a318c2 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 11:db4e51a318c2 106 #define MSG_BUFFER_SIZE 1024
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 11:db4e51a318c2 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 11:db4e51a318c2 278 if (calculatedFrequency < 10000000) { // cannot be larger
Arkadi 11:db4e51a318c2 279 pc.printf("{\"event\":\"dspFreq\",\"Freq\":%d}\r\n",calculatedFrequency); // Printf
Arkadi 11:db4e51a318c2 280 }
Arkadi 10:e4e3f5af6b0a 281 dspIntFlag=0;
Arkadi 10:e4e3f5af6b0a 282 }
Arkadi 5:cca17ebe4a1f 283 if(0) { // no analog data to read (not implemented yet
Arkadi 1:2b61ae8e6f94 284 micAData[0] = a_data_1.read_u16();
Arkadi 1:2b61ae8e6f94 285 micAData[1] = a_data_2.read_u16();
Arkadi 1:2b61ae8e6f94 286 micAData[2] = a_data_3.read_u16();
Arkadi 1:2b61ae8e6f94 287 micAData[3] = a_data_4.read_u16();
Arkadi 1:2b61ae8e6f94 288 micAData[4] = a_data_5.read_u16();
Arkadi 1:2b61ae8e6f94 289 pc.printf("Data:%d,%d,%d,%d,%d\r\n",micAData[0],micAData[1],micAData[2],micAData[3],micAData[4]);
Arkadi 1:2b61ae8e6f94 290 wait(1);
Arkadi 1:2b61ae8e6f94 291 }
Arkadi 5:cca17ebe4a1f 292 // change to interrupt - Problematic as PA_14 and PA_13 are share with stlink
Arkadi 6:696bf69e99d2 293 if (micPolling()) { // simple polling of interrupt signals
Arkadi 7:9153b6566524 294 if (autoFlag) { // update switch based on automatic selection
Arkadi 7:9153b6566524 295 autoSwitch(micInterrupt);
Arkadi 7:9153b6566524 296 }
Arkadi 7:9153b6566524 297
Arkadi 7:9153b6566524 298 if (1) { // send to pc event time
Arkadi 7:9153b6566524 299 float callTime = timeStamp.read();
Arkadi 7:9153b6566524 300 //pc.printf("IntMic: %d time: %.3f \r\n",micInterrupt,callTime); // Printf generates delay of about 5 millis
Arkadi 7:9153b6566524 301 // send json formatted
Arkadi 7:9153b6566524 302 pc.printf("{\"event\":\"micInt\",\"mic\":%d,\"time\":%.3f}\r\n",micInterrupt,callTime); // Printf generates delay of about 5 millis
Arkadi 7:9153b6566524 303
Arkadi 7:9153b6566524 304 // led blink
Arkadi 7:9153b6566524 305 led = !led;
Arkadi 7:9153b6566524 306 //wait(0.1);
Arkadi 7:9153b6566524 307 // reset micInterrupt flag
Arkadi 7:9153b6566524 308 micInterrupt=0;
Arkadi 7:9153b6566524 309 }
Arkadi 5:cca17ebe4a1f 310 }
Arkadi 0:f65ba5fb350e 311 }// end main loop
Arkadi 0:f65ba5fb350e 312 }// end main
Arkadi 0:f65ba5fb350e 313 ///////////////
Arkadi 0:f65ba5fb350e 314 // Functions //
Arkadi 0:f65ba5fb350e 315 ///////////////
Arkadi 1:2b61ae8e6f94 316
Arkadi 10:e4e3f5af6b0a 317 // Interrup event from the dsp (frequency counter)
Arkadi 11:db4e51a318c2 318 void dspInterrupt()
Arkadi 11:db4e51a318c2 319 {
Arkadi 11:db4e51a318c2 320 freqTimeInterval = freqTimer.read_us() + 1; // compensate the time takes to read / reset
Arkadi 10:e4e3f5af6b0a 321 freqTimer.reset();
Arkadi 10:e4e3f5af6b0a 322 dspIntFlag = 1;
Arkadi 10:e4e3f5af6b0a 323 }//end dspInterrupt
Arkadi 10:e4e3f5af6b0a 324
Arkadi 7:9153b6566524 325 // Atuomatic Switch Handler
Arkadi 7:9153b6566524 326 void autoSwitch(int micEvent)
Arkadi 7:9153b6566524 327 {
Arkadi 7:9153b6566524 328 int micChannle = 0;
Arkadi 7:9153b6566524 329 bool spkChannle[5]= {0};
Arkadi 11:db4e51a318c2 330
Arkadi 7:9153b6566524 331 // speaker selection:
Arkadi 11:db4e51a318c2 332
Arkadi 7:9153b6566524 333 // simple selection mode
Arkadi 7:9153b6566524 334 micChannle = micEvent;
Arkadi 8:5f6b8bffe9b9 335 if ((micChannle >= 1) && (micChannle <= 5)) {// verify mic is in the limit
Arkadi 7:9153b6566524 336 spkChannle[micChannle-1] = 1;
Arkadi 7:9153b6566524 337 }
Arkadi 11:db4e51a318c2 338
Arkadi 7:9153b6566524 339 // update hardware
Arkadi 7:9153b6566524 340 // update mic select mux
Arkadi 7:9153b6566524 341 uint8_t micByte = (uint8_t) micChannle;
Arkadi 7:9153b6566524 342 mux_s0.write((bool)(micByte & 0b00000001));
Arkadi 7:9153b6566524 343 mux_s1.write((bool)(micByte & 0b00000010));
Arkadi 7:9153b6566524 344 mux_s2.write((bool)(micByte & 0b00000100));
Arkadi 7:9153b6566524 345 mux_s3.write((bool)(micByte & 0b00001000));
Arkadi 7:9153b6566524 346
Arkadi 7:9153b6566524 347 // update speakers:
Arkadi 7:9153b6566524 348 en_spk_1.write(spkChannle[0]);
Arkadi 7:9153b6566524 349 en_spk_2.write(spkChannle[1]);
Arkadi 7:9153b6566524 350 en_spk_3.write(spkChannle[2]);
Arkadi 7:9153b6566524 351 en_spk_4.write(spkChannle[3]);
Arkadi 7:9153b6566524 352 en_spk_5.write(spkChannle[4]);
Arkadi 7:9153b6566524 353
Arkadi 7:9153b6566524 354 // send updated values json formatted
Arkadi 7:9153b6566524 355 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 356
Arkadi 7:9153b6566524 357 }// end autoSwitch
Arkadi 7:9153b6566524 358
Arkadi 1:2b61ae8e6f94 359 // initialize switch
Arkadi 1:2b61ae8e6f94 360 void initSwitch(void)
Arkadi 1:2b61ae8e6f94 361 {
Arkadi 1:2b61ae8e6f94 362 // attach serial event interrupt
Arkadi 1:2b61ae8e6f94 363 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 11:db4e51a318c2 364
Arkadi 10:e4e3f5af6b0a 365 // attach interrupt event for frequency counting
Arkadi 10:e4e3f5af6b0a 366 dsp_trigger.rise(&dspInterrupt);
Arkadi 11:db4e51a318c2 367
Arkadi 10:e4e3f5af6b0a 368 // start timer
Arkadi 10:e4e3f5af6b0a 369 freqTimer.start();
Arkadi 11:db4e51a318c2 370
Arkadi 6:696bf69e99d2 371 // initialize timer
Arkadi 6:696bf69e99d2 372 timeStamp.start();
Arkadi 7:9153b6566524 373
Arkadi 6:696bf69e99d2 374 // attach mic interrupts - Not used, polling mode
Arkadi 5:cca17ebe4a1f 375 //inter_1.rise(&micInt_1);
Arkadi 5:cca17ebe4a1f 376 //inter_2.rise(&micInt_2);
Arkadi 5:cca17ebe4a1f 377 //inter_3.rise(&micInt_3);
Arkadi 5:cca17ebe4a1f 378 //inter_4.rise(&micInt_4);
Arkadi 5:cca17ebe4a1f 379 //inter_5.rise(&micInt_5);
Arkadi 6:696bf69e99d2 380
Arkadi 1:2b61ae8e6f94 381 // reset output / input
Arkadi 1:2b61ae8e6f94 382 mux_s0.write(0);
Arkadi 1:2b61ae8e6f94 383 mux_s1.write(0);
Arkadi 1:2b61ae8e6f94 384 mux_s2.write(0);
Arkadi 1:2b61ae8e6f94 385 mux_s3.write(0);
Arkadi 1:2b61ae8e6f94 386 en_spk_1.write(0);
Arkadi 1:2b61ae8e6f94 387 en_spk_2.write(0);
Arkadi 1:2b61ae8e6f94 388 en_spk_3.write(0);
Arkadi 1:2b61ae8e6f94 389 en_spk_4.write(0);
Arkadi 1:2b61ae8e6f94 390 en_spk_5.write(0);
Arkadi 1:2b61ae8e6f94 391 }// end init switch
Arkadi 1:2b61ae8e6f94 392
Arkadi 6:696bf69e99d2 393 // poll mic interrupt gpio
Arkadi 6:696bf69e99d2 394 bool micPolling(void)
Arkadi 6:696bf69e99d2 395 {
Arkadi 6:696bf69e99d2 396 bool eventFlag=0;
Arkadi 6:696bf69e99d2 397 // implementation of rising interrupt in polling mode:
Arkadi 6:696bf69e99d2 398 if (inter_1.read() && (micInterrupt != 1)) {
Arkadi 6:696bf69e99d2 399 eventFlag=1;
Arkadi 6:696bf69e99d2 400 micInterrupt=1;
Arkadi 6:696bf69e99d2 401 }
Arkadi 6:696bf69e99d2 402 if (inter_2.read() && (micInterrupt != 2)) {
Arkadi 6:696bf69e99d2 403 eventFlag=1;
Arkadi 6:696bf69e99d2 404 micInterrupt=2;
Arkadi 6:696bf69e99d2 405 }
Arkadi 6:696bf69e99d2 406 if (inter_3.read() && (micInterrupt != 3)) {
Arkadi 6:696bf69e99d2 407 eventFlag=1;
Arkadi 6:696bf69e99d2 408 micInterrupt=3;
Arkadi 6:696bf69e99d2 409 }
Arkadi 6:696bf69e99d2 410 if (inter_4.read() && (micInterrupt != 4)) {
Arkadi 6:696bf69e99d2 411 eventFlag=1;
Arkadi 6:696bf69e99d2 412 micInterrupt=4;
Arkadi 6:696bf69e99d2 413 }
Arkadi 6:696bf69e99d2 414 if (inter_5.read() && (micInterrupt != 5)) {
Arkadi 6:696bf69e99d2 415 eventFlag=1;
Arkadi 6:696bf69e99d2 416 micInterrupt=5;
Arkadi 6:696bf69e99d2 417 }
Arkadi 7:9153b6566524 418 return eventFlag;
Arkadi 6:696bf69e99d2 419 }
Arkadi 6:696bf69e99d2 420
Arkadi 4:7c08791dcac1 421 // serial event from DSP
Arkadi 4:7c08791dcac1 422 void rxDspCallback(void)
Arkadi 4:7c08791dcac1 423 {
Arkadi 4:7c08791dcac1 424 while (dsp.readable()) {
Arkadi 4:7c08791dcac1 425 uint8_t in_byte = dsp.getc();
Arkadi 4:7c08791dcac1 426 pc.putc(in_byte);
Arkadi 4:7c08791dcac1 427 }
Arkadi 4:7c08791dcac1 428 } // end rxDspCallback
Arkadi 1:2b61ae8e6f94 429
Arkadi 1:2b61ae8e6f94 430 // Serial Event function
Arkadi 1:2b61ae8e6f94 431 void rxCallback(void)
Arkadi 1:2b61ae8e6f94 432 {
Arkadi 1:2b61ae8e6f94 433 while (pc.readable()) {
Arkadi 1:2b61ae8e6f94 434 // read icoming
Arkadi 1:2b61ae8e6f94 435 //led = !led;
Arkadi 1:2b61ae8e6f94 436 uint8_t in_byte = pc.getc();
Arkadi 1:2b61ae8e6f94 437 #ifdef DEBUG_MOD1
Arkadi 1:2b61ae8e6f94 438 pc.putc(in_byte);
Arkadi 1:2b61ae8e6f94 439 #endif
Arkadi 1:2b61ae8e6f94 440 // detect start message , end message
Arkadi 1:2b61ae8e6f94 441 switch (packetMSG.syncFlag) {
Arkadi 1:2b61ae8e6f94 442 // waiting for header
Arkadi 1:2b61ae8e6f94 443 case 0: {
Arkadi 1:2b61ae8e6f94 444 if (packetMSG.header[packetMSG.syncIndex] == in_byte) {
Arkadi 1:2b61ae8e6f94 445 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 446 if (packetMSG.syncIndex == HEADER_SIZE) { // finish header SYNC
Arkadi 1:2b61ae8e6f94 447 packetMSG.syncFlag = 1; // start collecting data, wait for footer
Arkadi 1:2b61ae8e6f94 448 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 449 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 450 }
Arkadi 1:2b61ae8e6f94 451 } else { // reinit sync
Arkadi 1:2b61ae8e6f94 452 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 453 }
Arkadi 1:2b61ae8e6f94 454 //pc.printf("case 0 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 455 break;
Arkadi 1:2b61ae8e6f94 456 }
Arkadi 1:2b61ae8e6f94 457 // waiting for footer
Arkadi 1:2b61ae8e6f94 458 case 1: {
Arkadi 1:2b61ae8e6f94 459 // add byte to buffer
Arkadi 1:2b61ae8e6f94 460 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 461 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 462 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 463 // reset buffer
Arkadi 1:2b61ae8e6f94 464 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 465 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 466 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 467 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 468 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 469 packetMSG.syncFlag=2; // move to verify footer
Arkadi 1:2b61ae8e6f94 470 }
Arkadi 1:2b61ae8e6f94 471 //pc.printf("case 2 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:2b61ae8e6f94 472 break;
Arkadi 1:2b61ae8e6f94 473 }
Arkadi 1:2b61ae8e6f94 474 // verify footer
Arkadi 1:2b61ae8e6f94 475 case 2: {
Arkadi 1:2b61ae8e6f94 476 // add byte to buffer
Arkadi 1:2b61ae8e6f94 477 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:2b61ae8e6f94 478 packetMSG.bufferIndex++;
Arkadi 1:2b61ae8e6f94 479 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:2b61ae8e6f94 480 // reset buffer
Arkadi 1:2b61ae8e6f94 481 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 482 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 483 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 484 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:2b61ae8e6f94 485 packetMSG.syncIndex++;
Arkadi 1:2b61ae8e6f94 486 if (packetMSG.syncIndex == FOOTER_SIZE) { // finish footer SYNC
Arkadi 1:2b61ae8e6f94 487 packetMSG.syncFlag = 3;
Arkadi 1:2b61ae8e6f94 488 // copy packet to json buffer
Arkadi 1:2b61ae8e6f94 489 memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex);
Arkadi 1:2b61ae8e6f94 490 json[packetMSG.bufferIndex]=NULL; // end with NULL to indicate end of string
Arkadi 1:2b61ae8e6f94 491 // copy packet to json buffer with sprintf
Arkadi 1:2b61ae8e6f94 492 //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 1:2b61ae8e6f94 493 // send msg to parse.
Arkadi 1:2b61ae8e6f94 494 parsePacket();
Arkadi 1:2b61ae8e6f94 495 // reset buffer
Arkadi 1:2b61ae8e6f94 496 packetMSG.bufferIndex = 0;
Arkadi 1:2b61ae8e6f94 497 packetMSG.syncIndex = 0;
Arkadi 1:2b61ae8e6f94 498 packetMSG.syncFlag = 0;
Arkadi 1:2b61ae8e6f94 499 }
Arkadi 1:2b61ae8e6f94 500 } else { // footer broke restart wait for footer
Arkadi 1:2b61ae8e6f94 501 packetMSG.syncFlag=1;
Arkadi 1:2b61ae8e6f94 502 // verify that it didnt broke on first footer char
Arkadi 1:2b61ae8e6f94 503 if (packetMSG.footer[0] == in_byte) {
Arkadi 1:2b61ae8e6f94 504 packetMSG.syncIndex=1;
Arkadi 1:2b61ae8e6f94 505 } else {
Arkadi 1:2b61ae8e6f94 506 packetMSG.syncIndex=0;
Arkadi 1:2b61ae8e6f94 507 }
Arkadi 1:2b61ae8e6f94 508 }
Arkadi 1:2b61ae8e6f94 509 break;
Arkadi 1:2b61ae8e6f94 510 }
Arkadi 1:2b61ae8e6f94 511 default: {
Arkadi 1:2b61ae8e6f94 512 pc.printf("Sonmething went wrong \r\n");
Arkadi 1:2b61ae8e6f94 513 break;
Arkadi 1:2b61ae8e6f94 514 }
Arkadi 1:2b61ae8e6f94 515 } // end switch
Arkadi 1:2b61ae8e6f94 516 }// end uart readable
Arkadi 1:2b61ae8e6f94 517 } // end rxCallback
Arkadi 1:2b61ae8e6f94 518
Arkadi 1:2b61ae8e6f94 519
Arkadi 1:2b61ae8e6f94 520 // initialize packet struct
Arkadi 1:2b61ae8e6f94 521 void initPacket(void)
Arkadi 1:2b61ae8e6f94 522 {
Arkadi 1:2b61ae8e6f94 523 // init variables to default:
Arkadi 1:2b61ae8e6f94 524 packetMSG.header[0] = 'j';
Arkadi 1:2b61ae8e6f94 525 packetMSG.header[1] = 's';
Arkadi 1:2b61ae8e6f94 526 packetMSG.header[2] = 'o';
Arkadi 1:2b61ae8e6f94 527 packetMSG.header[3] = 'n';
Arkadi 1:2b61ae8e6f94 528 packetMSG.header[4] = ':';
Arkadi 1:2b61ae8e6f94 529
Arkadi 1:2b61ae8e6f94 530 packetMSG.footer[0]= 13; // /r
Arkadi 1:2b61ae8e6f94 531 packetMSG.footer[1]= 10; // /n
Arkadi 1:2b61ae8e6f94 532
Arkadi 1:2b61ae8e6f94 533 packetMSG.syncIndex=0; // sync index for header / footer
Arkadi 1:2b61ae8e6f94 534 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 535 packetMSG.bufferIndex=0; // buffer index
Arkadi 1:2b61ae8e6f94 536 }
Arkadi 1:2b61ae8e6f94 537
Arkadi 1:2b61ae8e6f94 538 // Packet Parser
Arkadi 1:2b61ae8e6f94 539 void parsePacket(void)
Arkadi 1:2b61ae8e6f94 540 {
Arkadi 2:5c531dfe890b 541 string targetName;
Arkadi 2:5c531dfe890b 542 #ifdef DEBUG_MOD2
Arkadi 1:2b61ae8e6f94 543 // write buffer to screen
Arkadi 1:2b61ae8e6f94 544 //pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 2:5c531dfe890b 545 pc.printf("%s", json);
Arkadi 2:5c531dfe890b 546 #endif
Arkadi 11:db4e51a318c2 547 // verification its a full json
Arkadi 11:db4e51a318c2 548 if ((json[0] == '{') && (json[strlen(json)-3] == '}')) {
Arkadi 11:db4e51a318c2 549 // GUI message format Switch: {"name":"switch","mic":0, "spk": [0,1,0,0,0]}
Arkadi 11:db4e51a318c2 550 parse(guiCmd, json);
Arkadi 11:db4e51a318c2 551 if (debuggingEn) {
Arkadi 11:db4e51a318c2 552 pc.printf("%s", json);
Arkadi 11:db4e51a318c2 553 }
Arkadi 11:db4e51a318c2 554 // get target:
Arkadi 11:db4e51a318c2 555 targetName = guiCmd["name"].get<string>(); // switch / dsp
Arkadi 2:5c531dfe890b 556
Arkadi 2:5c531dfe890b 557 #ifdef DEBUG_MOD2
Arkadi 11:db4e51a318c2 558 // send parsed values
Arkadi 11:db4e51a318c2 559 pc.printf("targetName: %s \r\n", targetName.c_str());
Arkadi 1:2b61ae8e6f94 560 #endif
Arkadi 1:2b61ae8e6f94 561
Arkadi 11:db4e51a318c2 562 // select handler based on target mcu
Arkadi 11:db4e51a318c2 563 if (targetName == "switch") {
Arkadi 11:db4e51a318c2 564 // disable automatic mode
Arkadi 11:db4e51a318c2 565 autoFlag=0;
Arkadi 11:db4e51a318c2 566 // update controls
Arkadi 11:db4e51a318c2 567 switchPacket();
Arkadi 11:db4e51a318c2 568 } else if ((targetName == "dsp") || (targetName == "dspParam") || (targetName == "dspFilter")) {
Arkadi 11:db4e51a318c2 569 // send msg to dsp
Arkadi 11:db4e51a318c2 570 dsp.printf("json:%s", json);
Arkadi 4:7c08791dcac1 571 #ifdef DEBUG_MOD2
Arkadi 11:db4e51a318c2 572 pc.printf("json:%s", json);
Arkadi 4:7c08791dcac1 573 #endif
Arkadi 11:db4e51a318c2 574 }
Arkadi 11:db4e51a318c2 575 if (targetName == "auto") {
Arkadi 11:db4e51a318c2 576 // automatic mode
Arkadi 11:db4e51a318c2 577 autoFlag=1;
Arkadi 11:db4e51a318c2 578 pc.printf("{\"Ack\":\"switch\",\"auto\":%d}\r\n",autoFlag); // Printf
Arkadi 11:db4e51a318c2 579 } else {
Arkadi 2:5c531dfe890b 580 #ifdef DEBUG_MOD2
Arkadi 11:db4e51a318c2 581 // unrecognised target
Arkadi 11:db4e51a318c2 582 pc.printf("unrecognised target: %s \r\n", targetName.c_str());
Arkadi 2:5c531dfe890b 583 #endif
Arkadi 11:db4e51a318c2 584 }
Arkadi 11:db4e51a318c2 585 } else { // not a full json message
Arkadi 11:db4e51a318c2 586 pc.printf("Error: %s", json);
Arkadi 2:5c531dfe890b 587 }
Arkadi 2:5c531dfe890b 588 // led blink
Arkadi 2:5c531dfe890b 589 led = !led;
Arkadi 2:5c531dfe890b 590 }// end parse
Arkadi 1:2b61ae8e6f94 591
Arkadi 2:5c531dfe890b 592 // switch Packet Handler
Arkadi 2:5c531dfe890b 593 void switchPacket(void)
Arkadi 2:5c531dfe890b 594 {
Arkadi 2:5c531dfe890b 595 int micChannle = 0;
Arkadi 2:5c531dfe890b 596 bool spkChannle[5]= {0};
Arkadi 11:db4e51a318c2 597
Arkadi 8:5f6b8bffe9b9 598 // get debbug status
Arkadi 8:5f6b8bffe9b9 599 debuggingEn = guiCmd["debug"].get<int>();
Arkadi 11:db4e51a318c2 600
Arkadi 2:5c531dfe890b 601 // get mic channle
Arkadi 1:2b61ae8e6f94 602 micChannle = guiCmd["mic"].get<int>();
Arkadi 11:db4e51a318c2 603
Arkadi 2:5c531dfe890b 604 // get speakers output
Arkadi 1:2b61ae8e6f94 605 for (int ii=0 ; ii < 5 ; ii++) {
Arkadi 1:2b61ae8e6f94 606 spkChannle[ii] = guiCmd["spk"][ii].get<bool>();
Arkadi 1:2b61ae8e6f94 607 }
Arkadi 4:7c08791dcac1 608 #ifdef DEBUG_MOD10
Arkadi 1:2b61ae8e6f94 609 // send parsed values
Arkadi 2:5c531dfe890b 610 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 611 #endif
Arkadi 1:2b61ae8e6f94 612 // update hardware
Arkadi 1:2b61ae8e6f94 613 // update mic select mux
Arkadi 1:2b61ae8e6f94 614 uint8_t micByte = (uint8_t) micChannle;
Arkadi 1:2b61ae8e6f94 615 mux_s0.write((bool)(micByte & 0b00000001));
Arkadi 1:2b61ae8e6f94 616 mux_s1.write((bool)(micByte & 0b00000010));
Arkadi 1:2b61ae8e6f94 617 mux_s2.write((bool)(micByte & 0b00000100));
Arkadi 1:2b61ae8e6f94 618 mux_s3.write((bool)(micByte & 0b00001000));
Arkadi 1:2b61ae8e6f94 619 // update speakers:
Arkadi 1:2b61ae8e6f94 620 en_spk_1.write(spkChannle[0]);
Arkadi 1:2b61ae8e6f94 621 en_spk_2.write(spkChannle[1]);
Arkadi 1:2b61ae8e6f94 622 en_spk_3.write(spkChannle[2]);
Arkadi 1:2b61ae8e6f94 623 en_spk_4.write(spkChannle[3]);
Arkadi 1:2b61ae8e6f94 624 en_spk_5.write(spkChannle[4]);
Arkadi 2:5c531dfe890b 625 // end switch target parse
Arkadi 11:db4e51a318c2 626 pc.printf("{\"Ack\":\"switch\",\"mic\":%d,\"spk\":[%d,%d,%d,%d,%d]}\r\n",micChannle,spkChannle[0],spkChannle[1],spkChannle[2],spkChannle[3],spkChannle[4]);
Arkadi 7:9153b6566524 627 }// end switch packet