/**
******************************************************************************************************************************************************************************************
*@file                       app.c
*@author         
*@data                       
*@version                    v1.0
*@par Copyright(c):
*
*@par History:
*     version:author,date,desc
*     v1.0   :create this file
*
*******************************************************************************************************************************************************************************************
*/
#include "sdk_include.h"


void app_nmi_interrupt_handle(void)
{
    //< nothing do when nmi interrupt.
}

void app_tl_ready(void)
{


}

void app_gap_register_tl(HANDLE tl_handle, void *param) 
{

}

void adc_process(void)
{
#if SDK_GADC_ENABLE
	uint8_t low_power 	= 0;
	uint8_t bt_flush 	= 1;
	get_battery_lerver(GPIOA_Pin4,&low_power,1);
#endif
}

/*****************************************************************************
 函 数 名  : close_all_out_put_gpio
 功能描述  : 关闭所有的gpio
 输入参数  : void  
 输出参数  : 无
 返 回 值  : 
*****************************************************************************/
void close_all_out_put_gpio(void)
{
	gpio_config_default();
//	user_gpio_dir_out_hig(gpio_to_value(GPIOA_Pin5) | gpio_to_value(GPIOA_Pin6),0);
}

void enter_standbye_process(void)
{
	//保留PB4 唤醒		
#if SDK_ENABLE_STANDBYE
	
#if SDK_READY_EN
	//【1】清除READY
	user_gpio_dir_out_hig(gpio_to_value(GPIOD_Pin1) ,0);									//取消PD1 	准备好
#endif

	user_gpio_dir_out_hig(gpio_to_value(GPIOB_Pin0)|gpio_to_value(GPIOB_Pin1),0);		// 关闭PB0
	cmd_goto_standbye_prepare();							
	enter_standbye_deepsleep(SYSCFG_noRetention_Sram);
#endif
}






/*****************************************************************************
 函 数 名  : retain_ram_exit_standbye_process
 功能描述  : 退出保留RAM待机方式，用户事件处理
 输入参数  : void  
 输出参数  : 无
*****************************************************************************/
void retain_ram_exit_standbye_process(void)			//恢复所有的任务
{


}


/*****************************************************************************
 函 数 名  : retain_ram_enter_standbye_process
 功能描述  : 进入保留RAM待机方式，用户事件处理
 输入参数  : void  
 输出参数  : 无
 返 回 值  : 
*****************************************************************************/
void retain_ram_enter_standbye_process(void)		//停掉所有的任务
{

}


void uart_recive_isr(void *param,uint8_t ch)
{


//【1】OTA升级系统重启，不能处理任务
//	if(is_cmd){
//【2】AT指令处理		
//#if is_uart_dev(APP_UART)
//		read_uart_recv_cmd();
//#endif
//	}else{
//【3】串口数据转发蓝牙处理
//		uart_iot_recive_2_bt();
//	}
}


/*****************************************************************************
 函 数 名  : user_gpio_cbk
 功能描述  : 中断函数
 参数      : uint8_t intter_num  
 输出参数  : 无
 返 回 值  : 
 说明  	   : 
 			1、低功耗需要高电平来唤醒，高电平状态不可进入低功耗
 			2、在低功耗状态下，具备唤醒能力的GPIO应为低电平，因此触发中断后，检测唤醒GPIO
 			如果为高电平，应该用  cpu_prevent_sleep_set 设置低功耗阻止
 			检测到中断IO 变为低电平，清除低功耗阻止
 示例      : 
*****************************************************************************/
void user_gpio_cbk(uint8_t intter_num)
{
	if(intter_num == GPIO_Int0)
	{
//		dbg_block_printf("awake\n");
//		clear_retain_ram_to_standbye();
	}

	if(intter_num == GPIO_Int1){
		if(gpio_get_input(GPIOA_Pin1)){
			dbg_block_printf("PA1 HIG Command \n");
			
			cpu_prevent_sleep_set(USER_INT1_ONGOING);			//
// 多个GPIO同时具备唤醒能力 PA1 PA2 PB4 都具备唤醒能力，用PA1 进入待机
//			user_gpio_standbye_example();	
		}else{
			dbg_block_printf("PA1 LOW Data \n");
			cpu_prevent_sleep_clear(USER_INT1_ONGOING);			//
		}
	}

	if(intter_num == GPIO_Int2){
		if(gpio_get_input(GPIOA_Pin2)){
			dbg_block_printf("PA2 Uart Working \n");
			cpu_prevent_sleep_set(USER_INT2_ONGOING);			//
#if TEST_UART_EXAMPLE	// 测试串口例程代码
			user_uart_example();
			dbg_block_printf("init ok \n");
			ui_uart_block_writebuf(ws_uart1,"TEST Uart Working \n",strlen("TEST Uart Working \n")+1);
			dbg_block_printf("write uart 0 \n");
#else

// 【3】	使能串口
			set_uart_recv_busy(APP_UART,1);
			user_timer_set(IDX_TIMER0,ENABLE);
#endif

		}else{
		
			dbg_block_printf("PA2 Uart Stop Working \n");
			cpu_prevent_sleep_clear(USER_INT2_ONGOING);			//
#if TEST_UART_EXAMPLE
			dbg_block_printf("disable Working 1\n");
			gpio_remap_config(GPIOB_Pin2,GPIO_Remap_GPIO);
			gpio_remap_config(GPIOB_Pin3,GPIO_Remap_GPIO);
			system_clock_config(ws_uart1,DISABLE);
			dbg_block_printf("disable Working 2\n");	
#else
// 【4】	禁使能串口
			set_uart_recv_busy(APP_UART,0);
			user_timer_set(IDX_TIMER0,DISABLE);
#endif

		}
	}else if(intter_num == GPIO_Int3){

// 【5】检测中断3对应的 GPIO电平
		if(gpio_get_input(GPIOA_Pin3)){
			dbg_block_printf("PA3 HIG \n");
			cpu_prevent_sleep_set(USER_INT3_ONGOING);			//
		}else{
			dbg_block_printf("PA3 LOW\n");
			cpu_prevent_sleep_clear(USER_INT3_ONGOING);			//
		}
		
// 【6】翻转PA4		

		gpio_toggle(GPIOA_Pin4);
	}
}

/*****************************************************************************
 函 数 名  : user_timer_cbk
 功能描述  : 4ms 定时器
 输入参数  : timer_idx_t timer_id  
 输出参数  : 无
 返 回 值  : 
*****************************************************************************/
void user_timer_cbk(timer_idx_t timer_id)
{	
//	uint32_t sz;
//	uint8_t buff[256];
//	sz = ui_uart_readbuf(APP_UART,buff,256);
//	if(sz > 0){

//	}
}

void user_gpio_example(void);



/*
* brief: this fuction will be callback when gatt service register fineshed.
*/
void app_example(void)
{
    user_gpio_cfg_parameter_t 				p_parameter;
	user_uart_cfg_parameter_t 				p_uart_param;
	timer_config_t 							p_time_param;

    dbg_printf("\n == Bt Complite %s %s == \n",__DATE__,__TIME__);
    dbg_printf("串口波特率 %d\n",get_baudrate());
#if SDK_ENABLE_STANDBYE
//【1】 注册待机唤醒gpio 要放最早，防止进入了低功耗，无法唤醒
	dbg_printf("Register standbye ...  \n");

	gpio_init(GPIOB_Pin4,GPIO_Mode_Input_Pull_Down_Resistor);
	setup_gpio_wake_irq(GPIO_Int0,gpio_to_value(GPIOB_Pin4),GPIO_Int_Type_RisingEdge);		// PA0 每一比特对应一个gpio，PA0~PD7 共32位

	if((ws8100_cfg.starten == 0) && (gpio_get_input(GPIOB_Pin4) == 0)){
#if is_uart_dev(APP_UART)
		ui_uart_block_writebuf(APP_UART,(uint8_t * )"PowerOnEnterStandbye",strlen("PowerOnEnterStandbye"));
#endif
		enter_standbye(SYSCFG_noRetention_Sram);
	}
		
#endif //SDK_ENABLE_STANDBYE

#if 0
	glb_customize_para.internal_32krc_cycletime_integer = 3;
	glb_customize_para.calibrate_period = 3;
	glb_customize_para.calibrate_checkend_period = 3;
#endif

#if is_uart_dev(APP_UART)

//【7】注册串口接收中断回调函数
	p_uart_param.uart_handler = uart_recive_isr;
	reg_uart_rx_callback(APP_UART,&p_uart_param);

//【8】定时器中断回调函数
#if TIMER01_IRQ_ENABLE
	p_time_param.timer_idx					= IDX_TIMER0;			// timer 0
	p_time_param.timer_param.timer_period	= 16000*2;				// 2 ms
	timer_config(TIMER0, &p_time_param, user_timer_cbk);
#endif

#endif

//【11】 注册gpio中断回调函数
    p_parameter.gpio_handler = user_gpio_cbk;
    user_gpio_config(&p_parameter);

//【12】 初始化gpio 为输入
	gpio_init(GPIOA_Pin1,GPIO_Mode_Input_Pull_Down_Resistor);
	gpio_init(GPIOA_Pin2,GPIO_Mode_Input_Pull_Down_Resistor);
	gpio_init(GPIOA_Pin3,GPIO_Mode_Input_Pull_Down_Resistor);

//【13】注册可唤醒类型的中断，应该放置最后，防止gpio的中断过早于逻辑操作对象外设初始化，造成外设没启动，如定时器

	setup_gpio_irq(GPIO_Int1,gpio_to_value(GPIOA_Pin1),GPIO_Int_Type_BothEdge);		// PA1
	setup_gpio_irq(GPIO_Int2,gpio_to_value(GPIOA_Pin2),GPIO_Int_Type_BothEdge);		// PA2
	setup_gpio_irq(GPIO_Int3,gpio_to_value(GPIOA_Pin3),GPIO_Int_Type_BothEdge);		// PA3

//【14】 初始化gpio 为输出
	gpio_init(GPIOA_Pin4,GPIO_Mode_Output);

//【15】 设置gpio 为输低
	gpio_reset(GPIOA_Pin4);															// PA4

// 四个定时器应用举例
//	user_timer_example();
}



