#ifndef H_SVC_IR_PROTOCOL_H
#define H_SVC_IR_PROTOCOL_H

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

#define IR_FRAME_HEAD 0xDD
#define IR_FRAME_TAIL 0xDC

#define IR_PROTOCOL_VER 0x10

#define IR_BUFF_MAX_SIZE 256

#define MAIN_LEAD_CODE 0x7373FEFE  // 服务器->设备
#define SLAVE_LEAD_CODE 0xFEFEFEFE // 设备->服务器

#define IR_PROTOCOL_MIN_LEN 23 // 帧头+协议版本+长度2+序列号16+crc校验2+帧尾

typedef enum
{

    CMD_41_QUERY_SPECIAL_PARA = 0x41, // 查询设备特殊参数
    CMD_42_QUERY_NORMAL_PARA = 0x42,  // 查询设备普通参数
    CMD_81_SET_SPECIAL_PARA = 0x81,   // 设置设备特殊参数
    CMD_82_SET_NORMAL_PARA = 0x82,    // 设置设备普通参数
    CMD_C0_OPERATE = 0xC0,            // 业务操作
    CMD_C1_QUERY_HISTORY_DATA = 0xC1, // 查询历史数据
    CMD_C3_MAINTAIN = 0xC3,           // 运维操作

    CMD_A0_ISSUE_OTA = 0xA0,        // 服务器下发设备 OTA 升级
    CMD_A1_REQUEST_OTA = 0xA1,      // 表计请求 OTA 升级
    CMD_A2_REQUEST_OTA_DATA = 0xA2, // 表计请求 OTA 固件数据
    CMD_43_QUERY_PULSE_PARA = 0x43, // 查询计量模组参数
    CMD_83_SET_PULSE_PARA = 0x83,   // 设置计量模组参数
} E_Cmd_Code_Ir;

typedef enum
{
    /*core function codes*/
    IR_0002_METER_INFO = 0x0002,   // 表计信息 ,changed to meter ID ,doesn't need to implement for CSM
    IR_0003_NETWORK_INFO = 0x0003, // 网络连接
    IR_0004_PRODUCT_ID = 0x0004,   // 表号
    IR_0006_DEVICE_TIME = 0x0006,  // 表计时间
    IR_0007_INFORM_KEY = 0x0007,   // 密钥
    IR_000A_WORK_MODE = 0x000A,    // 操作模式
    IR_1000_DEVICE_STATE = 0x1000, // 设备状态
    IR_1001_POWER_STATE = 0x1001,  // 电源状态

    /*NBIot communication function codes*/
    IR_1420_REPORTCYCLE = 0x1420,          // 上报周期
    IR_1423_INFORM_RELIABLE_INFO = 0x1423, // 通讯可靠机制配置
    IR_1424_ERR_FLOW = 0x1424,             // 异常流量检测配置
    IR_1425_NORMAL_PARA_INFO = 0x1425,     // 表计基本参数配置

    /*Water flow function codes */
    IR_1120_USAGE_INFO = 0x1120,        // 总用量信息
    IR_1140_DAY_USAGE = 0x1140,         // 日用量信息
    IR_1141_DENSE_USAGE_INFO = 0x1141,  // 密集周期流量信息
    IR_1151_REALTIME_USAGE_INFO = 1151, // 流量信息
    IR_1502_QUERY_USAGE = 0x1502,       // 查询 6 个月内日区间明细
    IR_1504_QUERY_USAGE = 0x1504,       // 查询 36 个月内月区间明细
    IR_1521_USAGE_ALARM = 0x1521,       // 用量报警配置信息
    IR_1552_LOG = 0x1552,               // 查询 1 个月内日志记录概况
    IR_1553_LOG = 0x1553,               // 查询 1 个月内日志记录内容

    IR_1608_METER_STATE = 1608,         // 表状态
    IR_1609_TIME_PERIOD_EVENT = 1609,   // 读时间段事件记录
    IR_160A_LATESET_EVENT_LOG = 0x160A, // 读最新事件记录

    IR_1C01_SYNC_DIAL_NUM = 0x1C01,   // 机电同步
    IR_1C02_CLEAR_THE_FAULT = 0x1C02, // 清除故障

    /*Pulse module function codes */
    IR_3001_PULSE_INFO = 0x3001,             // 模组设备信息
    IR_3002_PULSE_BAUDRATE = 0x3002,         // 模组通信波特率
    IR_3003_PULSE_WORKMODE = 0x3003,         // 模组工作模式
    IR_3004_PULSE_TIME_CALIBRATE = 0x3004,   // 模组时间校准
    IR_3005_PULSE_RUNTIME = 0x3005,          // 模组运行时间
    IR_3010_PULSE_PIPE_PARA = 0X3010,        // 管段参数
    IR_3011_PULSE_START_FLOW = 0x3011,       // 始动流速
    IR_3012_PULSE_ZERO = 0x3012,             // 零点参数
    IR_3013_PULSE_CORRECT_PARA = 0x3013,     // 修正系数
    IR_3014_PULSE_ZEROMODE = 0x3014,         // 零点模式
    IR_30A0_PULSE_DAY_HISTORICAL = 0x30A0,   // 查询100日内的日流量数据
    IR_30A1_PULSE_MONTH_HISTORICAL = 0x30A1, // 查询 60个月内月流量数据
    IR_30A2_PULSE_DEBUG_ENABLE = 0x30A2,     // 使能/失能调试串口
    IR_302A_PULSE_CLEAR_CODATA = 0x302A,     // 清除模组校准数据
    IR_302C_PULSE_CLEAR_ALL_DATA = 0x302C,   // 清除模组所有数据
    IR_OTA_REQURST_DATA = 0xFAFA,            // Ota，实际无用处
    IR_ERROR = 0xFF,                         // 错误
} E_Function_Code_Ir;

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
{
    E_Cmd_Code_Ir e_cmd_code_ir;
    E_Function_Code_Ir e_func_code_ir;
    E_Comm_Result e_comm_result_ir;
    gw_u16 u16BuffLen;               // 数据帧长度
    gw_u8 pu8Buff[IR_BUFF_MAX_SIZE]; // 数据帧buff
    gw_u8 pu8QueryDate[3];           // 查询起始时间
    gw_u8 u8QueryNum;                // 查询天数或月数
    gw_u8 Event_StatrTime[6];        // 事件记录起始时间
    gw_u8 Event_EndTime[6];          // 事件记录结束时间
    gw_u8 Event_Num;                 // 记录条数
    gw_u16 Event;                    // 事件
    gw_u16 u16Crc;
    S_Ir_Data_Index s_data_index;
} S_Ir_Data;

void Svc_Ir_Protocol_Parse(uint8_t *data, uint16_t len);
void Svc_Ir_Protocol_Send_Cmd(E_Cmd_Code_Ir e_cmd_code, E_Function_Code_Ir e_func_code, E_Comm_Result e_comm_result);
void Svc_Module_Ack_Deal(void);
#endif
