#include <msp430g2231.h>

#define BUTTON BIT3
#define LED_0 BIT0
#define LED_1 BIT6
#define LED_OUT P1OUT
#define LED_DIR P1DIR

#define Precision 5
#define Timeout_Value 50

int counter = 0;

unsigned int LOCK_DOWN = 0;

unsigned int No_Password = 0;
unsigned int Password_Entered = 0;
unsigned int Correct = 0;
unsigned int Succeed = 0;
unsigned int Reboot = 0;

int Password[6];
int input[6];
int Timeout;

unsigned int index = 0;

unsigned int i = 0;

int main(void)
{

	WDTCTL = WDTPW + WDTHOLD; //Disable Watchdog 
	
	LED_DIR |=(LED_0 + LED_1); //Set LED 0 and LED 1 To outputs 
	LED_OUT &= ~(LED_0 + LED_1); //Turns off the LED's
	
	CCTL0 = CCIE;//Enable the Timer A
	TACTL = TASSEL_2 + MC_2;//Setup Timer and Start
	
	P1IE |= BUTTON; //Enable Inturupt For Button on P1.3
	
	/*SETUP DEFAULT ON BOOT PASSWORD*/
	Password[0] = 0;
	Password[1] = 7;
	Password[2] = 14;
	Password[3] = 21;
	Password[4] = 28;
	Password[5] = 35;
	No_Password = 1;

		
	__enable_interrupt(); //Enables Inturrupt for the whole chip
	
	__bis_SR_register(LPM0+GIE); //sleep
	
		
	
}

//Interrupt Service Function for Button Presses
#pragma vector = PORT1_VECTOR
__interrupt void Port_1(void)
{
	/*SET PASSWORD*/
	if(No_Password == 0)
	{
		if(index == 0)
		{
			counter = 0;	
		}
			
		Password[index] = counter;
		index ++;
			
		if(index == 6)
		{
			index = 0;
			No_Password = 1;
			LED_OUT = LED_0;
		}
			
	}
	/*PASSWORD SET*/

	/*ENTERING PASSWORD*/
	else if(No_Password == 1)
	{
		if(index == 0)
		{
			counter = 0;
		}
		
		input[index] = counter;
		index ++;
		
		if(index == 6)
		{
			index = 0;
			Password_Entered = 1;
		}
			
	}
	/*PASSWORD ENTERED*/
	
	P1IFG &= ~BUTTON;
}

//Interrupt Service Function for Timer
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_a(void)
{
	counter += 1;
	if(counter >= 150)
	{
		index = 0;
		counter = 0;
	}
	if((counter %2 == 0) && (Reboot == 0)) //REBOOTED SYSTEM NEED NEW PASSWORD
	{
		LED_OUT = LED_0;	
	}
	if((counter %2 == 0) && (No_Password == 0)) //TELL USER HE IS INPUTING PASSWORD
	{
		LED_OUT ^=(LED_0 + LED_1);	
	}
	
	if(Password_Entered == 1) //CHECK INPUT PASSWORD TO STORED
	{
		Correct = 0;
		for(i=0;i<6;i++)
		{
			if((input[i] >= Password[i]-Precision) && (input[i] <= Password[i]+Precision))
			{
				Correct ++;	
			}
		}
		if( Correct == 6 ) //PASSWORD CORRECT
		{
			counter = 0;
			Correct = 0;
			Password_Entered = 0;
			if (Reboot == 0)
			{
				No_Password = 0;
				Reboot = 1;	
				Succeed = 0;
				Correct = 0;
				index = 0;
				input[0] = 0;
				input[1] = 0;
				input[2] = 0;
				input[3] = 0;
				input[4] = 0;	
				input[5] = 0;
			}
			else
			{
				Succeed = 1;
				Timeout = counter + Timeout_Value;
				LED_OUT &= ~LED_0;
			}
		}
	}
	if(Succeed == 1) //UNLOCK THE DOOR
	{	
		LED_OUT ^=(LED_1);
		if(Timeout == counter) //RESET EVERYTHING
		{
			Succeed = 0;
			Correct = 0;
			index = 0;
			input[0] = 0;
			input[1] = 0;
			input[2] = 0;
			input[3] = 0;
			input[4] = 0;	
			input[5] = 0;
			LED_OUT = LED_0;
		}
	}
}

