/**
  **********************************************************************************
  * @file    tc_hal.c
  * @author  Product application department
  * @version V1.0
  * @date    2020.03.20
  * @brief   TC模块HAL层驱动.
  * @note 这个文件为应用层提供了操作TC的接口:
  *     - TC初始化接口.
  *     - TC中断服务函数
  *     - TC获取当下计数值
  *     - TC注册寄存器的回调函数
  *     - TC看门狗喂狗
  *     - TC中断回调函数
  @verbatim
  ===================================================================================
                                  ##### 更新 #####
  ===================================================================================
  [..] 更新时间:
  [..] 更新人:
  [..] 更新内容:
        1. nothing.
  @endverbatim
  */
#include "tc_hal.h"
#include "debug.h"

static uint32_t tc_tick = 0;

static TC_InitTypeDef *g_tcit;

/*** 全局变量定义 ***************************************************************/
/** @
  * @{volatile
  */
/** @ 
  * @}
  */
/** @ 
  * @{static
  */
/** @ 
  * @}
  */
/*** 常量定义 *******************************************************************/
/** @
  * @{const
  */
/** @ 
  * @}
  */

/*** 函数定义 *******************************************************************/


/**
  *@brief TC:注册寄存器的回调函数
  *
  *@param[in] husi TC句柄
  *@param[in] callback:回调函数实例
  *@param[in] index:回调函数类别
  *@return
  *- 0 :成功;
  *- 1 :失败;
  */
static uint8_t HAL_TC_ConfigCallbackRegistry(TC_InitTypeDef  *tcit,
		                                      tc_callback_t callback,
                                              uint8_t           index)
{
	(void)index;
	tcit->callback = callback;
	return 0;
}

/**
 * @brief TC：中断处理函数
 *
 * @param NONE
 * @retval NONE
 */
void HAL_TC_IRQHandler(void)
{

	_tc_clear_int_flag(g_tcit->instance);
	tc_tick++;
	if(g_tcit->callback)
	{
		g_tcit->callback((void *)g_tcit);
		return;
	}
}

/**
 * @brief TC初始化函数
 *
 * @param[in] tcit 初始化结构体
 * @return NONE
 */
void HAL_TC_Init(TC_InitTypeDef  *tcit)
{
    DRV_TC_DebugCmd(tcit->instance,tcit->debug_mode);
    DRV_TC_DozeCmd(tcit->instance,tcit->doze_mode);
    DRV_TC_WaitCmd(tcit->instance,tcit->wait_mode);
    DRV_TC_StopCmd(tcit->instance,tcit->stop_mode);
	DRV_TC_ResetCmd(tcit->instance,tcit->reset_enable);

    if(tcit->interrupt_enable == ENABLE)
    {
    	HAL_TC_ConfigCallbackRegistry(tcit,HAL_TC_Callback,0);
//      interrupt_setup(TC_INT_NUM,0,HAL_TC_IRQHandler);
			
        NVIC_Init(3, 3, TC_IRQn, 2);
    }

	DRV_TC_InterruptCmd(tcit->instance,tcit->interrupt_enable);

	_tc_set_mr(tcit->instance,tcit->tcmr);

	_tc_set_prescaler(tcit->instance,tcit->prescaler);

	_tc_update_wdp(tcit->instance);

  g_tcit = tcit;
}


/**
 * @brief TC获取当前计数值
 *
 * @param[in] tcit 初始化结构体
 * @return @ref TC当前计数值
 */
uint16_t HAL_TC_GetCounter(TC_InitTypeDef  *tcit)
{
	return _tc_get_count(tcit->instance);
}


/**
 * @brief TC看门狗喂狗
 * 
 * @param[in] tcit 初始化结构体
 * @retval NONE 
 */
void HAL_TC_FeedWatchdog(TC_InitTypeDef  *tcit)
{
	_tc_set_wsr(tcit->instance,0x5555);
	_tc_set_wsr(tcit->instance,0xAAAA);
}


/**
 * @brief TC回调函数
 *
 * @param[in] tcit 初始化结构体
 * @retval NONE
 */
void WEAK HAL_TC_Callback(void *tcit)
{
	printf("\r\n TC_Callback \r\n");
}
uint16_t HAL_TC_GetMs(void)//xukai20200407,bt_demo调用的函数，功能未实现
{
    unsigned short tc_val;
    return tc_val;
}
