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 mbed-rtos mbed wave_player
main.cpp@0:f531454e4dce, 2022-10-10 (annotated)
- Committer:
- mus3
- Date:
- Mon Oct 10 19:32:51 2022 +0000
- Revision:
- 0:f531454e4dce
- Child:
- 1:60087ee45d3b
rtos
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 | 0:f531454e4dce | 12 | |
mus3 | 0:f531454e4dce | 13 | float note[18]= {1568.0,1396.9,1244.5,1244.5,1396.9,1568.0,1568.0,1568.0,1396.9, |
mus3 | 0:f531454e4dce | 14 | 1244.5,1396.9,1568.0,1396.9,1244.5,1174.7,1244.5,1244.5, 0.0 |
mus3 | 0:f531454e4dce | 15 | }; |
mus3 | 0:f531454e4dce | 16 | float duration[18]= {0.48,0.24,0.72,0.48,0.24,0.48,0.24,0.24,0.24, |
mus3 | 0:f531454e4dce | 17 | 0.24,0.24,0.24,0.24,0.48,0.24,0.48,0.48, 0.0 |
mus3 | 0:f531454e4dce | 18 | }; |
mus3 | 0:f531454e4dce | 19 | |
mus3 | 0:f531454e4dce | 20 | // mutex to make the lcd lib thread safe |
mus3 | 0:f531454e4dce | 21 | Mutex lcd_mutex; |
mus3 | 0:f531454e4dce | 22 | |
mus3 | 0:f531454e4dce | 23 | // global variables |
mus3 | 0:f531454e4dce | 24 | int i = 0; |
mus3 | 0:f531454e4dce | 25 | int ix = 0; |
mus3 | 0:f531454e4dce | 26 | |
mus3 | 0:f531454e4dce | 27 | void drawairplane(int x, int y) { |
mus3 | 0:f531454e4dce | 28 | uLCD.filled_rectangle(x, y+7, x+27, y+13, WHITE); |
mus3 | 0:f531454e4dce | 29 | uLCD.filled_rectangle(x, y, x+4, y+6, BLUE); |
mus3 | 0:f531454e4dce | 30 | uLCD.filled_rectangle(x, y+14, x+4, y+20, BLUE); |
mus3 | 0:f531454e4dce | 31 | uLCD.filled_rectangle(x+16, y-6, x+20, y+6, BLUE); |
mus3 | 0:f531454e4dce | 32 | uLCD.filled_rectangle(x+16, y+14, x+20, y+26, BLUE); |
mus3 | 0:f531454e4dce | 33 | uLCD.filled_rectangle(x+20, y+9, x+27, y+11, BLUE); |
mus3 | 0:f531454e4dce | 34 | uLCD.filled_rectangle(x+15, y+9, x+17, y+11, BLUE); |
mus3 | 0:f531454e4dce | 35 | uLCD.filled_rectangle(x+10, y+9, x+12, y+11, BLUE); |
mus3 | 0:f531454e4dce | 36 | uLCD.filled_rectangle(x+5, y+9, x+7, y+11, BLUE); |
mus3 | 0:f531454e4dce | 37 | } |
mus3 | 0:f531454e4dce | 38 | |
mus3 | 0:f531454e4dce | 39 | // Thread 1 |
mus3 | 0:f531454e4dce | 40 | // RGB LED |
mus3 | 0:f531454e4dce | 41 | void thread1(void const *args) |
mus3 | 0:f531454e4dce | 42 | { |
mus3 | 0:f531454e4dce | 43 | while(true) { // thread loop |
mus3 | 0:f531454e4dce | 44 | if (i < 10) { |
mus3 | 0:f531454e4dce | 45 | RGBLED_r = 0.0; |
mus3 | 0:f531454e4dce | 46 | RGBLED_g = (float) i / 10; |
mus3 | 0:f531454e4dce | 47 | RGBLED_b = 0.0; |
mus3 | 0:f531454e4dce | 48 | } else if (10 <= i && i < 20) { |
mus3 | 0:f531454e4dce | 49 | RGBLED_r = 0.0; |
mus3 | 0:f531454e4dce | 50 | RGBLED_g = (float) (20 - i) / 10; |
mus3 | 0:f531454e4dce | 51 | RGBLED_b = 0.0; |
mus3 | 0:f531454e4dce | 52 | } else if (20 <= i && i < 30) { |
mus3 | 0:f531454e4dce | 53 | RGBLED_r = (float) (i - 20) / 10; |
mus3 | 0:f531454e4dce | 54 | RGBLED_g = (float) (i - 20) / 10; |
mus3 | 0:f531454e4dce | 55 | RGBLED_b = (float) (i - 20) / 10; |
mus3 | 0:f531454e4dce | 56 | } else if (30 <= i && i < 40) { |
mus3 | 0:f531454e4dce | 57 | RGBLED_r = (float) (40 - i) / 10; |
mus3 | 0:f531454e4dce | 58 | RGBLED_g = (float) (40 - i) / 10; |
mus3 | 0:f531454e4dce | 59 | RGBLED_b = (float) (40 - i) / 10; |
mus3 | 0:f531454e4dce | 60 | } else { |
mus3 | 0:f531454e4dce | 61 | i = -1; |
mus3 | 0:f531454e4dce | 62 | } |
mus3 | 0:f531454e4dce | 63 | i++; |
mus3 | 0:f531454e4dce | 64 | Thread::wait(200); // wait 0.2s |
mus3 | 0:f531454e4dce | 65 | } |
mus3 | 0:f531454e4dce | 66 | } |
mus3 | 0:f531454e4dce | 67 | |
mus3 | 0:f531454e4dce | 68 | |
mus3 | 0:f531454e4dce | 69 | void thread2(void const *args) |
mus3 | 0:f531454e4dce | 70 | { |
mus3 | 0:f531454e4dce | 71 | SongPlayer mySpeaker(p21); |
mus3 | 0:f531454e4dce | 72 | mySpeaker.PlaySong(note,duration); |
mus3 | 0:f531454e4dce | 73 | Thread::wait(2000); // wait 0.01s |
mus3 | 0:f531454e4dce | 74 | } |
mus3 | 0:f531454e4dce | 75 | |
mus3 | 0:f531454e4dce | 76 | |
mus3 | 0:f531454e4dce | 77 | void thread3(void const *args) |
mus3 | 0:f531454e4dce | 78 | { |
mus3 | 0:f531454e4dce | 79 | while (true) { |
mus3 | 0:f531454e4dce | 80 | time_t seconds = time(NULL); |
mus3 | 0:f531454e4dce | 81 | lcd_mutex.lock(); |
mus3 | 0:f531454e4dce | 82 | uLCD.filled_rectangle(0, 0, 127, 63, BLACK); |
mus3 | 0:f531454e4dce | 83 | char buffer[32]; |
mus3 | 0:f531454e4dce | 84 | strftime(buffer, 32, "%I:%M:%S %p\n", localtime(&seconds)); |
mus3 | 0:f531454e4dce | 85 | uLCD.locate(0,0); |
mus3 | 0:f531454e4dce | 86 | uLCD.printf(buffer); |
mus3 | 0:f531454e4dce | 87 | lcd_mutex.unlock(); |
mus3 | 0:f531454e4dce | 88 | Thread::wait(1000); // wait 1s |
mus3 | 0:f531454e4dce | 89 | } |
mus3 | 0:f531454e4dce | 90 | } |
mus3 | 0:f531454e4dce | 91 | |
mus3 | 0:f531454e4dce | 92 | void thread4(void const *args) |
mus3 | 0:f531454e4dce | 93 | { |
mus3 | 0:f531454e4dce | 94 | while (true) { |
mus3 | 0:f531454e4dce | 95 | lcd_mutex.lock(); |
mus3 | 0:f531454e4dce | 96 | uLCD.filled_rectangle(0, 63, 127, 127, BLACK); |
mus3 | 0:f531454e4dce | 97 | drawairplane(ix, 90); |
mus3 | 0:f531454e4dce | 98 | lcd_mutex.unlock(); |
mus3 | 0:f531454e4dce | 99 | ix += 1; |
mus3 | 0:f531454e4dce | 100 | if (ix > 100) { |
mus3 | 0:f531454e4dce | 101 | ix = 0; |
mus3 | 0:f531454e4dce | 102 | } |
mus3 | 0:f531454e4dce | 103 | Thread::wait(500); // wait 0.75s |
mus3 | 0:f531454e4dce | 104 | } |
mus3 | 0:f531454e4dce | 105 | } |
mus3 | 0:f531454e4dce | 106 | |
mus3 | 0:f531454e4dce | 107 | |
mus3 | 0:f531454e4dce | 108 | int main() { |
mus3 | 0:f531454e4dce | 109 | Thread t1(thread1); //start thread1 |
mus3 | 0:f531454e4dce | 110 | Thread t2(thread2); //start thread2 |
mus3 | 0:f531454e4dce | 111 | Thread t3(thread3); //start thread3 |
mus3 | 0:f531454e4dce | 112 | Thread t4(thread4); //start thread3 |
mus3 | 0:f531454e4dce | 113 | set_time(1256729737); |
mus3 | 0:f531454e4dce | 114 | while(1) { |
mus3 | 0:f531454e4dce | 115 | myled = 1; |
mus3 | 0:f531454e4dce | 116 | wait(0.2); |
mus3 | 0:f531454e4dce | 117 | myled = 0; |
mus3 | 0:f531454e4dce | 118 | wait(0.2); |
mus3 | 0:f531454e4dce | 119 | } |
mus3 | 0:f531454e4dce | 120 | Thread::wait(200); // wait 0.2s |
mus3 | 0:f531454e4dce | 121 | } |