fork

Dependencies:   TextLCD XBeeLib mbed-rtos mbed

Fork of ProjetReceiver by jasmin desilets

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