/*
 * @file:
 * @Author: Lida
 * @Date: 2022-11-30 09:43:13
 * @LastEditors: Lida
 * @LastEditTime: 2023-02-18 19:46:54
 */

#include "app_cloud.h"
#include "../../log/svc/svc_log.h"
#include "../../nb/svc/svc_nb_core.h"
#include "../../lp/svc/svc_lp.h"
#include "../../flash/svc/svc_flash.h"
#include "../../lcd/svc/svc_lcd.h"
// #include "../../pulse/svc/svc_pulse_protocol.h"

static void Upload_Event_Deal(void);

/**
 * @brief: 云模块线程
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
void App_Cloud_Task(void)
{
    S_Flash_Data *ps_flash;
    ps_flash = Svc_Flash_Get_Data();
    Bsp_Iwdg_Feed();

    if (ps_flash->s_other.e_work_mode != E_Mode_Normal) // 非正常模式不做上报
    {
        return;
    }

    if (Svc_Cloud_Event_Fail_Check() == E_CHECK_FAIL)
    { // 云事件通讯失败，服务器没有应答
        Svc_Log_Printf(LOG_INFO, "%s->Svc_Cloud_Event_Fail_Check", __FUNCTION__);
        Svc_Cloud_Unlock_All_Event();             // 解锁所有云事件
        Svc_Cloud_Clear_Event(E_CLOUD_EVENT_ALL); // 清除所有云事件
        Svc_Cloud_Clear_Rsp_Cnt();
        Svc_Nb_Core_Run_Clear_Event(NB_EVENT_COAP_SEND); // 清除NB发送udp数据事件
        Svc_Cloud_Set_Keep_Alive_Time(5);
        Svc_Lcd_Display_Comm_Process(E_Lcd_UP_FAIL, 5);       //lcd显示上传失败
    }

    /*供电不足导致flash无法工作，云模块线程不执行，直接返回*/
    if (ps_flash->u8flashCheckFail == 1)
    {
        Svc_Cloud_Unlock_All_Event();                    // 解锁所有云事件
        Svc_Cloud_Clear_Event(E_CLOUD_EVENT_ALL);        // 清除所有云事件
        Svc_Nb_Core_Run_Clear_Event(NB_EVENT_COAP_SEND); // 清除NB发送udp数据事件
        return;
    }
    Upload_Event_Deal(); // 上报事件处理
    Bsp_Iwdg_Feed();
    if (Svc_Cloud_Check_WakeUpCnt())
    {                                   // 这样处理是因为调用这个函数功耗较高
        Svc_Cloud_Check_Timing_Event(); // 检查定时事件 //检查的是分钟位
    }
    Bsp_Iwdg_Feed();
    // Svc_Cloud_Refresh_Time(); //放到RTC中刷新，每次中断刷新一次
}

/**
 * @brief: 上报事件处理
 * @param  {void}
 * @return {void}
 * @note:
 * @see:
 */
static void Upload_Event_Deal(void)
{
    S_Cloud_Protocol_Data *s_cloud_data;
    s_cloud_data = Svc_Cloud_GetProtocol_Data();
    if (Svc_Cloud_Protocol_Has_More_Check() == E_CHECK_OK)
    { // 服务器有数据下发，先等待数据下发
        return;
    }
    if (Svc_Nb_Core_Get_Cur_State() != E_NB_RUN)
    { // 等待NB联网
        return;
    }
    E_Cloud_Event_Enum e_event = E_CLOUD_EVENT_NO;
    e_event = Svc_Cloud_Get_Pending_Event(); // 获取处于等待处理的最高优先级事件
    if (Svc_Cloud_Event_Is_Changed(e_event) == E_CHECK_FAIL)
    { // 事件未改变，不需要重新触发
        return;
    }
    switch (e_event)
    {
    case E_CLOUD_EVENT_RSP:
        Svc_Cloud_Lock_Event(E_CLOUD_EVENT_RSP);
        break;
#if AUTH_CLOUD
    case E_CLOUD_EVENT_AUTH:
        if (Svc_Cloud_Protocol_Request_Auth(s_cloud_data) == E_CHECK_OK)
        {
            Svc_Cloud_Lock_Event(E_CLOUD_EVENT_AUTH);
        }
        break;
#endif
    case E_CLOUD_EVENT_DEVICE_INFO_UPLOAD:
        if (Svc_Cloud_Sub_Event_Is_Idle() == E_CHECK_FAIL)
        {
            return;
        }
        Svc_Cloud_Lock_Dev_Info_Event(); // 锁定当前云事件数据上报
        if (Svc_Cloud_Protocol_DevInfo_Upload(s_cloud_data) == E_CHECK_FAIL)
        {
            Svc_Cloud_Unlock_Dev_Info_Event();
        }
        break;
    case E_CLOUD_EVENT_DEVICE_DATA_UPLOAD:
        if (Svc_Cloud_Sub_Event_Is_Idle() == E_CHECK_FAIL)
        {
            return;
        }
        Svc_Cloud_Lock_Dev_Data_Event(); // 锁定当前云事件数据上报
        if (Svc_Cloud_Protocol_DevData_Upload(s_cloud_data) == E_CHECK_FAIL)
        {
            Svc_Cloud_Unlock_Dev_Data_Event();
        }
        break;
    default:
        return;
    }
    Svc_Log_Printf(LOG_INFO, "%s->cloud event:0x%04X", __FUNCTION__, e_event);
}


