RTOS example with bluetooth
Dependencies: 4DGL-uLCD-SE SDFileSystem_v1 mbed-rtos mbed wave_player
main.cpp@0:1420a38edeb2, 2018-10-16 (annotated)
- Committer:
- kzar
- Date:
- Tue Oct 16 20:20:09 2018 +0000
- Revision:
- 0:1420a38edeb2
SDFileSystem
Who changed what in which revision?
User | Revision | Line number | New 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 | } |