/*
Program for Security Guard by SMS (Kiel software compiler)    
Designed and developed by Lim.laboratory
Contact at lim.laboratory@yahoo.com,Thailand
*/
//===================================================================================
#include <regx52.h>
unsigned int int0_tick,int1_tick;
char get_value[72],index_get,phone_number[8],command_zero,command_one,command_two,stop;
//xxxxx Function for initial program xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//===================================================================================
void initial_interrupt(void)
{
	EA  = 1;	//Enable Interrupt
	IT1 = 0; 	//Interrupt at INT1 1 at 0
	IT0 = 0; 	//Interrupt at INT0 1 at 0
}
//-----------------------------------------------------------------------------------
void delay_command(unsigned int a)
{
	unsigned int i,t;
	i = t = 0;
	for(i=0; i<=a; i++)
	{
		for(t=0; t<=a; t++)
		{
			;
	  	}
	}
}
//-----------------------------------------------------------------------------------
void int0(void) interrupt 0
{
	int0_tick++;
}
//-----------------------------------------------------------------------------------
void int1(void) interrupt 2
{
	int1_tick++;
}
//-----------------------------------------------------------------------------------
void serial_intertupt(void) interrupt 4
{
	TI = 0;
	if(RI == 1)								// IF interrupt by reciver data work in block
	{
		get_value[index_get] = SBUF;
		index_get++;
		if(index_get == 66)					//check for control
		{
			if(get_value[61] == 0x31)
			{
				if(get_value[34] == phone_number[0])
				{
					if(get_value[35] == phone_number[1])
					{
						if(get_value[36] == phone_number[2])
						{
							if(get_value[37] == phone_number[3])
							{
								if(get_value[38] == phone_number[4])
								{
									if(get_value[39] == phone_number[5])
									{
										if(get_value[40] == phone_number[6])
										{
											if(get_value[41] == phone_number[7])
											{
												if(get_value[62] == 0x33)
												{
													switch(get_value[63])
													{
														case 0x30 : command_zero = 0;
																	command_one = 0;
																	stop = 1;
																	delay_command(300);
																	index_get = 0;
																	break;
														case 0x31 : command_zero = 1;
																	command_one = 1;
																	delay_command(300);
																	index_get = 0;
																	break;
													  	case 0x32 :	command_two = 0;
																	command_zero = 0;
																	command_one = 0;
																	delay_command(300);
																	index_get = 0;
																	break;
													 	default   : delay_command(500);
																	index_get = 0;
												  	}
												}
												if(get_value[62] != 0x33)
												{
													delay_command(500);
													index_get = 0;
												}
											}
											if(get_value[41] != phone_number[6])
											{
												delay_command(500);
												index_get = 0;
											}
										}
										if(get_value[40] != phone_number[7])
										{
											delay_command(500);
											index_get = 0;
										}
									}
									if(get_value[39] != phone_number[4])
									{
										delay_command(500);
										index_get = 0;
									}
								}
								if(get_value[38] != phone_number[5])
								{
									delay_command(500);
									index_get = 0;
								}
							}
							if(get_value[37] != phone_number[2])
							{
								delay_command(500);
								index_get = 0;
							}
						}
						if(get_value[36] != phone_number[3])
						{
							delay_command(500);
							index_get = 0;
						}
					}
					if(get_value[35] != phone_number[0])
					{
						delay_command(500);
						index_get = 0;
					}
				}
				if(get_value[34] != phone_number[1])
				{
					delay_command(500);
					index_get = 0;
				}
		 	}
			if(get_value[61] != 0x31)
			{
				delay_command(500);
				index_get = 0;
			}
		}
		RI = 0;
 	}
}
//-----------------------------------------------------------------------------------
void initial_serial(void)
{    
	TMOD = 0x21;	// Timer1 Mode2(8 bit auto reload) for serial port
					// and Timer0 Mode 1 
	SCON = 0x50;	// Setup for 8 bit data
	TH1  = 0xFD;    // Set 9600 bps (FD) 4800 (FA) Timer1 default
	TF1  = 0;   	// Clear bit over flag Timer1 
	TI   = 0;       // Clear bit over flag TX
	TR1  = 1;       // Start Timer1
}
//-----------------------------------------------------------------------------------
void initial_parameter(void)
{
	int0_tick = 0;
	int1_tick = 0;
	index_get = 0;
}
//xxxxx Function for program xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//----- Subfunction Program ---------------------------------------------------------
void send_serial(unsigned char *s)
{
	while(*s != 0x00)
	{
		SBUF=*s;
		while(!TI);
		TI = 0;
		s++;
	}
}
//-----------------------------------------------------------------------------------
void enable_interrupt(void)
{
	EX1 = 1;
	EX0 = 1;
	ES = 1;
}
//-----------------------------------------------------------------------------------
void disable_interrupt(void)
{
	EX1 = 0;
	EX0 = 0;
	ES = 0;
}
//----- Library protocal sms --------------------------------------------------------
void x0(void)
{
	send_serial("0");
}
void x1(void)
{	
	send_serial("1");	
}
void x2(void)
{
	send_serial("2");
}
void x3(void)
{
	send_serial("3");
}
void x4(void)
{
	send_serial("4");
}
void x5(void)
{
	send_serial("5");
}
void x6(void)
{
	send_serial("6");
}
void x7(void)
{
	send_serial("7");
}
void x8(void)
{
	send_serial("8");
}
void x9(void)
{
	send_serial("9");
}
//----- Subfunction SMS -------------------------------------------------------------
void test_command(void)
{
	send_serial("at\r");
	delay_command(260);
}
void send_now(void)						//command to send sms
{
	send_serial("04028140\x1a");  			
	delay_command(260);
}
void first_gsm_code(void)				//first code
{
	send_serial("0011000aa166");  	
}
//-----------------------------------------------------------------------------------
void receiver_number(void)				//phone number
{
	char loop;
	index_get = 0;
	loop = 1;
	while(loop)
	{
		if(index_get == 7)
		{
			loop = 0;
		}
		switch(phone_number[index_get])
		{
			case 0x30 : x0();
				 		break;
   			case 0x31 : x1();
				 		break;
			case 0x32 : x2();
				 		break;
	  		case 0x33 : x3();
				 		break;
	  		case 0x34 : x4();
				 		break;
	 		case 0x35 : x5();
				 		break;
			case 0x36 : x6();
				 		break;
	  		case 0x37 : x7();
				 		break;
			case 0x38 : x8();
				 		break;
			case 0x39 : x9();
				 		break;
		}
		index_get++;
	}
	index_get = 0;
}
//-----------------------------------------------------------------------------------
void sgsms_ready(void)
{
	RD = 0;
	test_command();
	send_serial("at+cmgs=27\r");
	delay_command(260);
	first_gsm_code();
	receiver_number();
	send_serial("0000ff0b");
	send_serial("d3e3b4390549cb61721e");
	send_now();
	delay_command(800);
	RD = 1;
}
//-----------------------------------------------------------------------------------
void sgsms_running(void)
{
	RD = 0;
	test_command();
	send_serial("at+cmgs=29\r");
	delay_command(260);
	first_gsm_code();
	receiver_number();
	send_serial("0000ff0d");
	send_serial("d3e3b4390549eb6e77da7d06");
	send_now();
	delay_command(800);
	RD = 1;
}
//-----------------------------------------------------------------------------------
void door_a_open(void)
{
	RD = 0;
	test_command();
	send_serial("at+cmgs=27\r");
	delay_command(260);
	first_gsm_code();
	receiver_number();
	send_serial("0000ff0b");
	send_serial("c4f75b0e0a829ef0b21b");
	send_now();
	delay_command(800);
	RD = 1;
}
//-----------------------------------------------------------------------------------
void door_b_open(void)
{
	RD = 0;
	test_command();
	send_serial("at+cmgs=27\r");
	delay_command(260);
	first_gsm_code();
	receiver_number();
	send_serial("0000ff0b");
	send_serial("c4f75b0e12829ef0b21b");
	send_now();
	delay_command(800);
	RD = 1;
}
//-----------------------------------------------------------------------------------
void door_ab_open(void)
{
	RD = 0;
	test_command();
	send_serial("at+cmgs=29\r");
	delay_command(260);
	first_gsm_code();
	receiver_number();
	send_serial("0000ff0d");
	send_serial("c4f75b0e0a9a84a027bcec06");
	send_now();
	delay_command(800);
	RD = 1;
}
//-----------------------------------------------------------------------------------
void sgsms_stop(void)
{
	RD = 0;
	test_command();
	send_serial("at+cmgs=26\r");
	delay_command(260);
	first_gsm_code();
	receiver_number();
	send_serial("0000ff0a");
	send_serial("d3e3b439054de96f38");
	send_now();
	delay_command(800);
	RD = 1;
}
//-----------------------------------------------------------------------------------
void sgsms_reset(void)
{
	RD = 0;
	test_command();
	send_serial("at+cmgs=27\r");
	delay_command(260);
	first_gsm_code();
	receiver_number();
	send_serial("0000ff0b");
	send_serial("d3e3b4390549cbf3321d");
	send_now();
	delay_command(800);
	RD = 1;
}
//-----------------------------------------------------------------------------------
void check_password(void)
{
	char out_check_pass;
	out_check_pass = 1;
	index_get = 0;
	while(out_check_pass)
	{
		RI = 0;
		while(RI != 1);
		get_value[index_get] = SBUF;
		index_get++;
		if(index_get == 72)
		{
			if(get_value[61] == 0x34)
			{
				if(get_value[62] == 0x33)
				{
					if(get_value[63] == 0x33)
					{
						if(get_value[64] == 0x35)
						{
							if(get_value[65] == 0x42)
							{
								if(get_value[66] == 0x32)
								{
									if(get_value[67] == 0x45)
									{
										if(get_value[68] == 0x30)
										{
											if(get_value[69] == 0x37)
											{
												phone_number[0] = get_value[34];
												phone_number[1] = get_value[35];
												phone_number[2] = get_value[36];
												phone_number[3] = get_value[37];
												phone_number[4] = get_value[38];
												phone_number[5] = get_value[39];
												phone_number[6] = get_value[40];
												phone_number[7] = get_value[41];
												sgsms_ready();								
												out_check_pass = 0;
											}
											if(get_value[69] != 0x37)
											{
												delay_command(500);
												index_get = 0;
											}
										}
										if(get_value[68] != 0x30)
										{
											delay_command(500);
											index_get = 0;
										}
									}
									if(get_value[67] != 0x45)
									{
										delay_command(500);
										index_get = 0;
									}
								}
								if(get_value[66] != 0x32)
								{
									delay_command(500);
									index_get = 0;
								}
							}
							if(get_value[65] != 0x42)
							{
								delay_command(500);
								index_get = 0;
							}
						}
						if(get_value[64] != 0x35)
						{
							delay_command(500);
							index_get = 0;
						}
					}
					if(get_value[63] != 0x33)
					{
						delay_command(500);
						index_get = 0;
					}
				}
				if(get_value[62] != 0x33)
				{
					delay_command(500);
					index_get = 0;
				}
			}
			if(get_value[61] != 0x34)
			{
				delay_command(500);
				index_get = 0;
			}
		}
		RI = 0;
	}
}
//xxxxx main program xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//-----------------------------------------------------------------------------------
void main(void)
{
	char wait_new_check,tick_wait,interrupt_door;
	initial_interrupt();
	initial_serial();
	initial_parameter();
	RD = 0;
	
	command_two = 1;
	stop = 0;
	test_command();
	send_serial("at+cnmi=3,3,0,0,0\r");
	delay_command(260);
	RD = 1;
	while(1)
	{
		ES = 0;								//Serial Intertupt
		EX1 = 0; 							//External Interrupt 1
		EX0 = 0;							//External Interrupt 0
		if(command_two == 0)
		{
			sgsms_reset();
		}
		check_password();
		command_one = 0;
		ES = 1;
		index_get = 0;
		while(command_two)
		{
			EX1 = 0; 						//External Interrupt 1
			EX0 = 0;						//External Interrupt 0
			if(stop == 1)
			{
				ES = 0;
				sgsms_stop();
				stop = 0;
				ES = 1;
				index_get = 0;
			}
			int0_tick = 0;
			int1_tick = 0;
			while(command_one)
			{
				ES = 0;
				sgsms_running();
				ES = 1;
				index_get = 0;
				EX1 = 1; 					//External Interrupt 1
				EX0 = 1;					//External Interrupt 0
				wait_new_check = 1;
				tick_wait = 0;
				interrupt_door = 0;
				while(command_zero)
				{
					RD = 0;							//-------run LED
					delay_command(50);
					RD = 1;
					delay_command(200);
					if(wait_new_check == 0)
					{
						tick_wait++;
					}
					while(wait_new_check)			//-------check door open----------
					{
						wait_new_check = 0;
						if(int0_tick != 0)
						{
							if(int1_tick != 0)
							{
								disable_interrupt();
								door_ab_open();
								int0_tick = 0;
								int1_tick = 0;
								interrupt_door = 1;
								ES = 1;						//enable serial interrupt only
								index_get = 0;
					  		}
							if(int1_tick == 0)
							{
								disable_interrupt();
								door_a_open();
								int0_tick = 0;
								interrupt_door = 1;
								ES = 1;						//enable serial interrupt only
								index_get = 0;
							}
						}
						if(int1_tick != 0)
						{
							disable_interrupt();
							door_b_open();
							int1_tick = 0;
							interrupt_door = 1;
							ES = 1;							//enable serial interrupt only
							index_get = 0;
						}
					}
					wait_new_check = 1;
					if(interrupt_door == 1)
					{
						wait_new_check = 0;
			   		}
					if(tick_wait == 58)
					{
						tick_wait = 0;
						interrupt_door = 0;
						wait_new_check = 1;
						enable_interrupt();					//enable interrupt
			 		}
				}
  			}
  		}
  	}
}
//-----------------------------------------------------------------------------------
