Mobile Security System - Revision 1.0

Dependencies:   FXOS8700Q N5110 SDFileSystem SRF02 mbed

Revision:
8:8a3d1c07bdec
Parent:
7:8ac5aee0c13e
Child:
9:a5614f53d435
--- a/main.cpp	Mon May 02 14:28:32 2016 +0000
+++ b/main.cpp	Tue May 03 09:51:02 2016 +0000
@@ -103,9 +103,21 @@
 
                 buzzer = 0;
 
-            }
+            }                   
 
         }
+        
+        if (g_acc_flag) {
+            
+            g_acc_flag = 0;
+            
+            if (g_current_state == 4) {
+                
+                compare_axis_data();
+                
+            }
+            
+        }    
 
         if (g_pin_timeout_flag) { // state 7 - 20 second timeout
 
@@ -127,33 +139,6 @@
 
         }
 
-
-
-        if (g_current_state == 4) {
-
-            if (setting_distance_ticker_status == 0) { // if the setting_distance ticker has not been attached
-
-                setting_distance_ticker_status = 1;
-
-                setting_distance.attach(&setting_distance_isr,0.1);
-
-            }
-
-        }
-
-        if (g_current_state == 5) {
-
-            intruder_distance.attach(&intruder_distance_isr,0.1);
-
-        }
-
-        else {
-
-            intruder_distance.detach();
-
-        }
-
-
         sleep();
 
 
@@ -218,11 +203,11 @@
     g_intruder_distance_flag = 0;
     g_pin_timeout_flag = 0;
 
-    setting_distance_ticker_status = 0;
-
     g_current_state = 0;
 
     reset_entered_pin();
+    
+    acc.enable();
 
 }
 
@@ -264,6 +249,12 @@
 
 }
 
+void acc_isr()
+{
+    g_acc_flag = 1;
+
+}
+
 void pin_timeout_isr()
 {
     g_pin_timeout_flag = 1;
@@ -501,7 +492,11 @@
     // detach tickers
 
     pin_timeout.detach();
-
+    
+    accelerometer.detach();
+    
+    intruder_distance.detach();
+    
     alerts.detach();
 
     // set LED and buzzer
@@ -593,9 +588,27 @@
     // attach tickers
 
     alerts.attach(&led_buzzer_isr,0.5);
+    
+    setting_distance.attach(&setting_distance_isr,0.1);
+    
+    accelerometer.attach(&acc_isr,0.1);
 
-    setting_screen.attach(&setting_screen_isr,0.3);
-
+    setting_screen.attach(&setting_screen_isr,0.28);
+    
+    // get setting accelerometer data
+    
+    get_axis_data();
+    
+    pc.printf("Printing setting accelerometer data....\n");    
+    
+    setting_acc_X = acc_X;
+    
+    setting_acc_Y = acc_Y;
+    
+    setting_acc_Z = acc_Z;
+    
+    pc.printf("X = %.4f \nY = %.4f \nZ = %.4f \n",setting_acc_X,setting_acc_Y,setting_acc_Z);
+    
     lcd.refresh();
 
 }
@@ -621,8 +634,14 @@
     // detach tickers
 
     alerts.detach();
+    
+    accelerometer.detach();
 
     setting_screen.detach();
+    
+    // attach ticker
+    
+    intruder_distance.attach(&intruder_distance_isr,0.1);
 
     // set LED and buzzer
 
@@ -661,7 +680,10 @@
     // attach ticker
 
     alerts.attach(&led_buzzer_isr,0.5);
-
+    
+    // detach ticker
+    
+    intruder_distance.detach();
     lcd.refresh();
 
 }
@@ -693,6 +715,10 @@
     alerts.attach(&led_buzzer_isr,0.5);
 
     pin_timeout.attach(&pin_timeout_isr,1);
+    
+    // detach ticker
+    
+    intruder_distance.detach();
 
     lcd.refresh();
 
@@ -748,6 +774,54 @@
 
 }
 
+void screen_progression()
+{
+    if (g_current_state == 3) { // set new pin state
+
+        if (pin_counter > 3) { // if a four digit pin has been entered
+
+            change_pin(); // save entered_pin to the SD card
+
+            read_pin(); // read the pin from the SD card to the set_pin array
+
+            g_next_state = fsm[g_current_state].nextState[2];
+
+        }
+
+        else {
+
+            g_next_state = fsm[g_current_state].nextState[3];
+
+        }
+
+    }
+
+    else { // if the current state is either 2, 6 or 7
+
+        check_pin(); // sets incorrect_pin_flag to 1 if entered pin doesn't match set_pin
+
+        if (incorrect_pin_flag == 1) {
+
+            incorrect_pin_flag = 0;
+
+            g_next_state = fsm[g_current_state].nextState[3]; // go to previous state or alarm triggered state
+
+            pc.printf("g_next_state = %d\n",g_next_state);
+
+        }
+
+        else {
+
+            g_next_state = fsm[g_current_state].nextState[2]; // proceed
+
+            pc.printf("g_next_state = %d\n",g_next_state);
+
+        }
+
+    }
+
+}
+
 void screen_selection()
 {
 
@@ -994,7 +1068,7 @@
         intruder_distance.attach(&intruder_distance_isr,0.1);
 
     }
-    
+
 }
 
 // Timeout Functions
@@ -1002,74 +1076,15 @@
 void screen_5_transition()
 {
     g_next_state = 5;
+    
+    accelerometer.detach();
 
     screen_selection(); // sets the LCD to screen 5
 
     g_current_state = 5;
 
-    setting_distance_ticker_status = 0; // setting_distance ticker is off
-
-    intruder_distance.attach(&intruder_distance_isr,0.1); // start reading distance to detect potential intruder
-
 }
 
-void screen_progression()
-{
-    if (g_current_state == 3) { // set new pin state
-
-        if (pin_counter > 3) { // if a four digit pin has been entered
-
-            change_pin(); // save entered_pin to the SD card
-
-            read_pin(); // read the pin from the SD card to the set_pin array
-
-            g_next_state = fsm[g_current_state].nextState[2];
-
-        }
-
-        else {
-
-            g_next_state = fsm[g_current_state].nextState[3];
-
-        }
-
-    }
-
-    else { // if the current state is either 2, 6 or 7
-
-        check_pin(); // sets incorrect_pin_flag to 1 if entered pin doesn't match set_pin
-
-        if (incorrect_pin_flag == 1) {
-
-            incorrect_pin_flag = 0;
-
-            g_next_state = fsm[g_current_state].nextState[3]; // go to previous state or alarm triggered state
-
-            pc.printf("g_next_state = %d\n",g_next_state);
-
-        }
-
-        else {
-
-            g_next_state = fsm[g_current_state].nextState[2]; // proceed
-
-            pc.printf("g_next_state = %d\n",g_next_state);
-
-        }
-
-    }
-
-}
-
-void alarm_setting_buzz()
-{
-
-    buzzer.write(0.0); // turn off buzzer
-
-}
-
-// Pin Functions
-
 void pin_confirm()
 {
     lcd.clear();
@@ -1081,17 +1096,133 @@
     lcd.printString("to",36,2);
 
     lcd.printString("Confirm",24,3);
-    
+
     if (g_current_state == 7) {
-        
+
         lcd.drawRect(1,30,15,10,0);
-        
-    }    
+
+    }
 
     lcd.refresh();
 
 }
 
+void device_tampered()
+{
+    g_next_state = 1;
+
+    screen_selection();
+
+    g_current_state = 1;
+
+}
+
+void alarm_setting_buzz()
+{
+
+    buzzer.write(0.0); // turn off buzzer
+
+}
+
+// Accelerometer Function
+
+void get_axis_data()
+{
+
+    acc.getX(acc_X);
+    acc.getY(acc_Y);
+    acc.getZ(acc_Z);
+
+}
+
+void compare_axis_data()
+{
+    get_axis_data();
+
+    pc.printf("X1 = %.4f \nY1 = %.4f \nZ1 = %.4f \n",acc_X,acc_Y,acc_Z);
+
+    if (abs(acc_X) < 0.2f*abs(setting_acc_X)) {
+        
+        device_tampered_protocol();
+        
+        pc.printf("acc_X < setting_acc_X\n");
+        
+    }
+    
+    else if (abs(acc_X) > 5.0f*abs(setting_acc_X)) {
+        
+        device_tampered_protocol();
+        
+        pc.printf("acc_X > setting_acc_X\n");
+        
+    }    
+    
+    else if (abs(acc_Y) < 0.2f*abs(setting_acc_Y)) {
+        
+        device_tampered_protocol();
+        
+        pc.printf("acc_Y < setting_acc_Y\n");
+
+    }
+    
+    else if (abs(acc_Y) > 5.0f*abs(setting_acc_Y)) {
+        
+        device_tampered_protocol();
+        
+        pc.printf("acc_Y > setting_acc_Y\n");
+        
+    } 
+    
+    else if (abs(acc_Z) < 0.2f*abs(setting_acc_Z)) {
+        
+        device_tampered_protocol();
+        
+        pc.printf("acc_Z < setting_acc_Z\n");
+
+    }
+    
+    else if (abs(acc_Z) > 5.0f*abs(setting_acc_Z)) {
+        
+        device_tampered_protocol();
+        
+        pc.printf("acc_Z > setting_acc_Z\n");
+        
+    } 
+    
+    else {
+        
+    }    
+
+}
+
+void device_tampered_protocol()
+{
+    setting_distance.detach();
+
+    setting_screen.detach();
+    
+    accelerometer.detach();
+
+    transition.detach();
+
+    lcd.clear();
+
+    lcd.printString("DEVICE MOVED",6,1);
+
+    lcd.printString("SETTING",21,3);
+
+    lcd.printString("INCOMPLETE",12,4);
+
+    lcd_border();
+
+    lcd.refresh();
+
+    tamper_transition.attach(&device_tampered,3);
+
+}
+
+// Pin Functions
+
 void enter_pin()
 {