/**
 * @file TimerModule.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 "TimerModule.h"

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

/**
 * @brief 全局各时基标志
 * 
 */
SysTimerFlag_Un g_st_SysTimeFlag = {0};

/*DEFINE *********************************************************/
//2ms时基计数器
#define DELAYB2MS_10MS      ((UINT16)5)    // 10ms
#define DELAYB2MS_20MS      ((UINT16)12)   // 20ms
#define DELAYB2MS_30MS      ((UINT16)15)   // 30ms
#define DELAYB2MS_50MS      ((UINT16)25)   // 50ms
#define DELAYB2MS_100MS     ((UINT16)50)    // 100ms
#define DELAYB2MS_250MS     ((UINT16)125)   // 250ms
#define DELAYB2MS_500MS     ((UINT16)250)   // 500ms
#define DELAYB2MS_1S        ((UINT16)500)   // 1s
#define DELAYB2MS_2S        ((UINT16)1000)  // 2s
#define DELAYB2MS_10S       ((UINT16)5000)  // 10s
#define DELAYB2MS_30S       ((UINT16)15000) // 30s
#define DELAYB2MS_60S       ((UINT16)30000) // 60s

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

/**
 * @brief 时基主函数,在主循环中调用
 * 
 */
void TimerModule_Main(void)
{
    static UINT8 s_u8time2msCnt = 0;
    static UINT16 s_u16TimeBaseCnt = 0;

    g_st_SysTimeFlag.bits.b1Timer2ms = 0;   // 清1ms定时标志
    g_st_SysTimeFlag.bits.b1Timer10ms = 0;  // 清10ms定时标志
    g_st_SysTimeFlag.bits.b1Timer20ms = 0;  // 清20ms定时标志
    g_st_SysTimeFlag.bits.b1Timer100ms = 0; // 清100ms定时标志
    g_st_SysTimeFlag.bits.b1Timer250ms = 0; // 清250ms定时标志
    g_st_SysTimeFlag.bits.b1Timer500ms = 0; // 清500ms定时标志
    g_st_SysTimeFlag.bits.b1Timer1s = 0;

    if (s_u8time2msCnt != TimerMiddle_Get2msFlag())
    {
        s_u16TimeBaseCnt++;
        s_u8time2msCnt = TimerMiddle_Get2msFlag();
        g_st_SysTimeFlag.bits.b1Timer2ms = 1; // 置2ms定时标志    注：存在误差
    }

    if (1 == g_st_SysTimeFlag.bits.b1Timer2ms)
    {
        if (0 == (s_u16TimeBaseCnt % DELAYB2MS_10MS))
        {
            g_st_SysTimeFlag.bits.b1Timer10ms = 1; // 置10ms定时标志
        }

        if (0 == (s_u16TimeBaseCnt % 15))
        {
            g_st_SysTimeFlag.bits.b1Timer20ms = 1; // 置10ms定时标志
        }

        if (0 == (s_u16TimeBaseCnt % DELAYB2MS_100MS))
        {
            g_st_SysTimeFlag.bits.b1Timer100ms = 1; // 置100ms定时标志
        }

        if (0 == (s_u16TimeBaseCnt % DELAYB2MS_250MS))
        {
            g_st_SysTimeFlag.bits.b1Timer250ms = 1; // 置250ms定时标志
        }

        if (0 == (s_u16TimeBaseCnt % DELAYB2MS_500MS))
        {
            g_st_SysTimeFlag.bits.b1Timer500ms = 1; // 置500ms定时标志
        }

        if (0 == (s_u16TimeBaseCnt % DELAYB2MS_1S))
        {
            g_st_SysTimeFlag.bits.b1Timer1s = 1; // 置1s定时标志
        }
    }

    if (s_u16TimeBaseCnt >= 30000)
    {
        s_u16TimeBaseCnt = 0;
    }
}
