RTOS example running four threads
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
main.cpp@0:9fc1245cb50f, 2018-10-16 (annotated)
- Committer:
- kzar
- Date:
- Tue Oct 16 20:19:23 2018 +0000
- Revision:
- 0:9fc1245cb50f
RTOS example running four threads;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kzar | 0:9fc1245cb50f | 1 | #include "mbed.h" |
kzar | 0:9fc1245cb50f | 2 | #include "rtos.h" |
kzar | 0:9fc1245cb50f | 3 | #include "uLCD_4DGL.h" |
kzar | 0:9fc1245cb50f | 4 | #include "wave_player.h" |
kzar | 0:9fc1245cb50f | 5 | #include "SDFileSystem.h" |
kzar | 0:9fc1245cb50f | 6 | |
kzar | 0:9fc1245cb50f | 7 | uLCD_4DGL lcd(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;) |
kzar | 0:9fc1245cb50f | 8 | //Init leds using PwmOut |
kzar | 0:9fc1245cb50f | 9 | PwmOut red(p26); |
kzar | 0:9fc1245cb50f | 10 | PwmOut green(p25); |
kzar | 0:9fc1245cb50f | 11 | PwmOut blue(p24); |
kzar | 0:9fc1245cb50f | 12 | //Analog out for speaker, and waveplayer linked to this pin |
kzar | 0:9fc1245cb50f | 13 | AnalogOut DACout(p18); |
kzar | 0:9fc1245cb50f | 14 | wave_player waver(&DACout); |
kzar | 0:9fc1245cb50f | 15 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); |
kzar | 0:9fc1245cb50f | 16 | // mutex to make the lcd lib thread safe |
kzar | 0:9fc1245cb50f | 17 | Mutex lcd_mutex; |
kzar | 0:9fc1245cb50f | 18 | |
kzar | 0:9fc1245cb50f | 19 | Semaphore lcd_sem(1); |
kzar | 0:9fc1245cb50f | 20 | |
kzar | 0:9fc1245cb50f | 21 | |
kzar | 0:9fc1245cb50f | 22 | // Thread 1, led fire effect |
kzar | 0:9fc1245cb50f | 23 | void thread1(void const *args) |
kzar | 0:9fc1245cb50f | 24 | { |
kzar | 0:9fc1245cb50f | 25 | while(1) { |
kzar | 0:9fc1245cb50f | 26 | //ramp up brightness level |
kzar | 0:9fc1245cb50f | 27 | for(double x = 0.0; x <= 1.0; x = x+0.2) { |
kzar | 0:9fc1245cb50f | 28 | red = x*x; |
kzar | 0:9fc1245cb50f | 29 | Thread::wait(300); |
kzar | 0:9fc1245cb50f | 30 | } |
kzar | 0:9fc1245cb50f | 31 | red=0; |
kzar | 0:9fc1245cb50f | 32 | //ramp up brightness level |
kzar | 0:9fc1245cb50f | 33 | for(double x = 0.0; x <= 1.0; x = x+0.2) { |
kzar | 0:9fc1245cb50f | 34 | blue = x*x; |
kzar | 0:9fc1245cb50f | 35 | Thread::wait(300); |
kzar | 0:9fc1245cb50f | 36 | } |
kzar | 0:9fc1245cb50f | 37 | blue=0; |
kzar | 0:9fc1245cb50f | 38 | } |
kzar | 0:9fc1245cb50f | 39 | } |
kzar | 0:9fc1245cb50f | 40 | |
kzar | 0:9fc1245cb50f | 41 | // Thread 2 update the lcd with the current rgb values |
kzar | 0:9fc1245cb50f | 42 | void thread2(void const *args) |
kzar | 0:9fc1245cb50f | 43 | { |
kzar | 0:9fc1245cb50f | 44 | while(true) { // thread loop |
kzar | 0:9fc1245cb50f | 45 | //lcd_mutex.lock(); |
kzar | 0:9fc1245cb50f | 46 | lcd_sem.wait(); |
kzar | 0:9fc1245cb50f | 47 | lcd.color(WHITE); |
kzar | 0:9fc1245cb50f | 48 | lcd.locate(1,1); |
kzar | 0:9fc1245cb50f | 49 | lcd.printf("R: %f", (float)red); |
kzar | 0:9fc1245cb50f | 50 | lcd.locate(1,3); |
kzar | 0:9fc1245cb50f | 51 | lcd.printf("B: %f", (float)blue); |
kzar | 0:9fc1245cb50f | 52 | //lcd_mutex.unlock(); |
kzar | 0:9fc1245cb50f | 53 | lcd_sem.release(); |
kzar | 0:9fc1245cb50f | 54 | Thread::wait(150); |
kzar | 0:9fc1245cb50f | 55 | } |
kzar | 0:9fc1245cb50f | 56 | } |
kzar | 0:9fc1245cb50f | 57 | |
kzar | 0:9fc1245cb50f | 58 | // Thread 3 |
kzar | 0:9fc1245cb50f | 59 | // print a sin function in a small window |
kzar | 0:9fc1245cb50f | 60 | // the value of DACout pin changes the speed of the sine wave |
kzar | 0:9fc1245cb50f | 61 | void thread3(void const *args) |
kzar | 0:9fc1245cb50f | 62 | { |
kzar | 0:9fc1245cb50f | 63 | int t = 0; |
kzar | 0:9fc1245cb50f | 64 | |
kzar | 0:9fc1245cb50f | 65 | while(1) { |
kzar | 0:9fc1245cb50f | 66 | //lcd_mutex.lock(); |
kzar | 0:9fc1245cb50f | 67 | lcd_sem.wait(); |
kzar | 0:9fc1245cb50f | 68 | lcd.locate(1,9); |
kzar | 0:9fc1245cb50f | 69 | lcd.color(RED); |
kzar | 0:9fc1245cb50f | 70 | lcd.printf("Time: %d seconds", t); |
kzar | 0:9fc1245cb50f | 71 | //lcd_mutex.unlock(); |
kzar | 0:9fc1245cb50f | 72 | lcd_sem.release(); |
kzar | 0:9fc1245cb50f | 73 | |
kzar | 0:9fc1245cb50f | 74 | t++; |
kzar | 0:9fc1245cb50f | 75 | Thread::wait(1000); |
kzar | 0:9fc1245cb50f | 76 | } |
kzar | 0:9fc1245cb50f | 77 | } |
kzar | 0:9fc1245cb50f | 78 | |
kzar | 0:9fc1245cb50f | 79 | int main() |
kzar | 0:9fc1245cb50f | 80 | { |
kzar | 0:9fc1245cb50f | 81 | //Get a file pointer for playing audio |
kzar | 0:9fc1245cb50f | 82 | FILE *wave_file; |
kzar | 0:9fc1245cb50f | 83 | //Jack up the lcds baud rate |
kzar | 0:9fc1245cb50f | 84 | lcd.baudrate(3000000); |
kzar | 0:9fc1245cb50f | 85 | green = 0; |
kzar | 0:9fc1245cb50f | 86 | |
kzar | 0:9fc1245cb50f | 87 | Thread t1(thread1); //start thread1 |
kzar | 0:9fc1245cb50f | 88 | Thread t2(thread2); //start thread2 |
kzar | 0:9fc1245cb50f | 89 | Thread t3(thread3); //start thread3 |
kzar | 0:9fc1245cb50f | 90 | |
kzar | 0:9fc1245cb50f | 91 | while(1) { |
kzar | 0:9fc1245cb50f | 92 | wave_file=fopen("/sd/mydir/siren.wav","r"); |
kzar | 0:9fc1245cb50f | 93 | if(wave_file==NULL) printf("file open error!\n\n\r"); |
kzar | 0:9fc1245cb50f | 94 | waver.play(wave_file); |
kzar | 0:9fc1245cb50f | 95 | fclose(wave_file); |
kzar | 0:9fc1245cb50f | 96 | } |
kzar | 0:9fc1245cb50f | 97 | } |