ReSpeaker Switch V02
Dependencies: mbed MbedJSONValue
main.cpp@12:1b8560db3dff, 2018-08-27 (annotated)
- Committer:
- Arkadi
- Date:
- Mon Aug 27 12:18:51 2018 +0000
- Revision:
- 12:1b8560db3dff
- Parent:
- 11:db4e51a318c2
- Child:
- 13:b80d07c4f6e6
minor bug in ack message
Who changed what in which revision?
User | Revision | Line number | New 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 | 12:1b8560db3dff | 196 | volatile bool loopFreqFlag = 0; |
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 | 12:1b8560db3dff | 278 | if ((calculatedFrequency < 10000000) && loopFreqFlag) { // cannot be larger, update when requested |
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 | 12:1b8560db3dff | 599 | debuggingEn = guiCmd["debug"].get<bool>(); |
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 | 12:1b8560db3dff | 604 | // get loop frequency calculator flag |
Arkadi | 12:1b8560db3dff | 605 | loopFreqFlag = guiCmd["LoopFreq"].get<bool>(); |
Arkadi | 12:1b8560db3dff | 606 | |
Arkadi | 2:5c531dfe890b | 607 | // get speakers output |
Arkadi | 1:2b61ae8e6f94 | 608 | for (int ii=0 ; ii < 5 ; ii++) { |
Arkadi | 1:2b61ae8e6f94 | 609 | spkChannle[ii] = guiCmd["spk"][ii].get<bool>(); |
Arkadi | 1:2b61ae8e6f94 | 610 | } |
Arkadi | 4:7c08791dcac1 | 611 | #ifdef DEBUG_MOD10 |
Arkadi | 1:2b61ae8e6f94 | 612 | // send parsed values |
Arkadi | 2:5c531dfe890b | 613 | 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 | 614 | #endif |
Arkadi | 1:2b61ae8e6f94 | 615 | // update hardware |
Arkadi | 1:2b61ae8e6f94 | 616 | // update mic select mux |
Arkadi | 1:2b61ae8e6f94 | 617 | uint8_t micByte = (uint8_t) micChannle; |
Arkadi | 1:2b61ae8e6f94 | 618 | mux_s0.write((bool)(micByte & 0b00000001)); |
Arkadi | 1:2b61ae8e6f94 | 619 | mux_s1.write((bool)(micByte & 0b00000010)); |
Arkadi | 1:2b61ae8e6f94 | 620 | mux_s2.write((bool)(micByte & 0b00000100)); |
Arkadi | 1:2b61ae8e6f94 | 621 | mux_s3.write((bool)(micByte & 0b00001000)); |
Arkadi | 1:2b61ae8e6f94 | 622 | // update speakers: |
Arkadi | 1:2b61ae8e6f94 | 623 | en_spk_1.write(spkChannle[0]); |
Arkadi | 1:2b61ae8e6f94 | 624 | en_spk_2.write(spkChannle[1]); |
Arkadi | 1:2b61ae8e6f94 | 625 | en_spk_3.write(spkChannle[2]); |
Arkadi | 1:2b61ae8e6f94 | 626 | en_spk_4.write(spkChannle[3]); |
Arkadi | 1:2b61ae8e6f94 | 627 | en_spk_5.write(spkChannle[4]); |
Arkadi | 2:5c531dfe890b | 628 | // end switch target parse |
Arkadi | 12:1b8560db3dff | 629 | 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 | 630 | }// end switch packet |