working rtos 5
Dependencies: 4DGL-uLCD-SE SDFileSystem ShiftBrite mbed-rtos mbed wave_player
Fork of RTOS_threading by
main.cpp@13:72e2a45b7847, 2017-02-27 (annotated)
- Committer:
- jplager3
- Date:
- Mon Feb 27 06:31:12 2017 +0000
- Revision:
- 13:72e2a45b7847
- Parent:
- 12:7e05acc6502b
- Child:
- 14:088c1b04b4c1
ITS LIT
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 | 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 | 12:7e05acc6502b | 132 | if (BT.getc()=='B') { //button data |
jplager3 | 12:7e05acc6502b | 133 | bnum = BT.getc(); //button number |
jplager3 | 13:72e2a45b7847 | 134 | mutex.unlock(); |
jplager3 | 12:7e05acc6502b | 135 | if (bnum == '1') { //turn Green LED on |
jplager3 | 12:7e05acc6502b | 136 | green = 250; |
jplager3 | 12:7e05acc6502b | 137 | led1 = 1; |
jplager3 | 13:72e2a45b7847 | 138 | led2=led3=led4=0; |
jplager3 | 12:7e05acc6502b | 139 | } |
jplager3 | 13:72e2a45b7847 | 140 | if (bnum == '2') { // revert to normal operation |
jplager3 | 12:7e05acc6502b | 141 | green = 0; |
jplager3 | 13:72e2a45b7847 | 142 | bluHex = 0x0000FF; |
jplager3 | 12:7e05acc6502b | 143 | led1=led3=led4=0; |
jplager3 | 12:7e05acc6502b | 144 | led2=1; |
jplager3 | 12:7e05acc6502b | 145 | } |
jplager3 | 13:72e2a45b7847 | 146 | if (bnum == '3') { // change sound file playing |
jplager3 | 12:7e05acc6502b | 147 | led2=led1=led4=0; |
jplager3 | 12:7e05acc6502b | 148 | led3=1; |
jplager3 | 13:72e2a45b7847 | 149 | if ( wave_file != NULL) { |
jplager3 | 13:72e2a45b7847 | 150 | led2=1; // debug |
jplager3 | 13:72e2a45b7847 | 151 | //fclose(wave_file); //stop police siren from playing |
jplager3 | 13:72e2a45b7847 | 152 | thread4.terminate(); |
jplager3 | 13:72e2a45b7847 | 153 | led2=0; |
jplager3 | 13:72e2a45b7847 | 154 | } |
jplager3 | 12:7e05acc6502b | 155 | FILE *wave_file2; |
jplager3 | 12:7e05acc6502b | 156 | wave_file2=fopen("/sd/banker_calling.wav","r"); |
jplager3 | 12:7e05acc6502b | 157 | if (wave_file2 == NULL){ |
jplager3 | 12:7e05acc6502b | 158 | led1=led2=0; |
jplager3 | 12:7e05acc6502b | 159 | led3=led4=1; |
jplager3 | 12:7e05acc6502b | 160 | } |
jplager3 | 12:7e05acc6502b | 161 | waver.play(wave_file2); |
jplager3 | 13:72e2a45b7847 | 162 | fclose(wave_file2); |
jplager3 | 13:72e2a45b7847 | 163 | thread4.start(sound_thread); |
jplager3 | 13:72e2a45b7847 | 164 | //wave_file=fopen("/sd/Police_Siren.wav","r"); |
jplager3 | 13:72e2a45b7847 | 165 | //waver.play(wave_file); |
jplager3 | 12:7e05acc6502b | 166 | } |
jplager3 | 12:7e05acc6502b | 167 | if (bnum == '4') { // change LCD colors |
jplager3 | 12:7e05acc6502b | 168 | bluHex = 0x00FF00; //change the lights to flash red/grn |
jplager3 | 12:7e05acc6502b | 169 | led2=led3=led1=0; |
jplager3 | 12:7e05acc6502b | 170 | led4=1; |
jplager3 | 12:7e05acc6502b | 171 | } |
jplager3 | 12:7e05acc6502b | 172 | } |
jplager3 | 13:72e2a45b7847 | 173 | //mutex.unlock(); |
jplager3 | 13:72e2a45b7847 | 174 | led4=0; |
jplager3 | 13:72e2a45b7847 | 175 | led3=1; |
jplager3 | 12:7e05acc6502b | 176 | } |
jplager3 | 13:72e2a45b7847 | 177 | //mutex.unlock(); |
jplager3 | 12:7e05acc6502b | 178 | } |
jplager3 | 13:72e2a45b7847 | 179 | |
jplager3 | 13:72e2a45b7847 | 180 | } |