/**
 * @file Common_Delay.c
 * @brief 通用延时函数,实现非阻塞性延时
 * @author Landworld0321 (Landworld@landworld.com)
 * @version V1.0
 * @date 2025-06-13
 * @copyright Copyright (c) 2025 by Landworld.Co.Ltd. All rights reserved
 *  * 修改记录：
 * 版本号    修改日期        修改人        修改内容
 * ---------------------------------------------------------------------------
 * v1.0    2025-06-13     wuhonghui       初版代码
 * v1.1    2025-08-05     wuhonghui       增加拓展延时功能,提供可关闭的定时器
 */

/*INCLUDE HEAD*********************************************************/

#include "Common_Delay.h"

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

/// @brief 全局系统Tick
uint32_t g_u32SystemTick = 0u;

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

/**
 * @brief 全局系统Tick自增
 * 
 */
void IncSysTick(void)
{
    ++g_u32SystemTick;
}

/**
 * @brief 初始化开始计时的Tick
 * 
 * @param pStartTick 待初始化的开始Tick点
 */
void Delay_Init(uint32_t* pStartTick)
{
    *pStartTick = g_u32SystemTick;
}

/**
 * @brief 查看延时时间是否超时
 * 
 * @param pStartTick 已经初始化的开始Tick点
 * @param delayMs 预期的延时时间.单位:ms
 * @return UINT8 返回超时状态.true:延时时间已经超时 false:仍需等待
 */
uint8_t Delay_IsTimeout(uint32_t* pStartTick,uint16_t delayMs)
{
    uint8_t t_Result = false;
    if(g_u32SystemTick < (*pStartTick))//溢出判断
    {
        if((g_u32SystemTick + (0xFFFFFFFF - (*pStartTick))) >= delayMs)
        {
            t_Result = true;
        }
    }
    else
    {
        if(g_u32SystemTick - (*pStartTick) >= delayMs)
        {
            t_Result = true;
        }
    }

    return t_Result;
}

/**
 * @brief 初始化拓展定时器的开始Tick结构体
 * 
 * @param pExDelayTick 待初始化的拓展定时器开始Tick结构体
 */
void exDelay_Init(exDelay_St* pExDelayTick)
{
    pExDelayTick->exDelayTick = g_u32SystemTick;
}

/**
 * @brief 查看拓展定时器的延时时间是否超时
 * 
 * @param pExDelayTick 拓展定时器开始Tick结构体
 * @param delayMs 预期的延时时间.单位:ms
 * @return uint8_t 返回超时状态.true:延时时间已经超时 false:仍需等待
 */
uint8_t exDelay_IsTimeout(exDelay_St* pExDelayTick,uint16_t delayMs)
{
    uint8_t t_Result = false;
    if(pExDelayTick->exEnable == false)
    {
        t_Result = true;
    }
    else
    {
        if(g_u32SystemTick < (pExDelayTick->exDelayTick))//溢出判断
        {
            if ((g_u32SystemTick + (0xFFFFFFFF - (pExDelayTick->exDelayTick))) >= delayMs)
            {
                t_Result = true;
            }
        }
        else
        {
            if (g_u32SystemTick - (pExDelayTick->exDelayTick) >= delayMs)
            {
                t_Result = true;
            }
        }
    }
    return t_Result;
}
