ReSpeaker Switch V02
Dependencies: mbed MbedJSONValue
main.cpp@3:9c3169e549f0, 2018-02-04 (annotated)
- Committer:
- Arkadi
- Date:
- Sun Feb 04 16:14:03 2018 +0000
- Revision:
- 3:9c3169e549f0
- Parent:
- 2:5c531dfe890b
- Child:
- 4:7c08791dcac1
minor fix
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 | 0:f65ba5fb350e | 3 | // Arkadiraf@gmail.com - 05/06/2017 // |
Arkadi | 0:f65ba5fb350e | 4 | //////////////////////////////////////// |
Arkadi | 0:f65ba5fb350e | 5 | /* |
Arkadi | 0:f65ba5fb350e | 6 | Receive byte from pc to reroute input outputs |
Arkadi | 1:2b61ae8e6f94 | 7 | b1xxxxxxx (0x8x) - define input port; b10000000 - port 0, b10000001 - port 1, b10000010 - port 2 etc , b10000011 - port 3 etc. |
Arkadi | 0:f65ba5fb350e | 8 | b0xxxxxxx - define output ports; b10000001 - port 1, b10000011 - port 1&2, b10000000 - non. |
Arkadi | 1:2b61ae8e6f94 | 9 | off all: 0x00 |
Arkadi | 1:2b61ae8e6f94 | 10 | All ports: 0x1f |
Arkadi | 1:2b61ae8e6f94 | 11 | speaker 5: 0x10 |
Arkadi | 1:2b61ae8e6f94 | 12 | speaker 1: 0x01 |
Arkadi | 1:2b61ae8e6f94 | 13 | |
Arkadi | 1:2b61ae8e6f94 | 14 | Alternative json format: |
Arkadi | 1:2b61ae8e6f94 | 15 | Json Format: {"mic":0, "spk": [0,1,0,0,0]} |
Arkadi | 1:2b61ae8e6f94 | 16 | |
Arkadi | 0:f65ba5fb350e | 17 | */ |
Arkadi | 0:f65ba5fb350e | 18 | |
Arkadi | 0:f65ba5fb350e | 19 | /* |
Arkadi | 0:f65ba5fb350e | 20 | Board : Nucleo STM32F446RE |
Arkadi | 0:f65ba5fb350e | 21 | Power Source : USB || Jumper 5V source from STM32 DSP board |
Arkadi | 0:f65ba5fb350e | 22 | */ |
Arkadi | 0:f65ba5fb350e | 23 | |
Arkadi | 0:f65ba5fb350e | 24 | /* |
Arkadi | 0:f65ba5fb350e | 25 | Nucleo board modification: |
Arkadi | 1:2b61ae8e6f94 | 26 | to use PH_0(MUX_S2) as IO modify boards as followed: |
Arkadi | 0:f65ba5fb350e | 27 | SB54 and SB55 ON |
Arkadi | 0:f65ba5fb350e | 28 | SB16 and SB50 (MCO) OFF |
Arkadi | 1:2b61ae8e6f94 | 29 | 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 | 30 | */ |
Arkadi | 0:f65ba5fb350e | 31 | |
Arkadi | 0:f65ba5fb350e | 32 | /* |
Arkadi | 0:f65ba5fb350e | 33 | Pinout: |
Arkadi | 0:f65ba5fb350e | 34 | PC - Serial 2 |
Arkadi | 0:f65ba5fb350e | 35 | PA_2 (Tx) --> STLINK |
Arkadi | 0:f65ba5fb350e | 36 | PA_3 (Rx) --> STLINK |
Arkadi | 0:f65ba5fb350e | 37 | |
Arkadi | 0:f65ba5fb350e | 38 | Switch - Serial 3 |
Arkadi | 0:f65ba5fb350e | 39 | PC_10 (Tx) --> SW_Rx |
Arkadi | 0:f65ba5fb350e | 40 | PC_11 (Rx) --> SW_Tx |
Arkadi | 0:f65ba5fb350e | 41 | |
Arkadi | 0:f65ba5fb350e | 42 | I2C_Bus |
Arkadi | 0:f65ba5fb350e | 43 | PB_8 --> SCL |
Arkadi | 0:f65ba5fb350e | 44 | PB_9 --> SDA |
Arkadi | 0:f65ba5fb350e | 45 | |
Arkadi | 0:f65ba5fb350e | 46 | Digital output : |
Arkadi | 0:f65ba5fb350e | 47 | PA_5 --> led (DigitalOut) |
Arkadi | 0:f65ba5fb350e | 48 | PA_10 --> SW_Trigger |
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 | 0:f65ba5fb350e | 63 | MIC Interrupts: |
Arkadi | 0:f65ba5fb350e | 64 | PC_15 --> INTER_1 |
Arkadi | 0:f65ba5fb350e | 65 | PC_14 --> INTER_2 |
Arkadi | 0:f65ba5fb350e | 66 | PA_15 --> INTER_3 |
Arkadi | 0:f65ba5fb350e | 67 | PA_14 --> INTER_4 |
Arkadi | 0:f65ba5fb350e | 68 | PA_13 --> INTER_5 |
Arkadi | 0:f65ba5fb350e | 69 | |
Arkadi | 0:f65ba5fb350e | 70 | Digital Input |
Arkadi | 0:f65ba5fb350e | 71 | PC_13 --> BTN (Blue) |
Arkadi | 0:f65ba5fb350e | 72 | |
Arkadi | 0:f65ba5fb350e | 73 | Analog Input |
Arkadi | 0:f65ba5fb350e | 74 | PA_0 --> A_DATA_1 |
Arkadi | 0:f65ba5fb350e | 75 | PA_1 --> A_DATA_2 |
Arkadi | 0:f65ba5fb350e | 76 | PA_4 --> A_DATA_3 |
Arkadi | 0:f65ba5fb350e | 77 | PB_0 --> A_DATA_4 |
Arkadi | 0:f65ba5fb350e | 78 | PC_1 --> A_DATA_5 |
Arkadi | 0:f65ba5fb350e | 79 | |
Arkadi | 0:f65ba5fb350e | 80 | Analog Output |
Arkadi | 0:f65ba5fb350e | 81 | |
Arkadi | 0:f65ba5fb350e | 82 | |
Arkadi | 0:f65ba5fb350e | 83 | */ |
Arkadi | 0:f65ba5fb350e | 84 | |
Arkadi | 0:f65ba5fb350e | 85 | /////////////// |
Arkadi | 0:f65ba5fb350e | 86 | // Libraries // |
Arkadi | 0:f65ba5fb350e | 87 | /////////////// |
Arkadi | 0:f65ba5fb350e | 88 | #include "mbed.h" |
Arkadi | 1:2b61ae8e6f94 | 89 | #include "MbedJSONValue.h" |
Arkadi | 1:2b61ae8e6f94 | 90 | //#include <string> |
Arkadi | 0:f65ba5fb350e | 91 | |
Arkadi | 0:f65ba5fb350e | 92 | /////////////// |
Arkadi | 0:f65ba5fb350e | 93 | // #defines // |
Arkadi | 0:f65ba5fb350e | 94 | /////////////// |
Arkadi | 0:f65ba5fb350e | 95 | |
Arkadi | 2:5c531dfe890b | 96 | //#define DEBUG_MOD1 // json packet recognise |
Arkadi | 2:5c531dfe890b | 97 | //#define DEBUG_MOD2 // json parse |
Arkadi | 2:5c531dfe890b | 98 | //#define DEBUG_MOD3 // switch handler |
Arkadi | 2:5c531dfe890b | 99 | #define DEBUG_MOD10 // responsivity msges to gui |
Arkadi | 2:5c531dfe890b | 100 | |
Arkadi | 1:2b61ae8e6f94 | 101 | #define MSG_BUFFER_SIZE 512 |
Arkadi | 1:2b61ae8e6f94 | 102 | #define HEADER_SIZE 5 |
Arkadi | 1:2b61ae8e6f94 | 103 | #define FOOTER_SIZE 2 |
Arkadi | 0:f65ba5fb350e | 104 | ///////////// |
Arkadi | 0:f65ba5fb350e | 105 | // Objects // |
Arkadi | 0:f65ba5fb350e | 106 | ///////////// |
Arkadi | 0:f65ba5fb350e | 107 | |
Arkadi | 2:5c531dfe890b | 108 | // json |
Arkadi | 2:5c531dfe890b | 109 | MbedJSONValue guiCmd; |
Arkadi | 2:5c531dfe890b | 110 | |
Arkadi | 0:f65ba5fb350e | 111 | // uart |
Arkadi | 1:2b61ae8e6f94 | 112 | Serial pc(USBTX, USBRX); |
Arkadi | 0:f65ba5fb350e | 113 | |
Arkadi | 0:f65ba5fb350e | 114 | // digital input |
Arkadi | 0:f65ba5fb350e | 115 | DigitalIn user_button(PC_13); |
Arkadi | 0:f65ba5fb350e | 116 | |
Arkadi | 0:f65ba5fb350e | 117 | // digital output |
Arkadi | 0:f65ba5fb350e | 118 | DigitalOut led(PA_5); |
Arkadi | 0:f65ba5fb350e | 119 | DigitalOut sw_trigger(PA_10); |
Arkadi | 0:f65ba5fb350e | 120 | |
Arkadi | 0:f65ba5fb350e | 121 | // MUX: CD74HC4067 |
Arkadi | 0:f65ba5fb350e | 122 | DigitalOut mux_s0(PC_12); |
Arkadi | 0:f65ba5fb350e | 123 | DigitalOut mux_s1(PD_2); |
Arkadi | 0:f65ba5fb350e | 124 | DigitalOut mux_s2(PH_0); |
Arkadi | 0:f65ba5fb350e | 125 | DigitalOut mux_s3(PH_1); |
Arkadi | 0:f65ba5fb350e | 126 | |
Arkadi | 0:f65ba5fb350e | 127 | // speaker switch |
Arkadi | 0:f65ba5fb350e | 128 | DigitalOut en_spk_1(PB_2); |
Arkadi | 0:f65ba5fb350e | 129 | DigitalOut en_spk_2(PB_1); |
Arkadi | 0:f65ba5fb350e | 130 | DigitalOut en_spk_3(PB_15); |
Arkadi | 0:f65ba5fb350e | 131 | DigitalOut en_spk_4(PB_14); |
Arkadi | 0:f65ba5fb350e | 132 | DigitalOut en_spk_5(PB_13); |
Arkadi | 0:f65ba5fb350e | 133 | |
Arkadi | 0:f65ba5fb350e | 134 | // MIC interrupts |
Arkadi | 0:f65ba5fb350e | 135 | DigitalOut inter_1(PC_15); |
Arkadi | 0:f65ba5fb350e | 136 | DigitalOut inter_2(PC_14); |
Arkadi | 0:f65ba5fb350e | 137 | DigitalOut inter_3(PA_15); |
Arkadi | 0:f65ba5fb350e | 138 | DigitalOut inter_4(PA_14); |
Arkadi | 0:f65ba5fb350e | 139 | DigitalOut inter_5(PA_13); |
Arkadi | 0:f65ba5fb350e | 140 | |
Arkadi | 0:f65ba5fb350e | 141 | // analog input |
Arkadi | 0:f65ba5fb350e | 142 | AnalogIn a_data_1(PA_0); |
Arkadi | 0:f65ba5fb350e | 143 | AnalogIn a_data_2(PA_1); |
Arkadi | 0:f65ba5fb350e | 144 | AnalogIn a_data_3(PA_4); |
Arkadi | 0:f65ba5fb350e | 145 | AnalogIn a_data_4(PB_0); |
Arkadi | 0:f65ba5fb350e | 146 | AnalogIn a_data_5(PC_1); |
Arkadi | 0:f65ba5fb350e | 147 | |
Arkadi | 0:f65ba5fb350e | 148 | /////////////// |
Arkadi | 0:f65ba5fb350e | 149 | // variables // |
Arkadi | 0:f65ba5fb350e | 150 | /////////////// |
Arkadi | 1:2b61ae8e6f94 | 151 | // analog input from microphone |
Arkadi | 1:2b61ae8e6f94 | 152 | uint16_t micAData[5]= {0}; |
Arkadi | 0:f65ba5fb350e | 153 | |
Arkadi | 1:2b61ae8e6f94 | 154 | // json buffer |
Arkadi | 1:2b61ae8e6f94 | 155 | char json[MSG_BUFFER_SIZE]; |
Arkadi | 1:2b61ae8e6f94 | 156 | |
Arkadi | 1:2b61ae8e6f94 | 157 | // packet variables |
Arkadi | 1:2b61ae8e6f94 | 158 | struct packetMSG_struct { |
Arkadi | 1:2b61ae8e6f94 | 159 | // recieve message variables |
Arkadi | 1:2b61ae8e6f94 | 160 | uint8_t header[HEADER_SIZE]; |
Arkadi | 1:2b61ae8e6f94 | 161 | uint8_t footer[FOOTER_SIZE]; |
Arkadi | 1:2b61ae8e6f94 | 162 | uint8_t syncIndex; // sync index for header / footer |
Arkadi | 1:2b61ae8e6f94 | 163 | 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 | 164 | // buffer |
Arkadi | 1:2b61ae8e6f94 | 165 | uint16_t bufferIndex; // buffer index |
Arkadi | 1:2b61ae8e6f94 | 166 | uint8_t buffer[MSG_BUFFER_SIZE]; |
Arkadi | 1:2b61ae8e6f94 | 167 | } ; |
Arkadi | 1:2b61ae8e6f94 | 168 | packetMSG_struct packetMSG; |
Arkadi | 1:2b61ae8e6f94 | 169 | |
Arkadi | 0:f65ba5fb350e | 170 | |
Arkadi | 0:f65ba5fb350e | 171 | /////////////// |
Arkadi | 0:f65ba5fb350e | 172 | // Functions // |
Arkadi | 0:f65ba5fb350e | 173 | /////////////// |
Arkadi | 0:f65ba5fb350e | 174 | |
Arkadi | 1:2b61ae8e6f94 | 175 | // Serial Event function |
Arkadi | 1:2b61ae8e6f94 | 176 | void rxCallback(void); |
Arkadi | 1:2b61ae8e6f94 | 177 | |
Arkadi | 1:2b61ae8e6f94 | 178 | // initialize packet struct |
Arkadi | 1:2b61ae8e6f94 | 179 | void initPacket(void); |
Arkadi | 1:2b61ae8e6f94 | 180 | |
Arkadi | 1:2b61ae8e6f94 | 181 | // Packet Parser |
Arkadi | 1:2b61ae8e6f94 | 182 | void parsePacket(void); |
Arkadi | 1:2b61ae8e6f94 | 183 | |
Arkadi | 2:5c531dfe890b | 184 | // switch Packet Handler |
Arkadi | 2:5c531dfe890b | 185 | void switchPacket(void); |
Arkadi | 2:5c531dfe890b | 186 | |
Arkadi | 1:2b61ae8e6f94 | 187 | // initialize switch |
Arkadi | 1:2b61ae8e6f94 | 188 | void initSwitch(void); |
Arkadi | 0:f65ba5fb350e | 189 | //////////////////////// |
Arkadi | 0:f65ba5fb350e | 190 | // Main Code Setup : // |
Arkadi | 0:f65ba5fb350e | 191 | //////////////////////// |
Arkadi | 0:f65ba5fb350e | 192 | int main() |
Arkadi | 0:f65ba5fb350e | 193 | { |
Arkadi | 1:2b61ae8e6f94 | 194 | // init packet: |
Arkadi | 1:2b61ae8e6f94 | 195 | initPacket(); |
Arkadi | 1:2b61ae8e6f94 | 196 | // init uart |
Arkadi | 0:f65ba5fb350e | 197 | pc.baud(57600); |
Arkadi | 1:2b61ae8e6f94 | 198 | // attach serial event interrupt |
Arkadi | 1:2b61ae8e6f94 | 199 | pc.attach(&rxCallback, Serial::RxIrq); |
Arkadi | 1:2b61ae8e6f94 | 200 | |
Arkadi | 1:2b61ae8e6f94 | 201 | // initialize switch |
Arkadi | 1:2b61ae8e6f94 | 202 | initSwitch(); |
Arkadi | 0:f65ba5fb350e | 203 | #ifdef DEBUG_MOD1 |
Arkadi | 0:f65ba5fb350e | 204 | pc.printf("ReSpeaker Test \r\n"); |
Arkadi | 0:f65ba5fb350e | 205 | #endif |
Arkadi | 0:f65ba5fb350e | 206 | /////////////////////// |
Arkadi | 0:f65ba5fb350e | 207 | // Main Code Loop : // |
Arkadi | 0:f65ba5fb350e | 208 | /////////////////////// |
Arkadi | 1:2b61ae8e6f94 | 209 | while(0) { |
Arkadi | 1:2b61ae8e6f94 | 210 | if(1) { |
Arkadi | 1:2b61ae8e6f94 | 211 | micAData[0] = a_data_1.read_u16(); |
Arkadi | 1:2b61ae8e6f94 | 212 | micAData[1] = a_data_2.read_u16(); |
Arkadi | 1:2b61ae8e6f94 | 213 | micAData[2] = a_data_3.read_u16(); |
Arkadi | 1:2b61ae8e6f94 | 214 | micAData[3] = a_data_4.read_u16(); |
Arkadi | 1:2b61ae8e6f94 | 215 | micAData[4] = a_data_5.read_u16(); |
Arkadi | 1:2b61ae8e6f94 | 216 | pc.printf("Data:%d,%d,%d,%d,%d\r\n",micAData[0],micAData[1],micAData[2],micAData[3],micAData[4]); |
Arkadi | 1:2b61ae8e6f94 | 217 | wait(1); |
Arkadi | 1:2b61ae8e6f94 | 218 | } |
Arkadi | 0:f65ba5fb350e | 219 | |
Arkadi | 0:f65ba5fb350e | 220 | }// end main loop |
Arkadi | 0:f65ba5fb350e | 221 | }// end main |
Arkadi | 0:f65ba5fb350e | 222 | /////////////// |
Arkadi | 0:f65ba5fb350e | 223 | // Functions // |
Arkadi | 0:f65ba5fb350e | 224 | /////////////// |
Arkadi | 1:2b61ae8e6f94 | 225 | |
Arkadi | 1:2b61ae8e6f94 | 226 | // initialize switch |
Arkadi | 1:2b61ae8e6f94 | 227 | void initSwitch(void) |
Arkadi | 1:2b61ae8e6f94 | 228 | { |
Arkadi | 1:2b61ae8e6f94 | 229 | // attach serial event interrupt |
Arkadi | 1:2b61ae8e6f94 | 230 | pc.attach(&rxCallback, Serial::RxIrq); |
Arkadi | 1:2b61ae8e6f94 | 231 | // reset output / input |
Arkadi | 1:2b61ae8e6f94 | 232 | mux_s0.write(0); |
Arkadi | 1:2b61ae8e6f94 | 233 | mux_s1.write(0); |
Arkadi | 1:2b61ae8e6f94 | 234 | mux_s2.write(0); |
Arkadi | 1:2b61ae8e6f94 | 235 | mux_s3.write(0); |
Arkadi | 1:2b61ae8e6f94 | 236 | en_spk_1.write(0); |
Arkadi | 1:2b61ae8e6f94 | 237 | en_spk_2.write(0); |
Arkadi | 1:2b61ae8e6f94 | 238 | en_spk_3.write(0); |
Arkadi | 1:2b61ae8e6f94 | 239 | en_spk_4.write(0); |
Arkadi | 1:2b61ae8e6f94 | 240 | en_spk_5.write(0); |
Arkadi | 1:2b61ae8e6f94 | 241 | }// end init switch |
Arkadi | 1:2b61ae8e6f94 | 242 | |
Arkadi | 1:2b61ae8e6f94 | 243 | |
Arkadi | 1:2b61ae8e6f94 | 244 | // Serial Event function |
Arkadi | 1:2b61ae8e6f94 | 245 | void rxCallback(void) |
Arkadi | 1:2b61ae8e6f94 | 246 | { |
Arkadi | 1:2b61ae8e6f94 | 247 | while (pc.readable()) { |
Arkadi | 1:2b61ae8e6f94 | 248 | // read icoming |
Arkadi | 1:2b61ae8e6f94 | 249 | //led = !led; |
Arkadi | 1:2b61ae8e6f94 | 250 | uint8_t in_byte = pc.getc(); |
Arkadi | 1:2b61ae8e6f94 | 251 | #ifdef DEBUG_MOD1 |
Arkadi | 1:2b61ae8e6f94 | 252 | pc.putc(in_byte); |
Arkadi | 1:2b61ae8e6f94 | 253 | #endif |
Arkadi | 1:2b61ae8e6f94 | 254 | // detect start message , end message |
Arkadi | 1:2b61ae8e6f94 | 255 | switch (packetMSG.syncFlag) { |
Arkadi | 1:2b61ae8e6f94 | 256 | // waiting for header |
Arkadi | 1:2b61ae8e6f94 | 257 | case 0: { |
Arkadi | 1:2b61ae8e6f94 | 258 | if (packetMSG.header[packetMSG.syncIndex] == in_byte) { |
Arkadi | 1:2b61ae8e6f94 | 259 | packetMSG.syncIndex++; |
Arkadi | 1:2b61ae8e6f94 | 260 | if (packetMSG.syncIndex == HEADER_SIZE) { // finish header SYNC |
Arkadi | 1:2b61ae8e6f94 | 261 | packetMSG.syncFlag = 1; // start collecting data, wait for footer |
Arkadi | 1:2b61ae8e6f94 | 262 | packetMSG.bufferIndex = 0; |
Arkadi | 1:2b61ae8e6f94 | 263 | packetMSG.syncIndex=0; |
Arkadi | 1:2b61ae8e6f94 | 264 | } |
Arkadi | 1:2b61ae8e6f94 | 265 | } else { // reinit sync |
Arkadi | 1:2b61ae8e6f94 | 266 | packetMSG.syncIndex=0; |
Arkadi | 1:2b61ae8e6f94 | 267 | } |
Arkadi | 1:2b61ae8e6f94 | 268 | //pc.printf("case 0 , %d \r\n",packetMSG.syncIndex); |
Arkadi | 1:2b61ae8e6f94 | 269 | break; |
Arkadi | 1:2b61ae8e6f94 | 270 | } |
Arkadi | 1:2b61ae8e6f94 | 271 | // waiting for footer |
Arkadi | 1:2b61ae8e6f94 | 272 | case 1: { |
Arkadi | 1:2b61ae8e6f94 | 273 | // add byte to buffer |
Arkadi | 1:2b61ae8e6f94 | 274 | packetMSG.buffer[packetMSG.bufferIndex] = in_byte; |
Arkadi | 1:2b61ae8e6f94 | 275 | packetMSG.bufferIndex++; |
Arkadi | 1:2b61ae8e6f94 | 276 | if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow |
Arkadi | 1:2b61ae8e6f94 | 277 | // reset buffer |
Arkadi | 1:2b61ae8e6f94 | 278 | packetMSG.bufferIndex = 0; |
Arkadi | 1:2b61ae8e6f94 | 279 | packetMSG.syncIndex = 0; |
Arkadi | 1:2b61ae8e6f94 | 280 | packetMSG.syncFlag = 0; |
Arkadi | 1:2b61ae8e6f94 | 281 | } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved |
Arkadi | 1:2b61ae8e6f94 | 282 | packetMSG.syncIndex++; |
Arkadi | 1:2b61ae8e6f94 | 283 | packetMSG.syncFlag=2; // move to verify footer |
Arkadi | 1:2b61ae8e6f94 | 284 | } |
Arkadi | 1:2b61ae8e6f94 | 285 | //pc.printf("case 2 , %d \r\n",packetMSG.syncIndex); |
Arkadi | 1:2b61ae8e6f94 | 286 | break; |
Arkadi | 1:2b61ae8e6f94 | 287 | } |
Arkadi | 1:2b61ae8e6f94 | 288 | // verify footer |
Arkadi | 1:2b61ae8e6f94 | 289 | case 2: { |
Arkadi | 1:2b61ae8e6f94 | 290 | // add byte to buffer |
Arkadi | 1:2b61ae8e6f94 | 291 | packetMSG.buffer[packetMSG.bufferIndex] = in_byte; |
Arkadi | 1:2b61ae8e6f94 | 292 | packetMSG.bufferIndex++; |
Arkadi | 1:2b61ae8e6f94 | 293 | if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow |
Arkadi | 1:2b61ae8e6f94 | 294 | // reset buffer |
Arkadi | 1:2b61ae8e6f94 | 295 | packetMSG.bufferIndex = 0; |
Arkadi | 1:2b61ae8e6f94 | 296 | packetMSG.syncIndex = 0; |
Arkadi | 1:2b61ae8e6f94 | 297 | packetMSG.syncFlag = 0; |
Arkadi | 1:2b61ae8e6f94 | 298 | } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved |
Arkadi | 1:2b61ae8e6f94 | 299 | packetMSG.syncIndex++; |
Arkadi | 1:2b61ae8e6f94 | 300 | if (packetMSG.syncIndex == FOOTER_SIZE) { // finish footer SYNC |
Arkadi | 1:2b61ae8e6f94 | 301 | packetMSG.syncFlag = 3; |
Arkadi | 1:2b61ae8e6f94 | 302 | // copy packet to json buffer |
Arkadi | 1:2b61ae8e6f94 | 303 | memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex); |
Arkadi | 1:2b61ae8e6f94 | 304 | json[packetMSG.bufferIndex]=NULL; // end with NULL to indicate end of string |
Arkadi | 1:2b61ae8e6f94 | 305 | // copy packet to json buffer with sprintf |
Arkadi | 1:2b61ae8e6f94 | 306 | //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer ); |
Arkadi | 1:2b61ae8e6f94 | 307 | // send msg to parse. |
Arkadi | 1:2b61ae8e6f94 | 308 | parsePacket(); |
Arkadi | 1:2b61ae8e6f94 | 309 | // reset buffer |
Arkadi | 1:2b61ae8e6f94 | 310 | packetMSG.bufferIndex = 0; |
Arkadi | 1:2b61ae8e6f94 | 311 | packetMSG.syncIndex = 0; |
Arkadi | 1:2b61ae8e6f94 | 312 | packetMSG.syncFlag = 0; |
Arkadi | 1:2b61ae8e6f94 | 313 | } |
Arkadi | 1:2b61ae8e6f94 | 314 | } else { // footer broke restart wait for footer |
Arkadi | 1:2b61ae8e6f94 | 315 | packetMSG.syncFlag=1; |
Arkadi | 1:2b61ae8e6f94 | 316 | // verify that it didnt broke on first footer char |
Arkadi | 1:2b61ae8e6f94 | 317 | if (packetMSG.footer[0] == in_byte) { |
Arkadi | 1:2b61ae8e6f94 | 318 | packetMSG.syncIndex=1; |
Arkadi | 1:2b61ae8e6f94 | 319 | } else { |
Arkadi | 1:2b61ae8e6f94 | 320 | packetMSG.syncIndex=0; |
Arkadi | 1:2b61ae8e6f94 | 321 | } |
Arkadi | 1:2b61ae8e6f94 | 322 | } |
Arkadi | 1:2b61ae8e6f94 | 323 | break; |
Arkadi | 1:2b61ae8e6f94 | 324 | } |
Arkadi | 1:2b61ae8e6f94 | 325 | default: { |
Arkadi | 1:2b61ae8e6f94 | 326 | pc.printf("Sonmething went wrong \r\n"); |
Arkadi | 1:2b61ae8e6f94 | 327 | break; |
Arkadi | 1:2b61ae8e6f94 | 328 | } |
Arkadi | 1:2b61ae8e6f94 | 329 | } // end switch |
Arkadi | 1:2b61ae8e6f94 | 330 | }// end uart readable |
Arkadi | 1:2b61ae8e6f94 | 331 | } // end rxCallback |
Arkadi | 1:2b61ae8e6f94 | 332 | |
Arkadi | 1:2b61ae8e6f94 | 333 | |
Arkadi | 1:2b61ae8e6f94 | 334 | // initialize packet struct |
Arkadi | 1:2b61ae8e6f94 | 335 | void initPacket(void) |
Arkadi | 1:2b61ae8e6f94 | 336 | { |
Arkadi | 1:2b61ae8e6f94 | 337 | // init variables to default: |
Arkadi | 1:2b61ae8e6f94 | 338 | packetMSG.header[0] = 'j'; |
Arkadi | 1:2b61ae8e6f94 | 339 | packetMSG.header[1] = 's'; |
Arkadi | 1:2b61ae8e6f94 | 340 | packetMSG.header[2] = 'o'; |
Arkadi | 1:2b61ae8e6f94 | 341 | packetMSG.header[3] = 'n'; |
Arkadi | 1:2b61ae8e6f94 | 342 | packetMSG.header[4] = ':'; |
Arkadi | 1:2b61ae8e6f94 | 343 | |
Arkadi | 1:2b61ae8e6f94 | 344 | packetMSG.footer[0]= 13; // /r |
Arkadi | 1:2b61ae8e6f94 | 345 | packetMSG.footer[1]= 10; // /n |
Arkadi | 1:2b61ae8e6f94 | 346 | |
Arkadi | 1:2b61ae8e6f94 | 347 | packetMSG.syncIndex=0; // sync index for header / footer |
Arkadi | 1:2b61ae8e6f94 | 348 | 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 | 349 | packetMSG.bufferIndex=0; // buffer index |
Arkadi | 1:2b61ae8e6f94 | 350 | } |
Arkadi | 1:2b61ae8e6f94 | 351 | |
Arkadi | 1:2b61ae8e6f94 | 352 | // Packet Parser |
Arkadi | 1:2b61ae8e6f94 | 353 | void parsePacket(void) |
Arkadi | 1:2b61ae8e6f94 | 354 | { |
Arkadi | 2:5c531dfe890b | 355 | string targetName; |
Arkadi | 2:5c531dfe890b | 356 | #ifdef DEBUG_MOD2 |
Arkadi | 1:2b61ae8e6f94 | 357 | // write buffer to screen |
Arkadi | 1:2b61ae8e6f94 | 358 | //pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer ); |
Arkadi | 2:5c531dfe890b | 359 | pc.printf("%s", json); |
Arkadi | 2:5c531dfe890b | 360 | #endif |
Arkadi | 2:5c531dfe890b | 361 | |
Arkadi | 2:5c531dfe890b | 362 | // GUI message format Switch: {"name":"switch","mic":0, "spk": [0,1,0,0,0]} |
Arkadi | 2:5c531dfe890b | 363 | parse(guiCmd, json); |
Arkadi | 2:5c531dfe890b | 364 | |
Arkadi | 2:5c531dfe890b | 365 | // get target: |
Arkadi | 2:5c531dfe890b | 366 | targetName = guiCmd["name"].get<string>(); // switch / dsp |
Arkadi | 2:5c531dfe890b | 367 | |
Arkadi | 2:5c531dfe890b | 368 | #ifdef DEBUG_MOD2 |
Arkadi | 2:5c531dfe890b | 369 | // send parsed values |
Arkadi | 2:5c531dfe890b | 370 | pc.printf("targetName: %s \r\n", targetName.c_str()); |
Arkadi | 1:2b61ae8e6f94 | 371 | #endif |
Arkadi | 1:2b61ae8e6f94 | 372 | |
Arkadi | 2:5c531dfe890b | 373 | // select handler based on target mcu |
Arkadi | 2:5c531dfe890b | 374 | if (targetName == "switch") { |
Arkadi | 2:5c531dfe890b | 375 | switchPacket(); |
Arkadi | 2:5c531dfe890b | 376 | } else if (targetName == "dsp") { |
Arkadi | 2:5c531dfe890b | 377 | // send msg to dsp |
Arkadi | 2:5c531dfe890b | 378 | pc.printf("json:%s", json); |
Arkadi | 2:5c531dfe890b | 379 | } else { |
Arkadi | 2:5c531dfe890b | 380 | #ifdef DEBUG_MOD2 |
Arkadi | 2:5c531dfe890b | 381 | // unrecognised target |
Arkadi | 2:5c531dfe890b | 382 | pc.printf("unrecognised target: %s \r\n", targetName.c_str()); |
Arkadi | 2:5c531dfe890b | 383 | #endif |
Arkadi | 2:5c531dfe890b | 384 | } |
Arkadi | 2:5c531dfe890b | 385 | // led blink |
Arkadi | 2:5c531dfe890b | 386 | led = !led; |
Arkadi | 2:5c531dfe890b | 387 | }// end parse |
Arkadi | 1:2b61ae8e6f94 | 388 | |
Arkadi | 2:5c531dfe890b | 389 | // switch Packet Handler |
Arkadi | 2:5c531dfe890b | 390 | void switchPacket(void) |
Arkadi | 2:5c531dfe890b | 391 | { |
Arkadi | 2:5c531dfe890b | 392 | int micChannle = 0; |
Arkadi | 2:5c531dfe890b | 393 | bool spkChannle[5]= {0}; |
Arkadi | 1:2b61ae8e6f94 | 394 | |
Arkadi | 2:5c531dfe890b | 395 | // get mic channle |
Arkadi | 1:2b61ae8e6f94 | 396 | micChannle = guiCmd["mic"].get<int>(); |
Arkadi | 2:5c531dfe890b | 397 | // get speakers output |
Arkadi | 1:2b61ae8e6f94 | 398 | for (int ii=0 ; ii < 5 ; ii++) { |
Arkadi | 1:2b61ae8e6f94 | 399 | spkChannle[ii] = guiCmd["spk"][ii].get<bool>(); |
Arkadi | 1:2b61ae8e6f94 | 400 | } |
Arkadi | 3:9c3169e549f0 | 401 | #ifdef DEBUG_MOD10 |
Arkadi | 1:2b61ae8e6f94 | 402 | // send parsed values |
Arkadi | 2:5c531dfe890b | 403 | pc.printf("mic: %d , spk: [%d,%d,%d,%d,%d]\r\n", micChannle,spkChannle[0],spkChannle[1],spkChannle[2],spkChannle[3],spkChannle[4]); |
Arkadi | 2:5c531dfe890b | 404 | #endif |
Arkadi | 1:2b61ae8e6f94 | 405 | // update hardware |
Arkadi | 1:2b61ae8e6f94 | 406 | // update mic select mux |
Arkadi | 1:2b61ae8e6f94 | 407 | uint8_t micByte = (uint8_t) micChannle; |
Arkadi | 1:2b61ae8e6f94 | 408 | mux_s0.write((bool)(micByte & 0b00000001)); |
Arkadi | 1:2b61ae8e6f94 | 409 | mux_s1.write((bool)(micByte & 0b00000010)); |
Arkadi | 1:2b61ae8e6f94 | 410 | mux_s2.write((bool)(micByte & 0b00000100)); |
Arkadi | 1:2b61ae8e6f94 | 411 | mux_s3.write((bool)(micByte & 0b00001000)); |
Arkadi | 1:2b61ae8e6f94 | 412 | // update speakers: |
Arkadi | 1:2b61ae8e6f94 | 413 | en_spk_1.write(spkChannle[0]); |
Arkadi | 1:2b61ae8e6f94 | 414 | en_spk_2.write(spkChannle[1]); |
Arkadi | 1:2b61ae8e6f94 | 415 | en_spk_3.write(spkChannle[2]); |
Arkadi | 1:2b61ae8e6f94 | 416 | en_spk_4.write(spkChannle[3]); |
Arkadi | 1:2b61ae8e6f94 | 417 | en_spk_5.write(spkChannle[4]); |
Arkadi | 2:5c531dfe890b | 418 | // end switch target parse |
Arkadi | 1:2b61ae8e6f94 | 419 | |
Arkadi | 2:5c531dfe890b | 420 | }// end switch packet |
Arkadi | 1:2b61ae8e6f94 | 421 | |
Arkadi | 1:2b61ae8e6f94 | 422 | |
Arkadi | 1:2b61ae8e6f94 | 423 | //// Serial Event function simple byte parser |
Arkadi | 1:2b61ae8e6f94 | 424 | //void rxCallback(void) |
Arkadi | 1:2b61ae8e6f94 | 425 | //{ |
Arkadi | 1:2b61ae8e6f94 | 426 | // // incoming buffer |
Arkadi | 1:2b61ae8e6f94 | 427 | // uint8_t in_byte; |
Arkadi | 1:2b61ae8e6f94 | 428 | // // read icoming |
Arkadi | 1:2b61ae8e6f94 | 429 | // led = !led; |
Arkadi | 1:2b61ae8e6f94 | 430 | // in_byte = pc.getc(); |
Arkadi | 1:2b61ae8e6f94 | 431 | //#ifdef DEBUG_MOD1 |
Arkadi | 1:2b61ae8e6f94 | 432 | // pc.putc(in_byte); |
Arkadi | 1:2b61ae8e6f94 | 433 | //#endif |
Arkadi | 1:2b61ae8e6f94 | 434 | // // check if command of input or output |
Arkadi | 1:2b61ae8e6f94 | 435 | // if ((bool)(in_byte & 0b10000000)) { // set input |
Arkadi | 1:2b61ae8e6f94 | 436 | // mux_s0.write((bool)(in_byte & 0b00000001)); |
Arkadi | 1:2b61ae8e6f94 | 437 | // mux_s1.write((bool)(in_byte & 0b00000010)); |
Arkadi | 1:2b61ae8e6f94 | 438 | // mux_s2.write((bool)(in_byte & 0b00000100)); |
Arkadi | 1:2b61ae8e6f94 | 439 | // mux_s3.write((bool)(in_byte & 0b00001000)); |
Arkadi | 1:2b61ae8e6f94 | 440 | // } else { // set output |
Arkadi | 1:2b61ae8e6f94 | 441 | // en_spk_1.write((bool)(in_byte & 0b00000001)); |
Arkadi | 1:2b61ae8e6f94 | 442 | // en_spk_2.write((bool)(in_byte & 0b00000010)); |
Arkadi | 1:2b61ae8e6f94 | 443 | // en_spk_3.write((bool)(in_byte & 0b00000100)); |
Arkadi | 1:2b61ae8e6f94 | 444 | // en_spk_4.write((bool)(in_byte & 0b00001000)); |
Arkadi | 1:2b61ae8e6f94 | 445 | // en_spk_5.write((bool)(in_byte & 0b00010000)); |
Arkadi | 1:2b61ae8e6f94 | 446 | // } |
Arkadi | 1:2b61ae8e6f94 | 447 | //} // end rxCallback |