/*
 * @Description: 云模块-svc层-协议子模块
 * @Author: yangsw
 * @Date: 2021-05-21 16:27:42
 * @LastEditTime: 2023-05-06 17:26:39
 * @LastEditors: Lida
 * @Reference: 
 */

#ifndef H_SVC_CLOUD_PROTOCOL_H
#define H_SVC_CLOUD_PROTOCOL_H

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

#define FRAME_HEAD1      0xA5
#define FRAME_HEAD2      0x68
#define PROTOCOL_VER     0x02
#define FACTORY_CODE     0x02
#define FRAME_TAIL       0x16
/*发送数据最大包长*/
#define PACKAGE_DATA_MAX_LEN 700

/*最大允许的时间误差，单位：s，超过误差需要校准时间*/
#define MAX_TIME_DIFFER     5

#define CMD1_04_ID_NUM     14

#define KEEP_ALIVE_TIME_MAX 30

typedef enum{
    RESULT_SUCCESS=0x00,    //处理成功
    RESULT_INFO_ERR=0x01,   //消息有误
    RESULT_CMD_INVALID=0x02,//不支持fail
    RESULT_FAIL=0x03,       //处理失败   
}E_CMD_RESULT;

typedef enum{
    E_CMD_01_SET_PARA=0x01,
    E_CMD_81_REPLY_SET_PARA=0x81,
    E_CMD_02_DATA_UPLOAD=0x02,
    E_CMD_82_REPLY_DATA_UPLOAD=0x82,
    E_CMD_03_REQUEST_INFO=0x03,
    E_CMD_83_REPLY_REQUEST_INFO=0x83,
    E_CMD_05_HISTORICAL_DATA_UPLOAD=0x05,
    E_CMD_85_REPLY_HISTORICAL_DATA_UPLOAD=0x85,
    E_CMD_06_REQUEST_HISTORICAL_DATA=0x06,
    E_CMD_86_REPLY_REQUEST_HISTORICAL_DATA=0x86,   
}E_Cmd_Code;

typedef enum{
    E_CMD_TAG_FUNCTION=0x01,
    E_CMD_TAG_RESULT=0x02,
    E_CMD_TAG_BASIC_INFO=0x03,
    E_CMD_TAG_PARA=0x04,
    E_CMD_TAG_ALARM=0x05,
    E_CMD_TAG_TRAMSMIT=0x06,  
    E_CMD_TAG_REAL_DATA=0x07,  
    E_CMD_TAG_HOUR_DATA=0x08, 
    E_CMD_TAG_DENSE_DATA=0x09,  
    E_CMD_TAG_HIST_TIME=0x0a,  
}E_Cmd_Code_Tag;

typedef enum{
    E_ID_0_LARGE_FLOW=0x00,
    E_ID_1_LARGE_FLOW_DURATION=0x01,
    E_ID_2_NEG_FLOW=0x02,
    E_ID_3_NEG_FLOW_DURATION=0x03,
    E_ID_4_BAT_ALARM=0x04,
    E_ID_5_SERVER_ADD=0x05,
    E_ID_6_APN=0x06,
    E_ID_7_RESEND_TIMES=0x07,
    E_ID_8_DISCRETE_TIME=0x08,
    E_ID_9_START_STOP_ENABLE=0x09,
    E_ID_10_COMM_CYCLE=0x10,
    // E_ID_111_DENSE_START_TIME=111,      
    E_ID_11_DENSE_START_TIME=111,
    E_ID_23_BASE_NUMBER=0x17,
    E_ID_24_PN=0x18,

}E_PARA_ID;

typedef struct E_PARA_ID_Data{
    E_PARA_ID   e_para_id;   
    gw_u16      len;           
} E_PARA_ID_Data;


typedef struct{
    gw_u8   pu8Buf[PACKAGE_DATA_MAX_LEN];
    gw_u16  u16Len;  
}S_Data_Field;

typedef struct{   
    /*数据域*/
    S_Data_Field s_data_field;
    /*帧序列号*/
    gw_u16 u16FrameSerial;    
    /*上位机时间，年、月、日、时、分、秒*/
    gw_u8 u8ServerTime[6];
    /*加密标识*/
    gw_u8 u8AesEnable;   
    /*信号强度RSRP*/
    gw_s16 s16Rsrp;
		/*信号强度RSRQ*/
    gw_s16 s16Rsrq;
    /*信噪比SNR*/
    gw_s16 s16Snr;
   /*覆盖等级 CoverLev*/
    gw_u8 u8CoverLev;
		/* Band*/
    gw_u8  	u8Band;	
    /*信号质量CSQ*/
    gw_u8 u8Csq;     
    /*强度信号*/
    gw_s16 s16GsmRssi;     
    /*物理小区ID*/
    gw_u32 u32CellId;
    /*结果码*/
    E_CMD_RESULT Cmd_Result;  
    /*查询历史数据时间，年、月、日、时、分、秒*/
    gw_u8 pu8RequestTime[6];		
	    /*当前时间时间戳从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_Data;


void Svc_Cloud_Set_Imei(gw_u8 *pu8Imei);
void Svc_Cloud_Get_Imei(gw_u8 *out_pu8Imei);
void Svc_Cloud_Set_Imsi(gw_u8 *pu8Imsi);
void Svc_Cloud_Get_Imsi(gw_u8 *out_pu8Imsi);
void Svc_Cloud_Set_Nb_Ver(gw_u8 *pu8NbVer,gw_u8 u8Len);
void Svc_Cloud_Get_Nb_Ver(gw_u8 *out_pu8NbVer);	

static void Parse_Cmd01_Set_Para(gw_u8* data,gw_u16 len);
E_PARA_ID_Data* Svc_Find_Cmd01_04_ID(E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_0_LARGE_FLOW(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id); 
E_CMD_RESULT E_Cmd01_04_ID_1_LARGE_FLOW_DURATION(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_2_NEG_FLOW(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_3_NEG_FLOW_DURATION(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_4_BAT_ALARM(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_5_SERVER_ADD(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_6_APN(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_7_RESEND_TIMES(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_8_DISCRETE_TIME(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_9_START_STOP_ENABLE(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id); 
E_CMD_RESULT E_Cmd01_04_ID_10_COMM_CYCLE(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_23_BASE_NUMBER(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_24_PN(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);
E_CMD_RESULT E_Cmd01_04_ID_11_DENSE_START_TIME(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id);


void Parse_Cmd82_Reply_Data_Upload(gw_u8* data,gw_u16 len);
void Parse_Cmd85_Reply_Historical_Data_Upload(gw_u8* data,gw_u16 len);
void Svc_Cloud_Protocol_Reply_Set_Para(void);
void Svc_Cloud_Protocol_Upload_Data(void);
void Svc_Cloud_Protocol_Reply_Requset_Info(void);
void Svc_Cloud_Protocol_Historical_Upload_Data(void);
void Svc_Cloud_Protocol_Reply_Requset_Historical_Data(void);
void Svc_Cloud_Protocol_Init(void);
S_Cloud_Data* Svc_Cloud_Get_Data(void);
void Svc_Cloud_Protocol_Parse(gw_u8* data,gw_u16 len);
void Svc_Cloud_Update_Time(gw_u32 u32Time);
void Svc_Cloud_Refresh_Time(void);
void Svc_Cloud_Time_Printf(char *PrintInfo,gw_u8 *PrintTime);
void Svc_Cloud_SysTime_Printf(void);
E_Result_Check Svc_Cloud_Time_Check(char *FunctionName);
gw_u32 Svc_Cloud_Get_Time(void);
void Svc_Cloud_Set_Iccid(gw_u8 *pu8Iccid);
void Svc_Cloud_Get_Iccid(gw_u8 *out_pu8Iccid);
void Svc_Cloud_Protocol_Request_Ota_Data(void);
void Svc_Cloud_Protocol_Ota_Success(void);
void  Creat_Upload_Day_Real_Data_Printf(S_Flash_Day_Usage *day_usage);
void  Creat_Upload_Day_Hour_Data_Printf(S_Flash_Day_Usage *day_usage);
void  Creat_Upload_Day_Dense_Data_Printf(S_Flash_Day_Usage *day_usage);
void  Creat_Upload_Day_Alarm_Data_Printf(S_Flash_Day_Usage *day_usage);
void Svc_Systemtime_Info_Printf(void);

#endif
