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
}