Projet S5 Info - Beginner
Dependencies: TextLCD XBeeLib mbed-rtos mbed
Fork of Coordinateur-Advanced by
Diff: main.cpp
- 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); } }