#include "u_time.h"
#include "u_main.h"
#include "time.h"

typedef struct
{
	uint8_t week;
	uint8_t hour;
	uint8_t minute;
	uint8_t second;
}CurrTime_t;


//AlarmTime_t m_count_down 	= {0x00};    //����ʱ�ṹ�嶨��
AlarmTime_t m_alarm_cfg[TIME_ALIRM_MUN_MAX] 	= {0x00};    //3�����ӽṹ�嶨��

CurrTime_t m_curr_time 		= {0x00};

void time_alarm_set(uint8_t *data)
{
	m_alarm_cfg[data[0]-1].alarm_state	= data[1];
	m_alarm_cfg[data[0]-1].week 		= data[2];
	m_alarm_cfg[data[0]-1].hour 		= data[3];
	m_alarm_cfg[data[0]-1].minute 		= data[4];
	m_alarm_cfg[data[0]-1].second 		= data[5];
	m_alarm_cfg[data[0]-1].led_onoff 	= data[6];
}
/*
void time_count_down_set(uint8_t *data)
{
	m_count_down.second = 0;
	m_count_down.minute = 0;
	m_count_down.hour 	= 0;
	
	m_count_down.alarm_state = data[0];
	m_count_down.hour_set	 = data[1];
	m_count_down.minute_set	 = data[2];
	m_count_down.second_set  = data[3];
	
	m_count_down.second = m_count_down.second + m_curr_time.second + m_count_down.second_set;
	if(m_count_down.second >= 60)
	{
		m_count_down.minute = 1;
		m_count_down.second = m_count_down.second - 60 ;
	}
	
	m_count_down.minute = m_count_down.minute + m_curr_time.minute + m_count_down.minute_set;
	if(m_count_down.minute >= 60)
	{
		m_count_down.hour = 1;
		m_count_down.minute = m_count_down.minute - 60 ;
	}
	
	m_count_down.hour = m_count_down.hour + m_curr_time.hour + m_count_down.hour_set;
	if(m_count_down.hour >= 24)
	{
		m_count_down.week = m_curr_time.week + 1;
		if(m_count_down.week > 7)
			m_count_down.week = 1;
		m_count_down.hour = m_count_down.hour - 24 ;
	}
	else
	{
		m_count_down.week = m_curr_time.week;
	}
	m_count_down.led_onoff = data[4];
	U_UART_PRINTF("m_count_down %d %d %d %d %d\r\n",m_count_down.week, m_count_down.hour,m_count_down.minute, m_count_down.second,m_count_down.led_onoff);
}

void time_count_dowm_state_query(uint8_t *count_down_state)
{
	struct tm set_date, curr_date , tran_date;
	time_t set_sec = 0, curr_sec = 0, tran_sec = 0;
	
	uint8_t count_borrow = 0; 					//������λ
	//uint8_t count_down_state[5] = {0x00};
	
	count_down_state[0] = m_count_down.alarm_state;
	count_down_state[4] = m_count_down.led_onoff;
	if (m_count_down.alarm_state == GLO_DIS)
	{
		return;
	}
	//if(m_curr_time.week == m_count_down.week  && m_curr_time.hour == m_count_down.hour && m_curr_time.minute == m_count_down.minute && m_curr_time.second == m_count_down.second)

	U_UART_PRINTF("set_dow = %d , %d, %d;\n count_down = %d , %d, %d\n", 
		m_count_down.hour, m_count_down.minute, m_count_down.second,
		m_curr_time.hour, m_curr_time.minute, m_curr_time.second);
	
	
	memset(&set_date, 0, sizeof(struct tm));
	if (m_count_down.week == m_curr_time.week) //������
		set_date.tm_mday = 1;
	else
		set_date.tm_mday = 2;
	set_date.tm_hour = m_count_down.hour;
	set_date.tm_min  = m_count_down.minute;
	set_date.tm_sec  = m_count_down.second;
	set_sec = mktime(&set_date);
	U_UART_PRINTF("set_sec = %d \n", set_sec);
	
	memset(&curr_date, 0, sizeof(struct tm));
	curr_date.tm_mday = 1;
	curr_date.tm_hour = m_curr_time.hour;
	curr_date.tm_min  = m_curr_time.minute;
	curr_date.tm_sec  = m_curr_time.second;
	curr_sec = mktime(&curr_date);
	U_UART_PRINTF("curr_sec = %d \n", curr_sec);
	
	memset(&tran_date, 0, sizeof(struct tm));
	tran_sec = difftime(set_sec, curr_sec);//set_sec - curr_sec;
	
	tran_date = *localtime(&tran_sec);
	U_UART_PRINTF("tran_date = %d, %d, %d \n", tran_date.tm_hour, tran_date.tm_min, tran_date.tm_sec);
	
	count_down_state[1] = tran_date.tm_hour;
	count_down_state[2] = tran_date.tm_min;
	count_down_state[3] = tran_date.tm_sec;

}
*/

void time_app_driver_sync(uint8_t *data)
{
	m_curr_time.hour 	= data[4];
	m_curr_time.minute 	= data[5];
	m_curr_time.second 	= data[6];
	m_curr_time.week 	= data[7] + 1;
	U_UART_PRINTF("CURR_TIME %d %d %d %d\r\n", data[4], data[5], data[6], data[7]);

}

void time_alarm_state_query(uint8_t *send, uint8_t *reply_len)
{
	uint8_t index = 0, i = 0; 
	*reply_len = 0;
	
	for(i = 0; i < TIME_ALIRM_MUN_MAX ; i++)   //ѭ��3���ж�3�������Ƿ����
	{
		if(m_alarm_cfg[i].alarm_state != ALARM_ST_NULL) 
		{
			U_UART_PRINTF("1index%d\r\n",index);
			send[index++] = i+1;
			U_UART_PRINTF("2index%d\r\n",index);
			send[index++] = m_alarm_cfg[i].alarm_state; 
			send[index++] = m_alarm_cfg[i].week;
			send[index++] = m_alarm_cfg[i].hour;
			send[index++] = m_alarm_cfg[i].minute;
			send[index++] = m_alarm_cfg[i].second;
			send[index++] = m_alarm_cfg[i].led_onoff;
			*reply_len += 7; 
			U_UART_PRINTF("2index%d\r\n",index);
			U_UART_PRINTF("3len%d\r\n",*reply_len);
			U_UART_PRINTF("sent %d %d %d %d\r\n",send[1],send[2],send[3],send[4]);
			
		}
	} 
}

void time_delete_alarm(uint8_t delete_ind)
{
	memset(&m_alarm_cfg[delete_ind - 1].alarm_state, 0, sizeof(AlarmTime_t));
	m_alarm_cfg[delete_ind - 1].alarm_state = ALARM_ST_NULL;

}

//void time_count_down_off(uint8_t hour, uint8_t min, uint8_t sec)
//{
//	uint8_t set_buff[5] = {0x00};
//	
//	set_buff[1] = hour;
//	set_buff[2] = min;
//	set_buff[3] = sec;
//	set_buff[4] = GLO_DIS;	//�ص�
//	
//	if (hour == 0 && min == 0 && sec == 0)
//	{
//		set_buff[0] = GLO_DIS;
//	}
//	else
//	{
//		set_buff[0] = GLO_EN;
//	}

//	time_count_down_set(set_buff);
//}

void alarm_time_task(void)     //����ʱ������1�����¼�����
{
	uint8_t i = 0;
	m_curr_time.second ++;  //��ǰ��ʱ��������룬�֣�ʱ����
	if(m_curr_time.second >= 60)
	{
		m_curr_time.second = 0;
		m_curr_time.minute ++;
		if(m_curr_time.minute >= 60)
		{
			m_curr_time.minute = 0;
			m_curr_time.hour ++;
			if(m_curr_time.hour >= 24)
			{
				m_curr_time.hour = 0;
				m_curr_time.week ++;
				if(m_curr_time.week > 7)
				{
					m_curr_time.week = 1;
				}
			}
		}
	}
	//U_UART_PRINTF("curr_time: %d %d %d %d\r\n", m_curr_time.week, m_curr_time.hour, m_curr_time.minute, m_curr_time.second);


//	if(m_count_down.alarm_state)    //����ֻ����õ���ʱ��־λ���óɹ�
//	{
//		//�����ǰʱ����ڵ���ʱ���õ�ʱ��
//		if(m_curr_time.week == m_count_down.week  && m_curr_time.hour == m_count_down.hour && m_curr_time.minute == m_count_down.minute && m_curr_time.second == m_count_down.second)
//		{
//			m_count_down.alarm_state = ALARM_ST_OFF;
//			count_down_reach_cb(m_count_down.led_onoff);
//			//����ʱ��
//			//user_send_light_state();  //����ʱʱ�䵽���Ժ���Ҫ���͵Ƶ�״̬��app
//			//user_send_count_down_state();
//		}
//		U_UART_PRINTF("curr_time: %d %d %d %d\r\n", m_curr_time.week, m_curr_time.hour, m_curr_time.minute, m_curr_time.second);
//		U_UART_PRINTF("m_count_down %d %d %d %d %d\r\n", m_count_down.week, m_count_down.hour, m_count_down.minute, m_count_down.second, m_count_down.led_onoff);
//	}
	
	for(i = 0; i < TIME_ALIRM_MUN_MAX; i++)
	{
		if(m_alarm_cfg[i].alarm_state == ALARM_ST_ON)      //����ֻ��������ӵı�־λ���óɹ�
		{
			if(m_alarm_cfg[i].week & (0x1 <<(m_curr_time.week -1)))   //������ӵ����ڵ��ڽ��������
			{	//�����ǰʱ������������õ�ʱ��
				if(m_curr_time.hour == m_alarm_cfg[i].hour && m_curr_time.minute == m_alarm_cfg[i].minute && m_curr_time.second == m_alarm_cfg[i].second)
				{
					
					alarm_time_reach_cb(m_alarm_cfg[i].led_onoff);

					if(m_alarm_cfg[i].week & (0x1 << 7))   //�������ִֻ��һ�Σ�����ÿ�ܶ�ִ��
					{
						m_alarm_cfg[i].alarm_state = ALARM_ST_OFF;    //������ӱ���ִ�к��״̬
					}

				}
			}
			U_UART_PRINTF("curr_time: %d %d %d %d\r\n", m_curr_time.week, m_curr_time.hour, m_curr_time.minute, m_curr_time.second);
			U_UART_PRINTF("m_alarm_cfg %d %d %d %d %d\r\n",m_alarm_cfg[i].week, m_alarm_cfg[i].hour, m_alarm_cfg[i].minute, m_alarm_cfg[i].second, m_alarm_cfg[i].led_onoff);

		}
	}
//	UART_PRINTF("m_alarm_cfg %d %d %d %d\r\n",m_curr_time.week,m_curr_time.hour,m_curr_time.minute,m_curr_time.second);

//	UART_PRINTF("COLOR briht = %d ,R G B = %x %x %x\n",Rgb_Para.rgb_light, Rgb_Para.color_arr[0], Rgb_Para.color_arr[1], Rgb_Para.color_arr[2]);

}
/***************************************** adaptor *************************************************************/

void light_time_init(void)
{
	light_time_timer_start();
	
}