Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE SDFileSystem_3 mbed-rtos mbed wave_player
main.cpp@2:3de25ad12458, 2022-10-13 (annotated)
- Committer:
- mus3
- Date:
- Thu Oct 13 18:59:26 2022 +0000
- Revision:
- 2:3de25ad12458
- Parent:
- 1:60087ee45d3b
lab3part5 bluetooth
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mus3 | 0:f531454e4dce | 1 | #include "uLCD_4DGL.h" |
| mus3 | 0:f531454e4dce | 2 | #include "mbed.h" |
| mus3 | 0:f531454e4dce | 3 | #include "rtos.h" |
| mus3 | 0:f531454e4dce | 4 | #include "SongPlayer.h" |
| mus3 | 0:f531454e4dce | 5 | |
| mus3 | 0:f531454e4dce | 6 | uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin; |
| mus3 | 0:f531454e4dce | 7 | AnalogOut DACout(p18); |
| mus3 | 0:f531454e4dce | 8 | DigitalOut myled(LED1); |
| mus3 | 0:f531454e4dce | 9 | PwmOut RGBLED_r(p23); |
| mus3 | 0:f531454e4dce | 10 | PwmOut RGBLED_g(p24); |
| mus3 | 0:f531454e4dce | 11 | PwmOut RGBLED_b(p25); |
| mus3 | 2:3de25ad12458 | 12 | Serial blue(p13,p14); |
| mus3 | 0:f531454e4dce | 13 | |
| mus3 | 0:f531454e4dce | 14 | float note[18]= {1568.0,1396.9,1244.5,1244.5,1396.9,1568.0,1568.0,1568.0,1396.9, |
| mus3 | 0:f531454e4dce | 15 | 1244.5,1396.9,1568.0,1396.9,1244.5,1174.7,1244.5,1244.5, 0.0 |
| mus3 | 0:f531454e4dce | 16 | }; |
| mus3 | 0:f531454e4dce | 17 | float duration[18]= {0.48,0.24,0.72,0.48,0.24,0.48,0.24,0.24,0.24, |
| mus3 | 0:f531454e4dce | 18 | 0.24,0.24,0.24,0.24,0.48,0.24,0.48,0.48, 0.0 |
| mus3 | 0:f531454e4dce | 19 | }; |
| mus3 | 0:f531454e4dce | 20 | |
| mus3 | 0:f531454e4dce | 21 | // mutex to make the lcd lib thread safe |
| mus3 | 0:f531454e4dce | 22 | Mutex lcd_mutex; |
| mus3 | 0:f531454e4dce | 23 | |
| mus3 | 0:f531454e4dce | 24 | // global variables |
| mus3 | 0:f531454e4dce | 25 | int i = 0; |
| mus3 | 0:f531454e4dce | 26 | int ix = 0; |
| mus3 | 2:3de25ad12458 | 27 | int iy = 90; |
| mus3 | 2:3de25ad12458 | 28 | char color = 'g'; |
| mus3 | 2:3de25ad12458 | 29 | int flight_dir = 8; |
| mus3 | 0:f531454e4dce | 30 | |
| mus3 | 0:f531454e4dce | 31 | void drawairplane(int x, int y) { |
| mus3 | 0:f531454e4dce | 32 | uLCD.filled_rectangle(x, y+7, x+27, y+13, WHITE); |
| mus3 | 0:f531454e4dce | 33 | uLCD.filled_rectangle(x, y, x+4, y+6, BLUE); |
| mus3 | 0:f531454e4dce | 34 | uLCD.filled_rectangle(x, y+14, x+4, y+20, BLUE); |
| mus3 | 0:f531454e4dce | 35 | uLCD.filled_rectangle(x+16, y-6, x+20, y+6, BLUE); |
| mus3 | 0:f531454e4dce | 36 | uLCD.filled_rectangle(x+16, y+14, x+20, y+26, BLUE); |
| mus3 | 0:f531454e4dce | 37 | uLCD.filled_rectangle(x+20, y+9, x+27, y+11, BLUE); |
| mus3 | 0:f531454e4dce | 38 | uLCD.filled_rectangle(x+15, y+9, x+17, y+11, BLUE); |
| mus3 | 0:f531454e4dce | 39 | uLCD.filled_rectangle(x+10, y+9, x+12, y+11, BLUE); |
| mus3 | 0:f531454e4dce | 40 | uLCD.filled_rectangle(x+5, y+9, x+7, y+11, BLUE); |
| mus3 | 0:f531454e4dce | 41 | } |
| mus3 | 0:f531454e4dce | 42 | |
| mus3 | 0:f531454e4dce | 43 | // Thread 1 |
| mus3 | 0:f531454e4dce | 44 | // RGB LED |
| mus3 | 0:f531454e4dce | 45 | void thread1(void const *args) |
| mus3 | 0:f531454e4dce | 46 | { |
| mus3 | 0:f531454e4dce | 47 | while(true) { // thread loop |
| mus3 | 2:3de25ad12458 | 48 | /* |
| mus3 | 0:f531454e4dce | 49 | if (i < 10) { |
| mus3 | 0:f531454e4dce | 50 | RGBLED_r = 0.0; |
| mus3 | 0:f531454e4dce | 51 | RGBLED_g = (float) i / 10; |
| mus3 | 0:f531454e4dce | 52 | RGBLED_b = 0.0; |
| mus3 | 0:f531454e4dce | 53 | } else if (10 <= i && i < 20) { |
| mus3 | 0:f531454e4dce | 54 | RGBLED_r = 0.0; |
| mus3 | 0:f531454e4dce | 55 | RGBLED_g = (float) (20 - i) / 10; |
| mus3 | 0:f531454e4dce | 56 | RGBLED_b = 0.0; |
| mus3 | 0:f531454e4dce | 57 | } else if (20 <= i && i < 30) { |
| mus3 | 0:f531454e4dce | 58 | RGBLED_r = (float) (i - 20) / 10; |
| mus3 | 0:f531454e4dce | 59 | RGBLED_g = (float) (i - 20) / 10; |
| mus3 | 0:f531454e4dce | 60 | RGBLED_b = (float) (i - 20) / 10; |
| mus3 | 0:f531454e4dce | 61 | } else if (30 <= i && i < 40) { |
| mus3 | 0:f531454e4dce | 62 | RGBLED_r = (float) (40 - i) / 10; |
| mus3 | 0:f531454e4dce | 63 | RGBLED_g = (float) (40 - i) / 10; |
| mus3 | 0:f531454e4dce | 64 | RGBLED_b = (float) (40 - i) / 10; |
| mus3 | 0:f531454e4dce | 65 | } else { |
| mus3 | 0:f531454e4dce | 66 | i = -1; |
| mus3 | 0:f531454e4dce | 67 | } |
| mus3 | 0:f531454e4dce | 68 | i++; |
| mus3 | 2:3de25ad12458 | 69 | */ |
| mus3 | 2:3de25ad12458 | 70 | if (color == 'r') { |
| mus3 | 2:3de25ad12458 | 71 | RGBLED_r = 0.8; |
| mus3 | 2:3de25ad12458 | 72 | RGBLED_g = 0.0; |
| mus3 | 2:3de25ad12458 | 73 | RGBLED_b = 0.0; |
| mus3 | 2:3de25ad12458 | 74 | } else if (color == 'g') { |
| mus3 | 2:3de25ad12458 | 75 | RGBLED_r = 0.0; |
| mus3 | 2:3de25ad12458 | 76 | RGBLED_g = 0.8; |
| mus3 | 2:3de25ad12458 | 77 | RGBLED_b = 0.0; |
| mus3 | 2:3de25ad12458 | 78 | } else if (color == 'b') { |
| mus3 | 2:3de25ad12458 | 79 | RGBLED_r = 0.0; |
| mus3 | 2:3de25ad12458 | 80 | RGBLED_g = 0.0; |
| mus3 | 2:3de25ad12458 | 81 | RGBLED_b = 0.8; |
| mus3 | 2:3de25ad12458 | 82 | } else { |
| mus3 | 2:3de25ad12458 | 83 | RGBLED_r = 0.0; |
| mus3 | 2:3de25ad12458 | 84 | RGBLED_g = 0.8; |
| mus3 | 2:3de25ad12458 | 85 | RGBLED_b = 0.0; |
| mus3 | 2:3de25ad12458 | 86 | } |
| mus3 | 0:f531454e4dce | 87 | Thread::wait(200); // wait 0.2s |
| mus3 | 0:f531454e4dce | 88 | } |
| mus3 | 0:f531454e4dce | 89 | } |
| mus3 | 0:f531454e4dce | 90 | |
| mus3 | 0:f531454e4dce | 91 | |
| mus3 | 0:f531454e4dce | 92 | void thread2(void const *args) |
| mus3 | 0:f531454e4dce | 93 | { |
| mus3 | 1:60087ee45d3b | 94 | while (true) { |
| mus3 | 1:60087ee45d3b | 95 | SongPlayer mySpeaker(p21); |
| mus3 | 1:60087ee45d3b | 96 | mySpeaker.PlaySong(note,duration); |
| mus3 | 1:60087ee45d3b | 97 | Thread::wait(6000); // wait 6s |
| mus3 | 1:60087ee45d3b | 98 | } |
| mus3 | 0:f531454e4dce | 99 | } |
| mus3 | 0:f531454e4dce | 100 | |
| mus3 | 0:f531454e4dce | 101 | |
| mus3 | 0:f531454e4dce | 102 | void thread3(void const *args) |
| mus3 | 0:f531454e4dce | 103 | { |
| mus3 | 0:f531454e4dce | 104 | while (true) { |
| mus3 | 0:f531454e4dce | 105 | time_t seconds = time(NULL); |
| mus3 | 0:f531454e4dce | 106 | lcd_mutex.lock(); |
| mus3 | 0:f531454e4dce | 107 | uLCD.filled_rectangle(0, 0, 127, 63, BLACK); |
| mus3 | 0:f531454e4dce | 108 | char buffer[32]; |
| mus3 | 0:f531454e4dce | 109 | strftime(buffer, 32, "%I:%M:%S %p\n", localtime(&seconds)); |
| mus3 | 0:f531454e4dce | 110 | uLCD.locate(0,0); |
| mus3 | 0:f531454e4dce | 111 | uLCD.printf(buffer); |
| mus3 | 0:f531454e4dce | 112 | lcd_mutex.unlock(); |
| mus3 | 0:f531454e4dce | 113 | Thread::wait(1000); // wait 1s |
| mus3 | 0:f531454e4dce | 114 | } |
| mus3 | 0:f531454e4dce | 115 | } |
| mus3 | 0:f531454e4dce | 116 | |
| mus3 | 0:f531454e4dce | 117 | void thread4(void const *args) |
| mus3 | 0:f531454e4dce | 118 | { |
| mus3 | 0:f531454e4dce | 119 | while (true) { |
| mus3 | 0:f531454e4dce | 120 | lcd_mutex.lock(); |
| mus3 | 0:f531454e4dce | 121 | uLCD.filled_rectangle(0, 63, 127, 127, BLACK); |
| mus3 | 2:3de25ad12458 | 122 | drawairplane(ix, iy); |
| mus3 | 0:f531454e4dce | 123 | lcd_mutex.unlock(); |
| mus3 | 2:3de25ad12458 | 124 | if (flight_dir == 8) { |
| mus3 | 2:3de25ad12458 | 125 | ix += 1; |
| mus3 | 2:3de25ad12458 | 126 | } else if (flight_dir == 7) { |
| mus3 | 2:3de25ad12458 | 127 | ix -= 1; |
| mus3 | 2:3de25ad12458 | 128 | } else if (flight_dir == 6) { |
| mus3 | 2:3de25ad12458 | 129 | iy += 1; |
| mus3 | 2:3de25ad12458 | 130 | } else if (flight_dir == 5) { |
| mus3 | 2:3de25ad12458 | 131 | iy -= 1; |
| mus3 | 2:3de25ad12458 | 132 | } |
| mus3 | 0:f531454e4dce | 133 | if (ix > 100) { |
| mus3 | 0:f531454e4dce | 134 | ix = 0; |
| mus3 | 2:3de25ad12458 | 135 | } else if (ix < 0) { |
| mus3 | 2:3de25ad12458 | 136 | ix = 99; |
| mus3 | 2:3de25ad12458 | 137 | } else if (iy > 113) { |
| mus3 | 2:3de25ad12458 | 138 | iy = 64; |
| mus3 | 2:3de25ad12458 | 139 | } else if (iy < 64) { |
| mus3 | 2:3de25ad12458 | 140 | iy = 113; |
| mus3 | 0:f531454e4dce | 141 | } |
| mus3 | 0:f531454e4dce | 142 | Thread::wait(500); // wait 0.75s |
| mus3 | 0:f531454e4dce | 143 | } |
| mus3 | 0:f531454e4dce | 144 | } |
| mus3 | 0:f531454e4dce | 145 | |
| mus3 | 0:f531454e4dce | 146 | |
| mus3 | 0:f531454e4dce | 147 | int main() { |
| mus3 | 0:f531454e4dce | 148 | Thread t1(thread1); //start thread1 |
| mus3 | 0:f531454e4dce | 149 | Thread t2(thread2); //start thread2 |
| mus3 | 0:f531454e4dce | 150 | Thread t3(thread3); //start thread3 |
| mus3 | 0:f531454e4dce | 151 | Thread t4(thread4); //start thread3 |
| mus3 | 0:f531454e4dce | 152 | set_time(1256729737); |
| mus3 | 0:f531454e4dce | 153 | while(1) { |
| mus3 | 2:3de25ad12458 | 154 | char bnum=0; |
| mus3 | 2:3de25ad12458 | 155 | char bhit=0; |
| mus3 | 2:3de25ad12458 | 156 | if (!blue.readable()) { |
| mus3 | 2:3de25ad12458 | 157 | continue; |
| mus3 | 2:3de25ad12458 | 158 | } |
| mus3 | 2:3de25ad12458 | 159 | if (blue.getc()=='!') { |
| mus3 | 2:3de25ad12458 | 160 | if (blue.getc()=='B') { //button data packet |
| mus3 | 2:3de25ad12458 | 161 | bnum = blue.getc(); //button number |
| mus3 | 2:3de25ad12458 | 162 | bhit = blue.getc(); //1=hit, 0=release |
| mus3 | 2:3de25ad12458 | 163 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
| mus3 | 2:3de25ad12458 | 164 | myled = bnum - '0'; //current button number will appear on LEDs |
| mus3 | 2:3de25ad12458 | 165 | switch (bnum) { |
| mus3 | 2:3de25ad12458 | 166 | case '1': //number button 1 |
| mus3 | 2:3de25ad12458 | 167 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 168 | //add hit code here |
| mus3 | 2:3de25ad12458 | 169 | color = 'r'; |
| mus3 | 2:3de25ad12458 | 170 | } //else { |
| mus3 | 2:3de25ad12458 | 171 | //add release code here |
| mus3 | 2:3de25ad12458 | 172 | //} |
| mus3 | 2:3de25ad12458 | 173 | break; |
| mus3 | 2:3de25ad12458 | 174 | case '2': //number button 2 |
| mus3 | 2:3de25ad12458 | 175 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 176 | //add hit code here |
| mus3 | 2:3de25ad12458 | 177 | color = 'g'; |
| mus3 | 2:3de25ad12458 | 178 | } //else { |
| mus3 | 2:3de25ad12458 | 179 | //add release code here |
| mus3 | 2:3de25ad12458 | 180 | //} |
| mus3 | 2:3de25ad12458 | 181 | break; |
| mus3 | 2:3de25ad12458 | 182 | case '3': //number button 3 |
| mus3 | 2:3de25ad12458 | 183 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 184 | //add hit code here |
| mus3 | 2:3de25ad12458 | 185 | color = 'b'; |
| mus3 | 2:3de25ad12458 | 186 | } //else { |
| mus3 | 2:3de25ad12458 | 187 | //add release code here |
| mus3 | 2:3de25ad12458 | 188 | //} |
| mus3 | 2:3de25ad12458 | 189 | break; |
| mus3 | 2:3de25ad12458 | 190 | case '4': //number button 4 |
| mus3 | 2:3de25ad12458 | 191 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 192 | //add hit code here |
| mus3 | 2:3de25ad12458 | 193 | } //else { |
| mus3 | 2:3de25ad12458 | 194 | //add release code here |
| mus3 | 2:3de25ad12458 | 195 | //} |
| mus3 | 2:3de25ad12458 | 196 | break; |
| mus3 | 2:3de25ad12458 | 197 | case '5': //button 5 up arrow |
| mus3 | 2:3de25ad12458 | 198 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 199 | //add hit code here |
| mus3 | 2:3de25ad12458 | 200 | flight_dir = 5; |
| mus3 | 2:3de25ad12458 | 201 | } //else { |
| mus3 | 2:3de25ad12458 | 202 | //add release code here |
| mus3 | 2:3de25ad12458 | 203 | //} |
| mus3 | 2:3de25ad12458 | 204 | break; |
| mus3 | 2:3de25ad12458 | 205 | case '6': //button 6 down arrow |
| mus3 | 2:3de25ad12458 | 206 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 207 | //add hit code here |
| mus3 | 2:3de25ad12458 | 208 | flight_dir = 6; |
| mus3 | 2:3de25ad12458 | 209 | } //else { |
| mus3 | 2:3de25ad12458 | 210 | //add release code here |
| mus3 | 2:3de25ad12458 | 211 | //} |
| mus3 | 2:3de25ad12458 | 212 | break; |
| mus3 | 2:3de25ad12458 | 213 | case '7': //button 7 left arrow |
| mus3 | 2:3de25ad12458 | 214 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 215 | //add hit code here |
| mus3 | 2:3de25ad12458 | 216 | flight_dir = 7; |
| mus3 | 2:3de25ad12458 | 217 | } //else { |
| mus3 | 2:3de25ad12458 | 218 | //add release code here |
| mus3 | 2:3de25ad12458 | 219 | //} |
| mus3 | 2:3de25ad12458 | 220 | break; |
| mus3 | 2:3de25ad12458 | 221 | case '8': //button 8 right arrow |
| mus3 | 2:3de25ad12458 | 222 | if (bhit=='1') { |
| mus3 | 2:3de25ad12458 | 223 | //add hit code here |
| mus3 | 2:3de25ad12458 | 224 | flight_dir = 8; |
| mus3 | 2:3de25ad12458 | 225 | } //else { |
| mus3 | 2:3de25ad12458 | 226 | //add release code here |
| mus3 | 2:3de25ad12458 | 227 | //} |
| mus3 | 2:3de25ad12458 | 228 | break; |
| mus3 | 2:3de25ad12458 | 229 | default: |
| mus3 | 2:3de25ad12458 | 230 | break; |
| mus3 | 2:3de25ad12458 | 231 | } |
| mus3 | 2:3de25ad12458 | 232 | } |
| mus3 | 2:3de25ad12458 | 233 | } |
| mus3 | 2:3de25ad12458 | 234 | } |
| mus3 | 0:f531454e4dce | 235 | } |
| mus3 | 0:f531454e4dce | 236 | Thread::wait(200); // wait 0.2s |
| mus3 | 0:f531454e4dce | 237 | } |