Running multiple threads on mbed using RTOS

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

Committer:
nliu96
Date:
Sun Feb 28 23:44:56 2016 +0000
Revision:
3:7d53a2744a2b
Parent:
2:f4ad69c44c7e
Child:
4:5fdadaef5b1f
LED;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wschon 0:fdcdbc5499f7 1 #include "mbed.h"
wschon 0:fdcdbc5499f7 2 #include "rtos.h"
wschon 0:fdcdbc5499f7 3 #include "uLCD_4DGL.h"
wschon 0:fdcdbc5499f7 4 #include "SDFileSystem.h"
wschon 1:2129bb91c172 5 #include "USBHostMSD.h"
wschon 2:f4ad69c44c7e 6 #include "wave_player.h"
wschon 0:fdcdbc5499f7 7
wschon 0:fdcdbc5499f7 8 SDFileSystem sd(p5, p6, p7, p8, "sd");
wschon 0:fdcdbc5499f7 9 Serial pc(USBTX, USBRX);
wschon 0:fdcdbc5499f7 10 Mutex ulcd_mutex;
wschon 0:fdcdbc5499f7 11 uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
wschon 0:fdcdbc5499f7 12 DigitalOut myled(LED1);
nliu96 3:7d53a2744a2b 13 DigitalOut latch(p15);
nliu96 3:7d53a2744a2b 14 DigitalOut enable(p17);
wschon 2:f4ad69c44c7e 15 //Analog Out Jack
wschon 2:f4ad69c44c7e 16 AnalogOut DACout(p18);
wschon 2:f4ad69c44c7e 17 //On Board Speaker
wschon 2:f4ad69c44c7e 18 PwmOut PWMout(p21);
nliu96 3:7d53a2744a2b 19 SPI spi(p5, p6, p7);
wschon 2:f4ad69c44c7e 20 wave_player waver(&DACout,&PWMout);
wschon 2:f4ad69c44c7e 21 int playing = 1;
wschon 2:f4ad69c44c7e 22
wschon 0:fdcdbc5499f7 23
wschon 0:fdcdbc5499f7 24 void ulcd2_thread(void const *args) {
wschon 1:2129bb91c172 25 int count = 0;
wschon 0:fdcdbc5499f7 26 while(true) {
wschon 0:fdcdbc5499f7 27 ulcd_mutex.lock();
wschon 0:fdcdbc5499f7 28 pc.printf("Activated mutex lock on uLCD screen: ulcd2_thread");
wschon 0:fdcdbc5499f7 29 uLCD.cls();
wschon 0:fdcdbc5499f7 30 uLCD.printf("\nECE 4180 L3: RTOS\n"); //Default Green on black text
wschon 0:fdcdbc5499f7 31 uLCD.printf("\nWes Schon Nick Liu");
wschon 1:2129bb91c172 32 uLCD.printf("\n\nThread 2 count: %d", count);
wschon 2:f4ad69c44c7e 33 if (playing == 1)
wschon 2:f4ad69c44c7e 34 uLCD.printf("\n\nPlaying wav file...");
wschon 2:f4ad69c44c7e 35 else
wschon 2:f4ad69c44c7e 36 uLCD.printf("\n\nWav file finished.");
wschon 0:fdcdbc5499f7 37 uLCD.text_width(4); //4X size text
wschon 0:fdcdbc5499f7 38 uLCD.text_height(4);
wschon 0:fdcdbc5499f7 39 Thread::wait(3000);
wschon 0:fdcdbc5499f7 40 ulcd_mutex.unlock();
wschon 1:2129bb91c172 41 count++;
wschon 0:fdcdbc5499f7 42 }
wschon 0:fdcdbc5499f7 43 }
wschon 2:f4ad69c44c7e 44 void wav_thread(void const *args) {
wschon 2:f4ad69c44c7e 45 USBHostMSD msd("usb");
wschon 2:f4ad69c44c7e 46 FILE *wave_file;
wschon 2:f4ad69c44c7e 47 //setup PWM hardware for a Class D style audio output
wschon 2:f4ad69c44c7e 48 PWMout.period(1.0/400000.0);
wschon 2:f4ad69c44c7e 49 //printf("\n\n\nHello, wave world!\n");
wschon 2:f4ad69c44c7e 50 // wait until connected to a USB device
wschon 2:f4ad69c44c7e 51 while(!msd.connect()) {
wschon 2:f4ad69c44c7e 52 Thread::wait(500);
wschon 2:f4ad69c44c7e 53 }
wschon 2:f4ad69c44c7e 54 //open wav file and play it
wschon 2:f4ad69c44c7e 55 wave_file=fopen("/usb/sample.wav","r");
wschon 2:f4ad69c44c7e 56 waver.play(wave_file);
wschon 2:f4ad69c44c7e 57 fclose(wave_file);
wschon 2:f4ad69c44c7e 58 //end of program
wschon 2:f4ad69c44c7e 59 Thread::wait(500);
wschon 2:f4ad69c44c7e 60 playing = 0;
wschon 2:f4ad69c44c7e 61 }
wschon 2:f4ad69c44c7e 62
nliu96 3:7d53a2744a2b 63 void RGB_LED(int red, int green, int blue) {
nliu96 3:7d53a2744a2b 64 unsigned int low_color=0;
nliu96 3:7d53a2744a2b 65 unsigned int high_color=0;
nliu96 3:7d53a2744a2b 66 high_color=(blue<<4)|((red&0x3C0)>>6);
nliu96 3:7d53a2744a2b 67 low_color=(((red&0x3F)<<10)|(green));
nliu96 3:7d53a2744a2b 68 spi.write(high_color);
nliu96 3:7d53a2744a2b 69 spi.write(low_color);
nliu96 3:7d53a2744a2b 70 latch=1;
nliu96 3:7d53a2744a2b 71 latch=0;
nliu96 3:7d53a2744a2b 72 }
nliu96 3:7d53a2744a2b 73
nliu96 3:7d53a2744a2b 74
wschon 2:f4ad69c44c7e 75 void led_thread(void const *args) {
nliu96 3:7d53a2744a2b 76 int red=0;
nliu96 3:7d53a2744a2b 77 int green=0;
nliu96 3:7d53a2744a2b 78 int blue=0;
nliu96 3:7d53a2744a2b 79 spi.format(16,0);
nliu96 3:7d53a2744a2b 80 spi.frequency(500000);
nliu96 3:7d53a2744a2b 81 enable=0;
nliu96 3:7d53a2744a2b 82 latch=0;
nliu96 3:7d53a2744a2b 83 wait(2);
nliu96 3:7d53a2744a2b 84 for (red = 0; red<50; red = red+10) {
nliu96 3:7d53a2744a2b 85 for (blue = 0; blue<50; blue = blue+10) {
nliu96 3:7d53a2744a2b 86 for (green = 0; green<50; green = green+10)
nliu96 3:7d53a2744a2b 87
nliu96 3:7d53a2744a2b 88 {
nliu96 3:7d53a2744a2b 89 RGB_LED( red, green, blue);
nliu96 3:7d53a2744a2b 90 wait(.25);
nliu96 3:7d53a2744a2b 91 }
nliu96 3:7d53a2744a2b 92 }
nliu96 3:7d53a2744a2b 93 }
nliu96 3:7d53a2744a2b 94
wschon 2:f4ad69c44c7e 95 }
wschon 0:fdcdbc5499f7 96
wschon 0:fdcdbc5499f7 97 int main() {
wschon 0:fdcdbc5499f7 98 Thread thread(ulcd2_thread);
nliu96 3:7d53a2744a2b 99 // Thread thread2(wav_thread);
nliu96 3:7d53a2744a2b 100 Thread thread3(led_thread);
wschon 1:2129bb91c172 101 int count2 = 0;
wschon 0:fdcdbc5499f7 102 while(1) {
wschon 0:fdcdbc5499f7 103 myled = 1;
wschon 0:fdcdbc5499f7 104 Thread::wait(200);
wschon 0:fdcdbc5499f7 105 myled = 0;
wschon 0:fdcdbc5499f7 106 Thread::wait(200);
wschon 0:fdcdbc5499f7 107 ulcd_mutex.lock();
wschon 0:fdcdbc5499f7 108 uLCD.cls();
wschon 0:fdcdbc5499f7 109 //SD card needed with image and video files for last two demos
wschon 0:fdcdbc5499f7 110 uLCD.cls();
wschon 0:fdcdbc5499f7 111 uLCD.media_init();
wschon 1:2129bb91c172 112 uLCD.printf("\n\nThread 1 count: %d", count2);
wschon 2:f4ad69c44c7e 113 if (playing == 1)
wschon 2:f4ad69c44c7e 114 uLCD.printf("\n\nPlaying wav file...");
wschon 2:f4ad69c44c7e 115 else
wschon 2:f4ad69c44c7e 116 uLCD.printf("\n\nWav file finished.");
wschon 1:2129bb91c172 117 Thread::wait(200);
wschon 0:fdcdbc5499f7 118 uLCD.set_sector_address(0x0000, 0x0000);
wschon 0:fdcdbc5499f7 119 uLCD.display_video(0,0);
wschon 1:2129bb91c172 120 Thread::wait(100);
wschon 0:fdcdbc5499f7 121 ulcd_mutex.unlock();
wschon 1:2129bb91c172 122 count2++;
wschon 0:fdcdbc5499f7 123 }
wschon 0:fdcdbc5499f7 124 }