// YuriHan's Dream Factory™
// Made By, Choi Hyun-Seok.
// 블루투스 통신을 위한 명령 세트

#include<avr/io.h>
#include<avr/interrupt.h>
#include<stdio.h>
#include "global.h"

//Ubiquitous project
#include "bluetooth.h"
#include"parking.h"
#include "ubi_code.h"
#include "delay.h"
#include "keydef.h"
#include "timer.h"

volatile uint8_t bluebuffer[20];		//블루투스로 들어오는 데이터 저장.
volatile int bluecnt;				// 데이터 카운터
volatile u08 serchflag;				//장치검색용 플래크
const u08 slr[2]={'\r',0};			// \r 문자열
const char *discon="\rDISCONNECT\r";
const char *connec="\rCONNECT\r";

volatile uint8_t disflag=0;			//커멘드 상태의 메시지 검출용 플래그 set.
volatile uint8_t okflag=0;
volatile uint8_t conflag=0;
volatile uint8_t errflag=0;
volatile uint8_t flag=0;

extern volatile char connect;			//접속상태 저장 변수
extern volatile u08 parkflag;			// 주차상태.
extern struct Car car[5];				// 1~5호기 掠沮?데이터 저장
extern struct ParkingTower Tower;		// 타워 상태 저장
extern struct processmsg pmsg;		// 명령확인용 검출 셋
extern volatile u08 isrflag;				// 인터럽트 관련 플래그
extern volatile BOOL bTimerKeyLock;	// 키 딜레이

volatile char data1;					// UDR1데이터 임시 저장

static int send20(uint8_t data);
static int send21(uint8_t data);
void sendstr(uint8_t* data);

void uart1_init(unsigned long BaudRate)
{
	// Not Double mode, Not multi_communication
	UCSR1A=0x00;
	// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
	UCSR1B=0x98;
	UCSR1C=0x06;
	// Setting BaudRate
	UBRR1H=0x00;
	UBRR1L=(F_CPU/BaudRate/16 - 1);
}
/*
void uart1_dis(void)
{
	UCSR1B=0x00;
}
void uart1_en(void)
{
	UCSR1B=0x98;
}
*/
ISR(USART1_RX_vect)
{
	static u08 serline=0;
	int i,j;
	data1=UDR1;
	send20(data1);
	if(pmsg.flag)
	{
	       bluebuffer[bluecnt]=data1;
		bluecnt++;
	   	if(data1=='\r' || data1=='\n')
	   	{
			if(!strncmp(bluebuffer,pmsg.msg,3))
				pmsg.flag=0;
			bluecnt=0;
			memset(bluebuffer,0,sizeof(bluebuffer));
	   	}
		if(bluecnt>20)
		{
			bluecnt=0;
			memset(bluebuffer,0,sizeof(bluebuffer));
		}

	}
	else
	{
		if(!isrflag)
		{
			if(serchflag==1)
			{
				if(data1=='\r' )
				{
					serline++;
					glcdGotoChar(serline,0);
				}				
				else if(data1=='\n');
				else glcdWriteChar(data1);
			}
			else serline=0;
		}
	   	if(data1=='\r' || data1=='\n')
	   	{
			bluecnt=0;
			if(!strncmp(bluebuffer,"OK",2))
				okflag=1;
			if(!strncmp(bluebuffer,"DISCONNECT",10))
			{
				disflag=1;
				connect=0;
				flag=0;
			}
			if(!strncmp(bluebuffer,"CONNECT",7))
				conflag=1;
			if(!strncmp(bluebuffer,"ERROR",5))
			    errflag=1;		    
		}else{
		        bluebuffer[bluecnt]=data1;
			bluecnt++;
			if(bluecnt>20)
			{
				bluecnt=0;
				memset(bluebuffer,0,sizeof(bluebuffer));
			}
			if(!strncmp(bluebuffer,"CONNECT",7))
				conflag=1;
		}
		if(!isrflag)
		{
			if(connect==COM_RFID && !strncmp(bluebuffer,"RC",2))
			switch(bluebuffer[2])
			{			
			case COM_CAR1 :
				for(i=0;i<5;i++)
				{
					if(EEPROM_read(i)==1)
					{
						sei();
						return OutParkingProcess(1);
					}
				}
				return InParkingProcess(1);
				break;

			case COM_CAR2 :
				for(i=0;i<5;i++)
				{
					if(EEPROM_read(i)==2)
					{
						sei();
						return OutParkingProcess(2);
					}
				}
				return InParkingProcess(2);
				break;

			case COM_CAR3 :
				for(i=0;i<5;i++)
				{
					if(EEPROM_read(i)==3)
					{
						sei();
						return OutParkingProcess(3);
					}
				}
				return InParkingProcess(3);
				break;

			case COM_CAR4 :
				for(i=0;i<5;i++)
				{
					if(EEPROM_read(i)==4)
					{
						sei();
						return OutParkingProcess(4);
					}
				}
				return InParkingProcess(4);
				break;

			case COM_CAR5 :
				for(i=0;i<5;i++)
				{
					if(EEPROM_read(i)==5)
					{
						sei();
						return OutParkingProcess(5);
					}
				}
				return InParkingProcess(5);
				break;
			}		
		}
	}
}

int send21(uint8_t data)
{
   	if(data == '\n')
		return 0;
	while((UCSR0A&0x20)==0x00);                         // 스트림 버퍼가 비면
	UDR1=data;                                          // 데이터 날려줌
	return 0;
}

int send20(uint8_t data)
{
   	if (data == '\n')
		return 0;
	while((UCSR1A&0x20)==0x00);                         // 스트림 버퍼가 비면
	UDR0=data;
	return 0;
}
void sendstr(uint8_t* data)
{
	int i;
	for(i=0;i<strlen(data);i++)
	{
	    send21(*(data+i));
	    send20(*(data+i));
	}
	return;
}

void command(uint8_t com)
{
	int cnt=0;
	switch(com)
	{
	case COM_DISCONNECT :
		sendstr(discon);
		delay_ms(300);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	        sendstr("+++");
		errflag=0;
	        okflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
				errflag=0;
				break;
			}
			if(okflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}
		}
		
		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
		delay_ms(700);
	        sendstr("ath\r");	
	        okflag=0;
	        disflag=0;
	        errflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
				sendstr("ath\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(disflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		okflag=0;
		disflag=0;
		flag=0;
		connect=0;
		delay_ms(1000);
		break;
	case COM_MASTER :
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	        sendstr("AT+btrole=m\r");
	        okflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
		        memset(bluebuffer,0,sizeof(bluebuffer));
				sendstr("AT+btrole=m\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(okflag==1)break;
		}
		printf("SUCCES!!\r");
		okflag=0;
		break;
	case COM_INIT :
		bluecnt=0;
        memset(bluebuffer,0,sizeof(bluebuffer));
        sendstr("ATZ\r");
        okflag=0;
        errflag=0;
		while(1)
		{
			if(errflag==1)
			{
				bluecnt=0;
		        memset(bluebuffer,0,sizeof(bluebuffer));
				sendstr("ATZ\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(okflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		okflag=0;
		break;
	case COM_SCAN :		
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	        sendstr("AT+btinq?\r");
	        okflag=0;
	        errflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
				sendstr("AT+btinq?\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(okflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		okflag=0;
		break;
	case COM_CAR1 :
		if(flag==1)command(COM_DISCONNECT);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	       sendstr("atd");
		sendstr(BLUE_CAR1);
		sendstr("\r");
		conflag=0;
	        okflag=0;
	        errflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
			       sendstr("atd");
				sendstr(BLUE_CAR1);
				sendstr("\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(conflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		delay_ms(1000);
		sendstr(connec);
		okflag=0;
		conflag=0;
		flag=1;
		connect=COM_CAR1;
		break;
	case COM_CAR2 :
		if(flag==1)command(COM_DISCONNECT);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	       sendstr("atd");
		sendstr(BLUE_CAR2);
		sendstr("\r");
	        okflag=0;
	        errflag=0;
		conflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
			       sendstr("atd");
				sendstr(BLUE_CAR2);
				sendstr("\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(conflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}
		}
		printf("SUCCES!!\r");
		delay_ms(1000);
		sendstr(connec);
		okflag=0;
		conflag=0;
		flag=1;
		connect=COM_CAR2;
		break;
	case COM_CAR3 :
		if(flag==1)command(COM_DISCONNECT);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	       sendstr("atd");
		sendstr(BLUE_CAR3);
		sendstr("\r");
	        okflag=0;
	        errflag=0;
		conflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
			       sendstr("atd");
				sendstr(BLUE_CAR3);
				sendstr("\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(conflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		delay_ms(1000);
		sendstr(connec);
		okflag=0;
		conflag=0;
		flag=1;
		connect=COM_CAR3;
		break;
	case COM_CAR4 :
		if(flag==1)command(COM_DISCONNECT);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	       sendstr("atd");
		sendstr(BLUE_CAR4);
		sendstr("\r");
	        okflag=0;
	        errflag=0;
		conflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
			       sendstr("atd");
				sendstr(BLUE_CAR4);
				sendstr("\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(conflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		delay_ms(1000);
		sendstr(connec);
		okflag=0;
		conflag=0;
		flag=1;
		connect=COM_CAR4;
		break;
	case COM_CAR5 :
		if(flag==1)command(COM_DISCONNECT);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	       sendstr("atd");
		sendstr(BLUE_CAR5);
		sendstr("\r");
	        okflag=0;
	        errflag=0;
		conflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
			       sendstr("atd");
				sendstr(BLUE_CAR5);
				sendstr("\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(conflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		delay_ms(1000);
		sendstr(connec);
		okflag=0;
		conflag=0;
		connect=COM_CAR5;
		flag=1;
		break;

	case COM_RFID :
		if(flag==1)command(COM_DISCONNECT);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	       sendstr("atd");
		sendstr(BLUE_RFID);
		sendstr("\r");
	        okflag=0;
	        errflag=0;
		conflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
			       sendstr("atd");
				sendstr(BLUE_RFID);
				sendstr("\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(conflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		okflag=0;
		conflag=0;
		flag=1;
		connect=COM_RFID;
		delay_ms(1000);
		sendstr(connec);
		break;
	case COM_TOWER :
		if(flag==1)command(COM_DISCONNECT);
 		bluecnt=0;
	        memset(bluebuffer,0,sizeof(bluebuffer));
	       sendstr("atd");
		sendstr(BLUE_TOWER);
		sendstr("\r");
	        okflag=0;
	        errflag=0;
		conflag=0;
		for(;;)
		{
			if(errflag==1)
			{
				bluecnt=0;
			        memset(bluebuffer,0,sizeof(bluebuffer));
			       sendstr("atd");
				sendstr(BLUE_TOWER);
				sendstr("\r");
				errflag=0;
				cnt++;
				if(cnt>10)
				{
					printf("Fail\r");
					return;
				}
			}
			if(conflag==1)break;
			if(bTimerKeyLock==FALSE)
			{
				switch(KEY_INPUT())
				{
				case KEY_EXIT:
					timerReset(TIMER_MS);
					bTimerKeyLock = TRUE;
					bluecnt=0;
				        memset(bluebuffer,0,sizeof(bluebuffer));
				        okflag=0;
				        disflag=0;
				        errflag=0;
					return;					
					break;
				default : break;			
				}
			}

		}
		printf("SUCCES!!\r");
		delay_ms(1000);
		sendstr(connec);
		okflag=0;
		conflag=0;
		flag=1;
		connect=COM_TOWER;
		break;
	default : break;
	}
	return;
}
