Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MbedJSONValue
main.cpp@13:b80d07c4f6e6, 2019-06-08 (annotated)
- 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?
| User | Revision | Line number | New 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 |