Tau ReSpeaker Setup V01

Dependencies:   MbedJSONValue mbed

Fork of TAU_ReSpeaker_DSP_Test by Yossi_Students

Committer:
Arkadi
Date:
Tue Aug 28 08:20:15 2018 +0000
Revision:
12:9d30df1529be
Parent:
11:07981b0d28d3
Implemented Filter / rearranged code

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