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 mbed official

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

Committer:
pkoirala3
Date:
Sat Mar 18 13:50:28 2017 +0000
Revision:
7:4ba0bb973eb9
Parent:
6:1ae0d86d2020
Child:
8:bca5e9169240
MBED_RTOS

Who changed what in which revision?

UserRevisionLine numberNew 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 7:4ba0bb973eb9 21 void threat1RGB(){
pkoirala3 7:4ba0bb973eb9 22 char bred=0;
pkoirala3 7:4ba0bb973eb9 23 char bgreen=0;
pkoirala3 7:4ba0bb973eb9 24 char bblue=0;
pkoirala3 7:4ba0bb973eb9 25 red = green = blue = 0;
pkoirala3 7:4ba0bb973eb9 26 while(1){
pkoirala3 7:4ba0bb973eb9 27 if(bluemod.readable()){
pkoirala3 7:4ba0bb973eb9 28 uLCDmutex.lock();
pkoirala3 7:4ba0bb973eb9 29 if (bluemod.getc()=='!'){
pkoirala3 7:4ba0bb973eb9 30 if (bluemod.getc()=='C'){ //color data packet
pkoirala3 7:4ba0bb973eb9 31 printf("Color Packet Recieved\r\n");
pkoirala3 7:4ba0bb973eb9 32 bred = bluemod.getc(); // RGB color values
pkoirala3 7:4ba0bb973eb9 33 bgreen = bluemod.getc();
pkoirala3 7:4ba0bb973eb9 34 bblue = bluemod.getc();
pkoirala3 7:4ba0bb973eb9 35 if (bluemod.getc()==char(~('!' + 'C' + bred + bgreen + bblue))){ //checksum OK?
pkoirala3 7:4ba0bb973eb9 36 printf("valid checksum, LED changing\r\n");
pkoirala3 7:4ba0bb973eb9 37 red = bred/255.0; //send new color to RGB LED PWM outputs
pkoirala3 7:4ba0bb973eb9 38 green = bgreen/255.0;
pkoirala3 7:4ba0bb973eb9 39 blue = bblue/255.0;
pkoirala3 7:4ba0bb973eb9 40 }
pkoirala3 7:4ba0bb973eb9 41 }
pkoirala3 7:4ba0bb973eb9 42 }
pkoirala3 7:4ba0bb973eb9 43 uLCDmutex.unlock();
pkoirala3 7:4ba0bb973eb9 44 Thread::wait(500);
pkoirala3 7:4ba0bb973eb9 45 }
emilmont 1:0f886ffbe0c1 46 }
emilmont 1:0f886ffbe0c1 47 }
emilmont 1:0f886ffbe0c1 48
pkoirala3 7:4ba0bb973eb9 49 void thread2image(){
pkoirala3 7:4ba0bb973eb9 50 while(1){
pkoirala3 7:4ba0bb973eb9 51 while(bluemod.readable()){
pkoirala3 7:4ba0bb973eb9 52 uLCDmutex.lock();
pkoirala3 7:4ba0bb973eb9 53 if(bluemod.getc() == '1'){
pkoirala3 7:4ba0bb973eb9 54 printf("Image Displaying\r\n");
pkoirala3 7:4ba0bb973eb9 55 uLCD.media_init();
pkoirala3 7:4ba0bb973eb9 56 uLCD.set_sector_address(0x0000, 0x0000);
pkoirala3 7:4ba0bb973eb9 57 uLCD.display_image(0,0);
pkoirala3 7:4ba0bb973eb9 58 }
pkoirala3 7:4ba0bb973eb9 59 else if(bluemod.getc() == '2'){
pkoirala3 7:4ba0bb973eb9 60 printf("Clear Screen\r\n");
pkoirala3 7:4ba0bb973eb9 61 uLCD.cls();
pkoirala3 7:4ba0bb973eb9 62 }
pkoirala3 7:4ba0bb973eb9 63 uLCDmutex.unlock();
pkoirala3 7:4ba0bb973eb9 64 Thread::wait(500);
pkoirala3 7:4ba0bb973eb9 65 }
pkoirala3 7:4ba0bb973eb9 66 }
pkoirala3 7:4ba0bb973eb9 67 }
Bartek Szatkowski 5:384d6cef11d4 68
pkoirala3 7:4ba0bb973eb9 69 void thread3Audio(){
pkoirala3 7:4ba0bb973eb9 70 float D41 = 293.665;
pkoirala3 7:4ba0bb973eb9 71 float Eb4 = 311.127;
pkoirala3 7:4ba0bb973eb9 72 float F4 = 349.228;
pkoirala3 7:4ba0bb973eb9 73 float G4 = 391.995;
pkoirala3 7:4ba0bb973eb9 74 float len = 0.40;
pkoirala3 7:4ba0bb973eb9 75 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 76 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 7:4ba0bb973eb9 77 int playFlag = 0;
pkoirala3 7:4ba0bb973eb9 78
pkoirala3 7:4ba0bb973eb9 79 while(1){
pkoirala3 7:4ba0bb973eb9 80 while(bluemod.readable()){
pkoirala3 7:4ba0bb973eb9 81 uLCDmutex.lock();
pkoirala3 7:4ba0bb973eb9 82 if(bluemod.getc() == '3'){
pkoirala3 7:4ba0bb973eb9 83 printf("Playing Audio\r\n");
pkoirala3 7:4ba0bb973eb9 84 playFlag = 1;
pkoirala3 7:4ba0bb973eb9 85 }
pkoirala3 7:4ba0bb973eb9 86 uLCDmutex.unlock();
pkoirala3 7:4ba0bb973eb9 87 if(playFlag == 1){
pkoirala3 7:4ba0bb973eb9 88 for(int i = 0; i < 18; ++i) {mySpeaker.PlayNote(note[i],dur[i],0.5); }
pkoirala3 7:4ba0bb973eb9 89 playFlag = 0;
pkoirala3 7:4ba0bb973eb9 90 }
pkoirala3 7:4ba0bb973eb9 91 Thread::wait(500);
pkoirala3 7:4ba0bb973eb9 92 }
pkoirala3 7:4ba0bb973eb9 93 }
pkoirala3 7:4ba0bb973eb9 94 }
pkoirala3 7:4ba0bb973eb9 95
pkoirala3 7:4ba0bb973eb9 96 int main(){
pkoirala3 7:4ba0bb973eb9 97 uLCD.cls();
pkoirala3 7:4ba0bb973eb9 98 uLCD.baudrate(3000000); //jack up baud rate to max for fast display
pkoirala3 7:4ba0bb973eb9 99 t1.start(threat1RGB);
pkoirala3 7:4ba0bb973eb9 100 t2.start(thread2image);
pkoirala3 7:4ba0bb973eb9 101 t3.start(thread3Audio);
pkoirala3 7:4ba0bb973eb9 102 while(1);
emilmont 1:0f886ffbe0c1 103 }
pkoirala3 7:4ba0bb973eb9 104
pkoirala3 7:4ba0bb973eb9 105
pkoirala3 7:4ba0bb973eb9 106
pkoirala3 7:4ba0bb973eb9 107
pkoirala3 7:4ba0bb973eb9 108 /*
pkoirala3 7:4ba0bb973eb9 109 set_time(0); // Set RTC time to 0
pkoirala3 7:4ba0bb973eb9 110 char buffer[32];
pkoirala3 7:4ba0bb973eb9 111 while(1){
pkoirala3 7:4ba0bb973eb9 112 time_t seconds = time(NULL);
pkoirala3 7:4ba0bb973eb9 113 strftime(buffer, 32, "%M:%S", localtime(&seconds));
pkoirala3 7:4ba0bb973eb9 114 uLCDmutex.lock();
pkoirala3 7:4ba0bb973eb9 115 uLCD.locate(0,0);
pkoirala3 7:4ba0bb973eb9 116 uLCD.text_width(2); //2X size text
pkoirala3 7:4ba0bb973eb9 117 uLCD.text_height(2);
pkoirala3 7:4ba0bb973eb9 118 uLCD.printf("UP: %s", buffer);
pkoirala3 7:4ba0bb973eb9 119 uLCDmutex.unlock();
pkoirala3 7:4ba0bb973eb9 120 Thread::wait(500);
pkoirala3 7:4ba0bb973eb9 121 }
pkoirala3 7:4ba0bb973eb9 122 */