ece 4180 lab 3

Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem X_NUCLEO_53L0A1 HC_SR04_Ultrasonic_Library

main.cpp

Committer:
emilywilson
Date:
2020-02-27
Revision:
4:1ef667567942
Parent:
3:94d9434576af

File content as of revision 4:1ef667567942:

#include "mbed.h"
#include "rtos.h"
#include "uLCD_4DGL.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include "nav_switch.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);

float p = 0.5;
Color colors[] = { _red(1.0), _pink(1.0), _orange(1.0), _yellow(1.0) };

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(p);
//            colors[1] = _pink(p);
//            colors[2] = _orange(p);
//            colors[3] = _yellow(p);
//        } else if (c == 'b') {
//            colors[0] = _teal(p);
//            colors[1] = _light_blue(p);
//            colors[2] = _blue(p);
//            colors[3] = _purple(p);
//        } else if (c == 'g') {
//            colors[0] = _yellow(p);
//            colors[1] = _light_green(p);
//            colors[2] = _green(p);
//            colors[3] = _teal(p);
//        }
//    }
//}

void led_handler() {
    Color c = colors[0];
    int i = 0;
    while (1) {
        led.write(c.red*p, c.green*p, c.blue*p);
        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);
bool play_audio = true;

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

Nav_Switch nav(p15, p12, p16, p11, p17);

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);
    audio_thread.start(audio_handler);
    
//    dev.attach(&changeColor, Serial::RxIrq);

    while (1) {
        myled1 = !myled1;
        if (nav.fire()) {
            play_audio = !play_audio;
        } else if (nav.up() && p < 1.0f) {
            p += 0.1f;
        } else if (nav.down() && p > 0.0f) {
            p -= 0.1f;
        } else if (nav.left()) {
            colors[0] = _red(1.0);
            colors[1] = _pink(1.0);
            colors[2] = _orange(1.0);
            colors[3] = _yellow(1.0);
        } else if (nav.right()) {
            colors[0] = _teal(1.0);
            colors[1] = _light_blue(1.0);
            colors[2] = _blue(1.0);
            colors[3] = _purple(1.0);
        }

        Thread::wait(100);
    }
}