Tau ReSpeaker Setup V01

Dependencies:   MbedJSONValue mbed

Fork of TAU_ReSpeaker_DSP_Test by Yossi_Students

Committer:
Arkadi
Date:
Sun Aug 26 09:55:14 2018 +0000
Revision:
9:7e20c1e5a354
Parent:
8:8a3e6241c104
Child:
10:273127efdc6e
added frequency counter feature

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Arkadi 0:bfac05b2d50f 1 ////////////////////////////////////////
Arkadi 1:574b54755983 2 // Tau_ReSpeaker_DSP V01 //
Arkadi 9:7e20c1e5a354 3 // Arkadiraf@gmail.com - 26/08/2018 //
Arkadi 0:bfac05b2d50f 4 ////////////////////////////////////////
Arkadi 0:bfac05b2d50f 5 /*
Arkadi 5:ec6f2323a263 6 Json Format: json:{"name":"dsp","mode":"off"}\r\n
Arkadi 2:59c1a24aed7c 7 */
Arkadi 1:574b54755983 8
Arkadi 3:48258b86e182 9
Arkadi 0:bfac05b2d50f 10
Arkadi 0:bfac05b2d50f 11 /*
Arkadi 0:bfac05b2d50f 12 Board : Nucleo STM32F446RE
Arkadi 0:bfac05b2d50f 13 Power Source : USB
Arkadi 0:bfac05b2d50f 14 */
Arkadi 0:bfac05b2d50f 15
Arkadi 0:bfac05b2d50f 16 /*
Arkadi 0:bfac05b2d50f 17 Pinout:
Arkadi 0:bfac05b2d50f 18 PC - Serial 2
Arkadi 0:bfac05b2d50f 19 PA_2 (Tx) --> STLINK
Arkadi 0:bfac05b2d50f 20 PA_3 (Rx) --> STLINK
Arkadi 0:bfac05b2d50f 21
Arkadi 0:bfac05b2d50f 22 Switch - Serial 3
Arkadi 0:bfac05b2d50f 23 PC_10 (Tx) --> SW_Rx
Arkadi 0:bfac05b2d50f 24 PC_11 (Rx) --> SW_Tx
Arkadi 0:bfac05b2d50f 25
Arkadi 0:bfac05b2d50f 26 I2C_Bus
Arkadi 0:bfac05b2d50f 27 PB_8 --> SCL
Arkadi 0:bfac05b2d50f 28 PB_9 --> SDA
Arkadi 0:bfac05b2d50f 29
Arkadi 0:bfac05b2d50f 30 Digital output
Arkadi 0:bfac05b2d50f 31 PA_5 --> led (DigitalOut)
Arkadi 9:7e20c1e5a354 32 PA_10 --> DSP_Trigger
Arkadi 9:7e20c1e5a354 33
Arkadi 0:bfac05b2d50f 34 Digital Input
Arkadi 0:bfac05b2d50f 35 PC_13 --> BTN (Blue)
Arkadi 0:bfac05b2d50f 36
Arkadi 1:574b54755983 37 PA_6 --> Toggle Pin (Loop Freq D12)
Arkadi 1:574b54755983 38
Arkadi 0:bfac05b2d50f 39 Analog Input
Arkadi 1:574b54755983 40 PA_0 --> SIG_IN_DSP (A0)
Arkadi 0:bfac05b2d50f 41
Arkadi 0:bfac05b2d50f 42 Analog Output
Arkadi 1:574b54755983 43 PA_4 --> SIG_OUT_DSP (A2)
Arkadi 0:bfac05b2d50f 44
Arkadi 0:bfac05b2d50f 45 */
Arkadi 0:bfac05b2d50f 46
Arkadi 0:bfac05b2d50f 47 ///////////////
Arkadi 0:bfac05b2d50f 48 // Libraries //
Arkadi 0:bfac05b2d50f 49 ///////////////
Arkadi 0:bfac05b2d50f 50 #include "mbed.h"
Arkadi 1:574b54755983 51 #include "MbedJSONValue.h"
Arkadi 0:bfac05b2d50f 52
Arkadi 0:bfac05b2d50f 53 ///////////////
Arkadi 0:bfac05b2d50f 54 // #defines //
Arkadi 0:bfac05b2d50f 55 ///////////////
Arkadi 1:574b54755983 56 // UART debug modes:
Arkadi 1:574b54755983 57 //#define DEBUG_MOD1 // json packet recognise
Arkadi 1:574b54755983 58 #define DEBUG_MOD2 // json parse
Arkadi 1:574b54755983 59 #define DEBUG_MOD3 // dsp handler
Arkadi 5:ec6f2323a263 60 #define DEBUG_MOD10 // responsivity msges to gui
Arkadi 6:e8b4ca41c691 61 #define DEBUG_MOD11 // loop frequency indicator
Arkadi 0:bfac05b2d50f 62 // Sine generator
Arkadi 1:574b54755983 63 #define PI_DOUBLE (3.141592653589793238462)
Arkadi 1:574b54755983 64 #define PI_FLOAT (3.14159f)
Arkadi 1:574b54755983 65
Arkadi 1:574b54755983 66 // json commad
Arkadi 1:574b54755983 67 #define MSG_BUFFER_SIZE 512
Arkadi 1:574b54755983 68 #define HEADER_SIZE 5
Arkadi 1:574b54755983 69 #define FOOTER_SIZE 2
Arkadi 0:bfac05b2d50f 70
Arkadi 9:7e20c1e5a354 71 // Frequency counter
Arkadi 9:7e20c1e5a354 72 #define TICKS2TOGGLE 1000000
Arkadi 0:bfac05b2d50f 73 /////////////
Arkadi 0:bfac05b2d50f 74 // Objects //
Arkadi 0:bfac05b2d50f 75 /////////////
Arkadi 1:574b54755983 76 // json
Arkadi 1:574b54755983 77 MbedJSONValue guiCmd;
Arkadi 0:bfac05b2d50f 78
Arkadi 0:bfac05b2d50f 79 // uart
Arkadi 1:574b54755983 80 Serial pc(USBTX, USBRX);
Arkadi 0:bfac05b2d50f 81
Arkadi 2:59c1a24aed7c 82 // uart switch_dsp
Arkadi 2:59c1a24aed7c 83 Serial switch_dsp(PC_10, PC_11);
Arkadi 2:59c1a24aed7c 84
Arkadi 0:bfac05b2d50f 85 // digital
Arkadi 0:bfac05b2d50f 86 DigitalIn user_button(PC_13);
Arkadi 9:7e20c1e5a354 87 DigitalOut dsp_trigger(PA_10);// D2
Arkadi 8:8a3e6241c104 88 DigitalOut led(PA_5); // D13
Arkadi 8:8a3e6241c104 89 DigitalOut mytoggle(PA_6); // D12
Arkadi 0:bfac05b2d50f 90
Arkadi 1:574b54755983 91 // analog / define to init at mbed initialization. work directly with registers
Arkadi 0:bfac05b2d50f 92 AnalogOut dsp_output(PA_4);
Arkadi 0:bfac05b2d50f 93 AnalogIn dsp_input(PA_0);
Arkadi 0:bfac05b2d50f 94
Arkadi 1:574b54755983 95
Arkadi 1:574b54755983 96 // ADC/DAC declarations
Arkadi 1:574b54755983 97 ADC_HandleTypeDef hadc1;
Arkadi 1:574b54755983 98 DAC_HandleTypeDef hdac1;
Arkadi 1:574b54755983 99
Arkadi 0:bfac05b2d50f 100 ///////////////
Arkadi 0:bfac05b2d50f 101 // variables //
Arkadi 0:bfac05b2d50f 102 ///////////////
Arkadi 0:bfac05b2d50f 103
Arkadi 9:7e20c1e5a354 104 // Frequency counter
Arkadi 9:7e20c1e5a354 105 uint32_t toggleCounter = 0;
Arkadi 9:7e20c1e5a354 106 // toogle pin state
Arkadi 9:7e20c1e5a354 107 bool toggleCounterState = 0;
Arkadi 9:7e20c1e5a354 108
Arkadi 1:574b54755983 109 // json buffer
Arkadi 1:574b54755983 110 char json[MSG_BUFFER_SIZE];
Arkadi 1:574b54755983 111
Arkadi 1:574b54755983 112 // packet variables
Arkadi 1:574b54755983 113 struct packetMSG_struct {
Arkadi 1:574b54755983 114 // recieve message variables
Arkadi 1:574b54755983 115 uint8_t header[HEADER_SIZE];
Arkadi 1:574b54755983 116 uint8_t footer[FOOTER_SIZE];
Arkadi 1:574b54755983 117 uint8_t syncIndex; // sync index for header / footer
Arkadi 1:574b54755983 118 uint8_t syncFlag; // 0 - waiting for header, 1 - waiting for footer, 2 - verify footer, 3 - finish footer send to parser, flash buffer
Arkadi 1:574b54755983 119 // buffer
Arkadi 1:574b54755983 120 uint16_t bufferIndex; // buffer index
Arkadi 1:574b54755983 121 uint8_t buffer[MSG_BUFFER_SIZE];
Arkadi 1:574b54755983 122 } ;
Arkadi 1:574b54755983 123 packetMSG_struct packetMSG;
Arkadi 1:574b54755983 124
Arkadi 1:574b54755983 125
Arkadi 1:574b54755983 126 // Dac Register for direct method of setting DAC value`s
Arkadi 1:574b54755983 127 __IO uint32_t Dac_Reg = 0;
Arkadi 1:574b54755983 128
Arkadi 0:bfac05b2d50f 129 // analog input
Arkadi 8:8a3e6241c104 130 //uint16_t adc_in=0;
Arkadi 0:bfac05b2d50f 131
Arkadi 1:574b54755983 132 // toogle pin state
Arkadi 1:574b54755983 133 bool toggelState=0;
Arkadi 1:574b54755983 134
Arkadi 1:574b54755983 135 // create function pointer
Arkadi 1:574b54755983 136 typedef void(*functionPtr)(void);
Arkadi 1:574b54755983 137 functionPtr FilterFunction;
Arkadi 1:574b54755983 138
Arkadi 3:48258b86e182 139 // alternative functuin selection (faster mcu process)
Arkadi 5:ec6f2323a263 140 volatile uint8_t operationMode = 1;
Arkadi 4:59319802012b 141 // 0 - off
Arkadi 4:59319802012b 142 // 1 - passthrough - no filter
Arkadi 4:59319802012b 143 // 2 - highpass - High Pass filter
Arkadi 4:59319802012b 144 // 3 - hpf_trig - High Pass filter + Trigger mode
Arkadi 7:25c81cb23e42 145 // 4 - gains_trig - highpass filter + trigger mode + Gains vector
Arkadi 3:48258b86e182 146
Arkadi 5:ec6f2323a263 147
Arkadi 5:ec6f2323a263 148 // Trigger mode variables
Arkadi 8:8a3e6241c104 149 float signalGain = 1.0; // Signal Gain
Arkadi 8:8a3e6241c104 150 float trigTresh = 0.5; // threshold for trigger mode
Arkadi 8:8a3e6241c104 151 uint32_t trigDelaySet = 5000; // counter for pulse pass
Arkadi 5:ec6f2323a263 152 uint32_t trigDelay = trigDelaySet; // counter for pulse pass
Arkadi 8:8a3e6241c104 153 uint32_t trigPause = 10; // pause after trigger in microseconds
Arkadi 5:ec6f2323a263 154
Arkadi 8:8a3e6241c104 155 // Buffer mode variables
Arkadi 8:8a3e6241c104 156 uint32_t bufferSizeSet = 5000;
Arkadi 8:8a3e6241c104 157 uint32_t bufferSize = bufferSizeSet;
Arkadi 8:8a3e6241c104 158 uint32_t preBufferSizeSet = 1000;
Arkadi 8:8a3e6241c104 159 uint32_t bufferCountDown = bufferSizeSet - preBufferSizeSet;
Arkadi 8:8a3e6241c104 160 float bufferADC[5000] = {0};
Arkadi 9:7e20c1e5a354 161
Arkadi 9:7e20c1e5a354 162
Arkadi 0:bfac05b2d50f 163 ///////////////
Arkadi 0:bfac05b2d50f 164 // Functions //
Arkadi 0:bfac05b2d50f 165 ///////////////
Arkadi 0:bfac05b2d50f 166
Arkadi 1:574b54755983 167 // init functions header //hadc1 needs to be defined preiod #incude
Arkadi 1:574b54755983 168 #include "adc_init.h" // initialize adc/dac directly for continious sample
Arkadi 1:574b54755983 169 #include "filters.h"
Arkadi 1:574b54755983 170
Arkadi 1:574b54755983 171 // nop operation
Arkadi 1:574b54755983 172 inline void NOP()
Arkadi 1:574b54755983 173 {
Arkadi 1:574b54755983 174 __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess
Arkadi 1:574b54755983 175 }
Arkadi 1:574b54755983 176
Arkadi 1:574b54755983 177 // Serial Event function
Arkadi 1:574b54755983 178 void rxCallback(void);
Arkadi 1:574b54755983 179
Arkadi 1:574b54755983 180 // initialize packet struct
Arkadi 1:574b54755983 181 void initPacket(void);
Arkadi 1:574b54755983 182
Arkadi 1:574b54755983 183 // Packet Parser
Arkadi 1:574b54755983 184 void parsePacket(void);
Arkadi 1:574b54755983 185
Arkadi 1:574b54755983 186 // DSP Packet Handler
Arkadi 1:574b54755983 187 void dspPacket(void);
Arkadi 1:574b54755983 188
Arkadi 8:8a3e6241c104 189 // DSP Param Packet Handler
Arkadi 8:8a3e6241c104 190 void dspParamPacket(void);
Arkadi 8:8a3e6241c104 191
Arkadi 1:574b54755983 192 // initialize DSP
Arkadi 1:574b54755983 193 void initDSP(void);
Arkadi 0:bfac05b2d50f 194
Arkadi 0:bfac05b2d50f 195 ////////////////////////
Arkadi 0:bfac05b2d50f 196 // Main Code Setup : //
Arkadi 0:bfac05b2d50f 197 ////////////////////////
Arkadi 0:bfac05b2d50f 198 int main()
Arkadi 0:bfac05b2d50f 199 {
Arkadi 1:574b54755983 200 // init packet:
Arkadi 1:574b54755983 201 initPacket();
Arkadi 1:574b54755983 202
Arkadi 1:574b54755983 203 // initialize DSP
Arkadi 1:574b54755983 204 initDSP();
Arkadi 1:574b54755983 205
Arkadi 0:bfac05b2d50f 206 pc.baud(57600);
Arkadi 2:59c1a24aed7c 207 switch_dsp.baud(57600);
Arkadi 2:59c1a24aed7c 208
Arkadi 2:59c1a24aed7c 209
Arkadi 2:59c1a24aed7c 210 // pc is used for debbuging, in application mode the commands are from the switch_dsp.
Arkadi 1:574b54755983 211 // attach serial event interrupt
Arkadi 1:574b54755983 212 pc.attach(&rxCallback, Serial::RxIrq);
Arkadi 2:59c1a24aed7c 213
Arkadi 2:59c1a24aed7c 214 // attach serial event interrupt
Arkadi 2:59c1a24aed7c 215 switch_dsp.attach(&rxCallback, Serial::RxIrq);
Arkadi 2:59c1a24aed7c 216
Arkadi 0:bfac05b2d50f 217 #ifdef DEBUG_MOD1
Arkadi 0:bfac05b2d50f 218 pc.printf("ReSpeaker Test \r\n");
Arkadi 0:bfac05b2d50f 219 #endif
Arkadi 0:bfac05b2d50f 220
Arkadi 0:bfac05b2d50f 221 ///////////////////////
Arkadi 0:bfac05b2d50f 222 // Main Code Loop : //
Arkadi 0:bfac05b2d50f 223 ///////////////////////
Arkadi 0:bfac05b2d50f 224 while(1) {
Arkadi 1:574b54755983 225 // run selected filter
Arkadi 3:48258b86e182 226 if (operationMode == 0) {
Arkadi 4:59319802012b 227 offMode();
Arkadi 3:48258b86e182 228 } else if (operationMode == 1) {
Arkadi 4:59319802012b 229 passthrough();
Arkadi 4:59319802012b 230 } else if (operationMode == 2) {
Arkadi 4:59319802012b 231 highpass();
Arkadi 4:59319802012b 232 } else if (operationMode == 3) {
Arkadi 4:59319802012b 233 highpassTrig();
Arkadi 7:25c81cb23e42 234 } else if (operationMode == 4) {
Arkadi 7:25c81cb23e42 235 GainsTrig();
Arkadi 3:48258b86e182 236 }
Arkadi 4:59319802012b 237 //highpass_filter();
Arkadi 3:48258b86e182 238 // more elegant but much slower option:
Arkadi 3:48258b86e182 239 //FilterFunction();
Arkadi 1:574b54755983 240 #ifdef DEBUG_MOD11
Arkadi 1:574b54755983 241 // toggle pin, Loop frequency indicator
Arkadi 1:574b54755983 242 toggelState=!toggelState;
Arkadi 1:574b54755983 243 mytoggle.write(toggelState);
Arkadi 1:574b54755983 244 #endif
Arkadi 9:7e20c1e5a354 245 // Frequency counter
Arkadi 9:7e20c1e5a354 246 toggleCounter++;
Arkadi 9:7e20c1e5a354 247 if (toggleCounter == TICKS2TOGGLE){
Arkadi 9:7e20c1e5a354 248 toggleCounter=0;
Arkadi 9:7e20c1e5a354 249 toggleCounterState = !toggleCounterState;
Arkadi 9:7e20c1e5a354 250 dsp_trigger.write(toggleCounterState);
Arkadi 9:7e20c1e5a354 251 }
Arkadi 3:48258b86e182 252 } // end loop
Arkadi 3:48258b86e182 253 } // end main
Arkadi 0:bfac05b2d50f 254
Arkadi 0:bfac05b2d50f 255 ///////////////
Arkadi 0:bfac05b2d50f 256 // Functions //
Arkadi 0:bfac05b2d50f 257 ///////////////
Arkadi 0:bfac05b2d50f 258
Arkadi 1:574b54755983 259 // initialize DSP
Arkadi 1:574b54755983 260 void initDSP(void)
Arkadi 1:574b54755983 261 {
Arkadi 1:574b54755983 262 // init dac
Arkadi 1:574b54755983 263 ADC1_Init();
Arkadi 1:574b54755983 264 DAC1_Init();
Arkadi 1:574b54755983 265
Arkadi 1:574b54755983 266 HAL_ADC_Start(&hadc1);
Arkadi 1:574b54755983 267 HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
Arkadi 1:574b54755983 268
Arkadi 1:574b54755983 269 // define Dac Register for direct method of setting DAC value`s
Arkadi 1:574b54755983 270 Dac_Reg = (uint32_t) (hdac1.Instance);
Arkadi 1:574b54755983 271 Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R);
Arkadi 1:574b54755983 272
Arkadi 1:574b54755983 273 // intialize filter function pointer
Arkadi 5:ec6f2323a263 274 FilterFunction = passthrough;//highpass_filter;
Arkadi 6:e8b4ca41c691 275 operationMode = 0 ;
Arkadi 1:574b54755983 276 }
Arkadi 1:574b54755983 277
Arkadi 1:574b54755983 278 // Serial Event function
Arkadi 1:574b54755983 279 void rxCallback(void)
Arkadi 0:bfac05b2d50f 280 {
Arkadi 2:59c1a24aed7c 281 while ((pc.readable()) || (switch_dsp.readable())) {
Arkadi 1:574b54755983 282 // read icoming
Arkadi 2:59c1a24aed7c 283 uint8_t in_byte=0;
Arkadi 1:574b54755983 284 //led = !led;
Arkadi 2:59c1a24aed7c 285 if (pc.readable()) {
Arkadi 2:59c1a24aed7c 286 in_byte = pc.getc();
Arkadi 2:59c1a24aed7c 287 } else if (switch_dsp.readable()) {
Arkadi 2:59c1a24aed7c 288 in_byte = switch_dsp.getc();
Arkadi 2:59c1a24aed7c 289 }
Arkadi 1:574b54755983 290 #ifdef DEBUG_MOD1
Arkadi 1:574b54755983 291 pc.putc(in_byte);
Arkadi 1:574b54755983 292 #endif
Arkadi 1:574b54755983 293 // detect start message , end message
Arkadi 1:574b54755983 294 switch (packetMSG.syncFlag) {
Arkadi 1:574b54755983 295 // waiting for header
Arkadi 1:574b54755983 296 case 0: {
Arkadi 1:574b54755983 297 if (packetMSG.header[packetMSG.syncIndex] == in_byte) {
Arkadi 1:574b54755983 298 packetMSG.syncIndex++;
Arkadi 1:574b54755983 299 if (packetMSG.syncIndex == HEADER_SIZE) { // finish header SYNC
Arkadi 1:574b54755983 300 packetMSG.syncFlag = 1; // start collecting data, wait for footer
Arkadi 1:574b54755983 301 packetMSG.bufferIndex = 0;
Arkadi 1:574b54755983 302 packetMSG.syncIndex=0;
Arkadi 1:574b54755983 303 }
Arkadi 1:574b54755983 304 } else { // reinit sync
Arkadi 1:574b54755983 305 packetMSG.syncIndex=0;
Arkadi 1:574b54755983 306 }
Arkadi 1:574b54755983 307 //pc.printf("case 0 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:574b54755983 308 break;
Arkadi 1:574b54755983 309 }
Arkadi 1:574b54755983 310 // waiting for footer
Arkadi 1:574b54755983 311 case 1: {
Arkadi 1:574b54755983 312 // add byte to buffer
Arkadi 1:574b54755983 313 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:574b54755983 314 packetMSG.bufferIndex++;
Arkadi 1:574b54755983 315 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:574b54755983 316 // reset buffer
Arkadi 1:574b54755983 317 packetMSG.bufferIndex = 0;
Arkadi 1:574b54755983 318 packetMSG.syncIndex = 0;
Arkadi 1:574b54755983 319 packetMSG.syncFlag = 0;
Arkadi 1:574b54755983 320 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:574b54755983 321 packetMSG.syncIndex++;
Arkadi 1:574b54755983 322 packetMSG.syncFlag=2; // move to verify footer
Arkadi 1:574b54755983 323 }
Arkadi 1:574b54755983 324 //pc.printf("case 2 , %d \r\n",packetMSG.syncIndex);
Arkadi 1:574b54755983 325 break;
Arkadi 1:574b54755983 326 }
Arkadi 1:574b54755983 327 // verify footer
Arkadi 1:574b54755983 328 case 2: {
Arkadi 1:574b54755983 329 // add byte to buffer
Arkadi 1:574b54755983 330 packetMSG.buffer[packetMSG.bufferIndex] = in_byte;
Arkadi 1:574b54755983 331 packetMSG.bufferIndex++;
Arkadi 1:574b54755983 332 if (packetMSG.bufferIndex >= MSG_BUFFER_SIZE) { // buffer overflow
Arkadi 1:574b54755983 333 // reset buffer
Arkadi 1:574b54755983 334 packetMSG.bufferIndex = 0;
Arkadi 1:574b54755983 335 packetMSG.syncIndex = 0;
Arkadi 1:574b54755983 336 packetMSG.syncFlag = 0;
Arkadi 1:574b54755983 337 } else if (packetMSG.footer[packetMSG.syncIndex] == in_byte) { // footer char recieved
Arkadi 1:574b54755983 338 packetMSG.syncIndex++;
Arkadi 1:574b54755983 339 if (packetMSG.syncIndex == FOOTER_SIZE) { // finish footer SYNC
Arkadi 1:574b54755983 340 packetMSG.syncFlag = 3;
Arkadi 1:574b54755983 341 // copy packet to json buffer
Arkadi 1:574b54755983 342 memcpy (&json, &packetMSG.buffer, packetMSG.bufferIndex);
Arkadi 1:574b54755983 343 json[packetMSG.bufferIndex]=NULL; // end with NULL to indicate end of string
Arkadi 1:574b54755983 344 // copy packet to json buffer with sprintf
Arkadi 1:574b54755983 345 //sprintf(json, "%.*s", packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 1:574b54755983 346 // send msg to parse.
Arkadi 1:574b54755983 347 parsePacket();
Arkadi 1:574b54755983 348 // reset buffer
Arkadi 1:574b54755983 349 packetMSG.bufferIndex = 0;
Arkadi 1:574b54755983 350 packetMSG.syncIndex = 0;
Arkadi 1:574b54755983 351 packetMSG.syncFlag = 0;
Arkadi 1:574b54755983 352 }
Arkadi 1:574b54755983 353 } else { // footer broke restart wait for footer
Arkadi 1:574b54755983 354 packetMSG.syncFlag=1;
Arkadi 1:574b54755983 355 // verify that it didnt broke on first footer char
Arkadi 1:574b54755983 356 if (packetMSG.footer[0] == in_byte) {
Arkadi 1:574b54755983 357 packetMSG.syncIndex=1;
Arkadi 1:574b54755983 358 } else {
Arkadi 1:574b54755983 359 packetMSG.syncIndex=0;
Arkadi 1:574b54755983 360 }
Arkadi 1:574b54755983 361 }
Arkadi 1:574b54755983 362 break;
Arkadi 1:574b54755983 363 }
Arkadi 1:574b54755983 364 default: {
Arkadi 1:574b54755983 365 pc.printf("Sonmething went wrong \r\n");
Arkadi 1:574b54755983 366 break;
Arkadi 1:574b54755983 367 }
Arkadi 1:574b54755983 368 } // end switch
Arkadi 1:574b54755983 369 }// end uart readable
Arkadi 1:574b54755983 370 } // end rxCallback
Arkadi 1:574b54755983 371
Arkadi 1:574b54755983 372 // initialize packet struct
Arkadi 1:574b54755983 373 void initPacket(void)
Arkadi 1:574b54755983 374 {
Arkadi 1:574b54755983 375 // init variables to default:
Arkadi 1:574b54755983 376 packetMSG.header[0] = 'j';
Arkadi 1:574b54755983 377 packetMSG.header[1] = 's';
Arkadi 1:574b54755983 378 packetMSG.header[2] = 'o';
Arkadi 1:574b54755983 379 packetMSG.header[3] = 'n';
Arkadi 1:574b54755983 380 packetMSG.header[4] = ':';
Arkadi 1:574b54755983 381
Arkadi 1:574b54755983 382 packetMSG.footer[0]= 13; // /r
Arkadi 1:574b54755983 383 packetMSG.footer[1]= 10; // /n
Arkadi 1:574b54755983 384
Arkadi 1:574b54755983 385 packetMSG.syncIndex=0; // sync index for header / footer
Arkadi 1:574b54755983 386 packetMSG.syncFlag=0; // 0 - waiting for header, 1 - waiting for footer, 2 - verify footer, 3 - finish footer send to parser, flash buffer
Arkadi 1:574b54755983 387 packetMSG.bufferIndex=0; // buffer index
Arkadi 1:574b54755983 388 }// end init Packet struct
Arkadi 1:574b54755983 389
Arkadi 1:574b54755983 390
Arkadi 1:574b54755983 391
Arkadi 1:574b54755983 392 // Packet Parser
Arkadi 1:574b54755983 393 void parsePacket(void)
Arkadi 1:574b54755983 394 {
Arkadi 1:574b54755983 395 string targetName;
Arkadi 1:574b54755983 396 #ifdef DEBUG_MOD2
Arkadi 1:574b54755983 397 // write buffer to screen
Arkadi 1:574b54755983 398 //pc.printf("%d, %.*s", packetMSG.bufferIndex ,packetMSG.bufferIndex, packetMSG.buffer );
Arkadi 1:574b54755983 399 pc.printf("%s", json);
Arkadi 1:574b54755983 400 #endif
Arkadi 1:574b54755983 401
Arkadi 1:574b54755983 402 // GUI message format Switch: {"name":"switch","mic":0, "spk": [0,1,0,0,0]}
Arkadi 1:574b54755983 403 parse(guiCmd, json);
Arkadi 1:574b54755983 404
Arkadi 1:574b54755983 405 // get target:
Arkadi 1:574b54755983 406 targetName = guiCmd["name"].get<string>(); // switch / dsp
Arkadi 1:574b54755983 407
Arkadi 1:574b54755983 408 #ifdef DEBUG_MOD2
Arkadi 1:574b54755983 409 // send parsed values
Arkadi 1:574b54755983 410 pc.printf("targetName: %s \r\n", targetName.c_str());
Arkadi 1:574b54755983 411 #endif
Arkadi 1:574b54755983 412
Arkadi 1:574b54755983 413 // select handler based on target mcu
Arkadi 1:574b54755983 414 if (targetName == "dsp") {
Arkadi 1:574b54755983 415 dspPacket();
Arkadi 8:8a3e6241c104 416 } else if (targetName == "dspParam") {
Arkadi 8:8a3e6241c104 417 dspParamPacket();
Arkadi 1:574b54755983 418 } else {
Arkadi 1:574b54755983 419 #ifdef DEBUG_MOD2
Arkadi 1:574b54755983 420 // unrecognised target
Arkadi 1:574b54755983 421 pc.printf("unrecognised target: %s \r\n", targetName.c_str());
Arkadi 1:574b54755983 422 #endif
Arkadi 0:bfac05b2d50f 423 }
Arkadi 1:574b54755983 424 // led blink
Arkadi 1:574b54755983 425 led = !led;
Arkadi 1:574b54755983 426 }// end parse
Arkadi 1:574b54755983 427
Arkadi 1:574b54755983 428 // DSP Packet Handler
Arkadi 1:574b54755983 429 void dspPacket(void)
Arkadi 1:574b54755983 430 {
Arkadi 1:574b54755983 431 string modeType;
Arkadi 4:59319802012b 432 // get operation mode
Arkadi 1:574b54755983 433 modeType = guiCmd["mode"].get<string>();
Arkadi 1:574b54755983 434
Arkadi 1:574b54755983 435 #ifdef DEBUG_MOD10
Arkadi 1:574b54755983 436 // send parsed values
Arkadi 4:59319802012b 437 pc.printf("mode: %s\r\n", modeType.c_str());
Arkadi 8:8a3e6241c104 438 //switch_dsp.printf("mode: %s\r\n", modeType.c_str());
Arkadi 1:574b54755983 439 #endif
Arkadi 1:574b54755983 440 // selected operation mode
Arkadi 4:59319802012b 441 if ( modeType == "off" ) {
Arkadi 4:59319802012b 442 FilterFunction = offMode;
Arkadi 3:48258b86e182 443 operationMode = 0 ;
Arkadi 4:59319802012b 444 } else if( modeType == "passthrough" ) {
Arkadi 4:59319802012b 445 FilterFunction = passthrough;
Arkadi 3:48258b86e182 446 operationMode = 1 ;
Arkadi 8:8a3e6241c104 447 } else if( modeType == "highpass" ) {
Arkadi 4:59319802012b 448 FilterFunction = highpass;
Arkadi 4:59319802012b 449 operationMode = 2 ;
Arkadi 8:8a3e6241c104 450 } else if( modeType == "hpf_trig" ) {
Arkadi 4:59319802012b 451 FilterFunction = highpassTrig;
Arkadi 4:59319802012b 452 operationMode = 3 ;
Arkadi 8:8a3e6241c104 453 } else if( modeType == "gain_trig" ) {
Arkadi 7:25c81cb23e42 454 FilterFunction = GainsTrig;
Arkadi 7:25c81cb23e42 455 operationMode = 4 ;
Arkadi 1:574b54755983 456 } else {
Arkadi 4:59319802012b 457 switch_dsp.printf("undefined mode %s \r\n", modeType.c_str());
Arkadi 4:59319802012b 458 FilterFunction = offMode;
Arkadi 3:48258b86e182 459 operationMode = 0 ;
Arkadi 1:574b54755983 460 }
Arkadi 1:574b54755983 461
Arkadi 8:8a3e6241c104 462 }// end dspPacket
Arkadi 8:8a3e6241c104 463 // DSP Param Packet Handler
Arkadi 8:8a3e6241c104 464 void dspParamPacket(void)
Arkadi 8:8a3e6241c104 465 {
Arkadi 8:8a3e6241c104 466 // get values.
Arkadi 8:8a3e6241c104 467 signalGain = ((float)guiCmd["gain"].get<int>())/1000; // issue in parsing doubles when the number is round
Arkadi 8:8a3e6241c104 468 trigTresh = ((float)guiCmd["trigTresh"].get<int>()) / 100.0f;
Arkadi 8:8a3e6241c104 469 trigDelaySet = (uint32_t)guiCmd["trigPass"].get<int>();
Arkadi 8:8a3e6241c104 470 trigPause = (uint32_t)guiCmd["trigPause"].get<int>();
Arkadi 8:8a3e6241c104 471
Arkadi 8:8a3e6241c104 472 trigDelay = trigDelaySet;
Arkadi 8:8a3e6241c104 473 #ifdef DEBUG_MOD10
Arkadi 8:8a3e6241c104 474 // send parsed values
Arkadi 8:8a3e6241c104 475 pc.printf("SignalGain: %f , trigTresh: %f , trigDelaySet %d , trigPause: %d\r\n", signalGain , trigTresh , trigDelaySet , trigPause);
Arkadi 8:8a3e6241c104 476 #endif
Arkadi 8:8a3e6241c104 477
Arkadi 8:8a3e6241c104 478 } // end dspParamPacket