Running multiple threads on mbed using RTOS

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

Committer:
wschon
Date:
Mon Feb 29 03:46:10 2016 +0000
Revision:
4:5fdadaef5b1f
Parent:
3:7d53a2744a2b
fixed EVERYTHING

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 4:5fdadaef5b1f 11 uLCD_4DGL uLCD(p9,p10,p19); // serial tx, serial rx, reset pin;
wschon 0:fdcdbc5499f7 12 DigitalOut myled(LED1);
wschon 4:5fdadaef5b1f 13 DigitalOut myled2(LED2);
wschon 4:5fdadaef5b1f 14 DigitalOut myled3(LED3);
wschon 4:5fdadaef5b1f 15 DigitalOut myled4(LED4);
wschon 4:5fdadaef5b1f 16
nliu96 3:7d53a2744a2b 17 DigitalOut latch(p15);
nliu96 3:7d53a2744a2b 18 DigitalOut enable(p17);
wschon 2:f4ad69c44c7e 19 //Analog Out Jack
wschon 2:f4ad69c44c7e 20 AnalogOut DACout(p18);
wschon 2:f4ad69c44c7e 21 //On Board Speaker
wschon 4:5fdadaef5b1f 22 PwmOut PWMout(p26);
wschon 4:5fdadaef5b1f 23 SPI spi(p11, p12, p13);
wschon 2:f4ad69c44c7e 24 wave_player waver(&DACout,&PWMout);
wschon 2:f4ad69c44c7e 25 int playing = 1;
wschon 4:5fdadaef5b1f 26 int red=0;
wschon 4:5fdadaef5b1f 27 int green=0;
wschon 4:5fdadaef5b1f 28 int blue=0;
wschon 4:5fdadaef5b1f 29 int play = 0;
wschon 0:fdcdbc5499f7 30
wschon 0:fdcdbc5499f7 31 void ulcd2_thread(void const *args) {
wschon 1:2129bb91c172 32 int count = 0;
wschon 0:fdcdbc5499f7 33 while(true) {
wschon 0:fdcdbc5499f7 34 ulcd_mutex.lock();
wschon 4:5fdadaef5b1f 35 pc.printf("Activated mutex lock on uLCD screen: ulcd2_thread\n\r");
wschon 0:fdcdbc5499f7 36 uLCD.cls();
wschon 0:fdcdbc5499f7 37 uLCD.printf("\nECE 4180 L3: RTOS\n"); //Default Green on black text
wschon 0:fdcdbc5499f7 38 uLCD.printf("\nWes Schon Nick Liu");
wschon 1:2129bb91c172 39 uLCD.printf("\n\nThread 2 count: %d", count);
wschon 2:f4ad69c44c7e 40 if (playing == 1)
wschon 2:f4ad69c44c7e 41 uLCD.printf("\n\nPlaying wav file...");
wschon 2:f4ad69c44c7e 42 else
wschon 2:f4ad69c44c7e 43 uLCD.printf("\n\nWav file finished.");
wschon 0:fdcdbc5499f7 44 uLCD.text_width(4); //4X size text
wschon 0:fdcdbc5499f7 45 uLCD.text_height(4);
wschon 0:fdcdbc5499f7 46 Thread::wait(3000);
wschon 0:fdcdbc5499f7 47 ulcd_mutex.unlock();
wschon 1:2129bb91c172 48 count++;
wschon 0:fdcdbc5499f7 49 }
wschon 0:fdcdbc5499f7 50 }
wschon 2:f4ad69c44c7e 51 void wav_thread(void const *args) {
wschon 4:5fdadaef5b1f 52 while(1) {
wschon 4:5fdadaef5b1f 53 if (play == 1) {
wschon 4:5fdadaef5b1f 54 //USBHostMSD msd("usb");
wschon 4:5fdadaef5b1f 55 //pc.printf("\nset up usb host\n");
wschon 4:5fdadaef5b1f 56 myled = !myled;
wschon 4:5fdadaef5b1f 57 FILE *wave_file;
wschon 4:5fdadaef5b1f 58 //pc.printf("\nread wav file\n");
wschon 4:5fdadaef5b1f 59 //setup PWM hardware for a Class D style audio output
wschon 4:5fdadaef5b1f 60 PWMout.period(1.0/400000.0);
wschon 4:5fdadaef5b1f 61 //printf("\n\n\nHello, wave world!\n");
wschon 4:5fdadaef5b1f 62 // wait until connected to a USB device
wschon 4:5fdadaef5b1f 63 //while(!msd.connect()) {
wschon 4:5fdadaef5b1f 64 // Thread::wait(500);
wschon 4:5fdadaef5b1f 65 //}
wschon 4:5fdadaef5b1f 66 //open wav file and play it
wschon 4:5fdadaef5b1f 67 wave_file=fopen("/sd/monkey4.wav","r");
wschon 4:5fdadaef5b1f 68
wschon 4:5fdadaef5b1f 69 //pc.printf("\nplay\n");
wschon 4:5fdadaef5b1f 70 playing = 1;
wschon 4:5fdadaef5b1f 71 waver.play(wave_file);
wschon 4:5fdadaef5b1f 72 myled2 = !myled2;
wschon 4:5fdadaef5b1f 73 pc.printf("\nclose\n");
wschon 4:5fdadaef5b1f 74 fclose(wave_file);
wschon 4:5fdadaef5b1f 75 playing = 0;
wschon 4:5fdadaef5b1f 76 myled3 = !myled3;
wschon 4:5fdadaef5b1f 77 //end of program
wschon 4:5fdadaef5b1f 78 Thread::wait(500);
wschon 4:5fdadaef5b1f 79 myled4 = !myled4;
wschon 4:5fdadaef5b1f 80
wschon 4:5fdadaef5b1f 81 }
wschon 4:5fdadaef5b1f 82 }
wschon 2:f4ad69c44c7e 83 }
wschon 2:f4ad69c44c7e 84
nliu96 3:7d53a2744a2b 85 void RGB_LED(int red, int green, int blue) {
nliu96 3:7d53a2744a2b 86 unsigned int low_color=0;
nliu96 3:7d53a2744a2b 87 unsigned int high_color=0;
nliu96 3:7d53a2744a2b 88 high_color=(blue<<4)|((red&0x3C0)>>6);
nliu96 3:7d53a2744a2b 89 low_color=(((red&0x3F)<<10)|(green));
nliu96 3:7d53a2744a2b 90 spi.write(high_color);
nliu96 3:7d53a2744a2b 91 spi.write(low_color);
nliu96 3:7d53a2744a2b 92 latch=1;
nliu96 3:7d53a2744a2b 93 latch=0;
nliu96 3:7d53a2744a2b 94 }
nliu96 3:7d53a2744a2b 95
nliu96 3:7d53a2744a2b 96
wschon 2:f4ad69c44c7e 97 void led_thread(void const *args) {
wschon 4:5fdadaef5b1f 98
nliu96 3:7d53a2744a2b 99 spi.format(16,0);
nliu96 3:7d53a2744a2b 100 spi.frequency(500000);
nliu96 3:7d53a2744a2b 101 enable=0;
nliu96 3:7d53a2744a2b 102 latch=0;
wschon 4:5fdadaef5b1f 103 Thread::wait(2000);
wschon 4:5fdadaef5b1f 104 while(1) {
wschon 4:5fdadaef5b1f 105 if (play == 1) {
wschon 4:5fdadaef5b1f 106 red = 0;
wschon 4:5fdadaef5b1f 107 green = 50;
wschon 4:5fdadaef5b1f 108 blue = 0;
wschon 4:5fdadaef5b1f 109 RGB_LED( red, green, blue);
wschon 4:5fdadaef5b1f 110 Thread::wait(250);
wschon 4:5fdadaef5b1f 111 }
wschon 4:5fdadaef5b1f 112 else {
wschon 4:5fdadaef5b1f 113 red = 0;
wschon 4:5fdadaef5b1f 114 green = 0;
wschon 4:5fdadaef5b1f 115 blue = 50;
wschon 4:5fdadaef5b1f 116 RGB_LED( red, green, blue);
wschon 4:5fdadaef5b1f 117 Thread::wait(250);
wschon 4:5fdadaef5b1f 118 red = 50;
wschon 4:5fdadaef5b1f 119 green = 0;
wschon 4:5fdadaef5b1f 120 blue = 0;
wschon 4:5fdadaef5b1f 121 RGB_LED( red, green, blue);
wschon 4:5fdadaef5b1f 122 Thread::wait(250);
nliu96 3:7d53a2744a2b 123 }
nliu96 3:7d53a2744a2b 124 }
wschon 4:5fdadaef5b1f 125 }
nliu96 3:7d53a2744a2b 126
wschon 0:fdcdbc5499f7 127
wschon 0:fdcdbc5499f7 128 int main() {
wschon 0:fdcdbc5499f7 129 Thread thread(ulcd2_thread);
wschon 4:5fdadaef5b1f 130 pc.printf("\nwav_thread\n");
wschon 4:5fdadaef5b1f 131 Thread thread2(wav_thread);
wschon 4:5fdadaef5b1f 132 pc.printf("\nend wav_thread\n");
nliu96 3:7d53a2744a2b 133 Thread thread3(led_thread);
wschon 1:2129bb91c172 134 int count2 = 0;
wschon 0:fdcdbc5499f7 135 while(1) {
wschon 0:fdcdbc5499f7 136 myled = 1;
wschon 0:fdcdbc5499f7 137 Thread::wait(200);
wschon 0:fdcdbc5499f7 138 myled = 0;
wschon 0:fdcdbc5499f7 139 Thread::wait(200);
wschon 0:fdcdbc5499f7 140 ulcd_mutex.lock();
wschon 0:fdcdbc5499f7 141 uLCD.cls();
wschon 0:fdcdbc5499f7 142 //SD card needed with image and video files for last two demos
wschon 0:fdcdbc5499f7 143 uLCD.cls();
wschon 0:fdcdbc5499f7 144 uLCD.media_init();
wschon 1:2129bb91c172 145 uLCD.printf("\n\nThread 1 count: %d", count2);
wschon 2:f4ad69c44c7e 146 if (playing == 1)
wschon 2:f4ad69c44c7e 147 uLCD.printf("\n\nPlaying wav file...");
wschon 2:f4ad69c44c7e 148 else
wschon 2:f4ad69c44c7e 149 uLCD.printf("\n\nWav file finished.");
wschon 1:2129bb91c172 150 Thread::wait(200);
wschon 4:5fdadaef5b1f 151 play = 1;
wschon 0:fdcdbc5499f7 152 uLCD.set_sector_address(0x0000, 0x0000);
wschon 0:fdcdbc5499f7 153 uLCD.display_video(0,0);
wschon 1:2129bb91c172 154 Thread::wait(100);
wschon 0:fdcdbc5499f7 155 ulcd_mutex.unlock();
wschon 4:5fdadaef5b1f 156 play = 0;
wschon 1:2129bb91c172 157 count2++;
wschon 0:fdcdbc5499f7 158 }
wschon 0:fdcdbc5499f7 159 }