#include "u_global.h"
#include "u_rc.h"
#include "t_gpio.h"
#include "t_timer.h"
#include "system.h"
#include "user_driver.h"

uint8_t g_ir_code[4] = {0x00};
uint8_t g_ir_recv_done_flag = 0x00;


#if (NEC_ENABLE==1)




//ѡ�� nec���յ�gpio�� ��ʹ��
void nec_receive_enable(GPIO_NUM gpio)
{
	GPIO_SetGpioMultFunction(gpio,GPCFG_PULLUP);
	HWRITE(mem_nec_gpio,gpio);
	HWRITE(mem_nec_receive_enable,1);
}
#define NEC_CMD  0x01
#define NEC_REPEAT_CMD 0x02
void Bt_NecCallBack(uint8_t len,uint8_t *dataPtr)
{	
	switch(*dataPtr)
	{
		case NEC_CMD:
			for(int i=0;i<len-1;i++)
			{
				g_ir_code[i]=ReverseByteBits(dataPtr[i+1]);
				g_ir_recv_done_flag=1;
				#ifdef DEBUG_DRV_APP
				MyPrintf("nec data[%d]=%x\r\n",i,dataPtr[i+1]);	
				#endif
			}
			break;
		case NEC_REPEAT_CMD:
			#ifdef DEBUG_DRV_APP
			MyPrintf("\r\n*************NEC_REPEAT_CMD****************\r\n");	
			#endif
			break;
		default:
			break;
	}
}
#endif
void rc_init(void)
{
  #if (NEC_ENABLE==1)
	nec_receive_enable(NEC_GPIO);
	#endif
}
uint8_t *rc_decode(void)
{
	return (g_ir_code);
}

#if 0  //bk3431
#include "t_icu.h"
#include "driver_gpio.h"
#include "bk3231s_reg.h"
uint8_t g_ir_code[4] = {0x00};
uint8_t g_ir_recv_done_flag = 0x00;

typedef struct _rc_para
{
	uint8_t shake_flag;
	uint8_t decode_cnt;
	uint8_t capture_flow;
	uint8_t sample_data[40];
	volatile uint16_t time_count;

}RcPara_t;
RcPara_t rc_para = {0x00};

void rc_timer0_cb(void)
{
	rc_para.time_count++;
	GPIO_output(0, 4, 0);
	GPIO_output(0, 4, 1);
}

void rc_timer1_cb(void)
{
	rc_para.shake_flag = 0;

}

void rc_recv_clear(void)
{
	//Timer_Stop(0);
	rc_para.capture_flow = RC_CAPTURE_IDLE;
	rc_para.decode_cnt = 0;
	rc_para.time_count = 0;
	GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	GPIO_MODE_GPIO,	GPIO_IO_IN,	GPIO_PULL_UP);	
	GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	EN,	GPIO_INTERRUPT_EDGE_DOWN); //�жϴ������ж�ʹ��
	//memset(&rc_para, 0, sizeof(RcPara_t));
	
}


void u_gpio_int_handle(void)
{	

	if (rc_para.shake_flag == 0)
	{
		GPIO_output(0, 6, 1);
		GPIO_output(0, 6, 0);
		rc_para.shake_flag = 1;
		Timer_Start(1, 130);
		
		if(GpioGetIn(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F))
		{
			switch (rc_para.capture_flow)
			{
				case RC_CAPTURE_START_LOW:
				{
					//rc_para.capture_flow = RC_CAPTURE_START_HIGH;
					//U_UART_PRINTF("H_%d\n", rc_para.time_count);
					if (rc_para.time_count >= 30 && rc_para.time_count <= 42)//36
					{
						GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	GPIO_MODE_GPIO,	GPIO_IO_IN,	GPIO_PULL_UP);	
						GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	EN,	GPIO_INTERRUPT_EDGE_DOWN); //�жϴ������ж�ʹ��

						rc_para.time_count = 0;
						rc_para.capture_flow = RC_CAPTURE_START_HIGH;
						
					}
					else
					{
						rc_recv_clear();
						//U_UART_PRINTF("cr_4\n");
					}
				
				}
					break;
			}
			//U_UART_PRINTF("fw_%d\n", rc_para.capture_flow);
		}
		else		//gpio_low
		//if(!GpioGetIn(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F))
		{

			switch (rc_para.capture_flow)
			{
				case RC_CAPTURE_IDLE:
				{
					GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	GPIO_MODE_GPIO,	GPIO_IO_IN,	GPIO_PULL_UP);	
					GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	EN,	GPIO_INTERRUPT_EDGE_UP); //�жϴ������ж�ʹ��
					rc_para.capture_flow = RC_CAPTURE_START_LOW;
					rc_para.time_count = 0;
					//U_UART_PRINTF("st\n");
					Timer_Start(0, 280);
				
				}
					break;
				case RC_CAPTURE_START_HIGH:
				{
					//U_UART_PRINTF("L_%d\n", rc_para.time_count);
					if (rc_para.time_count >= 13 && rc_para.time_count <= 23) //18
					{
//						GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	GPIO_MODE_GPIO,	GPIO_IO_IN,	GPIO_PULL_UP);	
//						GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	EN,	GPIO_INTERRUPT_EDGE_DOWN); //�жϴ������ж�ʹ��

						rc_para.time_count = 0;
						rc_para.decode_cnt = 0;
						rc_para.capture_flow = RC_CAPTURE_STATE_CODE;
						
						
					}
					else
					{
						rc_recv_clear();
						//U_UART_PRINTF("cr_1\n");
					}
				
				}
					break;
				case RC_CAPTURE_STATE_CODE:
				{
					//U_UART_PRINTF("%d\n", rc_para.time_count);
					if (rc_para.time_count >= 2 && rc_para.time_count <= 11)
					{
						rc_para.sample_data[rc_para.decode_cnt] = rc_para.time_count; //12
						rc_para.decode_cnt++;
						rc_para.time_count = 0;
						
						if (rc_para.decode_cnt >= 32)
						{
							rc_recv_clear();
							//U_UART_PRINTF("cr_2\n");
							g_ir_recv_done_flag = 1;
						}	
					}
					else
					{
						rc_recv_clear();
						//U_UART_PRINTF("cr_3\n");
					}
				}
					break;
				default:
					break;
			}
		}
	}
}

uint8_t *rc_decode(void)
{
	uint8_t rc_code = 0, k = 0, i = 0;
	for(i = 0; i < 4; i++)
	{
		rc_code = 0;
		for (k = 0; k < 8; k++)
		{
			rc_code <<= 1;
			if (rc_para.sample_data[i * 8 + k] > RC_CODE_HIGH_PVT)
			{
				rc_code |= 0x01;
			}
			
			//U_UART_PRINTF(" %d", rc_para.sample_data[i * 8 + k]);
			g_ir_code[i] = rc_code;
		}
		//U_UART_PRINTF("\n");
	}
	U_UART_PRINTF("rc = %02X, %02X, %02X, %02X\n", g_ir_code[0], g_ir_code[1], g_ir_code[2], g_ir_code[3]);
	memset(rc_para.sample_data, 0, 40);
	
	return (g_ir_code);
}

void rc_init(void)
{
	GPIO_config(0, 4, 1);
	GPIO_output(0, 4, 0);
	
	GPIO_config(0, 6, 1);
	GPIO_output(0, 6, 0);
	memset(&rc_para, 0, sizeof(RcPara_t));
	
	IcuPphCfg(  ICU_PPH_GPIO, 
				ICU_MCU_CLK_SRC_APH,
				ICU_CLK_SRC_FREQ_DPLL_96M,
				ICU_CLK_PRE_DIV_NONE,
				ICU_CLK_EN,
				EN,
				EN,
				DISEN);
	
	GpioGenCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	GPIO_MODE_GPIO,	GPIO_IO_IN,	GPIO_PULL_UP);	
	GpioIntCfg(RC_GPIO_PORT >> 4, RC_GPIO_PORT & 0X0F,	EN,	GPIO_INTERRUPT_EDGE_DOWN); //�жϴ������ж�ʹ��
	REG_AHB0_FIQ_PRIORITY_EN |= INT_STATUS_GPIO;
	
	Timer_Start(0, 280);
	//GpioIntHandleCbCfg((GPIO_INT_HANDLE_CB_PFN)&ir_callback);
 
}
#endif