Robot that currently does nothing

Dependencies:   4DGL-uLCD-SE SDFileSystem ShiftBrite mbed-rtos mbed wave_player Motor

main.cpp

Committer:
jplager3
Date:
2017-03-15
Revision:
7:df218a6a1a01
Parent:
6:21c5a7cf63de
Child:
8:cde09ae38be7

File content as of revision 7:df218a6a1a01:

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

Mutex mutex;    //
Mutex mutex2;   //
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
Thread thread1;
Thread thread2;
Thread thread3;
Thread thread4;
//DigitalOut latch(p15);
//DigitalOut enable(p16);
SPI spi(p11, p12, p13);
//uLCD_4DGL uLCD(p28,p27,p29); //(p27, p28, p30);    //tx, rx, rst
uLCD_4DGL uLCD(p28, p27, p30); 
//ShiftBrite myBrite(p15,p16,spi); //latch, enable, spi
SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
AnalogOut DACout(p18);      //must be p18
AnalogIn IR(p20);
//RawSerial BT(p9, p10);  //bluetooth pinout
FILE *wave_file = NULL;         //global bc its gotta be changed by Main while running in child thread
FILE *wave_file2 = NULL;
wave_player waver(&DACout);     //create wave_player object for speaker

void LCD_thread1() {
    while(1){    
        mutex.lock();
        uLCD.filled_circle(64, 64, 12, 0xFF0000);
        mutex.unlock();
        wait(.5);
        mutex.lock();
        uLCD.filled_circle(64, 64, 12, 0x0000FF);
        mutex.unlock();
        wait(.5);
    }     
} 
void sound_thread(){
    while(1) {
        //FILE *wave_file;
        wave_file=fopen("/sd/vacuum.wav","r");    
        if (wave_file == NULL){
               led1=led4 = 1; // if file read error, outside LEDs are on
               led2=led3 = 0;
        }
        waver.play(wave_file);
        fclose(wave_file);  
    }
}

void beep(){
    wave_file2=fopen("/sd/beep.wav","r");
    if(wave_file2 == NULL) {
        led1=led4 = 0; // if file read error, inside LEDs are on
        led2=led3 = 0;
    }
    waver.play(wave_file2);
    fclose(wave_file2);  
}

int main() {
    //thread1.start(IR_thread); // read in IR data
    thread2.start(LCD_thread1);   
    //thread3.start(Motor_thread);
    thread4.start(sound_thread);
    
    while(1){
        //IR testing
        if(IR>0.3 && IR<0.5) {
            led1=1;
            led2=led3=led4=0;
        } else if (IR>0.5 && IR< 0.7) {
            led1=led2=1;
            led3=led4=0;
        } else if (IR>0.7 && IR<0.9) {
            led1=led2=led3=1;
            led4=0;
        } else if(IR>0.9){ //collision threshold seems to be the same from IR=0.8 to IR=0.95
            led1=led2=led3=led4=1; 
            fclose(wave_file);
            thread4.terminate();
            thread4.start(beep);
            /* reverse motors and turn Roomba here
             *
             *
             *
             *
             */
            // write reverse values to the motors for N rotations
            // execute turn by stopping one wheel, and turning the other (trial and error to find exact rotation?)
            // jump back to normal behavior
            wait(5); //wait for beeping to finish
            fclose(wave_file2);
            thread4.terminate();
            thread4.start(sound_thread);
        } else led1=led2=led3=led4=0;
    }
    // use mutex to lock getc(), printf(), scanf()
    // don't unlock until you've checked that it's readable()  
}