Projet S5 Info - Advanced

Dependencies:   TextLCD XBeeLib mbed-rtos mbed

Fork of Coordinateur by Vincent Belanger

Committer:
vinbel93
Date:
Thu Apr 14 14:47:26 2016 +0000
Revision:
9:912506053afd
Parent:
8:120807be23b8
Final Advanced Version 2

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