#ifndef H_SVC_IR_PROTOCOL_H
#define H_SVC_IR_PROTOCOL_H

#include "svc_ir_uart.h"
#include "../bsp/bsp_ir_uart.h"
#include "../../ota/svc/svc_ota.h"

/*--------------------------------------------------------------------------------------------------------------------------------------*/
//下面代码为lierda OTA升级红外协议
#if LOG_FUNC_ENABLE
    #define IR_FUNC_ENABLE  1
#else
    #define IR_FUNC_ENABLE  1
#endif

#define FRAME_HEAD      0xDD
#define FRAME_TAIL_IR   0xDC
#define ESCAPE_CHAR     0xDB
#define IR_PROTOCOL_VER 0x10   
#define ENCRYPT         0x01
#define CHECK_SIGN_ENABLE 1

#define REQUEST 0
#define RESPOSE 1

#define HAS_MORE_WAIT_TIME  20
#define IR_BUFF_MAX_SIZE 1024

#define MAIN_LEAD_CODE     0x7373FEFE  //服务器->设备
#define SLAVE_LEAD_CODE    0xFEFEFEFE   //设备->服务器
#define DAY_USAGE_MAX_NUM  180
#define MONTH_USAGE_MAX_NUM 36

#define VALVE_CLOSE 0
#define VALVE_OPEN 1

typedef enum{

    CMD_00_DEVELOP_TEST_MODE=0x00,//开发测试模式
    CMD_01_PRODUCT_MODE=0x01,//查询设备普通参数
    CMD_02_NOMORAL_USER_MODE=0x02,//设置设备特殊参数
    CMD_03_SET_NORMAL_PARA=0x03,//设置设备普通参数
}Work_Mode_Enum;

typedef enum{
    CMD_41_QUERY_SPECIAL_PARA=0x41,//查询设备特殊参数
    CMD_81_SET_SPECIAL_PARA=0x81,//设置设备特殊参数
    CMD_C0_OPERATE=0xC0,
    CMD_C3_OPERATE=0xC3,    
    CMD_C8_PULSEDATE = 0xC8,
    CMD_A0_ISSUE_OTA=0xA0,
    CMD_A1_REQUEST_OTA=0xA1,
    CMD_A2_REQUEST_OTA_DATA=0xA2
}E_Cmd_IRCode;

typedef enum{
    FUNC_0002_METER_INFO=0x0002,
    FUNC_0003_COMM_MODEL_NET_INFO=0x0003,
    FUNC_0004_PRODUCT_ID=0x0004,
    FUNC_1C03_OPERATE_VALVE = 0x1C03,
    FUNC_1C08_PULSE_VALVE = 0x1C08,
    FUNC_1C04_QUERY_VALVE_STATE = 0x1C04,
    FUNC_1C02_ALARM_CLEAR=0x1C02, 
    FUNC_4000_RESET_MAG=0x4000, 
    FUNC_4001_READ_MAG_DATA=0x4001, 
    FUNC_4002_CLEAR_MAG_RUNDATA=0x4002, 
    FUNC_4003_CLEAR_MAG_CALIBRATE_DATA=0x4003, 

}E_Function_Code;

typedef enum{
    COMM_00_NORMAL=0x00,
    COMM_01_ERROR_AUTH_EXPIRE=0x01,
    COMM_02_ERROR_PARA=0x02,
    COMM_03_ERROR_PARA_FORMAT=0x03,
    COMM_04_ERROR_CMD_NO_SUPPORT=0x04,
    COMM_63_ERROR_OTA_FIRMWARE_NO_EXIST=0x63,
    COMM_FF_ERROR_SYS=0xFF
}E_Comm_Result;

typedef struct
{
    gw_u16 u16DataLenIndex;//数据长度所在位置
    gw_u16 u16IdIndex;//产品序列号起始位置
    gw_u16 u16DataFieldIndex;//数据域起始位置
}S_Ir_Data_Index;

typedef struct{
    gw_u16 *list;
    gw_u8 list_count;
    E_Cmd_IRCode e_cmd_code_ir;
    E_Function_Code e_func_code_ir;
    E_Comm_Result e_comm_result_ir;
    gw_u8 buff[IR_UART_RX_BUF_SIZE];
    gw_u16 buff_len;
    gw_u16 crc16;
    S_Ir_Data_Index s_data_index;
}S_Ir_OtaData;

void Svc_Pulse_Data_Rsp(S_Ir_OtaData *s_ir_otadata);
void Svc_Ir_Protocol_Parse(gw_u8* data,gw_u16 len);
void Svc_Ota_Post_Event(E_OTA_Event_Enum ota_event);
void Svc_Ota_Clear_Event(E_OTA_Event_Enum ota_event);
E_OTA_Event_Enum Svc_Ota_Get_Pending_Event(void);
void Svc_Ota_Lock_Event(E_OTA_Event_Enum ota_event);
E_Result_Check Svc_Ota_Event_Is_Changed(E_OTA_Event_Enum ota_event);
E_Result_Check Svc_Ir_Protocol_Request_Ota(void);
E_Result_Check Svc_Ir_Protocol_Request_Ota_Data(void);
/*--------------------------------------------------------------------------------------------------------------------------------------*/
//下面代码为客户定制红外协议

/*帧头*/
#define IR_FRAME_HEAD1       '['
#define IR_FRAME_HEAD2       '{'
/*帧尾*/
#define IR_FRAME_TAIL2       '}'
#define IR_FRAME_TAIL1       ']'

typedef enum{   
    E_IR_CMD_3=0x00,
    E_IR_CMD_80=0x01,
    E_IR_CMD_81=0x02,
    E_IR_CMD_82=0x03,
    E_IR_CMD_83=0x04,
    E_IR_CMD_84=0x05,
    E_IR_CMD_99=0x06,
    E_IR_CMD_IMEI=0x07,
    E_IR_CMD_ALL=0x08,
}E_IR_CMD;

typedef enum{   
    E_IR_CMD_3_2=0x00,
    E_IR_CMD_3_22=0x01,
    E_IR_CMD_3_13=0x02,
    E_IR_CMD_3_17=0x03,    
}E_IR_CMD_03;
typedef enum{   
    E_IR_CMD_80_1=0x00,
    E_IR_CMD_80_2=0x01,
    E_IR_CMD_80_7=0x02,
    E_IR_CMD_80_16=0x03,
    E_IR_CMD_80_31=0x04,
    E_IR_CMD_80_24=0x05,
    E_IR_CMD_80_26=0x06,
}E_IR_CMD_80_CHILD;
typedef enum{   
    E_IR_CMD_81_0=0x00,
    E_IR_CMD_81_3=0x01,
    E_IR_CMD_81_4=0x02,
    E_IR_CMD_81_5=0x03,
    E_IR_CMD_81_7=0x04,    
}E_IR_CMD_81_CHILD;
typedef enum{   
    E_IR_CMD_82_10=0x00,
    E_IR_CMD_82_11=0x01,
    E_IR_CMD_82_0=0x02,    
}E_IR_CMD_82_CHILD;
typedef enum{   
    E_IR_CMD_83_14=0x00,
    E_IR_CMD_83_15=0x01,
    E_IR_CMD_83_16=0x02,
    E_IR_CMD_83_17=0x03,
    E_IR_CMD_83_20=0x04,
    E_IR_CMD_83_18=0x05,    
    E_IR_CMD_83_7=0x06,
    E_IR_CMD_83_8=0x07,
    E_IR_CMD_83_9=0x08,
    E_IR_CMD_83_10=0x09,
    E_IR_CMD_83_11=10,
}E_IR_CMD_83_CHILD;
typedef enum{   
    E_IR_CMD_84_0=0x00,
    E_IR_CMD_84_1=0x01,
    E_IR_CMD_84_2=0x02,
    E_IR_CMD_84_4=0x03,
    E_IR_CMD_84_5=0x04,
    E_IR_CMD_84_10=0x05,      
}E_IR_CMD_84_CHILD;
typedef enum{   
    E_IR_CMD_99_21=0x00,
    E_IR_CMD_99_23=0x01,
    E_IR_CMD_99_3=0x02,
    E_IR_CMD_99_4=0x03,
    E_IR_CMD_99_5=0x04,
    E_IR_CMD_99_6=0x05,
    E_IR_CMD_99_7=0x06,
    E_IR_CMD_99_29=0x07,    
}E_IR_CMD_99_CHILD;
#define FRAME_ITEM_MAX      4

typedef enum{
    /*IR关机*/
    E_IR_OFF=0, 
    /*运行状态*/
    E_IR_ON=1, 
}E_IR_State;

typedef struct{   
    gw_u8 *FrameItem[FRAME_ITEM_MAX];
    gw_u8  u8ItemSize;
    gw_u8  u8KeepAliveTime;  
	gw_u8  u8QueFrozenTime[6];
	E_IR_State  e_ir_state;
}S_Ir_Data;


typedef enum{   
    E_IR_RSP_LEN=0,
    E_IR_RSP_ALL=1,
    E_IR_RSP_TM=2,
    E_IR_RSP_SN=3,
    E_IR_RSP_M_T=4,
    E_IR_RSP_MOD=5,
    E_IR_RSP_PN=6,
    E_IR_RSP_MAX_L=7,
    E_IR_RSP_BASE_L=8,
    E_IR_RSP_VALVE=9,
    E_IR_RSP_TYPE=10,
    E_IR_RSP_VER=11,
    E_IR_RSP_IP=12,
    E_IR_RSP_IMEI=13,
    E_IR_RSP_IMSI=14,
    E_IR_RSP_ICCID=15,
    E_IR_RSP_RSSI=16,
    E_IR_RSP_SNR=17,
    E_IR_RSP_CELL_ID=18,
    E_IR_RSP_NB_VER=19,
    E_IR_RSP_PME=20,
    E_IR_RSP_OW=21,
    E_IR_RSP_AW=22,
    E_IR_RSP_VP=23,
    E_IR_RSP_ACV=24,
    E_IR_RSP_PSM=25,
    E_IR_RSP_APN=26,
    E_IR_RSP_PLMN=27,
    E_IR_RSP_BAND=28,
    E_IR_RSP_NWP=29,
    E_IR_RSP_CWE=30,
    E_IR_RSP_CWT=31,
    E_IR_RSP_RI=32,
    E_IR_RSP_RT=33,
    E_IR_RSP_RFM=34,
    E_IR_RSP_GRP=35,
    E_IR_RSP_BOM_V=36,
    E_IR_RSP_BOM_T=37,
    E_IR_RSP_CON_T=38,
    E_IR_RSP_CON_MV=39,    
    E_IR_RSP_CON_FV=40,
    E_IR_RSP_STOP_T=41,
    E_IR_RSP_CVT=42,
    E_IR_RSP_ST_M=43,
    E_IR_RSP_DENSE=44,
    E_IR_RSP_FROZEN=45,
    E_IR_RSP_84_0=46,   
    E_IR_RSP_NB=47,
}E_IR_RSP_CMD;

typedef struct S_Ir_Cmd_Data
{
    /*红外命令*/
    gw_u8           e_ir_cmd;  
    /*命令具体信息*/        
    char           *recv_cmd;     
    /*命令回调函数*/
    gw_s8           (*callback)(gw_u8 *FrameItemData);      
} S_Ir_Cmd_Data;

typedef struct S_Ir_Cmd_Rsp
{
    /*红外命令*/
    E_IR_RSP_CMD     e_ir_rsp;        
    /*命令回调函数*/
    gw_u16           (*callrsp)(gw_u8 *,gw_u16); 
}S_Ir_Cmd_Rsp;


gw_s8 Parse_Cmd_Code_03(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_80(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_81(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_82(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_84(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_Imei(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_All(gw_u8 *FrameItemData);

gw_s8 Parse_Cmd_Code_03_2(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_03_22(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_03_13(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_03_17(gw_u8 *FrameItemData);

gw_s8 Parse_Cmd_Code_80_1(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_80_2(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_80_7(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_80_16(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_80_31(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_80_24(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_80_26(gw_u8 *FrameItemData);

gw_s8 Parse_Cmd_Code_81_0(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_81_3(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_81_4(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_81_5(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_81_7(gw_u8 *FrameItemData);

gw_s8 Parse_Cmd_Code_82_10(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_82_11(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_82_0(gw_u8 *FrameItemData);

gw_s8 Parse_Cmd_Code_83_14(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_15(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_16(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_17(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_20(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_18(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_7(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_8(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_9(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_10(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_83_11(gw_u8 *FrameItemData);

gw_s8 Parse_Cmd_Code_84_0(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_84_1(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_84_2(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_84_4(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_84_5(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_84_10(gw_u8 *FrameItemData);
 
gw_s8 Parse_Cmd_Code_99_21(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99_23(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99_3(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99_4(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99_5(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99_6(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99_7(gw_u8 *FrameItemData);
gw_s8 Parse_Cmd_Code_99_29(gw_u8 *FrameItemData);

gw_u8 Svc_Ir_Cmd_Parse(gw_u8 *FrameItemData,const S_Ir_Cmd_Data *Cmd_Data,gw_u8 CmdMaxNum);
void Svc_Ir_Parse(gw_u8* pu8Data,gw_u16 u16Len);
gw_u8 CheckRc(gw_u8 *buf, gw_u8 u8Differ,gw_u32 u32len);
gw_u8 CheckSn(gw_u8 *buf);
gw_u8 CheckIP(gw_u8 *buf);
gw_u8 CmdCheckSn(void);
E_IR_State Svc_Ir_Core_Get_Cur_State(void);
void Svc_Ir_Set_Cur_State(E_IR_State ir_cur_state);
gw_u8 Svc_Ir_Wait_Cmd(void);




#endif