/**
 * @file TimerMiddle.c
 * @brief 中间层封装通用时基代码
 * @author Landworld0321 (Landworld@landworld.com)
 * @version V1.0
 * @date 2025-04-23
 * @copyright Copyright (c) 2025 by Landworld.Co.Ltd. All rights reserved
 * 版本号    修改日期        修改人        修改内容
 * ---------------------------------------------------------------------------
 * v1.0    2025-04-23     WuHongHui     整理初版程序
 */

/*INCLUDE HEAD*********************************************************/
#include "TimerMiddle.h"

/*GLOBAL*********************************************************/

/**
 * @brief 全局系统倒计时时间
 * 
 */
UINT16 g_u16SystemTimerArray[SYSTEM_INTERRUPT_TIMER_NUM] = {0};
/**
 * @brief 全局每2ms自加计数次数
 * 
 */
UINT8 g_u8Timer2msCnt = 0u;

/*FUNCTION*********************************************************/

/**
 * @brief 1ms中断中运行的时基函数
 * 
 */
void TimerMiddle_InterruptRun(void)
{
    UINT8 t_u8Index = 0u;
    static UINT8 s_u8TimCnt = 0;

    if((++s_u8TimCnt) > 1)
    {
        s_u8TimCnt = 0;
        g_u8Timer2msCnt++;
        if(g_u8Timer2msCnt >= 0xFF)
        {
            g_u8Timer2msCnt = 0;
        }
    }

    for(t_u8Index = 0; t_u8Index < SYSTEM_INTERRUPT_TIMER_NUM; t_u8Index++)
    {
        if(g_u16SystemTimerArray[t_u8Index] > 0)
        {
        	--g_u16SystemTimerArray[t_u8Index];
        }
    }
    IncSysTick();
}

/**
 * @brief 时基中断回调函数
 * 
 */
void Timer_Interrupt_Handle(void)
{
    /* Clear compare flag */
    LPTMR_DRV_ClearCompareFlag(INST_TIMER_CONFIG);
	TimerMiddle_InterruptRun();
}

/**
 * @brief 初始化时基外设
 * 
 */
void TimerMiddle_Init(void)
{
	LPTMR_DRV_Init(INST_TIMER_CONFIG, &Timer_Config_config0, false);
    /* Install IRQ handler for LPTMR interrupt */
    INT_SYS_InstallHandler(LPTMR0_IRQn, &Timer_Interrupt_Handle, (isr_t *)0);
    /* Install interrupt callback function */
}

/**
 * @brief 反初始化时基外设
 * 
 */
void TimerMiddle_Deinit(void)
{
	LPTMR_DRV_Deinit(INST_TIMER_CONFIG);
}

/**
 * @brief 开始时基计时
 * 
 */
void TimerMiddle_Start(void)
{
	INT_SYS_EnableIRQ(LPTMR0_IRQn);
	LPTMR_DRV_StartCounter(INST_TIMER_CONFIG);
}

/**
 * @brief 停止时基计时
 * 
 */
void TimerMiddle_Stop(void)
{
	LPTMR_DRV_StopCounter(INST_TIMER_CONFIG);
}

/**
 * @brief 中间层封装通用获取2ms计数次数函数
 * 
 * @return UINT8 
 */
UINT8 TimerMiddle_Get2msFlag(void)
{
	return g_u8Timer2msCnt;
}
