Projet S5 Info - Beginner

Dependencies:   TextLCD XBeeLib mbed-rtos mbed

Fork of Coordinateur-Advanced by Vincent Belanger

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "XBeeLib.h"
00003 #include "TextLCD.h"
00004 #include "rtos.h"
00005 
00006 using namespace XBeeLib;
00007 
00008 PwmOut speaker(p21);
00009 TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
00010 DigitalIn button_back(p28);
00011 DigitalIn button_enter(p29);
00012 DigitalIn button_next(p30);
00013 Ticker timer;
00014 int btn_b;
00015 int btn_e;
00016 int btn_n;
00017 
00018 bool capt_1;
00019 bool capt_2;
00020 bool capt_3;
00021 bool capt_4;
00022 bool capt_5;
00023 bool capt_6;
00024 
00025 const float DO = 261.63;
00026 const float RE = 293.66;
00027 const float MI = 329.63;
00028 const float FA = 349.23;
00029 const float SOL = 392.00;
00030 const float LA = 440.00;
00031 
00032 float dutyCycle = 0.0002;
00033 float octaveMult = 2.0;
00034 int lastCapt = -1;
00035 Thread* thread_digital;
00036 Thread* thread_menu;
00037 
00038 const char MainMenuText[2][16] = {"1. Volume", "2. Octave"};
00039 const char VolumeMenuText[4][16] = {"+1", "-1", "+10", "-10"};
00040 const char OctaveMenuText[3][16] = {"3", "4", "5"};
00041 const int maxMenuCount = 2;
00042 const int maxVolumeCount = 4;
00043 const int maxOctaveCount = 3;
00044 
00045 bool inMainMenu = true;
00046 
00047 int menuCount = 0;
00048 int itemCount = 0;
00049 
00050 static float findPeriod(float frequency)
00051 {
00052     float freq = frequency * octaveMult;
00053     return 1.0/freq;
00054 }
00055 
00056 void timer_Signal()
00057 {
00058     thread_menu->signal_set(0x2);
00059 }
00060 
00061 void digitLect(void const *args)
00062 {
00063     while(true)
00064     {
00065         btn_b = button_back;
00066         btn_e = button_enter;
00067         btn_n = button_next;
00068     }
00069 }
00070 
00071 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
00072 {
00073     const uint64_t remote_addr64 = remote.get_addr64();
00074 
00075     capt_1 = (data[0] & 0b10000000);
00076     capt_2 = (data[0] & 0b01000000);
00077     capt_3 = (data[0] & 0b00100000);
00078     capt_4 = (data[0] & 0b00010000);
00079     capt_5 = (data[0] & 0b00001000);
00080     capt_6 = (data[0] & 0b00000100);
00081 
00082     if(!capt_1) {
00083         if (lastCapt != 1) {
00084             speaker.period(findPeriod(DO));
00085         }
00086         
00087         speaker = dutyCycle;
00088         lastCapt = 1;
00089     } else if(!capt_2) {
00090         if (lastCapt != 2) {
00091             speaker.period(findPeriod(RE));
00092         }
00093 
00094         speaker = dutyCycle;
00095         lastCapt = 2;
00096     } else if(!capt_3) {
00097         if (lastCapt != 3) {
00098             speaker.period(findPeriod(MI));
00099         }
00100 
00101         speaker = dutyCycle;
00102         lastCapt = 3;
00103     } else if(!capt_4) {
00104         if (lastCapt != 4) {
00105             speaker.period(findPeriod(FA));
00106         }
00107 
00108         speaker = dutyCycle;
00109         lastCapt = 4;
00110     } else if(!capt_5) {
00111         if (lastCapt != 5) {
00112             speaker.period(findPeriod(SOL));
00113         }
00114 
00115         speaker = dutyCycle;
00116         lastCapt = 5;
00117     } else if(!capt_6) {
00118         if (lastCapt != 6) {
00119             speaker.period(findPeriod(LA));
00120         }
00121 
00122         speaker = dutyCycle;
00123         lastCapt = 6;
00124     } else {
00125         if (lastCapt != 0)
00126         {
00127             speaker = 0.0f;
00128         }
00129         
00130         lastCapt = 0;
00131     }
00132 }
00133 
00134 void nextItem(int menuCount, int itemCount, bool inMainMenu)
00135 {
00136     lcd.cls();
00137     if(inMainMenu) {
00138         lcd.printf(MainMenuText[menuCount]);
00139     } else if(!inMainMenu && menuCount == 0) {
00140         lcd.printf(VolumeMenuText[itemCount]);
00141     } else if(!inMainMenu && menuCount == 1) {
00142         lcd.printf(OctaveMenuText[itemCount]);
00143     } else {
00144         lcd.printf("nextItem ERROR.");
00145     }
00146 }
00147 
00148 void enterMenu()
00149 {
00150     lcd.cls();
00151     nextItem(menuCount, itemCount, inMainMenu);
00152 
00153     if(menuCount == 0) {
00154         switch (itemCount) {
00155             case 0:
00156                 dutyCycle += 0.0001;
00157                 if (dutyCycle > 0.5)
00158                 {
00159                     dutyCycle = 0.5;
00160                 }
00161                 break;
00162             case 1:
00163                 dutyCycle -= 0.0001;
00164                 if (dutyCycle < 0)
00165                 {
00166                     dutyCycle = 0;
00167                 }
00168                 break;
00169             case 2:
00170                 dutyCycle += 0.001;
00171                 if (dutyCycle > 0.5)
00172                 {
00173                     dutyCycle = 0.5;
00174                 }
00175                 break;
00176             case 3:
00177                 dutyCycle -= 0.001;
00178                 if (dutyCycle < 0)
00179                 {
00180                     dutyCycle = 0;
00181                 }
00182                 break;
00183             default:
00184                 break;
00185         }
00186     }
00187     else if(menuCount == 1) {
00188         switch (itemCount) {
00189             case 0:
00190                 octaveMult = 0.5;
00191                 break;
00192             case 1:
00193                 octaveMult = 1.0;
00194                 break;
00195             case 2:
00196                 octaveMult = 2.0;
00197                 break;
00198             default:
00199                 break;
00200         }
00201     }
00202 }
00203 
00204 void backMenu()
00205 {
00206     lcd.cls();
00207     nextItem(menuCount, itemCount, inMainMenu);
00208 }
00209 
00210 void processMenu(void const *args)
00211 {
00212     while(true)
00213     {
00214         Thread::signal_wait(0x2);
00215         if(btn_n) {
00216             if(menuCount != maxMenuCount - 1 && inMainMenu) {
00217                 menuCount++;
00218             }
00219     
00220             else if(menuCount == maxMenuCount - 1 && inMainMenu) {
00221                 menuCount = 0;
00222             }
00223     
00224             if(menuCount == 0 && !inMainMenu) {
00225                 if(itemCount != maxVolumeCount - 1) {
00226                     itemCount++;
00227                 } else {
00228                     itemCount = 0;
00229                 }
00230             }
00231     
00232             if(menuCount == 1 && !inMainMenu) {
00233                 if(itemCount != maxOctaveCount - 1) {
00234                     itemCount++;
00235                 } else {
00236                     itemCount = 0;
00237                 }
00238             }
00239             nextItem(menuCount, itemCount, inMainMenu);
00240         }
00241     
00242         if(btn_e) {
00243     
00244             inMainMenu = false;
00245             enterMenu();
00246     
00247         }
00248     
00249         if(btn_b) {
00250             inMainMenu = true;
00251             itemCount = 0;
00252             backMenu();
00253         }
00254     }
00255 }
00256 
00257 int main()
00258 {
00259     XBeeZB xbee = XBeeZB(p13, p14, NC, NC, NC, 9600);
00260     xbee.register_receive_cb(&receive_cb);
00261     RadioStatus const radioStatus = xbee.init();
00262     
00263     timer.attach_us(&timer_Signal, 100000);
00264     thread_digital = new Thread(digitLect);
00265     thread_menu = new Thread(processMenu);
00266     MBED_ASSERT(radioStatus == Success);
00267     
00268     while (!xbee.is_joined()) {
00269         wait_ms(1000);
00270     }
00271 
00272     lcd.printf("Make a Selection:");
00273 
00274     while (true) {
00275         xbee.process_rx_frames();
00276         wait_ms(10);
00277     }
00278 }