// 系统监听模块
// 杭州秒寻科技有限公司
// 周涛
// 2024-9-29
#include "includes.h"

// 定义本模块使用的全局变量
static MONITOR_PARAM_T gMonitor_stMonitorParam = {0};

// 模块初始化
void monitor_init()
{
    SYS_MEMSET(&gMonitor_stMonitorParam, 0, sizeof(MONITOR_PARAM_T));

    // 创建定时器
    timer_create_timer(&gMonitor_stMonitorParam.byTimerID, ETIMER_LOOP);

    // 启动定时器，监测wifi模块工作状态
    timer_start_timer(gMonitor_stMonitorParam.byTimerID, 1000 * 60, (void *)monitor_timer_one_minute_expire);

    return;
}

// 1分钟定时器超时回调函数
void monitor_timer_one_minute_expire()
{
    uint8 bySwitch = 0; // 网管中心开关
    uint8 byRtcChipFlag = 0;

    // 查询网管中心使能标识符
    bySwitch = wmm_network_get_omc_switch_flag();
    if (bySwitch) // 使能了网管
    {
        monitor_report_udp_heart();   // 心跳定时上报
        monitor_tcp_connect_status(); // 监测tcp连接状态

        return;
    }

    // RTC
    byRtcChipFlag = rtc_get_chip_flag();
    if (byRtcChipFlag) // 存在rtc芯片
    {
        rtc_monitor();
    }

    return;
}

// 上报UDP心跳
void monitor_report_udp_heart()
{
    uint8 byUpgradeMode = 0;
    uint8 byTcpConnectStatus = 0; // tcp连接状态，0：断开，1：连接

    gMonitor_stMonitorParam.byUdpHeartCounter++; // 心跳计数器加1
    if (gMonitor_stMonitorParam.byUdpHeartCounter == 3)
    {
        gMonitor_stMonitorParam.byUdpHeartCounter = 0; // 置零

        // 判断设备是否在升级模式，在升级模式则不上报心跳
        byUpgradeMode = wmm_upgrade_get_upgrade_mode();
        if (!byUpgradeMode)
        {
            // 上报已正确返回，可继续上报
            if (!gMonitor_stMonitorParam.byUdpReportFlag)
            {
                byTcpConnectStatus = wifible_event_get_tcp_connect_status();
                if (byTcpConnectStatus)
                {
                    gMonitor_stMonitorParam.byUdpReportFlag = 1; // 上报标识符置1
                    oam_report_heart();
                }
                // else
                // {
                //     gMonitor_stMonitorParam.byUdpReportFlag = 0;          // 上报状态清零
                //     gMonitor_stMonitorParam.byUdpReportExpireCounter = 0; // 上报超时计数器清零

                //     nmc_reset_transparent_mode();
                //     wifi_ble_reset(); // wifi蓝牙模块复位
                // }
            }
            // 上一次的上报未正确返回
            else
            {
                gMonitor_stMonitorParam.byUdpReportExpireCounter++;         // 上报超时计数器加1
                if (gMonitor_stMonitorParam.byUdpReportExpireCounter >= 10) // 30分钟后重新初始化wifi模块
                {
                    gMonitor_stMonitorParam.byUdpReportFlag = 0;          // 上报状态清零
                    gMonitor_stMonitorParam.byUdpReportExpireCounter = 0; // 上报超时计数器清零

                    nmc_reset_transparent_mode();
                    wifi_ble_reset(); // wifi蓝牙模块复位
                }
                else
                {
                    byTcpConnectStatus = wifible_event_get_tcp_connect_status();
                    if (byTcpConnectStatus)
                    {
                        oam_report_heart();
                    }
                }
            }
        }
        else
        {
            gMonitor_stMonitorParam.byUpgradeModeCounter++;
            if (gMonitor_stMonitorParam.byUpgradeModeCounter > 1)
            {
                wmm_upgrade_reset_upgrade_mode(); // 复位升级模式
            }
        }
    }

    return;
}

// UDP上报状态复位
void monitor_report_udp_heart_reset()
{
    gMonitor_stMonitorParam.byUdpReportFlag = 0;          // 上报状态清零
    gMonitor_stMonitorParam.byUdpReportExpireCounter = 0; // 上报超时计数器清零

    return;
}

// 监测TCP连接状态
void monitor_tcp_connect_status()
{
    uint8 byStatus = 0; // 状态

    // tcp连接状态，0：断开，1：连接
    byStatus = wifible_event_get_tcp_connect_status();
    if (!byStatus)
    {
        gMonitor_stMonitorParam.byTcpDisconnectCounter++;
        if (gMonitor_stMonitorParam.byTcpDisconnectCounter >= 60)
        {
            gMonitor_stMonitorParam.byTcpDisconnectCounter = 0;

            // wifi模块重新初始化
            wifible_reinit();
        }
    }
    else
    {
        gMonitor_stMonitorParam.byTcpDisconnectCounter = 0;
    }
}