/*
 * @file:
 * @Author: Lida
 * @Date: 2022-11-30 09:43:13
 * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @LastEditTime: 2023-08-07 17:10:01
 */

/*
 * @Description: 云模块-svc层
 * @Author: yangsw
 * @Date: 2021-05-21 16:27:42
 * @LastEditTime: 2022-06-06 11:40:13
 * @LastEditors: yangsw
 * @Reference:
 */
#ifndef H_SVC_CLOUD_H
#define H_SVC_CLOUD_H

#include "../../com/svc/svc_com.h"

/*失败重发间隔，单位：s*/
#define CLOUD_RESEND_CYCLE 50
/*失败重发次数*/
#define CLOUD_RESEND_TIMES 3

#define Wake_Up_Check_Cnt 5 // 每 Wake_Up_Check_Cnt 次RTC唤醒后检查定时事件

typedef enum
{
    E_CLOUD_EVENT_NO = 0,
    E_CLOUD_EVENT_RSP = 0x0001,                // 应答
    E_CLOUD_EVENT_AUTH = 0x0002,               // 认证
    E_CLOUD_EVENT_DEVICE_INFO_UPLOAD = 0x0004, // 设备信息上报
    E_CLOUD_EVENT_DEVICE_DATA_UPLOAD = 0x0008, // 设备数据上报
    E_CLOUD_EVENT_REQUEST_OTA = 0x0010,        // 请求OTA
    E_CLOUD_EVENT_REQUEST_OTA_DATA = 0x0020,   // 请求OTA数据
    E_CLOUD_EVENT_ALL = 0xFFFF,
} E_Cloud_Event_Enum;

typedef enum
{
    E_CLOUD_DEV_INFO_EVENT_NO = 0,
    E_CLOUD_DEV_INFO_EVENT_DEV_STATE = 0x0001,   // 设备状态
    E_CLOUD_DEV_INFO_EVENT_POWER_STATE = 0x0002, // 电源状态
    E_CLOUD_DEV_INFO_EVENT_ALL = 0xFFFF,
} E_Cloud_Dev_Info_Event_Enum;

typedef enum
{
    E_CLOUD_DEV_DATA_EVENT_NO = 0,
    E_CLOUD_DEV_DATA_EVENT_TOTAL_USAGE = 0x0001, // 总用量信息
    E_CLOUD_DEV_DATA_EVENT_DAY_USAGE = 0x0002,   // 日用量信息
    E_CLOUD_DEV_DATA_EVENT_DENSE_FLOW = 0x0004,  // 密集流量信息
    E_CLOUD_DEV_DATA_EVENT_THIS_FLOW = 0x0008,   // 本次使用量
    E_CLOUD_DEV_DATA_EVENT_CUR_FLOW = 0x0010,    // 当前流速
    E_CLOUD_DEV_DATA_EVENT_DAY_SECTION = 0x0020, // 日区间明细
    E_CLOUD_DEV_DATA_EVENT_VALVE_STATE = 0x0040, // 阀门状态
    E_CLOUD_DEV_DATA_EVENT_ALL = 0xFFFF,
} E_Cloud_Dev_Data_Event_Enum;

typedef struct
{
    /*上报标志*/
    gw_u8 u8UploadFlag;
    gw_u8 u8UploadTotalFlag;
    /*上一次上报成功的时间戳*/
    gw_u32 u32LastUploadTime;
    /*上一次周期上报的时间戳*/
    gw_u32 u32LastCycleUploadTime;
    gw_u8 u8UploadDenseFlag;
    gw_u8 u8UploadMonthFlag;
    gw_u32 last_upload_total_usage_time;
    /*补传数据是否发送完标志位*/
    gw_u8 cloud_data_flag;
    /*重发计数*/
    gw_u8 resend_cnt;
    /*重发时间计时*/
    gw_u16 resend_time_cnt;

    gw_u8 u8waitsleep_flag;
    /*发送时间计时*/
    gw_u16 send_time_cnt;
    /*应答失败计数*/
    gw_u8 rsp_fail_cnt;
    // /*保持网络活跃时间*/
    gw_u8 u8KeepAliveTime;
    /*查到信号标志*/
    gw_u8 u8Signal_Sign;
    /*当前时间时间戳从2000-1-1开始计算*/
    gw_u32 u32SystemTime;
    /*上一次系统时间戳 防止时间倒走时数据重复存储 从2000-1-1开始计算*/
    gw_u32 u32LastSystemTime;
    /*当前时间戳，从2000-1-1开始计算*/
    gw_u32 u32CurTime;
    /*上一次时间戳，从2000-1-1开始计算*/
    gw_u32 u32LastTime;
    /*当前时间，年、月、日、时、分、秒*/
    gw_u8 pu8CurTime[6];
    /*上次时间，年、月、日、时、分、秒*/
    gw_u8 pu8LastTime[6];
} S_Cloud_Manage;

typedef struct
{
    /*上报事件*/
    gw_u16 cloud_event;
    /*正在处理的上报事件*/
    E_Cloud_Event_Enum e_cloud_sending_event;
    gw_u8 u8WakeUpCnt;
    gw_u16 cloud_dev_info_event;         // 上报设备信息子事件
    gw_u16 cloud_dev_info_sending_event; // 正在处理的上报设备信息子事件
    gw_u16 cloud_dev_data_event;         // 上报设备数据子事件
    gw_u16 cloud_dev_data_sending_event; // 正在处理的上报设备数据子事件
    /*管理相关数据*/
    S_Cloud_Manage s_manage;
} S_Cloud;

void Svc_Cloud_Init(void);
E_Result_Check Svc_Cloud_Is_Busy(void);
E_Result_Check Svc_Cloud_Event_Fail_Check(void);
void Svc_Cloud_Post_Event(E_Cloud_Event_Enum cloud_event);
void Svc_Cloud_Lock_Event(E_Cloud_Event_Enum cloud_event);
void Svc_Cloud_Clear_Event(E_Cloud_Event_Enum cloud_event);
void Svc_Cloud_Unlock_All_Event(void);
gw_u16 Svc_Cloud_Get_Event(void);
E_Cloud_Event_Enum Svc_Cloud_Get_Pending_Event(void);
E_Result_Check Svc_Cloud_Event_Is_Changed(E_Cloud_Event_Enum e_event);
void Svc_Cloud_Set_Keep_Alive_Time(gw_u8 u8Time);
void Svc_Cloud_Timer_Callback(void);
void Svc_Cloud_Post_Dev_Info_Event(E_Cloud_Dev_Info_Event_Enum event);
void Svc_Cloud_Clear_Dev_Info_Event(void);
void Svc_Cloud_Lock_Dev_Info_Event(void);
void Svc_Cloud_Unlock_Dev_Info_Event(void);
gw_u16 Svc_Cloud_Get_Dev_Info_Event(void);
void Svc_Cloud_Post_Dev_Data_Event(E_Cloud_Dev_Data_Event_Enum event);
void Svc_Cloud_Clear_Dev_Data_Event(void);
void Svc_Cloud_Lock_Dev_Data_Event(void);
void Svc_Cloud_Unlock_Dev_Data_Event(void);
gw_u16 Svc_Cloud_Get_Dev_Data_Event(void);

gw_u8 Svc_Cloud_Time_Is_Calibrate(void);
void Svc_Cloud_Time_Calibrate(gw_u32 u32Time);
void Svc_Cloud_Time_Set_Calibrate(void);
void Svc_Cloud_Check_Timing_Event(void);
gw_u8 Svc_Cloud_Wait_Cmd(void);
E_Result_Check Svc_Cloud_Is_Busy(void);
E_Result_Check Svc_Cloud_Protocol_Has_More_Check();
E_Result_Check Svc_Cloud_Sub_Event_Is_Idle();
gw_u16 Svc_Cloud_Get_Sending_Event(void);

void Svc_Cloud_Update_Time(gw_u32 u32Time);
void Svc_Cloud_Refresh_Time(void);
gw_u32 Svc_Cloud_Get_Time(void);
void Svc_Cloud_Protocol_Timer_Callback();
E_Result_Check Service_Cloud_Protocol_Has_More_Check(void);
S_Cloud *Svc_Cloud_Get_Data(void);
E_Result_Check Svc_Cloud_Time_Check(void);
void Svc_Cloud_SysTime_Printf(void);
void Svc_Cloud_Time_Printf(char *PrintInfo, gw_u8 *PrintTime);

E_Result_Check Svc_Cloud_Is_Busy(void);

void Svc_Cloud_Set_Stop_Alive_Time(void);
void Svc_Cloud_Clear_Rsp_Cnt(void);

gw_u8 Svc_Cloud_Check_WakeUpCnt(void);
void Svc_Cloud_WakeUpCnt_Increase(void);
#endif