update

Dependencies:   4DGL-uLCD-SE mbed-rtos mbed wave_player

Fork of Lab3 by Azra Ismail

Revision:
4:7ec6407f673f
Parent:
3:2adc8522c5e8
--- a/Part2.cpp	Thu Oct 13 19:30:09 2016 +0000
+++ b/Part2.cpp	Sun Oct 16 14:42:22 2016 +0000
@@ -1,49 +1,59 @@
 #include "mbed.h"
 #include "rtos.h"
 #include "uLCD_4DGL.h"
-#include "SDFileSystem.h"
-#include "wave_player.h"
+//#include "SDFileSystem.h"
+//#include "wave_player.h"
 #include <mpr121.h>
 
 // mutex to make the lcd lib thread safe
-//Mutex lcd_mutex;
-SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
-AnalogOut speaker(p18);
-wave_player waver(&speaker);
+Mutex lcd_mutex;
+//SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
+PwmOut speaker(p26);
+//wave_player waver(&speaker);
 uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin
-Semaphore lcd_sem(1);
+//Semaphore lcd_sem(1);
 
 // Shiftbrite
 DigitalOut latch(p15);
 DigitalOut enable(p16);
 SPI spi(p11, p12, p13);
-
+/*
 // Touchpad
 // Create the interrupt receiver object on pin 26
-//InterruptIn interrupt(p26);
+InterruptIn interrupt(p21);
 // Setup the i2c bus on pins 9 and 10
-//I2C i2c(p9, p10);
+I2C i2c(p9, p10);
 // Setup the Mpr121:
 // constructor(i2c object, i2c address of the mpr121)
-//Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
-
+Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
+*/
 // Test leds
 DigitalOut led1(LED1);
 DigitalOut led2(LED2);
 DigitalOut led3(LED3);
 DigitalOut led4(LED4);
 
+// sonar
+
+DigitalOut trigger(p20);
+//DigitalOut myled(LED1); //monitor trigger
+//DigitalOut myled2(LED2); //monitor echo
+DigitalIn echo(p19);
+int distance = 0;
+int correction = 0;
+Timer sonar;
+
+
 // global variables
 int light = 0; // to keep track of lighting
 int sound = 1; // to keep track of sound
-int sb_freq = 0.5; // rgb frequency
+int sb_freq = 1; // rgb frequency
 int bright = 1; // time of the day
 
 // Light sensor
-//AnalogIn photocell(p17);
+AnalogIn photocell(p17);
 //PwmOut myled(LED1);
 
-
 // Microphone
 class microphone
 {
@@ -131,7 +141,7 @@
 //microphone mymicrophone(p19); // uncomment when using
 
 // joystick
-//Nav_Switch myNav(p14, p25, p24, p10, p9); //pin order on Sparkfun breakout
+//Nav_Switch myNav(p25, p22, p23, p21, p24); //pin order on Sparkfun breakout
 
 // Shiftbrite
 void RGB_LED(int red, int green, int blue)
@@ -151,8 +161,8 @@
 void LCD_thread1(void const *args)
 {
     while(true) {       // thread loop
-        //lcd_mutex.lock();
-        lcd_sem.wait();
+        lcd_mutex.lock();
+        //lcd_sem.wait();
         //if (light == 0 && sound == 1) {
         if (light == 0) {
             // display red siren
@@ -169,8 +179,8 @@
             uLCD.filled_circle(SIZE_X/2, SIZE_Y/2, 10, BLUE);
             uLCD.filled_rectangle(SIZE_X/2 - 10, SIZE_Y/2, SIZE_X/2 + 10, SIZE_Y/2 + 30, BLUE);
         }
-        //lcd_mutex.unlock();
-        lcd_sem.release();
+        lcd_mutex.unlock();
+        //lcd_sem.release();
         Thread::wait(5); // wait till thread is done
     }
 }
@@ -179,8 +189,8 @@
 void LCD_thread2(void const *args)
 {
     while(true) {       // thread loop
-        //lcd_mutex.lock();
-        lcd_sem.wait();
+        lcd_mutex.lock();
+        //lcd_sem.wait();
         if (sound == 1) {
             // some indication there is audio
             // text saying "!ALERT!"
@@ -197,8 +207,8 @@
             // no indication
             // text removed
         }
-        //lcd_mutex.unlock();
-        lcd_sem.release();
+        lcd_mutex.unlock();
+        //lcd_sem.release();
         Thread::wait(5); // wait till thread is done
     }
 }
@@ -218,19 +228,35 @@
 {
     // play siren
     while(true) {         // thread loop
-        FILE * wave_file;
+        /*FILE * wave_file;
         wave_file = fopen("/sd/police-siren.wav","r");
-        //if (play == 1) {
+        if (play == 1) {
         sound = 1; // comment when using mic
         waver.play(wave_file);
         //play = 0; // comment when using joystick or touchpad
-        //} else if (play == 0) {
+        } else if (play == 0) {
         // how can we stop play midway? - reduce volume?
         sound = 0; // comment when using mic
         wait(5); // comment when using joystick or touchpad
         play = 1; // comment when using joystick or touchpad
-        //}
-        fclose(wave_file);
+        }
+        fclose(wave_file);*/
+        //if (play == 1) {
+        for (int i=0; i<1000; i=i+2) {
+            speaker.period(1.0/969.0);
+            speaker = float(i/50.0);
+            wait(.5);
+            speaker.period(1.0/800.0);
+            wait(.5);
+            sound = 1;
+            if (play == 0) {
+                sound = 0;
+                //wait(1);
+                break;
+            }
+            //  }
+        }
+        ///wait(1);
         Thread::wait(1000);    // wait 1s
     }
 }
@@ -238,9 +264,53 @@
 // thread reading from - ultrasonic sensor to do XYZ
 void sonar_thread(void const *args)
 {
+    sonar.reset();
+    sonar.start();
+    while(echo==2) {}
 
+    //while (echo==2) {};
+    //led2 = 0;
+// stop timer
+    sonar.stop();
+// read timer
+    correction = sonar.read_us();
+//    printf("Approximate software overhead timer delay is %d uS\n\r",correction);
+
+//Loop to read Sonar distance values, scale, and print
+    while(1) {
+// trigger sonar to send a ping
+        trigger = 1;
+        //led1 = 1;
+        //led2 = 0;
+        sonar.reset();
+        wait_us(10.0);
+        trigger = 0;
+        //led1 = 0;
+//wait for echo high
+        while (echo==0) {};
+        //led2=echo;
+//echo high, so start timer
+        sonar.start();
+//wait for echo low
+        while (echo==1) {};
+//stop timer and read value
+        sonar.stop();
+//subtract software overhead timer delay and scale to cm
+        distance = (sonar.read_us()-correction)/58.0;
+        //led2 = 0;
+//        printf(" %d cm \n\r",distance);
+//wait so that any echo(s) return before sending another ping
+        //wait(0.2);
+        if (distance < 10) {
+            play = 0;
+        } else {
+            play = 1;
+        }
+        Thread::wait(500);
+    }
 }
 
+
 // thread reading from - tactile switch to control RGB/sound/lcd
 /*
 void switchthread(void const *args)
@@ -251,23 +321,23 @@
         //mbedleds = ~(myNav & 0x0F); //update leds with nav switch direction inputs FOR TESTING ONLY
         if (myNav.up()) play = 1;
         if (myNav.down()) play = 0;
-        if (sb_freq > 0.2) {
-            if (myNav.left()) sb_freq -= 0.1;
+        if (sb_freq > 0.5) {
+            if (myNav.left()) sb_freq -= 0.2;
         }
-        if (sb_freq < 1) {
-            if (myNav.right()) sb_freq += 0.1;
+        if (sb_freq < 3) {
+            if (myNav.right()) sb_freq += 0.2;
         }
         //if(myNav.fire()) mbedleds = 0x0F; //special all leds on case for fire (center button)
         //or use - if(myNav[4]==0) mbedleds = 0x0F; //can index a switch bit like this
         Thread::wait(200);
     }
-}
-
+}*/
+/*
 // thread reading from - touch keypad same
 void touchpad_thread(void const *args)
 {
     while(true) {         // thread loop
-        int key_code=0;
+        int key_code = 0;
         int i=0;
         int value=mpr121.read(0x00);
         value +=mpr121.read(0x01)<<8;
@@ -275,22 +345,26 @@
         i=0;
         // puts key number out to LEDs for demo
         for (i=0; i<12; i++) {
-            if (((value>>i)&0x01)==1) key_code=i+1;
+            if (((value>>i)&0x01)==1) key_code=i;
         }
-        if (key_code == 2) {
+        if (key_code == 6) {
             play = 1;
-        } else if (key_code == 8) {
+        } else if (key_code == 4) {
             play = 0;
-        } else if (key_code == 4) {
-            sb_freq -= 0.1;
-        } else if (key_code == 6) {
-            sb_freq += 0.1;
+        } else if (key_code == 1) {
+            if (sb_freq > 0.5) {
+                sb_freq += -0.2;
+            }
+        } else if (key_code == 9) {
+            if (sb_freq < 3) {
+                sb_freq += 0.2;
+            }
         }
     }
 }
 */
 // thread reading from - light sensor to do something
-/*
+
 void lightsensor_thread(void const *args)
 {
     while(true) {         // thread loop
@@ -299,11 +373,11 @@
         } else {
             bright = 1;
         }
-        wait(0.1);
-        Thread::wait(1000);    // wait 0.25s
+        //wait(0.1);
+        Thread::wait(500);    // wait 0.25s
     }
 }
-*/
+
 //int mymic;
 /*
 // thread reading from - microphone to control rgb
@@ -326,8 +400,8 @@
 */
 int main()
 {
-    //uLCD.cls();
-    //wait(1);
+    uLCD.cls();
+    wait(1);
 
     // shiftbrite stuff
     int red=0;
@@ -339,8 +413,6 @@
     latch=0;
     wait(2);
 
-    // draw police car base?
-
     // t5 and t6 should not run at the same time
 
     // call threads here
@@ -350,64 +422,83 @@
     //Thread t4(sonar_thread); // start thread4
     //Thread t5(switchthread); //start thread5
     //Thread t6(touchpad_thread); //start thread6
-    //Thread t7(lightsensor_thread); //start thread7
+    Thread t7(lightsensor_thread); //start thread7
     //Thread t8(mic_thread); //start thread8
 
+    //t1.set_priority(osPriorityHigh);
+    //t2.set_priority(osPriorityHigh);
+    //t3.set_priority(osPriorityNormal);
+    //t5.set_priority(osPriorityHigh);
+    //t1.yield();
+    //t2.yield();
+    //t3.yield();
+    //t5.yield();
+
     // running shiftbrite
     int color = 255;
 
     while(1) {
 
-        if (bright == 0) {
-            color = 150;
-        } else if (bright == 1) {
-            color = 255;
-        }
+         if (bright == 0) {
+             color = 150;
+             green = 100;
+         } else if (bright == 1) {
+             color = 255;
+             green = 0;
+         }
 
         if (sound == 0) {
-        RGB_LED(0,0,0);
-        Thread::wait(500);
+            RGB_LED(0,0,0);
+            Thread::wait(200);
         } else {
-        light = 0;
-        red = color;     // flash red light
-        green = 0;
-        blue = 0;
-        RGB_LED(red, green, blue);
-        wait(0.5);
+            light = 0;
+            red = color;     // flash red light
+            //green = 0;
+            blue = 0;
+            RGB_LED(red, green, blue);
+            wait(sb_freq);
+            //wait(0.5);
 
-        RGB_LED(0,0,0);
-        wait(0.5);
+            RGB_LED(0,0,0);
+            wait(sb_freq);
+            //wait(0.5);
 
-        light = 1;
-        red = color;     // flash white light
-        green = color;
-        blue = color;
-        RGB_LED( red, green, blue);
-        wait(0.5);
+            light = 1;
+            red = color;     // flash white light
+            //green = color;
+            blue = color;
+            RGB_LED( red, green, blue);
+            wait(sb_freq);
+            //wait(0.5);
 
-        RGB_LED(0,0,0);
-        wait(0.5);
+            RGB_LED(0,0,0);
+            wait(sb_freq);
+            //wait(0.5);
 
-        light = 2;
-        red = 0;     // flash blue light
-        green = 0;
-        blue = color;
-        RGB_LED( red, green, blue);
-        wait(0.5);
+            light = 2;
+            red = 0;     // flash blue light
+            //green = 0;
+            blue = color;
+            RGB_LED( red, green, blue);
+            wait(sb_freq);
+            //wait(0.5);
 
-        RGB_LED(0,0,0);
-        wait(0.5);
+            RGB_LED(0,0,0);
+            wait(sb_freq);
+            //wait(0.5);
 
-        light = 1;
-        red = color;     // flash white light
-        green = color;
-        blue = color;
-        RGB_LED( red, green, blue);
-        wait(0.5);
+            light = 1;
+            red = color;     // flash white light
+            //green = color;
+            blue = color;
+            RGB_LED( red, green, blue);
+            wait(sb_freq);
+            //wait(0.5);
 
-        RGB_LED(0,0,0);
-        wait(0.5);
-        Thread::wait(500);
+            RGB_LED(0,0,0);
+            wait(sb_freq);
+            //wait(0.5);
+            Thread::wait(500);
         }
     }
 }