Projet S5 Info - Advanced

Dependencies:   TextLCD XBeeLib mbed-rtos mbed

Fork of Coordinateur by Vincent Belanger

Committer:
vinbel93
Date:
Mon Apr 11 20:37:07 2016 +0000
Revision:
7:bd9bc9fa66c7
Parent:
6:59b0b6c1b5bb
Child:
8:120807be23b8
Final version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jasmou 0:3acd447c12c0 1 #include "mbed.h"
jasmou 0:3acd447c12c0 2 #include "XBeeLib.h"
vinbel93 7:bd9bc9fa66c7 3 #include "TextLCD.h"
vinbel93 7:bd9bc9fa66c7 4 #include "rtos.h"
vinbel93 7:bd9bc9fa66c7 5
jasmou 0:3acd447c12c0 6 using namespace XBeeLib;
vinbel93 1:33b4a3b5cdb5 7
vinbel93 5:08245a3e93a8 8 PwmOut speaker(p21);
vinbel93 7:bd9bc9fa66c7 9 TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
vinbel93 7:bd9bc9fa66c7 10 DigitalIn button_back(p28);
vinbel93 7:bd9bc9fa66c7 11 DigitalIn button_enter(p29);
vinbel93 7:bd9bc9fa66c7 12 DigitalIn button_next(p30);
vinbel93 7:bd9bc9fa66c7 13 Ticker timer;
vinbel93 7:bd9bc9fa66c7 14 int btn_b;
vinbel93 7:bd9bc9fa66c7 15 int btn_e;
vinbel93 7:bd9bc9fa66c7 16 int btn_n;
jasmou 0:3acd447c12c0 17 Serial pc(USBTX, USBRX);
jasmou 0:3acd447c12c0 18
jasmou 0:3acd447c12c0 19 bool capt_1;
jasmou 0:3acd447c12c0 20 bool capt_2;
jasmou 0:3acd447c12c0 21 bool capt_3;
jasmou 0:3acd447c12c0 22 bool capt_4;
jasmou 0:3acd447c12c0 23 bool capt_5;
jasmou 0:3acd447c12c0 24 bool capt_6;
vinbel93 7:bd9bc9fa66c7 25 uint8_t GP2D12_value = 0;
vinbel93 7:bd9bc9fa66c7 26
vinbel93 7:bd9bc9fa66c7 27 const float DO = 261.63;
vinbel93 7:bd9bc9fa66c7 28 const float RE = 293.66;
vinbel93 7:bd9bc9fa66c7 29 const float MI = 329.63;
vinbel93 7:bd9bc9fa66c7 30 const float FA_SHARP = 369.99;
vinbel93 7:bd9bc9fa66c7 31 const float SOL_SHARP = 415.30;
vinbel93 7:bd9bc9fa66c7 32 const float LA_SHARP = 466.16;
vinbel93 6:59b0b6c1b5bb 33
vinbel93 6:59b0b6c1b5bb 34 const float DEMI_TON = 0.05946;
vinbel93 6:59b0b6c1b5bb 35
vinbel93 6:59b0b6c1b5bb 36 float dutyCycle = 0.0002;
vinbel93 7:bd9bc9fa66c7 37 float octaveMult = 2.0;
vinbel93 7:bd9bc9fa66c7 38 int lastCapt = -1;
vinbel93 7:bd9bc9fa66c7 39 Thread* thread_digital;
vinbel93 7:bd9bc9fa66c7 40 Thread* thread_menu;
vinbel93 6:59b0b6c1b5bb 41
vinbel93 7:bd9bc9fa66c7 42 const char MainMenuText[2][16] = {"1. Volume", "2. Octave"};
vinbel93 7:bd9bc9fa66c7 43 const char VolumeMenuText[4][16] = {"+1", "-1", "+10", "-10"};
vinbel93 7:bd9bc9fa66c7 44 const char OctaveMenuText[3][16] = {"3", "4", "5"};
vinbel93 7:bd9bc9fa66c7 45 const int maxMenuCount = 2;
vinbel93 7:bd9bc9fa66c7 46 const int maxVolumeCount = 4;
vinbel93 7:bd9bc9fa66c7 47 const int maxOctaveCount = 3;
vinbel93 7:bd9bc9fa66c7 48
vinbel93 7:bd9bc9fa66c7 49 bool inMainMenu = true;
vinbel93 7:bd9bc9fa66c7 50
vinbel93 7:bd9bc9fa66c7 51 int menuCount = 0;
vinbel93 7:bd9bc9fa66c7 52 int itemCount = 0;
vinbel93 7:bd9bc9fa66c7 53
vinbel93 7:bd9bc9fa66c7 54 static float findPeriod(float frequency, float vibrato)
vinbel93 7:bd9bc9fa66c7 55 {
vinbel93 6:59b0b6c1b5bb 56 float freq = frequency * octaveMult;
vinbel93 7:bd9bc9fa66c7 57 if (vibrato != 0) {
vinbel93 7:bd9bc9fa66c7 58 if(vibrato < 0.5) {
vinbel93 6:59b0b6c1b5bb 59 freq = freq + (freq * ( (0.5 - vibrato) * 2 * DEMI_TON));
vinbel93 6:59b0b6c1b5bb 60 } else {
vinbel93 6:59b0b6c1b5bb 61 freq = freq - (freq * ( (vibrato - 0.5) * 2 * DEMI_TON));
vinbel93 6:59b0b6c1b5bb 62 }
vinbel93 6:59b0b6c1b5bb 63 }
vinbel93 7:bd9bc9fa66c7 64
vinbel93 6:59b0b6c1b5bb 65 return 1.0/freq;
vinbel93 6:59b0b6c1b5bb 66 }
vinbel93 7:bd9bc9fa66c7 67
vinbel93 7:bd9bc9fa66c7 68 void timer_50swag()
vinbel93 7:bd9bc9fa66c7 69 {
vinbel93 7:bd9bc9fa66c7 70 //thread_digital->signal_set(0x2);
vinbel93 7:bd9bc9fa66c7 71 thread_menu->signal_set(0x2);
vinbel93 7:bd9bc9fa66c7 72 }
vinbel93 7:bd9bc9fa66c7 73
vinbel93 7:bd9bc9fa66c7 74 void digitLect(void const *args)
vinbel93 7:bd9bc9fa66c7 75 {
vinbel93 7:bd9bc9fa66c7 76 while(true)
vinbel93 7:bd9bc9fa66c7 77 {
vinbel93 7:bd9bc9fa66c7 78 btn_b = button_back;
vinbel93 7:bd9bc9fa66c7 79 btn_e = button_enter;
vinbel93 7:bd9bc9fa66c7 80 btn_n = button_next;
vinbel93 7:bd9bc9fa66c7 81 }
vinbel93 7:bd9bc9fa66c7 82 /*
vinbel93 7:bd9bc9fa66c7 83 while(true)
vinbel93 7:bd9bc9fa66c7 84 {
vinbel93 7:bd9bc9fa66c7 85 Thread::signal_wait(0x2);
vinbel93 7:bd9bc9fa66c7 86 if(btn_b != button_back || btn_e != button_enter || btn_n != button_next)
vinbel93 7:bd9bc9fa66c7 87 {
vinbel93 7:bd9bc9fa66c7 88 Thread::signal_wait(0x2);
vinbel93 7:bd9bc9fa66c7 89 if(btn_b != button_back)
vinbel93 7:bd9bc9fa66c7 90 {
vinbel93 7:bd9bc9fa66c7 91 btn_b = button_back;
vinbel93 7:bd9bc9fa66c7 92 }
vinbel93 7:bd9bc9fa66c7 93 if(btn_e != button_enter)
vinbel93 7:bd9bc9fa66c7 94 {
vinbel93 7:bd9bc9fa66c7 95 btn_e = button_enter;
vinbel93 7:bd9bc9fa66c7 96 }
vinbel93 7:bd9bc9fa66c7 97 if(btn_n != button_next)
vinbel93 7:bd9bc9fa66c7 98 {
vinbel93 7:bd9bc9fa66c7 99 btn_n = button_next;
vinbel93 7:bd9bc9fa66c7 100 }
vinbel93 7:bd9bc9fa66c7 101 }
vinbel93 7:bd9bc9fa66c7 102 }*/
vinbel93 7:bd9bc9fa66c7 103 }
vinbel93 7:bd9bc9fa66c7 104
jasmou 0:3acd447c12c0 105 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
jasmou 0:3acd447c12c0 106 {
jasmou 0:3acd447c12c0 107 const uint64_t remote_addr64 = remote.get_addr64();
vinbel93 7:bd9bc9fa66c7 108
vinbel93 1:33b4a3b5cdb5 109 capt_1 = (data[0] & 0b10000000);
vinbel93 1:33b4a3b5cdb5 110 capt_2 = (data[0] & 0b01000000);
vinbel93 1:33b4a3b5cdb5 111 capt_3 = (data[0] & 0b00100000);
vinbel93 1:33b4a3b5cdb5 112 capt_4 = (data[0] & 0b00010000);
vinbel93 1:33b4a3b5cdb5 113 capt_5 = (data[0] & 0b00001000);
vinbel93 1:33b4a3b5cdb5 114 capt_6 = (data[0] & 0b00000100);
vinbel93 7:bd9bc9fa66c7 115
vinbel93 6:59b0b6c1b5bb 116 GP2D12_value = data[1];
vinbel93 7:bd9bc9fa66c7 117
vinbel93 7:bd9bc9fa66c7 118 if(GP2D12_value < 0x50) {
vinbel93 6:59b0b6c1b5bb 119 GP2D12_value = 0;
vinbel93 7:bd9bc9fa66c7 120 } else {
vinbel93 6:59b0b6c1b5bb 121 GP2D12_value -= 0x50;
vinbel93 6:59b0b6c1b5bb 122 }
vinbel93 7:bd9bc9fa66c7 123
vinbel93 6:59b0b6c1b5bb 124 float pourcentageGP2D12 = float(GP2D12_value) / float(0x70);
vinbel93 7:bd9bc9fa66c7 125
vinbel93 7:bd9bc9fa66c7 126 if(pourcentageGP2D12 > 1) {
vinbel93 6:59b0b6c1b5bb 127 pourcentageGP2D12 = 1;
vinbel93 6:59b0b6c1b5bb 128 }
vinbel93 7:bd9bc9fa66c7 129
vinbel93 7:bd9bc9fa66c7 130 if(!capt_1) {
vinbel93 7:bd9bc9fa66c7 131 speaker.period(findPeriod(DO, pourcentageGP2D12));
vinbel93 1:33b4a3b5cdb5 132
vinbel93 7:bd9bc9fa66c7 133 speaker = dutyCycle;
vinbel93 6:59b0b6c1b5bb 134 lastCapt = 1;
vinbel93 7:bd9bc9fa66c7 135 } else if(!capt_2) {
vinbel93 6:59b0b6c1b5bb 136 speaker.period(findPeriod(RE, pourcentageGP2D12));
vinbel93 7:bd9bc9fa66c7 137
vinbel93 7:bd9bc9fa66c7 138 speaker = dutyCycle;
vinbel93 6:59b0b6c1b5bb 139 lastCapt = 2;
vinbel93 7:bd9bc9fa66c7 140 } else if(!capt_3) {
vinbel93 6:59b0b6c1b5bb 141 speaker.period(findPeriod(MI, pourcentageGP2D12));
vinbel93 7:bd9bc9fa66c7 142
vinbel93 7:bd9bc9fa66c7 143 speaker = dutyCycle;
vinbel93 6:59b0b6c1b5bb 144 lastCapt = 3;
vinbel93 7:bd9bc9fa66c7 145 } else if(!capt_4) {
vinbel93 6:59b0b6c1b5bb 146 speaker.period(findPeriod(FA_SHARP, pourcentageGP2D12));
vinbel93 7:bd9bc9fa66c7 147
vinbel93 7:bd9bc9fa66c7 148 speaker = dutyCycle;
vinbel93 6:59b0b6c1b5bb 149 lastCapt = 4;
vinbel93 7:bd9bc9fa66c7 150 } else if(!capt_5) {
vinbel93 6:59b0b6c1b5bb 151 speaker.period(findPeriod(SOL_SHARP, pourcentageGP2D12));
vinbel93 7:bd9bc9fa66c7 152
vinbel93 7:bd9bc9fa66c7 153 speaker = dutyCycle;
vinbel93 6:59b0b6c1b5bb 154 lastCapt = 5;
vinbel93 7:bd9bc9fa66c7 155 } else if(!capt_6) {
vinbel93 6:59b0b6c1b5bb 156 speaker.period(findPeriod(LA_SHARP, pourcentageGP2D12));
vinbel93 7:bd9bc9fa66c7 157
vinbel93 7:bd9bc9fa66c7 158 speaker = dutyCycle;
vinbel93 6:59b0b6c1b5bb 159 lastCapt = 6;
vinbel93 4:714484401021 160 } else {
vinbel93 7:bd9bc9fa66c7 161 speaker = 0.0f;
vinbel93 7:bd9bc9fa66c7 162 }
vinbel93 7:bd9bc9fa66c7 163 }
vinbel93 7:bd9bc9fa66c7 164
vinbel93 7:bd9bc9fa66c7 165 void nextItem(int menuCount, int itemCount, bool inMainMenu)
vinbel93 7:bd9bc9fa66c7 166 {
vinbel93 7:bd9bc9fa66c7 167 lcd.cls();
vinbel93 7:bd9bc9fa66c7 168 if(inMainMenu) {
vinbel93 7:bd9bc9fa66c7 169 lcd.printf(MainMenuText[menuCount]);
vinbel93 7:bd9bc9fa66c7 170 } else if(!inMainMenu && menuCount == 0) {
vinbel93 7:bd9bc9fa66c7 171 lcd.printf(VolumeMenuText[itemCount]);
vinbel93 7:bd9bc9fa66c7 172 } else if(!inMainMenu && menuCount == 1) {
vinbel93 7:bd9bc9fa66c7 173 lcd.printf(OctaveMenuText[itemCount]);
vinbel93 7:bd9bc9fa66c7 174 } else {
vinbel93 7:bd9bc9fa66c7 175 lcd.printf("nextItem ERROR.");
vinbel93 4:714484401021 176 }
jasmou 0:3acd447c12c0 177 }
vinbel93 2:a7820185e9a8 178
vinbel93 7:bd9bc9fa66c7 179 void enterMenu()
vinbel93 1:33b4a3b5cdb5 180 {
vinbel93 7:bd9bc9fa66c7 181 lcd.cls();
vinbel93 7:bd9bc9fa66c7 182 nextItem(menuCount, itemCount, inMainMenu);
vinbel93 7:bd9bc9fa66c7 183
vinbel93 7:bd9bc9fa66c7 184 if(menuCount == 0) {
vinbel93 7:bd9bc9fa66c7 185 switch (itemCount) {
vinbel93 7:bd9bc9fa66c7 186 case 0:
vinbel93 7:bd9bc9fa66c7 187 dutyCycle += 0.0001;
vinbel93 7:bd9bc9fa66c7 188 if (dutyCycle > 0.5)
vinbel93 7:bd9bc9fa66c7 189 {
vinbel93 7:bd9bc9fa66c7 190 dutyCycle = 0.5;
vinbel93 7:bd9bc9fa66c7 191 }
vinbel93 7:bd9bc9fa66c7 192 break;
vinbel93 7:bd9bc9fa66c7 193 case 1:
vinbel93 7:bd9bc9fa66c7 194 dutyCycle -= 0.0001;
vinbel93 7:bd9bc9fa66c7 195 if (dutyCycle < 0)
vinbel93 7:bd9bc9fa66c7 196 {
vinbel93 7:bd9bc9fa66c7 197 dutyCycle = 0;
vinbel93 7:bd9bc9fa66c7 198 }
vinbel93 7:bd9bc9fa66c7 199 break;
vinbel93 7:bd9bc9fa66c7 200 case 2:
vinbel93 7:bd9bc9fa66c7 201 dutyCycle += 0.001;
vinbel93 7:bd9bc9fa66c7 202 if (dutyCycle > 0.5)
vinbel93 7:bd9bc9fa66c7 203 {
vinbel93 7:bd9bc9fa66c7 204 dutyCycle = 0.5;
vinbel93 7:bd9bc9fa66c7 205 }
vinbel93 7:bd9bc9fa66c7 206 break;
vinbel93 7:bd9bc9fa66c7 207 case 3:
vinbel93 7:bd9bc9fa66c7 208 dutyCycle -= 0.001;
vinbel93 7:bd9bc9fa66c7 209 if (dutyCycle < 0)
vinbel93 7:bd9bc9fa66c7 210 {
vinbel93 7:bd9bc9fa66c7 211 dutyCycle = 0;
vinbel93 7:bd9bc9fa66c7 212 }
vinbel93 7:bd9bc9fa66c7 213 break;
vinbel93 7:bd9bc9fa66c7 214 default:
vinbel93 7:bd9bc9fa66c7 215 break;
vinbel93 7:bd9bc9fa66c7 216 }
vinbel93 1:33b4a3b5cdb5 217 }
vinbel93 7:bd9bc9fa66c7 218 else if(menuCount == 1) {
vinbel93 7:bd9bc9fa66c7 219 switch (itemCount) {
vinbel93 7:bd9bc9fa66c7 220 case 0:
vinbel93 7:bd9bc9fa66c7 221 octaveMult = 0.5;
vinbel93 7:bd9bc9fa66c7 222 break;
vinbel93 7:bd9bc9fa66c7 223 case 1:
vinbel93 7:bd9bc9fa66c7 224 octaveMult = 1.0;
vinbel93 7:bd9bc9fa66c7 225 break;
vinbel93 7:bd9bc9fa66c7 226 case 2:
vinbel93 7:bd9bc9fa66c7 227 octaveMult = 2.0;
vinbel93 7:bd9bc9fa66c7 228 break;
vinbel93 7:bd9bc9fa66c7 229 default:
vinbel93 7:bd9bc9fa66c7 230 break;
vinbel93 7:bd9bc9fa66c7 231 }
vinbel93 4:714484401021 232 }
vinbel93 2:a7820185e9a8 233 }
vinbel93 2:a7820185e9a8 234
vinbel93 7:bd9bc9fa66c7 235 void backMenu()
vinbel93 2:a7820185e9a8 236 {
vinbel93 7:bd9bc9fa66c7 237 lcd.cls();
vinbel93 7:bd9bc9fa66c7 238 nextItem(menuCount, itemCount, inMainMenu);
vinbel93 7:bd9bc9fa66c7 239 }
vinbel93 2:a7820185e9a8 240
vinbel93 7:bd9bc9fa66c7 241 void processMenu(void const *args)
vinbel93 7:bd9bc9fa66c7 242 {
vinbel93 7:bd9bc9fa66c7 243 while(true)
vinbel93 7:bd9bc9fa66c7 244 {
vinbel93 7:bd9bc9fa66c7 245 Thread::signal_wait(0x2);
vinbel93 7:bd9bc9fa66c7 246 if(btn_n) {
vinbel93 7:bd9bc9fa66c7 247 if(menuCount != maxMenuCount - 1 && inMainMenu) {
vinbel93 7:bd9bc9fa66c7 248 menuCount++;
vinbel93 7:bd9bc9fa66c7 249 }
vinbel93 7:bd9bc9fa66c7 250
vinbel93 7:bd9bc9fa66c7 251 else if(menuCount == maxMenuCount - 1 && inMainMenu) {
vinbel93 7:bd9bc9fa66c7 252 menuCount = 0;
vinbel93 7:bd9bc9fa66c7 253 }
vinbel93 7:bd9bc9fa66c7 254
vinbel93 7:bd9bc9fa66c7 255 if(menuCount == 0 && !inMainMenu) {
vinbel93 7:bd9bc9fa66c7 256 if(itemCount != maxVolumeCount - 1) {
vinbel93 7:bd9bc9fa66c7 257 itemCount++;
vinbel93 7:bd9bc9fa66c7 258 } else {
vinbel93 7:bd9bc9fa66c7 259 itemCount = 0;
vinbel93 7:bd9bc9fa66c7 260 }
vinbel93 7:bd9bc9fa66c7 261 }
vinbel93 7:bd9bc9fa66c7 262
vinbel93 7:bd9bc9fa66c7 263 if(menuCount == 1 && !inMainMenu) {
vinbel93 7:bd9bc9fa66c7 264 if(itemCount != maxOctaveCount - 1) {
vinbel93 7:bd9bc9fa66c7 265 itemCount++;
vinbel93 7:bd9bc9fa66c7 266 } else {
vinbel93 7:bd9bc9fa66c7 267 itemCount = 0;
vinbel93 7:bd9bc9fa66c7 268 }
vinbel93 7:bd9bc9fa66c7 269 }
vinbel93 7:bd9bc9fa66c7 270 nextItem(menuCount, itemCount, inMainMenu);
vinbel93 7:bd9bc9fa66c7 271 }
vinbel93 7:bd9bc9fa66c7 272
vinbel93 7:bd9bc9fa66c7 273 if(btn_e) {
vinbel93 7:bd9bc9fa66c7 274
vinbel93 7:bd9bc9fa66c7 275 inMainMenu = false;
vinbel93 7:bd9bc9fa66c7 276 enterMenu();
vinbel93 7:bd9bc9fa66c7 277
vinbel93 7:bd9bc9fa66c7 278 }
vinbel93 7:bd9bc9fa66c7 279
vinbel93 7:bd9bc9fa66c7 280 if(btn_b) {
vinbel93 7:bd9bc9fa66c7 281 inMainMenu = true;
vinbel93 7:bd9bc9fa66c7 282 itemCount = 0;
vinbel93 7:bd9bc9fa66c7 283 backMenu();
vinbel93 7:bd9bc9fa66c7 284 }
vinbel93 4:714484401021 285 }
vinbel93 2:a7820185e9a8 286 }
vinbel93 7:bd9bc9fa66c7 287
vinbel93 2:a7820185e9a8 288 int main()
vinbel93 7:bd9bc9fa66c7 289 {
vinbel93 7:bd9bc9fa66c7 290 XBeeZB xbee = XBeeZB(p13, p14, NC, NC, NC, 9600);
jasmou 0:3acd447c12c0 291 xbee.register_receive_cb(&receive_cb);
jasmou 0:3acd447c12c0 292 RadioStatus const radioStatus = xbee.init();
vinbel93 7:bd9bc9fa66c7 293
vinbel93 7:bd9bc9fa66c7 294 timer.attach_us(&timer_50swag, 100000);
vinbel93 7:bd9bc9fa66c7 295 thread_digital = new Thread(digitLect);
vinbel93 7:bd9bc9fa66c7 296 thread_menu = new Thread(processMenu);
jasmou 0:3acd447c12c0 297 MBED_ASSERT(radioStatus == Success);
vinbel93 7:bd9bc9fa66c7 298
jasmou 0:3acd447c12c0 299 while (!xbee.is_joined()) {
jasmou 0:3acd447c12c0 300 wait_ms(1000);
jasmou 0:3acd447c12c0 301 }
vinbel93 7:bd9bc9fa66c7 302 pc.printf("Xbee joined\r\n");
vinbel93 7:bd9bc9fa66c7 303
vinbel93 7:bd9bc9fa66c7 304 lcd.printf("Make a Selection:");
vinbel93 7:bd9bc9fa66c7 305
vinbel93 7:bd9bc9fa66c7 306 pc.printf("Begin loop\r\n");
jasmou 0:3acd447c12c0 307 while (true) {
jasmou 0:3acd447c12c0 308 xbee.process_rx_frames();
vinbel93 7:bd9bc9fa66c7 309 wait_ms(10);
jasmou 0:3acd447c12c0 310 }
jasmou 0:3acd447c12c0 311 }