ECE4180 / Mbed 2 deprecated Lab4_Two_Factor2

Dependencies:   4DGL-uLCD-SE EthernetInterface PinDetect mbed-rtos mbed

Revision:
2:50b6517bcae4
Parent:
0:a66216813d00
Child:
3:03629edd59ff
--- a/main.cpp	Wed Oct 21 22:02:13 2015 +0000
+++ b/main.cpp	Thu Oct 22 02:59:40 2015 +0000
@@ -7,6 +7,7 @@
 #include "PinDetect.h"
 #include "string.h"
 #include "EthernetInterface.h"
+#include "Speaker.h"
 
 //uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
 uLCD_4DGL uLCD(p28, p27, p29); 
@@ -19,7 +20,9 @@
 //Set up IR sensor 
 AnalogIn IrSensor(p20);
 Serial serial(USBTX, USBRX);
+
 SongPlayer mySpeaker(p26);
+Speaker NotePlayer(p26);
 
 // ethernet setup    
 EthernetInterface eth;
@@ -40,11 +43,12 @@
 enum Statetype { Armed =0 ,IR_sensed = 1,Second_Step = 2,Cleared = 3, Alarm_ON = 4};
 Statetype state = Armed;
 
-char Code[4] = {0,0,0,0}; 
+int Code[4] = {0,0,0,0}; 
 int CodeCounter = 0; 
 
 void pb1_hit_callback (void) {
-    if (state == IR_sensed) {
+    if ((state == IR_sensed) ||(state == Cleared)) {
+    NotePlayer.PlayNote(1200.0,0.15,0.1);
     myLED1 = !myLED1;
     Code[CodeCounter] = 1;
     //printf("\n  PB: %d\n\r",Code[CodeCounter]);
@@ -53,7 +57,8 @@
     }
 }
 void pb2_hit_callback (void) {
-    if (state == IR_sensed) {
+    if ((state == IR_sensed) ||(state == Cleared)){
+    NotePlayer.PlayNote(1200.0,0.15,0.1);
     myLED2 = !myLED2;
     Code[CodeCounter] = 2;
     //printf("\n  PB: %d\n\r",Code[CodeCounter]);
@@ -62,7 +67,8 @@
     }
 }
 void pb3_hit_callback (void) {
-    if (state == IR_sensed) {
+    if ((state == IR_sensed) ||(state == Cleared)) {
+    NotePlayer.PlayNote(1200.0,0.15,0.5);
     myLED3 = !myLED3;
     Code[CodeCounter] = 3;
     //printf("\n  PB: %d\n\r",Code[CodeCounter]);
@@ -71,11 +77,12 @@
     }
 }
 void pb4_hit_callback (void) {
-   if (state == IR_sensed) {
-   myLED4 = !myLED4;
-   Code[CodeCounter] = 4;
-   //printf("\n  PB: %d\n\r",Code[CodeCounter]);
-   CodeCounter++;
+   if ((state == IR_sensed) ||(state == Cleared)) {
+       NotePlayer.PlayNote(1200.0,0.15,0.5);
+       myLED4 = !myLED4;
+        Code[CodeCounter] = 4;
+        //printf("\n  PB: %d\n\r",Code[CodeCounter]);
+        CodeCounter++;
    wait(0.500);
    }
 }
@@ -85,7 +92,8 @@
 
 
 //Mutex stdio_mutex; 
-Semaphore LCD_Access(2);
+//Semaphore LCD_Access(2);
+Mutex LCD_Access; 
 Semaphore Consul_Access(5);
 float IrVoltage = 0.0;
 
@@ -108,12 +116,13 @@
 
 
     
+    
 void Speaker_thread(void const *args) {
     while (1) {
     if (state == Alarm_ON) {
-        Consul_Access.wait();
+        /*Consul_Access.wait();
         serial.printf("\n  play sound\n\r");
-        Consul_Access.release();
+        Consul_Access.release();*/
         mySpeaker.PlaySong(note,duration);
         Thread::wait(5000); 
         }
@@ -122,43 +131,35 @@
 
 void uLCD_thread(void const *args) {
     int Change = 99; 
-    Consul_Access.wait();
-    //serial.printf("state  %d  %d\n\r",Change,state);
-    Consul_Access.release();
     while(1) {
         
         if (Change != state) {
             Change = state;
             switch (state) {
                 case Armed:
-                    LCD_Access.wait();
+                    LCD_Access.lock();
                     uLCD.cls();
                     uLCD.color(WHITE);
-                    uLCD.printf("     ARMED           \n               ");
-                    LCD_Access.release();
+                    uLCD.printf("        ARMED           \n               ");
+                    LCD_Access.unlock();
                 break;
                 case IR_sensed:
-                    LCD_Access.wait();
+                    LCD_Access.lock();
                     uLCD.cls();
                     uLCD.printf("\nSensor triggred \n"); //Default Green on black text
                     uLCD.printf("\n  Enter the code ...");
-                    uLCD.text_width(4); //4X size text
-                    uLCD.text_height(4);
-                    uLCD.color(RED);
-                    LCD_Access.release();
+                    LCD_Access.unlock();
+                    //Thread::wait(100);
                     for (int i=30; i>=0; --i) {
                         if (state == IR_sensed) {
-                            LCD_Access.wait();
-                            uLCD.text_width(4); //4X size text
-                            uLCD.text_height(4);
+                            LCD_Access.lock();
+                            uLCD.text_width(3); //4X size text
+                            uLCD.text_height(3);
                             uLCD.color(RED);
-                            uLCD.locate(1,2);
-                            uLCD.printf("%2D",i);
-                            LCD_Access.release();
-                            Consul_Access.wait();
-                            serial.printf("CC: %d%d%d%d\n\r",Code[0],Code[1],Code[2],Code[3]);
-                            Consul_Access.release();
-                            Thread::wait(100);
+                            uLCD.locate(2,2);
+                            uLCD.printf("%2D",i);                    
+                            LCD_Access.unlock();                    
+                            Thread::wait(1000);
                             }
                         }
                         if (state == IR_sensed) {
@@ -167,28 +168,29 @@
 
                 break;
                 case Second_Step: 
-                    LCD_Access.wait();
+                    LCD_Access.lock();
                     uLCD.cls();
                     uLCD.color(BLUE);
                     uLCD.printf("\nPleas enter code from text massage \n");
-                    LCD_Access.release();
+                    LCD_Access.unlock();
                     break;
                 case Alarm_ON:
-                    LCD_Access.wait();
+                    LCD_Access.lock();
                     uLCD.cls();
                     uLCD.color(RED);
                     uLCD.printf("\nThis house is being broken into. \nThe athoroties have been informed \n"); 
-                    LCD_Access.release();
+                    LCD_Access.unlock();
                     break;
                 case Cleared: 
-                    LCD_Access.wait();
+                    LCD_Access.lock();
                     uLCD.cls();
                     uLCD.color(GREEN);
                     uLCD.printf("\nAccess Granted. \n\n"); 
-                    LCD_Access.release();  
+                    LCD_Access.unlock();  
                 break; 
                 }
             }
+            Thread::wait(500);
         }
 }
 
@@ -204,16 +206,9 @@
             if (IrVoltage <= 0.1) { //if value just nois reset timer
                 t.reset();
                 state = Armed;
-                Consul_Access.wait();
-                serial.printf("Vtimer reset %f\r\n", IrVoltage);
-                serial.printf("tread:  %f\r\n", t.read());
-                Consul_Access.release();
                 }
-            if (t.read() >= 5) { //wait 5 seconds to make sure that sense someone 
+            if (t.read() >= 2) { //wait 5 seconds to make sure that sense someone 
                 state = IR_sensed; 
-                Consul_Access.wait();
-                serial.printf("alarm on %f\r\n", IrVoltage);
-                Consul_Access.release();
                 }
             Thread::wait(1000);
         }
@@ -225,9 +220,6 @@
 }
 
 void Shiftbright_thread(void const *args){
-    //int red=0;
-    //int green=0;
-    //int blue=0;
     spi.format(16,0);
     spi.frequency(500000);
     enable=0;
@@ -236,29 +228,29 @@
     while(1) {
     switch (state) {
         case Armed:
-            Consul_Access.wait();
-            serial.printf("armed \r\n");
-            Consul_Access.release();
-            for (int i = 0; i <= 100; i++) {
-                RGB_LED( 0, i, 0);
+            for (int i = 0; i <= 50; i++) {
+                RGB_LED( i, 0, 0);
                 Thread::wait(10);
             }
-            for (int i = 100; i >= 0; i--) {
-                RGB_LED( 0, i, 0);
+            for (int i = 50; i >= 0; i--) {
+                RGB_LED( i, 0, 0);
                 Thread::wait(10);
             }
         break;
         case IR_sensed:
-            Consul_Access.wait();
-            serial.printf("sensed \r\n");
-            Consul_Access.release();
-            RGB_LED( 0, 0, 100);
+            RGB_LED( 100, 0, 0);
+            Thread::wait(500);
+            RGB_LED( 0, 0, 0);
         break;
         case Alarm_ON:
-            Consul_Access.wait();
-            serial.printf("on \r\n");
-            Consul_Access.release();
-            RGB_LED( 100, 0, 0);
+            for (int i = 0; i <= 100; i++) {
+                RGB_LED( i, i/2, 0);
+                Thread::wait(10);
+            }
+            for (int i = 100; i >= 0; i--) {
+                RGB_LED( i, i/2, 0);
+                Thread::wait(10);
+            }
         break; 
         case Cleared:
             RGB_LED( 0, 100, 0);
@@ -270,46 +262,55 @@
 
 void CheckCode_thread(void const *args) {
     while(1){
-        if (state == IR_sensed) {
-            //printf("CC from check: %d%d%d%d\n\r",Code[0],Code[1],Code[2],Code[3]);
-            if ((Code[0] == 1) &&  (Code[1] == 2) && (Code[2] == 3) && (Code[3] == 4)) {
-                Code[0] = Code[1] = Code[2] = Code[3] =0;
-                state = Second_Step; 
-                CodeCounter = 0;
-                break;
+        switch (state) {
+            case Armed:
+            break;
+            case IR_sensed:
+                if ((Code[0] == 1) &&  (Code[1] == 2) && (Code[2] == 3) && (Code[3] == 4)) {
+                    Code[0] = Code[1] = Code[2] = Code[3] =0;
+                    state = Cleared; 
+                    CodeCounter = 0;
+                    break;
+                }
+                else if ((Code[0] != 0) &&  (Code[1] != 0) && (Code[2] != 0) && (Code[3] != 0)) {
+                    Code[0] = Code[1] = Code[2] = Code[3] =0;
+                    NotePlayer.PlayNote(200,1,0.5);
+                    state = Alarm_ON; 
                 }
-            else if ((Code[0] != 0) &&  (Code[1] != 0) && (Code[2] != 0) && (Code[3] != 0)) {
-                Code[0] = Code[1] = Code[2] = Code[3] =0;
-                Consul_Access.wait();
-                serial.printf("\nAWrong passcode. \n\n");   
-                Consul_Access.release();
-                state = Alarm_ON; 
-            }
+                Thread::wait(100);
+            break;
+            case Alarm_ON: 
+                Thread::wait(1000);
+            break; 
+            case Cleared: 
+                //serial.printf("CC from check: %d%d%d%d\n\r",Code[0],Code[1],Code[2],Code[3]);
+                if ((Code[0] == 4) &&  (Code[1] == 3) && (Code[2] == 2) && (Code[3] == 1)) {
+                    Code[0] = Code[1] = Code[2] = Code[3] =0;
+                    Thread::wait(100);
+                    state = Armed; 
+                    CodeCounter = 0;
+                    break;
+                    }
+                else if ((Code[0] != 0) &&  (Code[1] != 0) && (Code[2] != 0) && (Code[3] != 0)) {
+                    Code[0] = Code[1] = Code[2] = Code[3] =0;
+                    NotePlayer.PlayNote(200,1,0.5);
+                    Thread::wait(100);
+                //state = Alarm_ON; 
+                }
+                Thread::wait(100);
+            break;
         }
-        if (state == Second_Step) {
-            Consul_Access.wait();
-            serial.printf("CC from check: %d%d%d%d\n\r",Code[0],Code[1],Code[2],Code[3]);
-            Consul_Access.release();
-            if ((Code[0] == 3) &&  (Code[1] == 2) && (Code[2] == 2) && (Code[3] == 1)) {
-                Code[0] = Code[1] = Code[2] = Code[3] =0;
-                state = Cleared; 
-                CodeCounter = 0;
-                }
-            else if ((Code[0] != 0) &&  (Code[1] != 0) && (Code[2] != 0) && (Code[3] != 0)) {
-                Code[0] = Code[1] = Code[2] = Code[3] =0;
-                Consul_Access.wait();
-                serial.printf("\nAWrong passcode. \n\n"); 
-                Consul_Access.release();  
-                state = Alarm_ON; 
-            }
-        } 
-    Thread::wait(1000);
     }
 }
 
 void Ethernet_thread(void const *args) { 
     
     int Change = 99; 
+    
+    eth.init(); //Use DHCP
+    eth.connect();
+    serial.printf("IP Address is: %s", eth.getIPAddress());
+    
     while(1) {
         if (Change != state) {
              
@@ -319,16 +320,20 @@
                     //add code that verifies connection every so often 
                     Thread::wait(1000);
                 break;
-                case IR_sensed: 
-                    /*// send alert
+                case Second_Step: 
+                    Thread::wait(1000);
+                break;
+                case Alarm_ON: {
+                // send alert
+                    char buffer[300];
+                    int ret;
                     TCPSocketConnection sock;
                     sock.connect("dreamphysix.com", 80);
 
                     char http_cmd[] = "GET http://dreamphysix.com/alert.php?authcode=0e9cae34a0 HTTP/1.0\n\n";
                     sock.send_all(http_cmd, sizeof(http_cmd)-1);
     
-                    char buffer[300];
-                    int ret;
+
                     while (true) {
                         ret = sock.receive(buffer, sizeof(buffer)-1);
                         if (ret <= 0)
@@ -338,45 +343,14 @@
                        serial.printf("Received %d chars from server:\n%s\n", ret, buffer);
                         Consul_Access.release();
                         }
-                    sock.close();*/
-                break;
-                case Second_Step: 
-                    /*TCPSocketConnection sock;
-                    sock.connect("dreamphysix.com", 80);
-                    char buffer[300];
-                    int ret;
-                    //code second step
-                    // send random code
-                    srand(time(NULL));
-                    int randomNumber = 3221 ;//rand() % 4444 + 1000;
-                    char randomCode[sizeof(int)*4];
-                    snprintf(randomCode, sizeof(randomCode), "%i", randomNumber);
-
-                    sock.connect("dreamphysix.com", 80);
-    
-                    char http_cmd1[100] = "GET http://dreamphysix.com/sendcode.php?authcode=0e9cae34a0&randomcode=";
-                    strcat(http_cmd1, randomCode);
-                    strcat(http_cmd1, " HTTP/1.0\n\n");
-                    sock.send_all(http_cmd1, sizeof(http_cmd1)-1);
-    
-                    while (true) {
-                        ret = sock.receive(buffer, sizeof(buffer)-1);
-                        if (ret <= 0)
-                            break;
-                        buffer[ret] = '\0';
-                        Consul_Access.wait();
-                       serial.printf("Received %d chars from server:\n%s\n", ret, buffer);
-                        Consul_Access.release();
+                    sock.close();
                     }
-    
-                    sock.close(); 
-                    */
                 break;
                 case Cleared:
                     //nothing to do for this thread make space for others 
                     Thread::wait(1000);
                 break;
-                case Alarm_ON:
+                case IR_sensed:
                     //nothing to do for this thread make space for others
                     Thread::wait(1000);
                 break;
@@ -397,17 +371,26 @@
                     Thread::wait(1000); //nothing to do for this thread make space for others
                 break;
                 case IR_sensed:
-                case Second_Step:
-                    LCD_Access.wait();
+                    
+                    Thread::wait(500);
+                    LCD_Access.lock();
 
                     uLCD.line(MidPoint-2*(LineWidth+SpaceWidth), LineHight, MidPoint- 2*SpaceWidth-LineWidth, LineHight, WHITE); //line( int x1, int y1, int x2, int y2, int color)
                     uLCD.line(MidPoint-LineWidth-SpaceWidth, LineHight, MidPoint-SpaceWidth, LineHight, WHITE); //line( int x1, int y1, int x2, int y2, int color)
                     uLCD.line(MidPoint+SpaceWidth, LineHight, MidPoint+SpaceWidth+LineWidth, LineHight, WHITE); //line( int x1, int y1, int x2, int y2, int color)
                     uLCD.line(MidPoint+2*SpaceWidth+LineWidth, LineHight, MidPoint+2*(SpaceWidth+LineWidth), LineHight, WHITE); //line( int x1, int y1, int x2, int y2, int color)
-                    
-                    uLCD.locate(20,20);
-                    uLCD.printf("%d %d %d %d ",Code[0],Code[1],Code[2],Code[3]);
-                    LCD_Access.release();
+                    LCD_Access.unlock();
+                    while(state == IR_sensed) {
+                        LCD_Access.lock();
+                        uLCD.locate(5,14);
+                        uLCD.text_width(1); //4X size text
+                        uLCD.text_height(1);
+                        uLCD.color(WHITE);
+                        uLCD.printf("%d %d  %d %d",Code[0],Code[1],Code[2],Code[3]);
+                        LCD_Access.unlock();
+                    }
+                case Second_Step:
+                    Thread::wait(1000); //nothing to do for this thread make space for others
                 break; 
                 case Cleared:
                     Thread::wait(1000); //nothing to do for this thread make space for others
@@ -421,15 +404,12 @@
     
 int main() {
     
+    serial.baud(921600);
     init_pbs();
     
-   serial.printf("Setting up connection\r\n");
-    
-    eth.init(); //Use DHCP
-    eth.connect();
     Thread Ethernetthread(Ethernet_thread);
-   serial.printf("IP Address is %s\n", eth.getIPAddress());
     wait(5);
+    //serial.printf("IP Address is: %s", eth.getIPAddress());
     
     Thread LCDthread(uLCD_thread);
     Thread IRthread(IR_thread);
@@ -438,36 +418,7 @@
     Thread CheckCode(CheckCode_thread);
     Thread LCD_CodeEnterThread(LCD_Code_Enter_Thread); 
     
-    while (1) {
-           /* switch (state) {
-            //state: Armed =0 ,IR_sensed = 1,Second_Step = 2,Cleared = 3, Alarm_ON = 4};
-                case Armed:
-
-                break;
-                case IR_sensed:
-                    
-                break;
-                case Second_Step:
-                    
-                break; 
-                case Cleared:
-
-                break;
-                case Alarm_ON:
-
-                break;
-                }*/
-        }
-        
-    
-    
-    
-    
-    
-
-
-    
-    //while (true) { }
+    while (true) { }
 
 }
 
@@ -511,11 +462,4 @@
     pb4.setSampleFrequency();
     // pushbuttons now setup and running
 
-    }
-
-/*void Thread_maintnence(char Thread) {
-    switch (Thread) {
-        case 'IRthread':
-            IRthread.terminate();
-        break;
-}*/
\ No newline at end of file
+    }
\ No newline at end of file