ReSpeaker Switch V02

Dependencies:   mbed MbedJSONValue

Revision:
13:b80d07c4f6e6
Parent:
12:1b8560db3dff
--- a/main.cpp	Mon Aug 27 12:18:51 2018 +0000
+++ b/main.cpp	Sat Jun 08 11:04:53 2019 +0000
@@ -1,6 +1,6 @@
 ////////////////////////////////////////
-//      Tau_ReSpeaker_Sitch_V01       //
-//  Arkadiraf@gmail.com - 26/08/2018  //
+//      Tau_ReSpeaker_Sitch_V02       //
+//  Arkadiraf@gmail.com - 08/06/2019  //
 ////////////////////////////////////////
 /*
  json format: json:{"name":"auto"}                               - automatic mode
@@ -8,25 +8,19 @@
 */
 
 /*
-    Bugs:
-    PA_14 and PA_13 are share with stlink - not available as interrupt pins
-    Used in polling mode instead
-    didnt switch to spk 5 - changed spk limits in auto switch perhaps this was the issue.
-*/
-/*
    Board : Nucleo STM32F446RE
-   Power Source : USB || Jumper 5V source from STM32 DSP board
+   Power Source : DC-DC 5V Regulator E5V Jumper
 */
 
 /*
     Nucleo board modification:
-    to use PH_0(MUX_S2) as IO modify boards as followed:
+    XBee UART Shield
+    SB13 , SB14 Off
+    SB62 , SB63 On
+
+    to use PH_0 / PH_1 (MUX_S2/S3) as IO modify boards as followed:
     SB54 and SB55 ON
     SB16 and SB50 (MCO) OFF
-
-    For use GPIO PC15 , PC14
-    SB48 and SB49 ON
-    R34 and R36 removed
     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
 */
 
@@ -40,12 +34,12 @@
     PC_10 (Tx) --> SW_Rx
     PC_11 (Rx) --> SW_Tx
 
-    I2C_Bus
-    PB_8 --> SCL
-    PB_9 --> SDA
+    Digital output :
+    PA_5  --> led
+    PC_8  --> led1
+    PC_6  --> led2
+    PA_15 --> TRIG
 
-    Digital output :
-    PA_5  --> led (DigitalOut)
 
     MUX: CD74HC4067
     PC_12 --> MUX_S0
@@ -64,11 +58,11 @@
     PA_10 --> DSP_Trigger
 
     MIC Interrupts:
-    PC_15 --> INTER_1
-    PC_14 --> INTER_2
-    PA_15 --> INTER_3
-    PA_14 --> INTER_4
-    PA_13 --> INTER_5
+    PA_6 --> INTER_1
+    PA_7 --> INTER_2
+    PB_6 --> INTER_3
+    PC_7 --> INTER_4
+    PA_9 --> INTER_5
 
     Digital Input
     PC_13 --> BTN (Blue)
@@ -132,6 +126,9 @@
 
 // digital output
 DigitalOut led(PA_5);
+DigitalOut led1(PC_8);
+DigitalOut led2(PC_6);
+DigitalOut trigger(PA_15);
 
 // interrup from dsp mcu (frequency counter)
 InterruptIn dsp_trigger(PA_10);
@@ -150,11 +147,11 @@
 DigitalOut en_spk_5(PB_13);
 
 // MIC interrupts
-DigitalIn inter_1(PC_15 , PullDown);
-DigitalIn inter_2(PC_14 , PullDown);
-DigitalIn inter_3(PA_15 , PullDown);
-DigitalIn inter_4(PA_14 , PullDown);
-DigitalIn inter_5(PA_13 , PullDown);
+DigitalIn inter_1(PA_6, PullDown);
+DigitalIn inter_2(PA_7, PullDown);
+DigitalIn inter_3(PB_6, PullDown);
+DigitalIn inter_4(PC_7, PullDown);
+DigitalIn inter_5(PA_9, PullDown);
 
 // analog input
 AnalogIn a_data_1(PA_0);
@@ -302,11 +299,12 @@
                 pc.printf("{\"event\":\"micInt\",\"mic\":%d,\"time\":%.3f}\r\n",micInterrupt,callTime); // Printf generates delay of about 5 millis
 
                 // led blink
-                led = !led;
+                led2 = !led2;
                 //wait(0.1);
-                // reset micInterrupt flag
-                micInterrupt=0;
             }
+            // reset micInterrupt flag
+            trigger = 0; // pull trigger down
+            micInterrupt=0;
         }
     }// end main loop
 }// end main
@@ -339,6 +337,10 @@
     // update hardware
     // update mic select mux
     uint8_t micByte = (uint8_t) micChannle;
+    // flip mic order around 3, I guess it is the stupidest implementation but hey :) tada.
+    if (micByte != 0) {
+        micByte = ((~(micByte + 0b00001001)) & 0b00001111);
+    }
     mux_s0.write((bool)(micByte & 0b00000001));
     mux_s1.write((bool)(micByte & 0b00000010));
     mux_s2.write((bool)(micByte & 0b00000100));
@@ -398,22 +400,27 @@
     if (inter_1.read() && (micInterrupt != 1)) {
         eventFlag=1;
         micInterrupt=1;
+        trigger=1;
     }
     if (inter_2.read() && (micInterrupt != 2)) {
         eventFlag=1;
         micInterrupt=2;
+        trigger=1;
     }
     if (inter_3.read() && (micInterrupt != 3)) {
         eventFlag=1;
         micInterrupt=3;
+        trigger=1;
     }
     if (inter_4.read() && (micInterrupt != 4)) {
         eventFlag=1;
         micInterrupt=4;
+        trigger=1;
     }
     if (inter_5.read() && (micInterrupt != 5)) {
         eventFlag=1;
         micInterrupt=5;
+        trigger=1;
     }
     return eventFlag;
 }
@@ -432,14 +439,14 @@
 {
     while (pc.readable()) {
         // read icoming
-        //led = !led;
+        led = !led;
         uint8_t in_byte = pc.getc();
 #ifdef DEBUG_MOD1
         pc.putc(in_byte);
 #endif
         // detect start message , end message
         switch (packetMSG.syncFlag) {
-                // waiting for header
+            // waiting for header
             case 0: {
                 if (packetMSG.header[packetMSG.syncIndex] == in_byte) {
                     packetMSG.syncIndex++;
@@ -565,7 +572,13 @@
             autoFlag=0;
             // update controls
             switchPacket();
-        } else if ((targetName == "dsp") || (targetName == "dspParam") || (targetName == "dspFilter")) {
+        } else if ((targetName == "dsp") || (targetName == "dspParam") || (targetName == "dspFilter") || (targetName == "dspPlay")) {
+            if (targetName == "dspPlay"){
+                // if target is to play a sound, trigger the daq to record.
+                trigger = 1;
+                wait(0.001);
+                trigger = 0; 
+            }
             // send msg to dsp
             dsp.printf("json:%s", json);
 #ifdef DEBUG_MOD2
@@ -586,7 +599,7 @@
         pc.printf("Error: %s", json);
     }
     // led blink
-    led = !led;
+    led1 = !led1;
 }// end parse
 
 // switch Packet Handler
@@ -603,7 +616,7 @@
 
     // get loop frequency calculator flag
     loopFreqFlag = guiCmd["LoopFreq"].get<bool>();
-    
+
     // get speakers output
     for (int ii=0 ; ii < 5 ; ii++) {
         spkChannle[ii] = guiCmd["spk"][ii].get<bool>();
@@ -615,6 +628,10 @@
     // update hardware
     // update mic select mux
     uint8_t micByte = (uint8_t) micChannle;
+    // flip mic order around 3, I guess it is the stupidest implementation but hey :) tada.
+    if (micByte != 0) {
+        micByte = ((~(micByte + 0b00001001)) & 0b00001111);
+    }
     mux_s0.write((bool)(micByte & 0b00000001));
     mux_s1.write((bool)(micByte & 0b00000010));
     mux_s2.write((bool)(micByte & 0b00000100));