#include <stdlib.h>
#include "cpu_qdec.h"
#include "user_qdec.h"
#include "app_trace.h"

typedef struct user_qdec_env
{
    qdec_event_handler user_qdec_evt_handler;
}user_qdec_env_t;

user_qdec_env_t user_qdec_env;

void user_qdec_init(void)
{
    memset(&user_qdec_env, 0, sizeof(user_qdec_env_t));
}
void user_qdec_config(qdec_event_handler user_evt_cbk)
{
	gpio_init(GPIOA_Pin0,GPIO_Mode_Input);
	gpio_init(GPIOA_Pin1,GPIO_Mode_Input);
	gpio_remap_config(GPIOA_Pin0,GPIO_Remap_QDEC_CHA);
	gpio_remap_config(GPIOA_Pin1,GPIO_Remap_QDEC_CHB);

	user_qdec_env.user_qdec_evt_handler = user_evt_cbk;
    qdec_init(ENABLE);
	qdec_clear_it_pending_bit(QDEC_IT_CM | QDEC_IT_UN|QDEC_IT_QE);
	qdec_it_config(QDEC_IT_CM | QDEC_IT_UN|QDEC_IT_QE,ENABLE);	
}

void qdec_sleep_close(void)
{
    //gpio_remap_config(GPIOA,GPIO_PinNum_0,GPIO_Remap_GPIO);
   // gpio_init(GPIOA,GPIO_Pin_0|GPIO_Pin_1,GPIO_Mode_Input_Pull_Down_Resistor);
    qdec_init(DISABLE);
}
void qdec_sleep_start(void)
{
    //gpio_remap_config(GPIOA,GPIO_PinNum_0,GPIO_Remap_QDEC_CHA);
    //gpio_init(GPIOA,GPIO_Pin_0|GPIO_Pin_1,GPIO_Mode_Input);
    qdec_init(ENABLE);
	qdec_clear_it_pending_bit(QDEC_IT_CM | QDEC_IT_UN|QDEC_IT_QE);
	qdec_it_config(QDEC_IT_CM | QDEC_IT_UN|QDEC_IT_QE,ENABLE);
}
void QDEC_IRQHandler(void)
{
    extern uint8_t current_cnt;
    current_cnt = 1;
    uint32_t iir = QDEC->QSR;
	dbg_printf("qdec iir=0x%x\r\n",iir);
	if(iir & QDEC_IT_CM)
    {
        qdec_it_config(QDEC_IT_CM,DISABLE);
		qdec_set_internal_counter(QDEC_InternalCounter_RELOAD_VAL);
		QDEC->QRW = QDEC_QRW_RELOAD_VAL;
		QDEC->QSR = QDEC_IT_CM;
		if(user_qdec_env.user_qdec_evt_handler != NULL)
			user_qdec_env.user_qdec_evt_handler(QDEC_UP);
		qdec_it_config(QDEC_IT_CM,ENABLE);
	}
	if(iir & QDEC_IT_UN)
	{
        qdec_it_config(QDEC_IT_UN|QDEC_IT_CM,DISABLE);
		qdec_set_internal_counter(QDEC_InternalCounter_RELOAD_VAL);
		QDEC->QRW = QDEC_QRW_RELOAD_VAL;
		QDEC->QSR = QDEC_IT_CM | QDEC_IT_UN;
		if(user_qdec_env.user_qdec_evt_handler != NULL)
			user_qdec_env.user_qdec_evt_handler(QDEC_DOWN);
		qdec_it_config(QDEC_IT_UN|QDEC_IT_CM,ENABLE);
	}
	#if 0
	if(iir & QDEC_IT_OV)
	{
        qdec_it_config(QDEC_IT_UN|QDEC_IT_CM,DISABLE);
		qdec_set_internal_counter(QDEC_InternalCounter_RELOAD_VAL);
		QDEC->QRW = QDEC_QRW_RELOAD_VAL;
		QDEC->QSR = QDEC_IT_OV | QDEC_IT_UN;
		if(user_qdec_env.user_qdec_evt_handler != NULL)
			user_qdec_env.user_qdec_evt_handler(QDEC_DOWN);
		qdec_it_config(QDEC_IT_UN|QDEC_IT_OV,ENABLE);
	}
	#endif
	qdec_clear_it_pending_bit(QDEC_IT_CM | QDEC_IT_UN | QDEC_IT_OV);
	NVIC_ClearPendingIRQ(QDEC_IRQn);
		
}


