working rtos 5
Dependencies: 4DGL-uLCD-SE SDFileSystem ShiftBrite mbed-rtos mbed wave_player
Fork of RTOS_threading by
main.cpp@12:7e05acc6502b, 2017-02-26 (annotated)
- 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?
User | Revision | Line number | New 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 | } |