lab3part5
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
main.cpp
- Committer:
- mus3
- Date:
- 21 months ago
- Revision:
- 2:9a28b8d45258
- Parent:
- 1:60087ee45d3b
File content as of revision 2:9a28b8d45258:
#include "uLCD_4DGL.h"
#include "mbed.h"
#include "rtos.h"
#include "SongPlayer.h"
uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin;
AnalogOut DACout(p18);
DigitalOut myled(LED1);
PwmOut RGBLED_r(p23);
PwmOut RGBLED_g(p24);
PwmOut RGBLED_b(p25);
float note[18]= {1568.0,1396.9,1244.5,1244.5,1396.9,1568.0,1568.0,1568.0,1396.9,
1244.5,1396.9,1568.0,1396.9,1244.5,1174.7,1244.5,1244.5, 0.0
};
float duration[18]= {0.48,0.24,0.72,0.48,0.24,0.48,0.24,0.24,0.24,
0.24,0.24,0.24,0.24,0.48,0.24,0.48,0.48, 0.0
};
// mutex to make the lcd lib thread safe
Mutex lcd_mutex;
// global variables
int i = 0;
int ix = 0;
void drawairplane(int x, int y) {
uLCD.filled_rectangle(x, y+7, x+27, y+13, WHITE);
uLCD.filled_rectangle(x, y, x+4, y+6, BLUE);
uLCD.filled_rectangle(x, y+14, x+4, y+20, BLUE);
uLCD.filled_rectangle(x+16, y-6, x+20, y+6, BLUE);
uLCD.filled_rectangle(x+16, y+14, x+20, y+26, BLUE);
uLCD.filled_rectangle(x+20, y+9, x+27, y+11, BLUE);
uLCD.filled_rectangle(x+15, y+9, x+17, y+11, BLUE);
uLCD.filled_rectangle(x+10, y+9, x+12, y+11, BLUE);
uLCD.filled_rectangle(x+5, y+9, x+7, y+11, BLUE);
}
// Thread 1
// RGB LED
void thread1(void const *args)
{
while(true) { // thread loop
if (i < 10) {
RGBLED_r = 0.0;
RGBLED_g = (float) i / 10;
RGBLED_b = 0.0;
} else if (10 <= i && i < 20) {
RGBLED_r = 0.0;
RGBLED_g = (float) (20 - i) / 10;
RGBLED_b = 0.0;
} else if (20 <= i && i < 30) {
RGBLED_r = (float) (i - 20) / 10;
RGBLED_g = (float) (i - 20) / 10;
RGBLED_b = (float) (i - 20) / 10;
} else if (30 <= i && i < 40) {
RGBLED_r = (float) (40 - i) / 10;
RGBLED_g = (float) (40 - i) / 10;
RGBLED_b = (float) (40 - i) / 10;
} else {
i = -1;
}
i++;
Thread::wait(200); // wait 0.2s
}
}
void thread2(void const *args)
{
while (true) {
SongPlayer mySpeaker(p21);
mySpeaker.PlaySong(note,duration);
Thread::wait(6000); // wait 6s
}
}
void thread3(void const *args)
{
while (true) {
time_t seconds = time(NULL);
lcd_mutex.lock();
uLCD.filled_rectangle(0, 0, 127, 63, BLACK);
char buffer[32];
strftime(buffer, 32, "%I:%M:%S %p\n", localtime(&seconds));
uLCD.locate(0,0);
uLCD.printf(buffer);
lcd_mutex.unlock();
Thread::wait(1000); // wait 1s
}
}
void thread4(void const *args)
{
while (true) {
lcd_mutex.lock();
uLCD.filled_rectangle(0, 63, 127, 127, BLACK);
drawairplane(ix, 90);
lcd_mutex.unlock();
ix += 1;
if (ix > 100) {
ix = 0;
}
Thread::wait(500); // wait 0.75s
}
}
int main() {
Thread t1(thread1); //start thread1
Thread t2(thread2); //start thread2
Thread t3(thread3); //start thread3
Thread t4(thread4); //start thread3
set_time(1256729737);
while(1) {
myled = 1;
wait(0.2);
myled = 0;
wait(0.2);
}
Thread::wait(200); // wait 0.2s
}