Multithreading program for 4180. LCD screen control, sound+SD card loading, LED control

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

Fork of RTOS_threading by James Plager

Committer:
jplager3
Date:
Wed Mar 15 03:17:10 2017 +0000
Revision:
14:601b2c586bff
Parent:
13:72e2a45b7847
Updated working Threading program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
mbed_official 11:0309bef74ba8 2 #include "rtos.h"
jplager3 12:7e05acc6502b 3 #include "uLCD_4DGL.h"
jplager3 12:7e05acc6502b 4 #include "ShiftBrite.h"
jplager3 12:7e05acc6502b 5 #include "SDFileSystem.h"
jplager3 12:7e05acc6502b 6 #include "wave_player.h"
jplager3 12:7e05acc6502b 7
jplager3 12:7e05acc6502b 8 Mutex mutex; //handles writing to the LCD
jplager3 12:7e05acc6502b 9 Mutex mutex2; //used for color changing
emilmont 1:491820ee784d 10 DigitalOut led1(LED1);
emilmont 1:491820ee784d 11 DigitalOut led2(LED2);
jplager3 12:7e05acc6502b 12 DigitalOut led3(LED3);
jplager3 12:7e05acc6502b 13 DigitalOut led4(LED4);
jplager3 12:7e05acc6502b 14 Thread thread1;
jplager3 12:7e05acc6502b 15 Thread thread2;
jplager3 12:7e05acc6502b 16 Thread thread3;
jplager3 12:7e05acc6502b 17 Thread thread4;
jplager3 12:7e05acc6502b 18 DigitalOut latch(p15);
jplager3 12:7e05acc6502b 19 DigitalOut enable(p16);
jplager3 12:7e05acc6502b 20 SPI spi(p11, p12, p13);
jplager3 13:72e2a45b7847 21 //uLCD_4DGL uLCD(p28,p27,p29); //(p27, p28, p30); //tx, rx, rst
jplager3 13:72e2a45b7847 22 uLCD_4DGL uLCD(p28, p27, p30);
jplager3 12:7e05acc6502b 23 ShiftBrite myBrite(p15,p16,spi); //latch, enable, spi
jplager3 12:7e05acc6502b 24 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
jplager3 12:7e05acc6502b 25 AnalogOut DACout(p18); //must be p18
jplager3 12:7e05acc6502b 26 RawSerial BT(p9, p10); //bluetooth pinout
jplager3 12:7e05acc6502b 27 int red = 200;
jplager3 12:7e05acc6502b 28 int blue = 0;
jplager3 12:7e05acc6502b 29 int green = 0;
jplager3 13:72e2a45b7847 30 FILE *wave_file = NULL; //global bc its gotta be changed by Main while running in child thread
jplager3 12:7e05acc6502b 31 unsigned int redHex = 0xFF0000;
jplager3 12:7e05acc6502b 32 unsigned int grnHex = 0x00FF00;
jplager3 12:7e05acc6502b 33 unsigned int bluHex = 0x0000FF;
jplager3 12:7e05acc6502b 34
jplager3 12:7e05acc6502b 35
jplager3 12:7e05acc6502b 36 wave_player waver(&DACout);
jplager3 12:7e05acc6502b 37
jplager3 12:7e05acc6502b 38 void LCD_thread1() {
jplager3 12:7e05acc6502b 39 while(1){
jplager3 12:7e05acc6502b 40 mutex.lock();
jplager3 12:7e05acc6502b 41 uLCD.filled_circle(64, 64, 12, 0xFF0000);
jplager3 12:7e05acc6502b 42 mutex.unlock();
jplager3 12:7e05acc6502b 43 wait(.5);
jplager3 12:7e05acc6502b 44 mutex.lock();
jplager3 13:72e2a45b7847 45 uLCD.filled_circle(64, 64, 12, bluHex);
jplager3 12:7e05acc6502b 46 mutex.unlock();
jplager3 12:7e05acc6502b 47 wait(.5);
jplager3 12:7e05acc6502b 48 }
jplager3 12:7e05acc6502b 49 }
jplager3 12:7e05acc6502b 50 void LCD_thread2() { //update a timer on the display every 100ms
jplager3 12:7e05acc6502b 51 uLCD.cls();
jplager3 13:72e2a45b7847 52 //float time = 0.0;
jplager3 12:7e05acc6502b 53 int count =0;
jplager3 12:7e05acc6502b 54 while(1) {
jplager3 12:7e05acc6502b 55 Thread::wait(60);
jplager3 12:7e05acc6502b 56 //time = time + 0.25;
jplager3 13:72e2a45b7847 57 mutex.lock();
jplager3 12:7e05acc6502b 58 uLCD.locate(0,0);
jplager3 12:7e05acc6502b 59 count++;
jplager3 12:7e05acc6502b 60 uLCD.printf("Counting! %i \n", count);
jplager3 12:7e05acc6502b 61 mutex.unlock();
emilmont 1:491820ee784d 62 }
emilmont 1:491820ee784d 63 }
jplager3 12:7e05acc6502b 64 void LED_thread() {
jplager3 12:7e05acc6502b 65 //flash red & blue for police siren
jplager3 12:7e05acc6502b 66 while(1){
jplager3 12:7e05acc6502b 67 mutex2.lock();
jplager3 12:7e05acc6502b 68 //myBrite.Write(red,green,blue);
jplager3 12:7e05acc6502b 69 myBrite.Write(150, green, 0);
jplager3 12:7e05acc6502b 70 mutex2.unlock();
jplager3 12:7e05acc6502b 71 wait(.5);
jplager3 12:7e05acc6502b 72 mutex2.lock();
jplager3 12:7e05acc6502b 73 myBrite.Write(0,green,150);
jplager3 12:7e05acc6502b 74 //myBrite.Write(blue,green,red); // change LEDs so Red=OFF, Blue=ON
jplager3 12:7e05acc6502b 75 mutex2.unlock();
jplager3 12:7e05acc6502b 76 wait(.5);
jplager3 12:7e05acc6502b 77 }
jplager3 12:7e05acc6502b 78 }
jplager3 13:72e2a45b7847 79 /*
jplager3 12:7e05acc6502b 80 void BT_thread() {
jplager3 12:7e05acc6502b 81 // use mutex to lock getc(), printf(), scanf()
jplager3 12:7e05acc6502b 82 // don't unlock until you've checked that it's readable()
jplager3 12:7e05acc6502b 83 char bnum=0;
jplager3 12:7e05acc6502b 84 while(1) {
jplager3 12:7e05acc6502b 85 mutex.lock();
jplager3 12:7e05acc6502b 86 if (BT.getc()=='!') {
jplager3 12:7e05acc6502b 87 if (BT.getc()=='B') { //button data
jplager3 12:7e05acc6502b 88 bnum = BT.getc(); //button number
jplager3 12:7e05acc6502b 89 if (bnum == '1') {
jplager3 12:7e05acc6502b 90 green = 250;
jplager3 12:7e05acc6502b 91 }
jplager3 12:7e05acc6502b 92 if (bnum == '2') {
jplager3 12:7e05acc6502b 93
jplager3 12:7e05acc6502b 94 }
jplager3 12:7e05acc6502b 95 if (bnum == '3') {
jplager3 12:7e05acc6502b 96 green = 250;
jplager3 12:7e05acc6502b 97 }
jplager3 12:7e05acc6502b 98 if (bnum == '4') {
jplager3 12:7e05acc6502b 99 green = 0;
jplager3 12:7e05acc6502b 100 }
jplager3 12:7e05acc6502b 101 //if ((bnum>='1')&&(bnum<='4')) //is a number button 1..4
jplager3 12:7e05acc6502b 102 // myled[bnum-'1']=blue.getc()-'0'; //turn on/off that num LED
jplager3 12:7e05acc6502b 103 }
jplager3 12:7e05acc6502b 104 }
jplager3 12:7e05acc6502b 105 mutex.unlock();
jplager3 12:7e05acc6502b 106 }
jplager3 13:72e2a45b7847 107 }*/
jplager3 12:7e05acc6502b 108 void sound_thread(){
jplager3 12:7e05acc6502b 109 //FILE *wave_file;
jplager3 12:7e05acc6502b 110 wave_file=fopen("/sd/Police_Siren.wav","r");
jplager3 12:7e05acc6502b 111 if (wave_file == NULL){
jplager3 12:7e05acc6502b 112 led1=led2=led3=led4 = 1;
emilmont 1:491820ee784d 113 }
jplager3 12:7e05acc6502b 114 waver.play(wave_file);
jplager3 12:7e05acc6502b 115 fclose(wave_file);
emilmont 1:491820ee784d 116 }
jplager3 12:7e05acc6502b 117 int main() {
jplager3 12:7e05acc6502b 118 thread1.start(LED_thread); //police lights work
jplager3 12:7e05acc6502b 119 thread2.start(LCD_thread1);
jplager3 12:7e05acc6502b 120 thread3.start(LCD_thread2);
jplager3 12:7e05acc6502b 121 thread4.start(sound_thread);
jplager3 12:7e05acc6502b 122 // use mutex to lock getc(), printf(), scanf()
jplager3 12:7e05acc6502b 123 // don't unlock until you've checked that it's readable()
jplager3 13:72e2a45b7847 124
jplager3 12:7e05acc6502b 125 char bnum=0;
jplager3 13:72e2a45b7847 126 //
jplager3 12:7e05acc6502b 127 while(1) {
jplager3 13:72e2a45b7847 128 //mutex.lock();
jplager3 13:72e2a45b7847 129 led3=0;
jplager3 13:72e2a45b7847 130 led4=1;
jplager3 12:7e05acc6502b 131 if (BT.getc()=='!') {
jplager3 14:601b2c586bff 132 //mutex.lock();
jplager3 12:7e05acc6502b 133 if (BT.getc()=='B') { //button data
jplager3 12:7e05acc6502b 134 bnum = BT.getc(); //button number
jplager3 13:72e2a45b7847 135 mutex.unlock();
jplager3 12:7e05acc6502b 136 if (bnum == '1') { //turn Green LED on
jplager3 12:7e05acc6502b 137 green = 250;
jplager3 12:7e05acc6502b 138 led1 = 1;
jplager3 13:72e2a45b7847 139 led2=led3=led4=0;
jplager3 12:7e05acc6502b 140 }
jplager3 13:72e2a45b7847 141 if (bnum == '2') { // revert to normal operation
jplager3 12:7e05acc6502b 142 green = 0;
jplager3 13:72e2a45b7847 143 bluHex = 0x0000FF;
jplager3 12:7e05acc6502b 144 led1=led3=led4=0;
jplager3 12:7e05acc6502b 145 led2=1;
jplager3 12:7e05acc6502b 146 }
jplager3 13:72e2a45b7847 147 if (bnum == '3') { // change sound file playing
jplager3 12:7e05acc6502b 148 led2=led1=led4=0;
jplager3 12:7e05acc6502b 149 led3=1;
jplager3 13:72e2a45b7847 150 if ( wave_file != NULL) {
jplager3 13:72e2a45b7847 151 led2=1; // debug
jplager3 13:72e2a45b7847 152 //fclose(wave_file); //stop police siren from playing
jplager3 13:72e2a45b7847 153 thread4.terminate();
jplager3 13:72e2a45b7847 154 led2=0;
jplager3 13:72e2a45b7847 155 }
jplager3 12:7e05acc6502b 156 FILE *wave_file2;
jplager3 12:7e05acc6502b 157 wave_file2=fopen("/sd/banker_calling.wav","r");
jplager3 12:7e05acc6502b 158 if (wave_file2 == NULL){
jplager3 12:7e05acc6502b 159 led1=led2=0;
jplager3 12:7e05acc6502b 160 led3=led4=1;
jplager3 12:7e05acc6502b 161 }
jplager3 12:7e05acc6502b 162 waver.play(wave_file2);
jplager3 13:72e2a45b7847 163 fclose(wave_file2);
jplager3 13:72e2a45b7847 164 thread4.start(sound_thread);
jplager3 13:72e2a45b7847 165 //wave_file=fopen("/sd/Police_Siren.wav","r");
jplager3 13:72e2a45b7847 166 //waver.play(wave_file);
jplager3 12:7e05acc6502b 167 }
jplager3 12:7e05acc6502b 168 if (bnum == '4') { // change LCD colors
jplager3 12:7e05acc6502b 169 bluHex = 0x00FF00; //change the lights to flash red/grn
jplager3 12:7e05acc6502b 170 led2=led3=led1=0;
jplager3 12:7e05acc6502b 171 led4=1;
jplager3 12:7e05acc6502b 172 }
jplager3 12:7e05acc6502b 173 }
jplager3 13:72e2a45b7847 174 //mutex.unlock();
jplager3 13:72e2a45b7847 175 led4=0;
jplager3 13:72e2a45b7847 176 led3=1;
jplager3 12:7e05acc6502b 177 }
jplager3 13:72e2a45b7847 178 //mutex.unlock();
jplager3 12:7e05acc6502b 179 }
jplager3 13:72e2a45b7847 180
jplager3 13:72e2a45b7847 181 }