Refacto function run_display Add call to function refresh_display_notes Add call to function refresh_display_gamme

Dependencies:   TextLCD

Fork of Nucleo_piano_V1 by Adeline Galasso

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "TextLCD.h"
00003 #include <string.h>
00004 #include <math.h>
00005  
00006 // Define screen
00007 TextLCD lcd(PA_8, PA_9, PC_7, PB_6, PA_7, PA_6, PA_5); // RS, RW, E, D4-D7
00008  
00009 // Define Bus In for Buttons (Do, Re, Mi, Fa, Sol, La, Si, Do)
00010 BusIn Bus_In(PA_0, PA_1, PA_4, PB_0, PA_10, PB_3, PB_5, PB_4);
00011 
00012 // Define the PWM speaker
00013 PwmOut speaker(PB_10);
00014 
00015 // Define Bus In for Gamme Button
00016 BusIn Bus_In_Gamme(PB_9);
00017 
00018 // Define Serial
00019 Serial pc(PA_2, PA_3);
00020    
00021 //Define variables for sound
00022 struct  NoteReference {
00023     char    name[4];
00024     int     mask;
00025     double  frequency;
00026     double  add[4];
00027     };
00028     
00029 NoteReference   noteReference[8] = {    {"Do", 0x1, 262.0, {0.0, -1.0, -1.5, -3.0}},
00030                                         {"Re", 0x2, 294.0, {0.0, -1.0, -1.0, -3.0 }},
00031                                         {"Mi", 0x4, 330.0, {0.0, -1.0, -1.5, -3.0}},
00032                                         {"Fa", 0x8, 349.0, {0.0, 0.5, -1.0, 2.0}},
00033                                         {"Sol", 0x10, 392.0, {0.0, 0.0, 0.0, 0.0}},
00034                                         {"La", 0x20, 440.0, {0.0, 0.0, 0.0, 0.0}},
00035                                         {"Si", 0x40, 494.0, {0.0, 0.0, -1.0, -1.0}},
00036                                         {"Do", 0x80, 523.0, {0.0, 0.0, 0.0, 0.0}}
00037                                     };
00038 volatile int    stateButtons = 0;
00039 volatile int    stateButtonGamme = 0;
00040 volatile int    gamme = 0;
00041 
00042 //Define variable for display
00043 char     bufferOutput[30] = "";
00044 
00045 //Define variables for synchronization
00046 Mutex   lockBufferOutput;
00047 Mutex   lockGamme;
00048  
00049 void    refresh_state_button()
00050 {
00051    stateButtons = Bus_In & Bus_In.mask(); // read the bus and mask out bits not being used
00052 }
00053  
00054 void        play_music(int notes, double frequency)
00055 {
00056    speaker.period(1.0 / frequency);
00057    while (stateButtons == notes) {
00058      refresh_state_button();
00059    }
00060 }
00061 
00062 double      generate_frequency(double frequency, int actualGamme)
00063 {
00064     frequency = 0.0;
00065     lockBufferOutput.lock();
00066     strcpy(bufferOutput, "");
00067     for (int i = 0; i < 8; i++) {
00068         if (!(stateButtons & noteReference[i].mask))
00069         {
00070             frequency += noteReference[i].frequency * pow(2.0, (double)actualGamme) + noteReference[i].add[actualGamme];
00071             strcat(bufferOutput, noteReference[i].name);
00072             strcat(bufferOutput, " ");
00073         }
00074     }
00075     lockBufferOutput.unlock();
00076     return (frequency);
00077 }
00078  
00079 void        check_buttons(double frequency, int actualGamme)
00080 {
00081     if (stateButtons == 0xFF)
00082     {
00083         speaker = 0;
00084         lockBufferOutput.lock();
00085         strcpy(bufferOutput, "");
00086         lockBufferOutput.unlock();
00087     }
00088     else {
00089         lockGamme.lock();
00090         actualGamme = gamme;
00091         lockGamme.unlock();
00092         frequency = generate_frequency(frequency, actualGamme);
00093         speaker = 0.5;
00094         play_music(stateButtons, frequency);
00095     }
00096 }
00097 
00098 void    run_music()
00099 {
00100     double  frequency = 0.0;
00101     int     actualGamme = 0;
00102     
00103     while (true)
00104     {
00105         refresh_state_button();
00106         check_buttons(frequency, actualGamme);
00107         Thread::wait(100);
00108     }
00109 }
00110 
00111 void    refresh_display_notes(char *old_buffer)
00112 {
00113     lcd.cls();
00114     lockGamme.lock();
00115     if (strcmp(bufferOutput, ""))
00116     {
00117         lcd.printf("%s- g[%d]", bufferOutput, gamme);
00118         pc.printf("Play notes: %s with gamme %d\n", bufferOutput, gamme); 
00119     }
00120     else 
00121     {
00122         lcd.printf("Gamme = %d", gamme);
00123         pc.printf("Release notes\n"); 
00124     }
00125     lockGamme.unlock();
00126     strcpy(old_buffer, bufferOutput);
00127 }
00128 
00129 int    refresh_display_gamme(int old_gamme)
00130 {
00131     lockGamme.lock();
00132     if (old_gamme != gamme)
00133     {
00134         lcd.cls();
00135         lcd.printf("Gamme = %d", gamme);
00136         pc.printf("Change gamme %d to gamme %d\n", old_gamme, gamme); 
00137         old_gamme = gamme;
00138     }
00139     lockGamme.unlock();
00140     return old_gamme;
00141 }
00142 
00143 void    run_display()
00144 {
00145     char    old_buffer[30] = "";
00146     int     old_gamme = 0;
00147     
00148     lockBufferOutput.lock();
00149     lockGamme.lock();
00150     lcd.printf("Gamme = %d", gamme);
00151     lockGamme.unlock();
00152     lockBufferOutput.unlock();
00153     while(true)
00154     {
00155         lockBufferOutput.lock();
00156         if (strcmp(old_buffer, bufferOutput))
00157             refresh_display_notes(old_buffer);
00158         else
00159             old_gamme = refresh_display_gamme(old_gamme);
00160         lockBufferOutput.unlock();
00161         Thread::wait(100);
00162     }
00163 }
00164 
00165 void     check_state_button_gamme()
00166 {
00167     stateButtonGamme = Bus_In_Gamme & Bus_In_Gamme.mask();
00168 }
00169 
00170 void    run_gamme()
00171 {
00172     while(true)
00173     {
00174         check_state_button_gamme();
00175         if (stateButtonGamme == 0x0)
00176         {
00177             lockGamme.lock();
00178             gamme = (gamme == 3) ? 0 : gamme + 1;
00179             lockGamme.unlock();
00180             while (stateButtonGamme == 0x0)
00181                 check_state_button_gamme();
00182         }
00183         Thread::wait(100);
00184     }
00185 }
00186 
00187 int main()
00188 {
00189     Thread  music_thread;
00190     Thread  display_thread;
00191     Thread  gamme_thread;
00192     
00193     lcd.printf("CS435 : Piano Project\n");
00194     wait(3);
00195     lcd.cls();
00196  
00197     music_thread.start(run_music);
00198     display_thread.start(run_display);
00199     gamme_thread.start(run_gamme);
00200     while(1);
00201 }