4180 lab 5

Dependencies:   mbed 4DGL-uLCD-SE RPCInterface

main.cpp

Committer:
emilywilson
Date:
2020-02-24
Revision:
3:94d9434576af
Parent:
2:4845e2dae429
Child:
4:1ef667567942

File content as of revision 3:94d9434576af:

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

//#include "part2.h"
//#include "part3.h"
#include "part4_led.h"
//#include "lidar_theremin.h"

Serial pc(USBTX, USBRX);
RawSerial dev(p9,p10);

DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);
RGBLed led = RGBLed(p21, p22, p23);
Color colors[] = { _red, _pink, _orange, _yellow };

uLCD_4DGL lcd(p28,p27,p30);

Thread led_thread;
Thread lcd_thread1;
Thread lcd_thread2;
Thread audio_thread;

void changeColor() {
    while (dev.readable()) {
        char c = dev.getc();
        
        if (c == 'r') {
            colors[0] = _red;
            colors[1] = _pink;
            colors[2] = _orange;
            colors[3] = _yellow;
        } else if (c == 'b') {
            colors[0] = _teal;
            colors[1] = _light_blue;
            colors[2] = _blue;
            colors[3] = _purple;
        } else if (c == 'g') {
            colors[0] = _yellow;
            colors[1] = _light_green;
            colors[2] = _green;
            colors[3] = _teal;
        }
    }
}

void led_handler() {
    Color c = colors[0];
    int i = 0;
    while (1) {
        led.write(c.red, c.green, c.blue);
        i = (i + 1) % 4;
        c = colors[i];
        
        Thread::wait(500);
    }
}

Mutex lcd_mutex;
//Semaphore sem(1);


void lcd1_handler() {
    int i = 0;
    while (1) {
        lcd_mutex.lock();
//        sem.wait();
        lcd.locate(0, 0);
        lcd.printf("Counter: %d", i);
        lcd_mutex.unlock();
//        sem.release();
        
        i++;
        Thread::wait(1000);
    }
}

void lcd2_handler() {
    int i,k, offset;
    double s,a;
    k = 1;
    offset = 50;
    lcd_mutex.lock();
//    sem.wait();
    lcd.rectangle(89,0,127,17,1);
    lcd_mutex.unlock();
//    sem.release();
    
    while(1) {       // thread loop
//        v = 1; 
        lcd_mutex.lock();
//        sem.wait();
        for (i=0; i<127; i++) {
            s = 8 * sin((long double)(i+k) /5);   // pixel to print
            a = 8 * sin((long double)(i+k-1) /5); // old pixel to erase
            lcd.pixel(i,offset + (int)a, BLACK);           // erase pixel
            lcd.pixel(i,offset + (int)s, WHITE);           // print pixel
        }
        lcd_mutex.unlock();
//        sem.release();
        k++;
        Thread::wait(100);   // value of pot1 / 100   
    }
}

SDFileSystem sd(p5, p6, p7, p8, "sd");
AnalogOut DACout(p18);
wave_player waver(&DACout);

void audio_handler() {
    FILE *wave_file;
    myled2 = !myled2;
//    printf("\n\n\nHello, wave world!\n");
//    myled4 = !myled4;
    while (1) {
        myled4 = !myled4;
        wave_file=fopen("/sd/sample.wav","r");
        waver.play(wave_file);
        fclose(wave_file);
        Thread::wait(1000);
    }
}

int main() {
//    run_part2();
//    run_part2_EC();
//    run_lidar_theremin();
    
//    run_part3();

    pc.baud(9600);
    dev.baud(9600);
    
    led_thread.start(led_handler);
    lcd.cls();
    lcd_thread1.start(lcd1_handler);
    lcd_thread2.start(lcd2_handler);
    myled2 = !myled2;
    audio_thread.start(audio_handler);
    myled3 = !myled3;
    
    dev.attach(&changeColor, Serial::RxIrq);

    while (1) {
        myled1 = !myled1;

        Thread::wait(500);
    }
}