Mobile Security System - Revision 1.0
Dependencies: FXOS8700Q N5110 SDFileSystem SRF02 mbed
main.cpp
- Committer:
- el14dg
- Date:
- 2016-04-17
- Revision:
- 4:9cac024c057c
- Parent:
- 3:70a7b64fbd98
- Child:
- 5:41cb88f47f42
File content as of revision 4:9cac024c057c:
/* ELEC2645 Project Week 19 - Take distance readings from the sensor and limited ticker interrupts Week 20 - Added the SD library Week 21 - Existing code has been edited to get consistent distance readings from the sensor and alll inputs and outputs have been added in main.h Week Easter - Week 22 - Week 23 - Week 24 - */ #include "main.h" int main() { init_serial(); init_K64F(); init_buttons(); lcd.init(); wait(3); read_pin(); led_alarm = 0; one_second_distance = 0; one_second_avg_distance = 0; initial_setting_distance = 0; pin_counter = 0; incorrect_pin_flag = 0; setting_distance_counter = 0; intruder_distance_counter = 0; g_button_0_flag = 0; g_button_1_flag = 0; g_button_c_flag = 0; g_setting_distance_flag = 0; g_intruder_distance_flag = 0; setting_distance_ticker_status = 0; g_current_state = 0; screen_selection(); wait(4); g_next_state = 1; while (1) { if (g_button_0_flag) { pc.printf("g_button_0_flag = %d \n", g_button_0_flag); g_button_0_flag = 0; button_0_protocol(); } if (g_button_1_flag) { pc.printf("g_button_1_flag = %d \n", g_button_1_flag); g_button_1_flag = 0; button_1_protocol(); } if (g_button_c_flag) { pc.printf("g_button_c_flag = %d \n", g_button_c_flag); g_button_c_flag = 0; button_c_protocol(); } if (g_setting_distance_flag) { //pc.printf("g_setting_distance_flag = %d \n", g_setting_distance_flag); g_setting_distance_flag = 0; //pc.printf("g_current_state = %d (setting calibration) \n", g_current_state); get_setting_distance(); } if (g_intruder_distance_flag) { //pc.printf("g_intruder_distance_flag = %d \n", g_intruder_distance_flag); g_setting_distance_flag = 0; //pc.printf("g_current_state = %d (intruder detection) \n", g_current_state); get_intruder_distance(); } if (setting_distance_counter == 10) { calculate_setting_distance(); } if (intruder_distance_counter == 10) { calculate_intruder_distance(); } //pc.printf("g_current_state = %d \n", g_current_state); //pc.printf("g_next_state = %d \n", g_next_state); if (g_next_state != g_current_state) { screen_selection(); // the screen is determined by the current value of g_current_state } g_current_state = g_next_state; //pc.printf("g_current_state_after_transition = %d \n", g_current_state); if (g_current_state == 4) { if (setting_distance_ticker_status == 0) { setting_distance_ticker_status = 1; //pc.printf("g_current_state = %d (attach setting ticker) \n", g_current_state); setting_distance.attach(&setting_distance_isr,0.1); } } if (g_current_state == 5) { //pc.printf("g_current_state = %d (attach intruder ticker) \n", g_current_state); intruder_distance.attach(&intruder_distance_isr,0.1); led_alarm = 1; } else { intruder_distance.detach(); led_alarm = 0; } sleep(); } } void init_serial() { // Ensure terminal software matches pc.baud(115200); } void init_K64F() { // on-board LEDs are active-low, so set pin high to turn them off. r_led = 1; g_led = 1; b_led = 1; // since the on-board switches have external pull-ups, we should disable the internal pull-down // resistors that are enabled by default using InterruptIn sw2.mode(PullNone); sw3.mode(PullNone); } void init_buttons() { button_0.fall(&button_0_isr); button_1.fall(&button_1_isr); button_c.fall(&button_c_isr); button_0.mode(PullDown); button_1.mode(PullDown); button_c.mode(PullDown); } void setting_distance_isr() { g_setting_distance_flag = 1; } void intruder_distance_isr() { g_intruder_distance_flag = 1; } void led_isr() { g_led_flag = 0; } void button_0_isr() { g_button_0_flag = 1; } void button_1_isr() { g_button_1_flag = 1; } void button_c_isr() { g_button_c_flag = 1; } void button_0_protocol() { if (g_current_state == 2) { if (pin_counter < 4) { entered_pin[pin_counter] = 0; pin_counter++; } enter_pin(); } else if (g_current_state == 3) { if (pin_counter < 4) { entered_pin[pin_counter] = 0; pin_counter++; } enter_pin(); } else if (g_current_state == 6) { if (pin_counter < 4) { entered_pin[pin_counter] = 0; pin_counter++; } enter_pin(); } else if (g_current_state == 7) { if (pin_counter < 4) { entered_pin[pin_counter] = 0; pin_counter++; } enter_pin(); } else { g_next_state = fsm[g_current_state].nextState[0]; } } void button_1_protocol() { if (g_current_state == 2) { if (pin_counter < 4) { entered_pin[pin_counter] = 1; pin_counter++; } enter_pin(); } else if (g_current_state == 3) { if (pin_counter < 4) { entered_pin[pin_counter] = 1; pin_counter++; } enter_pin(); } else if (g_current_state == 6) { if (pin_counter < 4) { entered_pin[pin_counter] = 1; pin_counter++; } enter_pin(); } else if (g_current_state == 7) { if (pin_counter < 4) { entered_pin[pin_counter] = 1; pin_counter++; } enter_pin(); } else { g_next_state = fsm[g_current_state].nextState[1]; } } void button_c_protocol() { if (g_current_state == 2) { screen_progression(); } else if (g_current_state == 3) { screen_progression(); } else if (g_current_state == 6) { screen_progression(); } else if (g_current_state == 7) { screen_progression(); } else { g_next_state = fsm[g_current_state].nextState[2]; } } void get_setting_distance() { distance[setting_distance_counter] = srf02.getDistanceCm(); setting_distance_counter++; if (setting_distance_counter == 10) { setting_distance.detach(); } } void get_intruder_distance() { distance[intruder_distance_counter] = srf02.getDistanceCm(); intruder_distance_counter++; if (intruder_distance_counter == 10) { intruder_distance.detach(); } } void calculate_setting_distance() { for (int i = 0; i < 10; i++) { one_second_distance = one_second_distance + distance[i]; } initial_setting_distance = (one_second_distance / 10); pc.printf("Initial Setting Distance = %.2f cm\n",initial_setting_distance); setting_distance_counter = 0; one_second_distance = 0; transition.attach(&screen_5_transition,5); } void calculate_intruder_distance() { for (int i = 0; i < 10; i++) { one_second_distance = one_second_distance + distance[i]; } one_second_avg_distance = one_second_distance / 10; pc.printf("Intruder Distance = %.2f cm\n",one_second_avg_distance); intruder_distance_counter = 0; one_second_distance = 0; if (one_second_avg_distance > (1.5*initial_setting_distance)) { g_next_state = 7; g_current_state = 7; screen_selection(); } else if (one_second_avg_distance < (0.5 * initial_setting_distance)) { g_next_state = 7; g_current_state = 7; screen_selection(); } else { intruder_distance.attach(&intruder_distance_isr,0.1); } } void state_0_screen() { lcd.clear(); lcd.printString("MobileSecurity",0,0); lcd.printString("System",27,1); lcd.printString("Daniel Gibbons",0,4); lcd.refresh(); } void state_1_screen() { lcd.clear(); lcd.printString("Set Alarm",15,1); lcd.printString("Set New Pin",9,4); lcd.refresh(); } void state_2_6_7_screen() { lcd.clear(); lcd.printString("Enter 4 Digit",3,1); lcd.printString("Pin Below",15,2); lcd.refresh(); } void state_3_screen() { lcd.clear(); lcd.printString("Enter New 4",9,1); lcd.printString("Digit Pin",15,2); lcd.refresh(); } void state_4_screen() { lcd.clear(); lcd.printString("Setting",21,1); lcd.refresh(); } void state_5_screen() { lcd.clear(); lcd.printString("Alarm Set",15,1); lcd.printString("DEACTIVATE?",9,4); lcd.refresh(); } void state_8_screen() { lcd.clear(); lcd.printString("ALARM",27,1); lcd.printString("TRIGGERED",15,2); lcd.refresh(); } void screen_selection() { pin_counter = 0; if (g_next_state == 0) { state_0_screen(); lcd.printString("0",0,0); } else if (g_next_state == 1) { state_1_screen(); lcd.printString("1",0,0); } else if (g_next_state == 2) { state_2_6_7_screen(); lcd.printString("2",0,0); } else if (g_next_state == 3) { state_3_screen(); lcd.printString("3",0,0); } else if (g_next_state == 4) { state_4_screen(); lcd.printString("4",0,0); } else if (g_next_state == 5) { state_5_screen(); lcd.printString("5",0,0); } else if (g_next_state == 6) { state_2_6_7_screen(); lcd.printString("6",0,0); } else if (g_next_state == 7) { state_2_6_7_screen(); lcd.printString("7",0,0); } else { state_8_screen(); lcd.printString("8",0,0); } } void screen_5_transition() { g_next_state = 5; screen_selection(); g_current_state = 5; setting_distance_ticker_status = 0; led.detach(); intruder_distance.attach(&intruder_distance_isr,0.1); led_alarm = 1; } void screen_progression() { if (g_current_state == 3) { if (pin_counter > 3) { change_pin(); read_pin(); g_next_state = fsm[g_current_state].nextState[2]; } else { g_next_state = fsm[g_current_state].nextState[3]; } } else { check_pin(); if (incorrect_pin_flag == 1) { incorrect_pin_flag = 0; g_next_state = fsm[g_current_state].nextState[3]; pc.printf("g_next_state = %d\n",g_next_state); } else { g_next_state = fsm[g_current_state].nextState[2]; pc.printf("g_next_state = %d\n",g_next_state); } } } void enter_pin() { if (pin_counter == 1) { lcd.printString("*",19,4); } else if (pin_counter == 2) { lcd.printString("*",34,4); } else if (pin_counter == 3) { lcd.printString("*",49,4); } else if (pin_counter == 4) { lcd.printString("*",64,4); } } void check_pin() { for (int i = 0; i < 4; i++) { if (entered_pin[i] != set_pin[i]) { pc.printf("entered pin doesn't match set pin..."); incorrect_pin_flag = 1; break; } entered_pin[i] = -1; } } void change_pin() { delete_file("/sd/test.txt"); pin = fopen("/sd/test.txt", "a"); if (pin == NULL) { // if it can't open the file then print error message pc.printf("Error! Unable to open file!\n"); } else { pc.printf("Writing to file....\n"); for(int i = 0; i < 4; i++) { int pin_element = entered_pin[i];; // pin_element variable fprintf(pin, "%d,%d\n",i,pin_element); // print formatted string to file (CSV) } for(int i = 0; i < 4; i++) { pc.printf("[%d] %d\n",i,entered_pin[i]); } pc.printf("Done.\n"); fclose(pin); // ensure you close the file after writing } } void read_pin() { pin = fopen("/sd/test.txt", "r"); int i = 0; pc.printf("Reading into set_pin array...\n"); while (fscanf(pin, "%d,%d",&index_array[i],&set_pin[i]) != EOF) { i++; // read data into array and increment index } fclose(pin); // ensure you close the file after reading for(int i = 0; i < 4 ; i++) { pc.printf("[%d] %d\n",i,set_pin[i]); } pc.printf("Done.\n"); } void delete_file(char filename[]) { pc.printf("Deleting file '%s'...",filename); FILE *fp = fopen(filename, "r"); // try and open file if (fp != NULL) { // if it does open... fclose(fp); // close it remove(filename); // and then delete pc.printf("Done!\n"); } // if we can't open it, it doesn't exist and so we can't delete it }