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:55:08 2017 +0000
Revision:
8:bca5e9169240
Parent:
7:4ba0bb973eb9
Formatted code

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 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 }