fork
Dependencies: TextLCD XBeeLib mbed-rtos mbed
Fork of ProjetReceiver 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 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 }
Generated on Mon Aug 1 2022 03:30:53 by 1.7.2