final_code

Dependencies:   mbed

main.cpp

Committer:
amirgahroosi
Date:
2014-12-10
Revision:
0:7208cb44ad05

File content as of revision 0:7208cb44ad05:

#include "mbed.h"
#include "airhumidity.h"
#include <string>

DigitalOut myled(LED1);
Serial pc(USBTX, USBRX); // tx, rx
Serial bt(PTE22, PTE23); // initializing Uart1 channel for connecting the bluetooth device
AnalogIn gas_output(PTB1); //initializing the ADC output for gas sensor
 
using namespace std;
 
DigitalOut R1 (D6);
DigitalOut R2 (D7);
DigitalOut R3 (D8);
DigitalOut R4 (D9);
 
InterruptIn C1 (D10);
DigitalIn C2 (D11);
DigitalIn C3 (D12);
 
DigitalOut keyled(LED1);
DigitalOut flash(LED4);
 
AnalogIn ain(PTB0);
 
Timer t;
float tm ;
 
char key;
int s=0;

float value_adc =0.0f;
int dig_value = 0;
Timer timeout;
float current_time = 0.0;

unsigned char arrkey[12]={ '1' , '2' , '3' ,
                            '4' , '5' , '6' ,
                            '7' , '8' , '9' ,
                            '*' , '0' , '#' };
                            
char msg;
float temp=0.0;
float humid=0.0;
int unit =0;
string room_safety_status = "issafe";
bool room_safe = true;
bool someone_in = false;
bool door_lock_status = true;
string is_door_locked = "locked";
string room_status = "yes";
string room_gas_status = "safe";
float gas_sensor_value = 0.0;

bool allow_entrance = false;
bool authorized_person_entered = false;
bool authorized_person_left = true;
string last_person = "N/A";

                            
void unlock (){
    printf("DOOR UNLOCK: Welcome!\n\r");
    door_lock_status = false;
}
 
void lock (){
    printf("DOOR LOCK\n\r");
    door_lock_status = true;
} 
 
unsigned char char_string[4]= {'*' ,'*' ,'*' ,'*'};
unsigned char password[4]={'1' , '2' , '3' , '4'};
unsigned char passwordA[4]={'4' , '5' , '6' , '7'};

unsigned char keypad(){
    unsigned char r,b;
      
    while(current_time<5){
        current_time = timeout.read();
        for (r=0; r<4; r++){
            b=4;
            R1 = 1; R2 = 1 ; R3 = 1 ; R4 = 1;
            if (r == 0) R1 = 0;
            if (r == 1) R2 = 0;
            if (r == 2) R3 = 0;
            if (r == 3) R4 = 0;
              
            if(C1==0) b=0;
            if(C2==0) b=1;
            if(C3==0) b=2;
             
            if ((!(b==4))){
                key=arrkey[(r*3)+b];
                while(C1==0);
                while(C2==0);
                while(C3==0);
           
                wait(0.2);
            
                char_string[s] = key;
                s++;
                return key;
            }
          
        }
    }
    return 'Q';
}
 
void handleKeypad (){
    
    bool finished = false ; 
    printf("In Intruppt\n\r");
    __disable_irq();
    C1.disable_irq ();
 
    int firsttime = 0;

    if (firsttime == 0)
    {
        s = -1;
        timeout.reset();
        timeout.start();
    }
    
    current_time = timeout.read();
        
    while ((! finished) && (current_time < 5.0)){
            key = keypad();
            current_time = timeout.read();
            if (s == 4){
                finished = true;
                firsttime = 1;
                
                printf("Password: ");  
                for (int i = 0 ; i < 4 ; i++)
                    printf("%c", char_string[i]);
                    printf("\n\r");
                s = 0; 
                /////////////check password functions//////////
                int j = 0;
                int matchSara = 1;
                while (j < 4){
                    if (char_string [j] == password[j])
                        j++;
                    else{
                        matchSara = 0;
                        break;
                        }
                    if(matchSara && j == 3)
                    {
                        last_person = "Sara";
                        allow_entrance = true; 
                        door_lock_status = false;   
                        room_safety_status = "issafe";
                        room_safe = true;
                    }       
                }
                
                int k = 0;
                int matchAmir = 1;
                while (k < 4){
                    if (char_string [k] == passwordA[k])
                        k++;
                    else{
                        matchAmir = 0;
                        break;
                        } 
                    if(matchAmir && k == 3)
                    {
                        last_person = "Amir";
                        allow_entrance = true;  
                        door_lock_status = false;  
                        room_safety_status = "issafe";
                        room_safe = true;
                    }          
                }
                
                if (matchSara == 1){
                    printf("MATCH Sara\n\r");
                    room_safety_status = "issafe";
                    room_safe = true;
                    unlock();
                    C1.enable_irq();
                    __enable_irq();
                    break;
                }
                else if (matchAmir == 1){
                    printf("MATCH Amir\n\r");
                    room_safety_status = "issafe";
                    room_safe = true;
                    unlock();
                    C1.enable_irq();
                    __enable_irq();
                    break;
                }
                else{
                    printf("WRONG\n\r");
                    printf("lock for wrong password\n\r");
                    C1.enable_irq();
                    __enable_irq();
                    break;
                }          
            } // end s=4
    } //end while                
    timeout.stop();    
    C1.enable_irq ();
    __enable_irq();
}


void uart_interrupt_fun() {
    __disable_irq();
    msg = bt.getc();
    //pc.putc(msg);
    if(msg == 's'){
        msg = 'n';
        wait(1);
        //pc.printf(" \n\r") ;
        bt.printf("info %4.2f %4.2f %s %s %s %s %s end\n\r", temp, humid, room_status,room_gas_status, room_safety_status, last_person, is_door_locked) ; 
        wait(3);
        for(int i=0; i<2; i++)
        {
            myled = 1;
            wait(0.2);
            myled = 0;
            wait(0.2);
        }
        
    }
    __enable_irq();
    
}

void check_rooms_presence_safety()
{
    if(someone_in)
    {
        if( !door_lock_status )
        {
            
            room_safety_status = "issafe";
            room_safe = true;
            authorized_person_entered = true;
            if(authorized_person_entered)
            {
                door_lock_status = true;    
            }
        }
        else /*if(!authorized_person_entered || authorized_person_left) */
        {
            room_safety_status = "notsafe"; 
            room_safe = false;   
        }
    }
    if(! someone_in)
    {
        if(authorized_person_entered)
        {
            authorized_person_left = true;
            authorized_person_entered = false;
            allow_entrance = false;
            door_lock_status = true;
            room_safety_status = "issafe"; 
            room_safe = true;
        }
        if(!authorized_person_entered && !(door_lock_status))
        {
            door_lock_status = false;   
        }
        if(!room_safe)
        {
            room_safety_status = "notsafe";    
        }
        
    }
    
}

const char * gas_status_function()
{
    if(gas_sensor_value < 45)
    {
        return  "safe";    
    }
    else
    {
        return "danger";    
    }
    return "notvalid";
}

void PIR_status_function()
{
    if (value_adc < 0.2)
    {
            //printf("Nobody is here!\n\r");
            someone_in = false;
    }
    else {
            //printf("Somebody is here!\n\r");
            someone_in = true;
    }
}


const char * change_room_status_string()
{
    if(someone_in)
    {
        return "yes";    
    }
    else
    {
        return "no";    
    }
}

const char * door_lock_status_func()
{
    if(door_lock_status)
    {
        return "lock";
    }
    else
    {
        return "unlock";
    }
}

void print_data_uart0()
{
    printf("Temperature is %4.2f C \r\n",temp);
    printf("Humid is %4.2f  \r\n",humid);
    printf("Presence: %s  \r\n",room_status);
    printf("gas: %f\r\n", gas_sensor_value);
    printf("room safety: %s\r\n",room_safety_status);
    printf("door lock status %s\n\r", is_door_locked); 
    printf("Analog %5.2f\n\r",value_adc);   
}


int main() {
        
    while(1){
        
        bt.baud(38400);
        bt.attach(&uart_interrupt_fun);
        
        R4 = 0;
        C1.fall(&handleKeypad);
        
        temp = get_air_temp_inside(unit);
        humid = get_air_humid_inside();
        value_adc = ain.read();
        gas_sensor_value = gas_output.read()*50;
        check_rooms_presence_safety();       
        room_gas_status = gas_status_function();
        PIR_status_function();
        room_status = change_room_status_string();
        is_door_locked = door_lock_status_func();
        print_data_uart0();        
    }
}