working rtos 5

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

Fork of RTOS_threading by James Plager

Committer:
jplager3
Date:
Sun Feb 26 19:52:01 2017 +0000
Revision:
12:7e05acc6502b
Parent:
11:0309bef74ba8
Child:
13:72e2a45b7847
Still needs kinks in BT control and uLCD worked out;

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