Adeline Galasso
/
Nucleo_piano
Nucleo piano project with base template nucleo rtos basic
Diff: main.cpp
- Revision:
- 3:ca0d5d72f842
- Parent:
- 2:35f13b7f3659
--- a/main.cpp Thu Nov 23 13:09:25 2017 +0000 +++ b/main.cpp Mon Jul 02 18:01:08 2018 +0000 @@ -1,8 +1,30 @@ #include "mbed.h" +#include "TextLCD.h" +#include "button_value.h" +#include <map> + +// Define screen +TextLCD lcd(PA_8, PA_9, PC_7, PB_6, PA_7, PA_6, PA_5); // RS, RW, E, D4-D7 + +// Define Bus In for Buttons (Do, Re, Mi, Fa) +BusIn Bus_In(PA_10, PB_3, PB_5, PB_4); -void print_char(char c = '*') +// Define the PWM speaker +PwmOut speaker(PB_10); + +//Define variables for sound +volatile int state_buttons = 0; +std::map<int, double> period; + +void print_note(char *str) { - printf("%c", c); + lcd.cls(); + lcd.printf(str); +} + +void print_char() +{ + lcd.printf("Hello world!"); fflush(stdout); } @@ -18,14 +40,153 @@ } } +void refresh_state_button() +{ + printf("refresh_state_button \n"); + state_buttons = Bus_In & Bus_In.mask(); // read the bus and mask out bits not being used + printf("state_button [ %d ]\n", state_buttons); +} + +void play_music(int key) +{ + printf("play_music \n"); + printf("key [%x], value[%f]\n", key, period[key]); + speaker.period(period[key]); + while (state_buttons == key) { + refresh_state_button(); + } + check_buttons(); +} + +void check_buttons() +{ + printf("check_buttons \n"); + // check bits set in bus + switch(state_buttons) { + case 0x0: + printf("0b0000, All buttons pressed [%d] \n\r", Bus_In & Bus_In.mask()); + speaker = 0.25; + print_note("DO RE MI FA"); + play_music(0x0); + break; + case 0x1: + printf("0b0001, Button 2 & 3 & 4 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + speaker = 0.25; + print_note("RE MI FA"); + play_music(0x1); + break; + case 0x2: + printf("0b0010, Button 1 & 3 & 4 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("DO MI FA"); + speaker = 0.25; + play_music(0x2); + break; + case 0x3: + printf("0b0011, Button 3 & 4 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("MI FA"); + speaker = 0.25; + play_music(0x3); + break; + case 0x4: + printf("0b0100, Button 1 & 2 & 4 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("DO RE FA"); + speaker = 0.25; + play_music(0x4); + break; + case 0x5: + printf("0b0101, Button 2 & 4 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("RE FA"); + speaker = 0.25; + play_music(0x5); + break; + case 0x6: + printf("0b0110, Button 1 & 4 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("DO FA"); + speaker = 0.25; + play_music(0x6); + break; + case 0x7: + printf("0b0111, Button 4 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("FA"); + speaker = 0.5; + play_music(0x7); + break; + case 0x8: + printf("0b1000, Button 1 & 2 & 3 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("DO RE MI"); + speaker = 0.25; + play_music(0x8); + break; + case 0x9: + printf("0b1001, Button 2 & 3 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("RE MI"); + speaker = 0.25; + play_music(0x9); + break; + case 0xA: + printf("0b1010, Button 1 & 3 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("DO MI"); + speaker = 0.25; + play_music(0xA); + break; + case 0xB: + printf("0b1011, Button 3 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("MI"); + speaker = 0.5; + play_music(0xB); + break; + case 0xC: + printf("0b1100, Button 1 & 2 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + speaker = 0.25; + print_note("DO RE"); + play_music(0xC); + break; + case 0xD: + printf("0b1101, Button 2 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("RE"); + speaker = 0.5; + play_music(0xD); + break; + case 0xE: + printf("0b1110, Button 1 pressed [%d] \n\r", Bus_In & Bus_In.mask()); + print_note("DO"); + speaker = 0.5; + play_music(0xE); + break; + case 0xF: + printf("0b1111, No button pressed [%d] \n\r", Bus_In & Bus_In.mask()); + speaker = 0; + lcd.cls(); + break; + } +} + +// TODO: perios of notes with ID +// TODO: implement new 4 buttons +// TODO: link new 2 buttons + implementation +// TODO: deal with gamme + +// TODO: PB with DO RE on the screen (board crashes) + int main() { - printf("\n\n*** RTOS basic example ***\n"); + printf("\n\n*** CS 435 - Piano ***\n"); + + period[0xE] = 1.0 / 262.0; // DO + period[0xD] = 1.0 / 294.0; // RE + period[0xB] = 1.0 / 330.0; // MI + period[0x7] = 1.0 / 349.0; // FA + period[0xC] = 1.0 / (262.0 + 294.0); // DO + RE + period[0x8] = 1.0 / (262.0 + 294.0 + 330.0) + lcd.printf("CS 435 - Piano"); - thread.start(print_thread); + //thread.start(print_thread); while (true) { + printf("loop\n"); led1 = !led1; - wait(0.5); + refresh_state_button(); + check_buttons(); + wait(0.1); } }