Roomba Final Project with working RTOS

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

Fork of RTOS_threadingWorking by Craig Raslawski

Committer:
CRaslawski
Date:
Tue May 02 06:07:19 2017 +0000
Revision:
14:088c1b04b4c1
Parent:
13:72e2a45b7847
Child:
15:7cafe0b078ea
working rtos5

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
CRaslawski 14:088c1b04b4c1 31 FILE *wave_file2 = NULL;
jplager3 12:7e05acc6502b 32 unsigned int redHex = 0xFF0000;
jplager3 12:7e05acc6502b 33 unsigned int grnHex = 0x00FF00;
jplager3 12:7e05acc6502b 34 unsigned int bluHex = 0x0000FF;
jplager3 12:7e05acc6502b 35
jplager3 12:7e05acc6502b 36
jplager3 12:7e05acc6502b 37 wave_player waver(&DACout);
jplager3 12:7e05acc6502b 38
jplager3 12:7e05acc6502b 39 void LCD_thread1() {
jplager3 12:7e05acc6502b 40 while(1){
jplager3 12:7e05acc6502b 41 mutex.lock();
jplager3 12:7e05acc6502b 42 uLCD.filled_circle(64, 64, 12, 0xFF0000);
jplager3 12:7e05acc6502b 43 mutex.unlock();
jplager3 12:7e05acc6502b 44 wait(.5);
jplager3 12:7e05acc6502b 45 mutex.lock();
jplager3 13:72e2a45b7847 46 uLCD.filled_circle(64, 64, 12, bluHex);
jplager3 12:7e05acc6502b 47 mutex.unlock();
jplager3 12:7e05acc6502b 48 wait(.5);
jplager3 12:7e05acc6502b 49 }
jplager3 12:7e05acc6502b 50 }
jplager3 12:7e05acc6502b 51 void LCD_thread2() { //update a timer on the display every 100ms
jplager3 12:7e05acc6502b 52 uLCD.cls();
jplager3 13:72e2a45b7847 53 //float time = 0.0;
jplager3 12:7e05acc6502b 54 int count =0;
jplager3 12:7e05acc6502b 55 while(1) {
jplager3 12:7e05acc6502b 56 Thread::wait(60);
jplager3 12:7e05acc6502b 57 //time = time + 0.25;
jplager3 13:72e2a45b7847 58 mutex.lock();
jplager3 12:7e05acc6502b 59 uLCD.locate(0,0);
jplager3 12:7e05acc6502b 60 count++;
jplager3 12:7e05acc6502b 61 uLCD.printf("Counting! %i \n", count);
jplager3 12:7e05acc6502b 62 mutex.unlock();
emilmont 1:491820ee784d 63 }
emilmont 1:491820ee784d 64 }
CRaslawski 14:088c1b04b4c1 65
jplager3 12:7e05acc6502b 66 void LED_thread() {
jplager3 12:7e05acc6502b 67 //flash red & blue for police siren
jplager3 12:7e05acc6502b 68 while(1){
jplager3 12:7e05acc6502b 69 mutex2.lock();
jplager3 12:7e05acc6502b 70 //myBrite.Write(red,green,blue);
jplager3 12:7e05acc6502b 71 myBrite.Write(150, green, 0);
jplager3 12:7e05acc6502b 72 mutex2.unlock();
jplager3 12:7e05acc6502b 73 wait(.5);
jplager3 12:7e05acc6502b 74 mutex2.lock();
jplager3 12:7e05acc6502b 75 myBrite.Write(0,green,150);
jplager3 12:7e05acc6502b 76 //myBrite.Write(blue,green,red); // change LEDs so Red=OFF, Blue=ON
jplager3 12:7e05acc6502b 77 mutex2.unlock();
jplager3 12:7e05acc6502b 78 wait(.5);
jplager3 12:7e05acc6502b 79 }
jplager3 12:7e05acc6502b 80 }
CRaslawski 14:088c1b04b4c1 81
jplager3 12:7e05acc6502b 82 void sound_thread(){
jplager3 12:7e05acc6502b 83 wave_file=fopen("/sd/Police_Siren.wav","r");
jplager3 12:7e05acc6502b 84 if (wave_file == NULL){
CRaslawski 14:088c1b04b4c1 85 led1=0;
CRaslawski 14:088c1b04b4c1 86 led2=led3=led4 = 1;
emilmont 1:491820ee784d 87 }
jplager3 12:7e05acc6502b 88 waver.play(wave_file);
jplager3 12:7e05acc6502b 89 fclose(wave_file);
emilmont 1:491820ee784d 90 }
CRaslawski 14:088c1b04b4c1 91
CRaslawski 14:088c1b04b4c1 92 void banker_thread(){
CRaslawski 14:088c1b04b4c1 93 wave_file=fopen("/sd/banker_calling.wav","r");
CRaslawski 14:088c1b04b4c1 94 if (wave_file == NULL) {
CRaslawski 14:088c1b04b4c1 95 led1=led2=led3=1;
CRaslawski 14:088c1b04b4c1 96 led4=0;
CRaslawski 14:088c1b04b4c1 97 }
CRaslawski 14:088c1b04b4c1 98 waver.play(wave_file);
CRaslawski 14:088c1b04b4c1 99 fclose(wave_file);
CRaslawski 14:088c1b04b4c1 100 }
CRaslawski 14:088c1b04b4c1 101
jplager3 12:7e05acc6502b 102 int main() {
jplager3 12:7e05acc6502b 103 thread1.start(LED_thread); //police lights work
jplager3 12:7e05acc6502b 104 thread2.start(LCD_thread1);
jplager3 12:7e05acc6502b 105 thread3.start(LCD_thread2);
jplager3 12:7e05acc6502b 106 thread4.start(sound_thread);
jplager3 12:7e05acc6502b 107 // use mutex to lock getc(), printf(), scanf()
jplager3 12:7e05acc6502b 108 // don't unlock until you've checked that it's readable()
jplager3 13:72e2a45b7847 109
jplager3 12:7e05acc6502b 110 char bnum=0;
CRaslawski 14:088c1b04b4c1 111
jplager3 12:7e05acc6502b 112 while(1) {
jplager3 13:72e2a45b7847 113 led3=0;
jplager3 13:72e2a45b7847 114 led4=1;
jplager3 12:7e05acc6502b 115 if (BT.getc()=='!') {
jplager3 12:7e05acc6502b 116 if (BT.getc()=='B') { //button data
jplager3 12:7e05acc6502b 117 bnum = BT.getc(); //button number
jplager3 12:7e05acc6502b 118 if (bnum == '1') { //turn Green LED on
jplager3 12:7e05acc6502b 119 green = 250;
jplager3 12:7e05acc6502b 120 led1 = 1;
jplager3 13:72e2a45b7847 121 led2=led3=led4=0;
jplager3 12:7e05acc6502b 122 }
jplager3 13:72e2a45b7847 123 if (bnum == '2') { // revert to normal operation
jplager3 12:7e05acc6502b 124 green = 0;
jplager3 13:72e2a45b7847 125 bluHex = 0x0000FF;
jplager3 12:7e05acc6502b 126 led1=led3=led4=0;
jplager3 12:7e05acc6502b 127 led2=1;
CRaslawski 14:088c1b04b4c1 128 if(wave_file2 != NULL){
CRaslawski 14:088c1b04b4c1 129 thread4.terminate();
CRaslawski 14:088c1b04b4c1 130 fclose(wave_file2);
CRaslawski 14:088c1b04b4c1 131 thread4.start(sound_thread);
CRaslawski 14:088c1b04b4c1 132 }
jplager3 12:7e05acc6502b 133 }
jplager3 13:72e2a45b7847 134 if (bnum == '3') { // change sound file playing
jplager3 12:7e05acc6502b 135 led2=led1=led4=0;
jplager3 12:7e05acc6502b 136 led3=1;
jplager3 13:72e2a45b7847 137 if ( wave_file != NULL) {
CRaslawski 14:088c1b04b4c1 138 led2=1; // debug
CRaslawski 14:088c1b04b4c1 139 thread4.terminate(); //stop police siren from playing
CRaslawski 14:088c1b04b4c1 140 fclose(wave_file);
jplager3 13:72e2a45b7847 141 led2=0;
CRaslawski 14:088c1b04b4c1 142 thread4.start(banker_thread);
jplager3 13:72e2a45b7847 143 }
CRaslawski 14:088c1b04b4c1 144
CRaslawski 14:088c1b04b4c1 145
CRaslawski 14:088c1b04b4c1 146 //CHANGING THIS BLOCK TO ALLOW BANKER INTERRUPTION
CRaslawski 14:088c1b04b4c1 147 /*
jplager3 12:7e05acc6502b 148 FILE *wave_file2;
jplager3 12:7e05acc6502b 149 wave_file2=fopen("/sd/banker_calling.wav","r");
jplager3 12:7e05acc6502b 150 if (wave_file2 == NULL){
jplager3 12:7e05acc6502b 151 led1=led2=0;
jplager3 12:7e05acc6502b 152 led3=led4=1;
jplager3 12:7e05acc6502b 153 }
jplager3 12:7e05acc6502b 154 waver.play(wave_file2);
CRaslawski 14:088c1b04b4c1 155 fclose(wave_file2);
CRaslawski 14:088c1b04b4c1 156 */
CRaslawski 14:088c1b04b4c1 157
CRaslawski 14:088c1b04b4c1 158 //thread4.start(sound_thread); //return to siren
jplager3 12:7e05acc6502b 159 }
jplager3 12:7e05acc6502b 160 if (bnum == '4') { // change LCD colors
jplager3 12:7e05acc6502b 161 bluHex = 0x00FF00; //change the lights to flash red/grn
jplager3 12:7e05acc6502b 162 led2=led3=led1=0;
jplager3 12:7e05acc6502b 163 led4=1;
jplager3 12:7e05acc6502b 164 }
jplager3 12:7e05acc6502b 165 }
jplager3 13:72e2a45b7847 166 led4=0;
jplager3 13:72e2a45b7847 167 led3=1;
jplager3 12:7e05acc6502b 168 }
jplager3 12:7e05acc6502b 169 }
jplager3 13:72e2a45b7847 170
jplager3 13:72e2a45b7847 171 }