ece4180_team / Mbed 2 deprecated lab3part5

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Committer:
mus3
Date:
Mon Oct 10 19:32:51 2022 +0000
Revision:
0:f531454e4dce
Child:
1:60087ee45d3b
rtos

Who changed what in which revision?

UserRevisionLine numberNew 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 }