This program is a part of Lab Assignment to introduce mbedRTOS feature. It has four threads.
Dependencies: 4DGL-uLCD-SE wave_player_appbd
Fork of rtos_mutex by
This program is a part of a ECE4180 Lab3. It uses four threads. Main thread is for counting the RTC time and printing to uLCD. Anohter thread is for playing short tone, next is for displaying image in uLCD from the unformatted SD card. Next thread control the RBG led. All these threads utilize bluetooth serial UART command received and function accordingly. Bluetooth App from adafruit is used as an assistance to send command.
Parts used: mBED LPC1768 uLCD Display + SD Card Adafruit Bluetooth Audio Amp + Speaker
main.cpp@8:bca5e9169240, 2017-03-18 (annotated)
- Committer:
- pkoirala3
- Date:
- Sat Mar 18 13:55:08 2017 +0000
- Revision:
- 8:bca5e9169240
- Parent:
- 7:4ba0bb973eb9
Formatted code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emilmont | 1:0f886ffbe0c1 | 1 | #include "mbed.h" |
pkoirala3 | 7:4ba0bb973eb9 | 2 | #include "rtos.h" |
pkoirala3 | 7:4ba0bb973eb9 | 3 | #include "uLCD_4DGL.h" |
pkoirala3 | 7:4ba0bb973eb9 | 4 | #include "Speaker.h" |
pkoirala3 | 7:4ba0bb973eb9 | 5 | #include <wave_player.h> |
pkoirala3 | 7:4ba0bb973eb9 | 6 | #include <string> |
emilmont | 1:0f886ffbe0c1 | 7 | |
pkoirala3 | 7:4ba0bb973eb9 | 8 | uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object |
pkoirala3 | 7:4ba0bb973eb9 | 9 | Serial pc(USBTX, USBRX); |
pkoirala3 | 7:4ba0bb973eb9 | 10 | RawSerial bluemod(p13,p14); |
pkoirala3 | 7:4ba0bb973eb9 | 11 | Mutex uLCDmutex; |
pkoirala3 | 7:4ba0bb973eb9 | 12 | PwmOut blue(p23); |
pkoirala3 | 7:4ba0bb973eb9 | 13 | PwmOut green(p22); |
pkoirala3 | 7:4ba0bb973eb9 | 14 | PwmOut red(p21); |
pkoirala3 | 7:4ba0bb973eb9 | 15 | Thread t1; |
mab5449 | 6:1ae0d86d2020 | 16 | Thread t2; |
mab5449 | 6:1ae0d86d2020 | 17 | Thread t3; |
pkoirala3 | 7:4ba0bb973eb9 | 18 | |
pkoirala3 | 7:4ba0bb973eb9 | 19 | Speaker mySpeaker(p25); |
emilmont | 1:0f886ffbe0c1 | 20 | |
pkoirala3 | 8:bca5e9169240 | 21 | void threat1RGB() |
pkoirala3 | 8:bca5e9169240 | 22 | { |
pkoirala3 | 7:4ba0bb973eb9 | 23 | char bred=0; |
pkoirala3 | 7:4ba0bb973eb9 | 24 | char bgreen=0; |
pkoirala3 | 7:4ba0bb973eb9 | 25 | char bblue=0; |
pkoirala3 | 7:4ba0bb973eb9 | 26 | red = green = blue = 0; |
pkoirala3 | 8:bca5e9169240 | 27 | while(1) { |
pkoirala3 | 8:bca5e9169240 | 28 | if(bluemod.readable()) { |
pkoirala3 | 7:4ba0bb973eb9 | 29 | uLCDmutex.lock(); |
pkoirala3 | 8:bca5e9169240 | 30 | if (bluemod.getc()=='!') { |
pkoirala3 | 8:bca5e9169240 | 31 | if (bluemod.getc()=='C') { //color data packet |
pkoirala3 | 7:4ba0bb973eb9 | 32 | printf("Color Packet Recieved\r\n"); |
pkoirala3 | 7:4ba0bb973eb9 | 33 | bred = bluemod.getc(); // RGB color values |
pkoirala3 | 7:4ba0bb973eb9 | 34 | bgreen = bluemod.getc(); |
pkoirala3 | 7:4ba0bb973eb9 | 35 | bblue = bluemod.getc(); |
pkoirala3 | 8:bca5e9169240 | 36 | if (bluemod.getc()==char(~('!' + 'C' + bred + bgreen + bblue))) { //checksum OK? |
pkoirala3 | 7:4ba0bb973eb9 | 37 | printf("valid checksum, LED changing\r\n"); |
pkoirala3 | 7:4ba0bb973eb9 | 38 | red = bred/255.0; //send new color to RGB LED PWM outputs |
pkoirala3 | 7:4ba0bb973eb9 | 39 | green = bgreen/255.0; |
pkoirala3 | 7:4ba0bb973eb9 | 40 | blue = bblue/255.0; |
pkoirala3 | 7:4ba0bb973eb9 | 41 | } |
pkoirala3 | 7:4ba0bb973eb9 | 42 | } |
pkoirala3 | 7:4ba0bb973eb9 | 43 | } |
pkoirala3 | 7:4ba0bb973eb9 | 44 | uLCDmutex.unlock(); |
pkoirala3 | 7:4ba0bb973eb9 | 45 | Thread::wait(500); |
pkoirala3 | 7:4ba0bb973eb9 | 46 | } |
emilmont | 1:0f886ffbe0c1 | 47 | } |
emilmont | 1:0f886ffbe0c1 | 48 | } |
emilmont | 1:0f886ffbe0c1 | 49 | |
pkoirala3 | 8:bca5e9169240 | 50 | void thread2image() |
pkoirala3 | 8:bca5e9169240 | 51 | { |
pkoirala3 | 8:bca5e9169240 | 52 | while(1) { |
pkoirala3 | 8:bca5e9169240 | 53 | while(bluemod.readable()) { |
pkoirala3 | 7:4ba0bb973eb9 | 54 | uLCDmutex.lock(); |
pkoirala3 | 8:bca5e9169240 | 55 | if(bluemod.getc() == '1') { |
pkoirala3 | 7:4ba0bb973eb9 | 56 | printf("Image Displaying\r\n"); |
pkoirala3 | 7:4ba0bb973eb9 | 57 | uLCD.media_init(); |
pkoirala3 | 7:4ba0bb973eb9 | 58 | uLCD.set_sector_address(0x0000, 0x0000); |
pkoirala3 | 7:4ba0bb973eb9 | 59 | uLCD.display_image(0,0); |
pkoirala3 | 8:bca5e9169240 | 60 | } else if(bluemod.getc() == '2') { |
pkoirala3 | 7:4ba0bb973eb9 | 61 | printf("Clear Screen\r\n"); |
pkoirala3 | 7:4ba0bb973eb9 | 62 | uLCD.cls(); |
pkoirala3 | 7:4ba0bb973eb9 | 63 | } |
pkoirala3 | 7:4ba0bb973eb9 | 64 | uLCDmutex.unlock(); |
pkoirala3 | 7:4ba0bb973eb9 | 65 | Thread::wait(500); |
pkoirala3 | 7:4ba0bb973eb9 | 66 | } |
pkoirala3 | 7:4ba0bb973eb9 | 67 | } |
pkoirala3 | 7:4ba0bb973eb9 | 68 | } |
Bartek Szatkowski |
5:384d6cef11d4 | 69 | |
pkoirala3 | 8:bca5e9169240 | 70 | void thread3Audio() |
pkoirala3 | 8:bca5e9169240 | 71 | { |
pkoirala3 | 7:4ba0bb973eb9 | 72 | float D41 = 293.665; |
pkoirala3 | 7:4ba0bb973eb9 | 73 | float Eb4 = 311.127; |
pkoirala3 | 7:4ba0bb973eb9 | 74 | float F4 = 349.228; |
pkoirala3 | 7:4ba0bb973eb9 | 75 | float G4 = 391.995; |
pkoirala3 | 7:4ba0bb973eb9 | 76 | float len = 0.40; |
pkoirala3 | 7:4ba0bb973eb9 | 77 | float note[18]= {G4, F4, Eb4, Eb4, Eb4, F4, G4, G4, G4, F4, Eb4, F4, G4, F4, Eb4, D41, Eb4, 0.0}; |
pkoirala3 | 7:4ba0bb973eb9 | 78 | float dur[18]= {len, 0.5*len, len, 0.5*len, len, 0.5*len, len, len, 0.5*len, 0.5*len, 0.5*len, 0.5*len, 0.5*len,0.5*len, 1*len, 0.5*len, 1.5*len, 0.0}; |
pkoirala3 | 8:bca5e9169240 | 79 | int playFlag = 0; |
pkoirala3 | 8:bca5e9169240 | 80 | |
pkoirala3 | 8:bca5e9169240 | 81 | while(1) { |
pkoirala3 | 8:bca5e9169240 | 82 | while(bluemod.readable()) { |
pkoirala3 | 7:4ba0bb973eb9 | 83 | uLCDmutex.lock(); |
pkoirala3 | 8:bca5e9169240 | 84 | if(bluemod.getc() == '3') { |
pkoirala3 | 8:bca5e9169240 | 85 | printf("Playing Audio\r\n"); |
pkoirala3 | 7:4ba0bb973eb9 | 86 | playFlag = 1; |
pkoirala3 | 7:4ba0bb973eb9 | 87 | } |
pkoirala3 | 7:4ba0bb973eb9 | 88 | uLCDmutex.unlock(); |
pkoirala3 | 8:bca5e9169240 | 89 | if(playFlag == 1) { |
pkoirala3 | 8:bca5e9169240 | 90 | for(int i = 0; i < 18; ++i) { |
pkoirala3 | 8:bca5e9169240 | 91 | mySpeaker.PlayNote(note[i],dur[i],0.5); |
pkoirala3 | 8:bca5e9169240 | 92 | } |
pkoirala3 | 7:4ba0bb973eb9 | 93 | playFlag = 0; |
pkoirala3 | 7:4ba0bb973eb9 | 94 | } |
pkoirala3 | 7:4ba0bb973eb9 | 95 | Thread::wait(500); |
pkoirala3 | 7:4ba0bb973eb9 | 96 | } |
pkoirala3 | 8:bca5e9169240 | 97 | } |
pkoirala3 | 8:bca5e9169240 | 98 | } |
pkoirala3 | 7:4ba0bb973eb9 | 99 | |
pkoirala3 | 8:bca5e9169240 | 100 | int main() |
pkoirala3 | 8:bca5e9169240 | 101 | { |
pkoirala3 | 7:4ba0bb973eb9 | 102 | uLCD.cls(); |
pkoirala3 | 7:4ba0bb973eb9 | 103 | uLCD.baudrate(3000000); //jack up baud rate to max for fast display |
pkoirala3 | 7:4ba0bb973eb9 | 104 | t1.start(threat1RGB); |
pkoirala3 | 7:4ba0bb973eb9 | 105 | t2.start(thread2image); |
pkoirala3 | 7:4ba0bb973eb9 | 106 | t3.start(thread3Audio); |
pkoirala3 | 7:4ba0bb973eb9 | 107 | set_time(0); // Set RTC time to 0 |
pkoirala3 | 8:bca5e9169240 | 108 | char buffer[32]; |
pkoirala3 | 8:bca5e9169240 | 109 | while(1) { |
pkoirala3 | 7:4ba0bb973eb9 | 110 | time_t seconds = time(NULL); |
pkoirala3 | 7:4ba0bb973eb9 | 111 | strftime(buffer, 32, "%M:%S", localtime(&seconds)); |
pkoirala3 | 7:4ba0bb973eb9 | 112 | uLCDmutex.lock(); |
pkoirala3 | 7:4ba0bb973eb9 | 113 | uLCD.locate(0,0); |
pkoirala3 | 7:4ba0bb973eb9 | 114 | uLCD.text_width(2); //2X size text |
pkoirala3 | 7:4ba0bb973eb9 | 115 | uLCD.text_height(2); |
pkoirala3 | 7:4ba0bb973eb9 | 116 | uLCD.printf("UP: %s", buffer); |
pkoirala3 | 7:4ba0bb973eb9 | 117 | uLCDmutex.unlock(); |
pkoirala3 | 7:4ba0bb973eb9 | 118 | Thread::wait(500); |
pkoirala3 | 7:4ba0bb973eb9 | 119 | } |
pkoirala3 | 8:bca5e9169240 | 120 | } |