Running multiple threads on mbed using RTOS

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player_appbd

main.cpp

Committer:
wschon
Date:
2016-02-29
Revision:
4:5fdadaef5b1f
Parent:
3:7d53a2744a2b

File content as of revision 4:5fdadaef5b1f:

#include "mbed.h"
#include "rtos.h"
#include "uLCD_4DGL.h"
#include "SDFileSystem.h"
#include "USBHostMSD.h"
#include "wave_player.h"

SDFileSystem sd(p5, p6, p7, p8, "sd"); 
Serial pc(USBTX, USBRX);
Mutex ulcd_mutex;
uLCD_4DGL uLCD(p9,p10,p19); // serial tx, serial rx, reset pin;
DigitalOut myled(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);

DigitalOut latch(p15);
DigitalOut enable(p17);
//Analog Out Jack
AnalogOut DACout(p18);
//On Board Speaker
PwmOut PWMout(p26);
SPI spi(p11, p12, p13);
wave_player waver(&DACout,&PWMout);
int playing = 1;
int red=0;
int green=0;
int blue=0;
int play = 0;

void ulcd2_thread(void const *args) {
    int count = 0;
    while(true) {
        ulcd_mutex.lock();
        pc.printf("Activated mutex lock on uLCD screen: ulcd2_thread\n\r");
        uLCD.cls();
        uLCD.printf("\nECE 4180 L3: RTOS\n"); //Default Green on black text
        uLCD.printf("\nWes Schon Nick Liu");
        uLCD.printf("\n\nThread 2 count: %d", count);
        if (playing == 1)
            uLCD.printf("\n\nPlaying wav file...");
        else
            uLCD.printf("\n\nWav file finished.");    
        uLCD.text_width(4); //4X size text
        uLCD.text_height(4);
        Thread::wait(3000);
        ulcd_mutex.unlock();
        count++;
        }
    }
void wav_thread(void const *args) {
    while(1) {
        if (play == 1) {
            //USBHostMSD msd("usb");
            //pc.printf("\nset up usb host\n");
            myled = !myled;
            FILE *wave_file;
            //pc.printf("\nread wav file\n");
            //setup PWM hardware for a Class D style audio output
            PWMout.period(1.0/400000.0);
            //printf("\n\n\nHello, wave world!\n");
            // wait until connected to a USB device
            //while(!msd.connect()) {
            //    Thread::wait(500);
            //}
            //open wav file and play it
            wave_file=fopen("/sd/monkey4.wav","r");
    
            //pc.printf("\nplay\n");
            playing = 1;
            waver.play(wave_file);
            myled2 = !myled2;
            pc.printf("\nclose\n");
            fclose(wave_file);
            playing = 0;
            myled3 = !myled3;
            //end of program
            Thread::wait(500);
            myled4 = !myled4;
            
            }
        }
    }

void RGB_LED(int red, int green, int blue) {
    unsigned int low_color=0;
    unsigned int high_color=0;
    high_color=(blue<<4)|((red&0x3C0)>>6);
    low_color=(((red&0x3F)<<10)|(green));
    spi.write(high_color);
    spi.write(low_color);
    latch=1;
    latch=0;
}


void led_thread(void const *args) {

    spi.format(16,0);
    spi.frequency(500000);
    enable=0;
    latch=0;
    Thread::wait(2000);
    while(1) {
    if (play == 1) {
        red = 0;
        green = 50;
        blue = 0;
        RGB_LED( red, green, blue);
        Thread::wait(250);
        }
    else {
        red = 0;
        green = 0;
        blue = 50;
        RGB_LED( red, green, blue);
        Thread::wait(250);
        red = 50;
        green = 0;
        blue = 0;
        RGB_LED( red, green, blue);
        Thread::wait(250);
        }
    }
    }


int main() {
    Thread thread(ulcd2_thread);
    pc.printf("\nwav_thread\n");
    Thread thread2(wav_thread);
    pc.printf("\nend wav_thread\n");
    Thread thread3(led_thread);
    int count2 = 0;
    while(1) {
        myled = 1;
        Thread::wait(200);
        myled = 0;
        Thread::wait(200);
        ulcd_mutex.lock();
        uLCD.cls();
    //SD card needed with image and video files for last two demos
        uLCD.cls();
        uLCD.media_init();
        uLCD.printf("\n\nThread 1 count: %d", count2);
        if (playing == 1)
            uLCD.printf("\n\nPlaying wav file...");
        else
            uLCD.printf("\n\nWav file finished.");  
        Thread::wait(200);
        play = 1;
        uLCD.set_sector_address(0x0000, 0x0000);
        uLCD.display_video(0,0);
        Thread::wait(100);
        ulcd_mutex.unlock();
        play = 0;
        count2++;
    }
}