Projet S5 Info - Advanced

Dependencies:   TextLCD XBeeLib mbed-rtos mbed

Fork of Coordinateur by Vincent Belanger

Revision:
7:bd9bc9fa66c7
Parent:
6:59b0b6c1b5bb
Child:
8:120807be23b8
--- a/main.cpp	Wed Apr 06 20:15:52 2016 +0000
+++ b/main.cpp	Mon Apr 11 20:37:07 2016 +0000
@@ -1,19 +1,20 @@
 #include "mbed.h"
-#include "rtos.h"
 #include "XBeeLib.h"
-#include "SDFileSystem.h"
-#include "wave_player.h"
- 
+#include "TextLCD.h"
+#include "rtos.h"
+
 using namespace XBeeLib;
 
-SDFileSystem sd(p5, p6, p7, p8, "sd"); // MOSI, MISO, SCLK, SSEL
 PwmOut speaker(p21);
-AnalogIn GP2D12(p16);
-//wave_player player(&DACout);
+TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
+DigitalIn button_back(p28);
+DigitalIn button_enter(p29);
+DigitalIn button_next(p30);
+Ticker timer;
+int btn_b;
+int btn_e;
+int btn_n;
 Serial pc(USBTX, USBRX);
-float octaveMult=0.5;
-osThreadId threadIDC5;
-osThreadId threadIDG5;
 
 bool capt_1;
 bool capt_2;
@@ -21,189 +22,290 @@
 bool capt_4;
 bool capt_5;
 bool capt_6;
-    
-// 261.63 hz do
-// 293.66 Ré
-// 329.63 mi
-// 369.99 fa#
-// 415.30 sol#
-// 466.16 la#
-    
-const float DO =261.63;
-const float RE =293.66;
-const float MI =329.63;
-const float FA_SHARP =369.99;
-const float SOL_SHARP =415.30;
-const float LA_SHARP =466.16;
+uint8_t GP2D12_value = 0;
+
+const float DO = 261.63;
+const float RE = 293.66;
+const float MI = 329.63;
+const float FA_SHARP = 369.99;
+const float SOL_SHARP = 415.30;
+const float LA_SHARP = 466.16;
 
 const float DEMI_TON = 0.05946;
 
-uint8_t GP2D12_value = 0;
-
 float dutyCycle = 0.0002;
-int lastCapt=-1;
+float octaveMult = 2.0;
+int lastCapt = -1;
+Thread* thread_digital;
+Thread* thread_menu;
 
-static float findPeriod(float frequency, float vibrato){
+const char MainMenuText[2][16] = {"1. Volume", "2. Octave"};
+const char VolumeMenuText[4][16] = {"+1", "-1", "+10", "-10"};
+const char OctaveMenuText[3][16] = {"3", "4", "5"};
+const int maxMenuCount = 2;
+const int maxVolumeCount = 4;
+const int maxOctaveCount = 3;
+
+bool inMainMenu = true;
+
+int menuCount = 0;
+int itemCount = 0;
+
+static float findPeriod(float frequency, float vibrato)
+{
     float freq = frequency * octaveMult;
-    if (vibrato != 0){
-        if(vibrato < 0.5){
+    if (vibrato != 0) {
+        if(vibrato < 0.5) {
             freq = freq + (freq *  ( (0.5 - vibrato) * 2 * DEMI_TON));
         } else {
             freq = freq - (freq *  ( (vibrato - 0.5) * 2 * DEMI_TON));
         }
     }
-    
-    pc.printf("freq = %f, vib = %f, freqF = %f\n\r ", frequency, vibrato, freq);
-    
+
     return 1.0/freq;
 }
- 
-/** Callback function, invoked at packet reception */
+
+void timer_50swag()
+{
+    //thread_digital->signal_set(0x2);
+    thread_menu->signal_set(0x2);
+}
+
+void digitLect(void const *args)
+{
+    while(true)
+    {
+        btn_b = button_back;
+        btn_e = button_enter;
+        btn_n = button_next;
+    }
+    /*
+    while(true)
+    {
+        Thread::signal_wait(0x2);
+        if(btn_b != button_back || btn_e != button_enter || btn_n != button_next)
+        {
+            Thread::signal_wait(0x2);
+            if(btn_b != button_back)
+            {
+                btn_b = button_back;
+            }
+            if(btn_e != button_enter)
+            {
+                btn_e = button_enter;
+            }
+            if(btn_n != button_next)
+            {
+                btn_n = button_next;
+            }
+        }
+    }*/
+}
+
 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
 {
     const uint64_t remote_addr64 = remote.get_addr64();
- 
-    for (int i = 0; i < len; i++)
-    {
-        pc.printf("%02x ", data[i]);
-    }
-        
+
     capt_1 = (data[0] & 0b10000000);
     capt_2 = (data[0] & 0b01000000);
     capt_3 = (data[0] & 0b00100000);
     capt_4 = (data[0] & 0b00010000);
     capt_5 = (data[0] & 0b00001000);
     capt_6 = (data[0] & 0b00000100);
-    
+
     GP2D12_value = data[1];
-    
-    pc.printf("GP2D12(v1) = %x\r\n",GP2D12_value);
-    
-    if(GP2D12_value < 0x50){
+
+    if(GP2D12_value < 0x50) {
         GP2D12_value = 0;
-    }else {
+    } else {
         GP2D12_value -= 0x50;
     }
-    
-    pc.printf("GP2D12(v2) = %x\r\n",GP2D12_value);
+
     float pourcentageGP2D12 = float(GP2D12_value) / float(0x70);
-    
-    if(pourcentageGP2D12 > 1){
+
+    if(pourcentageGP2D12 > 1) {
         pourcentageGP2D12 = 1;
     }
-    /*
-    pc.printf("\r\n%i ", capt_1);
-    pc.printf("%i ", capt_2);
-    pc.printf("%i ", capt_3);
-    pc.printf("%i ", capt_4);
-    pc.printf("%i ", capt_5);
-    pc.printf("%i ", capt_6);
+
+    if(!capt_1) {
+        speaker.period(findPeriod(DO, pourcentageGP2D12));
 
-    pc.printf("\r\n");*/
-    
-    pc.printf("GP2D12(v3) = %x\r\n",GP2D12_value);
-    if(capt_1){
-        speaker.period(findPeriod(DO, pourcentageGP2D12));
-        
-        speaker=dutyCycle;
+        speaker = dutyCycle;
         lastCapt = 1;
-    } else if(capt_2) {
+    } else if(!capt_2) {
         speaker.period(findPeriod(RE, pourcentageGP2D12));
-        
-        speaker=dutyCycle;
+
+        speaker = dutyCycle;
         lastCapt = 2;
-    } else if(capt_3) {
+    } else if(!capt_3) {
         speaker.period(findPeriod(MI, pourcentageGP2D12));
-        
-        speaker=dutyCycle;
+
+        speaker = dutyCycle;
         lastCapt = 3;
-    pc.printf("mi \r\n");
-    } else if(capt_4) {
+    } else if(!capt_4) {
         speaker.period(findPeriod(FA_SHARP, pourcentageGP2D12));
-        
-        speaker=dutyCycle;
+
+        speaker = dutyCycle;
         lastCapt = 4;
-    } else if(capt_5) {
+    } else if(!capt_5) {
         speaker.period(findPeriod(SOL_SHARP, pourcentageGP2D12));
-        
-        speaker=dutyCycle;
+
+        speaker = dutyCycle;
         lastCapt = 5;
-    } else if(capt_6) {
+    } else if(!capt_6) {
         speaker.period(findPeriod(LA_SHARP, pourcentageGP2D12));
-        
-        speaker=dutyCycle;
+
+        speaker = dutyCycle;
         lastCapt = 6;
     } else {
-        speaker=0.0f;
+        speaker = 0.0f;
+    }
+}
+
+void nextItem(int menuCount, int itemCount, bool inMainMenu)
+{
+    lcd.cls();
+    if(inMainMenu) {
+        lcd.printf(MainMenuText[menuCount]);
+    } else if(!inMainMenu && menuCount == 0) {
+        lcd.printf(VolumeMenuText[itemCount]);
+    } else if(!inMainMenu && menuCount == 1) {
+        lcd.printf(OctaveMenuText[itemCount]);
+    } else {
+        lcd.printf("nextItem ERROR.");
     }
 }
 
-void playFile(const char* name)
+void enterMenu()
 {
-    /*
-    FILE *fp = fopen(name, "r");
-    if(fp == NULL) {
-        pc.printf("Could not open file for read\r\n");
-    }
-    else {
-        player.play(fp);
+    lcd.cls();
+    nextItem(menuCount, itemCount, inMainMenu);
+
+    if(menuCount == 0) {
+        switch (itemCount) {
+            case 0:
+                dutyCycle += 0.0001;
+                if (dutyCycle > 0.5)
+                {
+                    dutyCycle = 0.5;
+                }
+                break;
+            case 1:
+                dutyCycle -= 0.0001;
+                if (dutyCycle < 0)
+                {
+                    dutyCycle = 0;
+                }
+                break;
+            case 2:
+                dutyCycle += 0.001;
+                if (dutyCycle > 0.5)
+                {
+                    dutyCycle = 0.5;
+                }
+                break;
+            case 3:
+                dutyCycle -= 0.001;
+                if (dutyCycle < 0)
+                {
+                    dutyCycle = 0;
+                }
+                break;
+            default:
+                break;
+        }
     }
-    fclose(fp);
-    */
-}
-/*
-void playC5(void const* args)
-{
-    threadIDC5 = osThreadGetId();
-    while(1){
-        osSignalWait(0x1, osWaitForever);
-        pc.printf("Wait done C5");
-        //playFile("/sd/Synth/C5.wav");        
-        speaker2=0.50f;  // 50% duty cycle 
-        //speaker2=1.0;
-        wait(2);
-        speaker2=0.0; // turn off audio
-        wait(2);
+    else if(menuCount == 1) {
+        switch (itemCount) {
+            case 0:
+                octaveMult = 0.5;
+                break;
+            case 1:
+                octaveMult = 1.0;
+                break;
+            case 2:
+                octaveMult = 2.0;
+                break;
+            default:
+                break;
+        }
     }
 }
 
-void playG5(void const* args)
+void backMenu()
 {
-    threadIDG5 = osThreadGetId();
+    lcd.cls();
+    nextItem(menuCount, itemCount, inMainMenu);
+}
 
-    while(1){
-        osSignalWait(0x2, osWaitForever);
-        pc.printf("Wait done G5");
-        //wait(1);
-        //playFile("/sd/Synth/A5.wav");
-        speaker1=0.50f;  // 50% duty cycle 
-        //speaker1=1.0;
-        wait(3);
-        speaker1=0.0; // turn off audio
-        wait(1);
+void processMenu(void const *args)
+{
+    while(true)
+    {
+        Thread::signal_wait(0x2);
+        if(btn_n) {
+            if(menuCount != maxMenuCount - 1 && inMainMenu) {
+                menuCount++;
+            }
+    
+            else if(menuCount == maxMenuCount - 1 && inMainMenu) {
+                menuCount = 0;
+            }
+    
+            if(menuCount == 0 && !inMainMenu) {
+                if(itemCount != maxVolumeCount - 1) {
+                    itemCount++;
+                } else {
+                    itemCount = 0;
+                }
+            }
+    
+            if(menuCount == 1 && !inMainMenu) {
+                if(itemCount != maxOctaveCount - 1) {
+                    itemCount++;
+                } else {
+                    itemCount = 0;
+                }
+            }
+            nextItem(menuCount, itemCount, inMainMenu);
+        }
+    
+        if(btn_e) {
+    
+            inMainMenu = false;
+            enterMenu();
+    
+        }
+    
+        if(btn_b) {
+            inMainMenu = true;
+            itemCount = 0;
+            backMenu();
+        }
     }
 }
-*/
+
 int main()
-{    
-    XBeeZB xbee = XBeeZB(p13, p14, p8, NC, NC, 9600);
-
-    /* Register callbacks */
+{
+    XBeeZB xbee = XBeeZB(p13, p14, NC, NC, NC, 9600);
     xbee.register_receive_cb(&receive_cb);
-
     RadioStatus const radioStatus = xbee.init();
-
+    
+    timer.attach_us(&timer_50swag, 100000);
+    thread_digital = new Thread(digitLect);
+    thread_menu = new Thread(processMenu);
     MBED_ASSERT(radioStatus == Success);
- 
-    /* Wait until the device has joined the network */
-    pc.printf("Waiting for device to join the network: ");
+    
     while (!xbee.is_joined()) {
         wait_ms(1000);
     }
-    pc.printf("OK\r\n");
- 
+    pc.printf("Xbee joined\r\n");
+
+    lcd.printf("Make a Selection:");
+
+    pc.printf("Begin loop\r\n");
     while (true) {
         xbee.process_rx_frames();
-        wait_ms(50);
+        wait_ms(10);
     }
 }