Projet S5 Info - Beginner
Dependencies: TextLCD XBeeLib mbed-rtos mbed
Fork of Coordinateur-Advanced by
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 }
Generated on Mon Aug 1 2022 06:06:02 by 1.7.2