Arkadi Rafalovich / Mbed 2 deprecated TAU_ReSpeaker_Switch_V02

Dependencies:   mbed MbedJSONValue

Committer:
Arkadi
Date:
Sat Jun 08 11:04:53 2019 +0000
Revision:
13:b80d07c4f6e6
Parent:
12:1b8560db3dff
ReSpeaker_Switch_V02

Who changed what in which revision?

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