// RTC业务模块
// 杭州秒寻科技有限公司
// 周涛
// 2025-02-28

#include "includes.h"

static uint8 gRtc_byRtcChipFlag = 1; // rtc芯片存在标识符，0：不存在，1：存在（默认值）

// 配置rtc芯片存在标识符
void rtc_set_chip_flag(uint8 byFlag)
{
    gRtc_byRtcChipFlag = byFlag;
}

// 查询rtc芯片存在标识符
uint8 rtc_get_chip_flag()
{
    return gRtc_byRtcChipFlag;
}

// 监听rtc
void rtc_monitor()
{
    SYNC_TIMER_T *pstSyncTimerParam = NULL;

    uint8 byFlag = 0;
    uint8 byCurrentHour = 0;
    uint8 byCurrentMinute = 0;
    uint32 dwCurrentMinutes = 0;

    uint8 bySetHour = 0;
    uint8 bySetMinute = 0;
    uint32 dwSetStartMinutesStart1 = 0;
    uint32 dwSetStartMinutesStop1 = 0;
    uint32 dwSetStartMinutesStart2 = 0;
    uint32 dwSetStartMinutesStop2 = 0;

    BOOL bFlag = 0;

    // 查询同步定时参数
    pstSyncTimerParam = oam_sync_timer_query_param();
    if (pstSyncTimerParam->byTimerSwitch) // 已开启同步定时功能
    {
        // 获得当前时间，小时和分钟
        byFlag = driverapp_rtc_read_hour_minute(&byCurrentHour, &byCurrentMinute);
        if (!byFlag)
        {
            return;
        }
        rtc_cal_minutes(&dwCurrentMinutes, byCurrentHour, byCurrentMinute); // 组织当前时间总分钟数

        // 组织配置定时1总分钟数（包括开始和结束时间）
        rtc_organize_set_time(pstSyncTimerParam->wTimer1Start, &bySetHour, &bySetMinute);
        rtc_cal_minutes(&dwSetStartMinutesStart1, bySetHour, bySetMinute); // 开始分钟数
        rtc_organize_set_time(pstSyncTimerParam->wTimer1Stop, &bySetHour, &bySetMinute);
        rtc_cal_minutes(&dwSetStartMinutesStop1, bySetHour, bySetMinute); // 结束分钟数

        // 一个同步定时
        if (pstSyncTimerParam->byTimerNum == 1)
        {
            bFlag = rtc_check_current_time_valid(dwCurrentMinutes, dwSetStartMinutesStart1, dwSetStartMinutesStop1);
        }
        // 两个同步定时
        else if (pstSyncTimerParam->byTimerNum == 2)
        {
            // 组织配置定时2总分钟数（包括开始和结束时间）
            rtc_organize_set_time(pstSyncTimerParam->wTimer2Start, &bySetHour, &bySetMinute);
            rtc_cal_minutes(&dwSetStartMinutesStart2, bySetHour, bySetMinute); // 开始分钟数
            rtc_organize_set_time(pstSyncTimerParam->wTimer2Stop, &bySetHour, &bySetMinute);
            rtc_cal_minutes(&dwSetStartMinutesStop2, bySetHour, bySetMinute); // 结束分钟数

            bFlag = rtc_check_current_time_valid(dwCurrentMinutes, dwSetStartMinutesStart1, dwSetStartMinutesStop1);
            if (!byFlag)
            {
                bFlag = rtc_check_current_time_valid(dwCurrentMinutes, dwSetStartMinutesStart2, dwSetStartMinutesStop2);
            }
        }

        // 当前时间在同步定时有效分段内
        if (bFlag)
        {
            exti_set_sync_timer_enabled_flag(1);
        }
        else
        {
            exti_set_sync_timer_enabled_flag(0);
        }
    }

    return;
}

// 计算分钟数
void rtc_cal_minutes(uint32 *pdwMinutes, uint8 byHour, uint8 byMinute)
{
    *pdwMinutes = byHour * 60 + byMinute;
    return;
}

// 组织时间
void rtc_organize_set_time(uint16 wTime, uint8 *pbyHour, uint8 *pbyMinute)
{
    uint16 wSetHour = 0xFF00;
    uint16 wSetMinute = 0x00FF;

    wSetHour &= wTime;
    wSetHour >>= 8;
    wSetMinute &= wTime;

    *pbyHour = (uint8)wSetHour;
    *pbyMinute = (uint8)wSetMinute;

    return;
}

// 检查当前时间的有效性
BOOL rtc_check_current_time_valid(uint32 dwCurrentMinutes, uint32 dwStartMinutes, uint32 dwStopMinutes)
{
    BOOL bFlag = FLASH;

    // 跨天了
    if (dwStartMinutes > dwStopMinutes)
    {
        // 分段判断
        if (dwCurrentMinutes >= dwStartMinutes || dwCurrentMinutes <= dwStopMinutes)
        {
            bFlag = TRUE;
        }
    }
    // 没有跨天
    else
    {
        if (dwCurrentMinutes >= dwStartMinutes && dwCurrentMinutes <= dwStopMinutes)
        {
            bFlag = TRUE;
        }
    }

    return bFlag;
}
