RTOS example with bluetooth

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

Committer:
kzar
Date:
Tue Oct 16 20:22:30 2018 +0000
Revision:
1:4db493a46a9e
Parent:
0:1420a38edeb2
RTOS example code with bluetooth featurez

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kzar 0:1420a38edeb2 1 #include "mbed.h"
kzar 0:1420a38edeb2 2 #include "rtos.h"
kzar 0:1420a38edeb2 3 #include "uLCD_4DGL.h"
kzar 0:1420a38edeb2 4 #include "wave_player.h"
kzar 0:1420a38edeb2 5 #include "SDFileSystem.h"
kzar 0:1420a38edeb2 6
kzar 0:1420a38edeb2 7 uLCD_4DGL lcd(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;)
kzar 0:1420a38edeb2 8 //leds using PwmOut
kzar 0:1420a38edeb2 9 PwmOut red(p26);
kzar 0:1420a38edeb2 10 PwmOut green(p25);
kzar 0:1420a38edeb2 11 PwmOut blue(p24);
kzar 0:1420a38edeb2 12 //Serial out for changing led color using ble
kzar 0:1420a38edeb2 13 RawSerial bluemod(p9,p10);
kzar 0:1420a38edeb2 14 //Analog out for speaker, and waveplayer linked to this pin
kzar 0:1420a38edeb2 15 AnalogOut DACout(p18);
kzar 0:1420a38edeb2 16 //Wave player and sd system for playing sound clips
kzar 0:1420a38edeb2 17 wave_player waver(&DACout);
kzar 0:1420a38edeb2 18 SDFileSystem sd(p5, p6, p7, p8, "sd");
kzar 0:1420a38edeb2 19 // mutex to make the lcd lib thread safe
kzar 0:1420a38edeb2 20 Mutex lcd_mutex;
kzar 0:1420a38edeb2 21 // Global color values used for lighting the led
kzar 0:1420a38edeb2 22 float ble_red;
kzar 0:1420a38edeb2 23 float ble_green;
kzar 0:1420a38edeb2 24 float ble_blue;
kzar 0:1420a38edeb2 25
kzar 0:1420a38edeb2 26 // Thread 1
kzar 0:1420a38edeb2 27 // Read in the color input from ble
kzar 0:1420a38edeb2 28 void thread1(void const *args)
kzar 0:1420a38edeb2 29 {
kzar 0:1420a38edeb2 30 char bred=0;
kzar 0:1420a38edeb2 31 char bgreen=0;
kzar 0:1420a38edeb2 32 char bblue=0;
kzar 0:1420a38edeb2 33
kzar 0:1420a38edeb2 34 while(1) {
kzar 0:1420a38edeb2 35 //lcd_mutex.lock();
kzar 0:1420a38edeb2 36 if (bluemod.getc()=='!') {
kzar 0:1420a38edeb2 37 if (bluemod.getc()=='C') { //color data packet
kzar 0:1420a38edeb2 38 bred = bluemod.getc(); // RGB color values
kzar 0:1420a38edeb2 39 bgreen = bluemod.getc();
kzar 0:1420a38edeb2 40 bblue = bluemod.getc();
kzar 0:1420a38edeb2 41 if (bluemod.getc()==char(~('!' + 'C' + bred + bgreen + bblue))) { //checksum OK?
kzar 0:1420a38edeb2 42 ble_red = bred/255.0; //send new color to RGB LED PWM outputs
kzar 0:1420a38edeb2 43 ble_green = bgreen/255.0;
kzar 0:1420a38edeb2 44 ble_blue = bblue/255.0;
kzar 0:1420a38edeb2 45 }
kzar 0:1420a38edeb2 46 }
kzar 0:1420a38edeb2 47 }
kzar 0:1420a38edeb2 48 //lcd_mutex.unlock();
kzar 0:1420a38edeb2 49 }
kzar 0:1420a38edeb2 50 }
kzar 0:1420a38edeb2 51 // Thread 2
kzar 0:1420a38edeb2 52 // Update the lcd with the current rgb values
kzar 0:1420a38edeb2 53 void thread2(void const *args)
kzar 0:1420a38edeb2 54 {
kzar 0:1420a38edeb2 55 while(true) { // thread loop
kzar 0:1420a38edeb2 56 lcd_mutex.lock();
kzar 0:1420a38edeb2 57 lcd.color(WHITE);
kzar 0:1420a38edeb2 58 lcd.locate(1,1);
kzar 0:1420a38edeb2 59 lcd.printf("R: %f", (float)red);
kzar 0:1420a38edeb2 60 lcd.locate(1,3);
kzar 0:1420a38edeb2 61 lcd.printf("B: %f", (float)blue);
kzar 0:1420a38edeb2 62 lcd.locate(1,5);
kzar 0:1420a38edeb2 63 lcd.printf("G: %f", (float)green);
kzar 0:1420a38edeb2 64 lcd_mutex.unlock();
kzar 0:1420a38edeb2 65 Thread::wait(150);
kzar 0:1420a38edeb2 66 }
kzar 0:1420a38edeb2 67 }
kzar 0:1420a38edeb2 68 // Thread 3
kzar 0:1420a38edeb2 69 // Display the current program time
kzar 0:1420a38edeb2 70 void thread3(void const *args)
kzar 0:1420a38edeb2 71 {
kzar 0:1420a38edeb2 72 int t = 0;
kzar 0:1420a38edeb2 73 while(1) {
kzar 0:1420a38edeb2 74 lcd_mutex.lock();
kzar 0:1420a38edeb2 75 lcd.locate(1,9);
kzar 0:1420a38edeb2 76 lcd.color(RED);
kzar 0:1420a38edeb2 77 lcd.printf("Time: %d seconds", t);
kzar 0:1420a38edeb2 78 lcd_mutex.unlock();
kzar 0:1420a38edeb2 79
kzar 0:1420a38edeb2 80 t++;
kzar 0:1420a38edeb2 81 Thread::wait(1000);
kzar 0:1420a38edeb2 82 }
kzar 0:1420a38edeb2 83 }
kzar 0:1420a38edeb2 84 // Thread 4
kzar 0:1420a38edeb2 85 // Take the color input from ble and ramp it up on the leds
kzar 0:1420a38edeb2 86 void thread4(void const *args)
kzar 0:1420a38edeb2 87 {
kzar 0:1420a38edeb2 88 while(1) {
kzar 0:1420a38edeb2 89 red = green = blue = 0;
kzar 0:1420a38edeb2 90 for (int i = 5; i >= 1; --i) {
kzar 0:1420a38edeb2 91 red = ble_red/i;
kzar 0:1420a38edeb2 92 green = ble_green/i;
kzar 0:1420a38edeb2 93 blue = ble_blue/i;
kzar 0:1420a38edeb2 94 Thread::wait(300);
kzar 0:1420a38edeb2 95 }
kzar 0:1420a38edeb2 96 }
kzar 0:1420a38edeb2 97 }
kzar 0:1420a38edeb2 98
kzar 0:1420a38edeb2 99 int main()
kzar 0:1420a38edeb2 100 {
kzar 0:1420a38edeb2 101 //Get a file pointer for playing audio
kzar 0:1420a38edeb2 102 FILE *wave_file;
kzar 0:1420a38edeb2 103 //Jack up the lcds baud rate
kzar 0:1420a38edeb2 104 lcd.baudrate(3000000);
kzar 0:1420a38edeb2 105
kzar 0:1420a38edeb2 106 Thread t1(thread1); //start thread1
kzar 0:1420a38edeb2 107 Thread t2(thread2); //start thread2
kzar 0:1420a38edeb2 108 Thread t3(thread3); //start thread3
kzar 0:1420a38edeb2 109 Thread t4(thread4); //start thread4
kzar 0:1420a38edeb2 110
kzar 0:1420a38edeb2 111 while(1) {
kzar 0:1420a38edeb2 112 wave_file=fopen("/sd/mydir/siren.wav","r");
kzar 0:1420a38edeb2 113 if(wave_file==NULL) printf("file open error!\n\n\r");
kzar 0:1420a38edeb2 114 waver.play(wave_file);
kzar 0:1420a38edeb2 115 fclose(wave_file);
kzar 0:1420a38edeb2 116 Thread::wait(1000);
kzar 0:1420a38edeb2 117 }
kzar 0:1420a38edeb2 118 }