RTOS example running four threads

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

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?

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