fork

Dependencies:   TextLCD XBeeLib mbed-rtos mbed

Fork of ProjetReceiver by jasmin desilets

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