/*
 * @Author: 002389 yangsw@lierda.com
 * @Date: 2022-07-29 13:15:11
 * @LastEditors: 002389 yangsw@lierda.com
 * @LastEditTime: 2022-08-04 14:07:31
 * @FilePath: \L-SWMUS01-00303\N32L406MBL7_Rev01.01\src\pulse\svc\svc_pulse_protocol.h
 * @Description:
 */
#ifndef H_SVC_PULSE_PROTOCOL_H
#define H_SVC_PULSE_PROTOCOL_H

#include "../svc/svc_pulse_uart.h"

#define PULSE_FRAME_HEAD 0x68
#define PULSE_FRAME_TAIL 0x16

#define PULSE_PROTOCOL_VER 0x01

#define PULSE_BUFF_MAX_SIZE 200

#define PULSE_RESEND_TIME 20 // 失败重连等待时间

#define PULSE_MAIN_LEAD_CODE 0x7373FEFE  // 主机->设备
#define PULSE_SLAVE_LEAD_CODE 0xFEFEFEFE // 设备->主机
#define PULSE_PROTOCOL_MIN_LEN 5         // 帧头+协议版本+长度1+校验1+帧尾

typedef enum
{

    CMD_41_QUERY_DEVICE_INFO = 0x41,    // 查询设备信息
    CMD_42_QUERY_MEASURE_PARA = 0x42,   // 查询测量参数
    CMD_81_SET_DEVICE_INFO = 0x81,      // 设置设备信息
    CMD_82_SET_MEASURE_PARA = 0x82,     // 设置测量参数
    CMD_C1_QUERY_USAGE_DATA = 0xC1,     // 查询用量数据
    CMD_C3_PROPRIETARY_PROTOCOL = 0xC3, // 查询历史信息
} E_Cmd_Code_Pulse;

typedef enum
{
    /*device info codes*/
    FUNC_01_METER_INFO = 0x01,    // 表计信息
    FUNC_02_COMM_BAUDRATE = 0x02, // 通信波特率
    FUNC_03_WORK_MODE = 0x03,     // 计量模组工作模式
    FUNC_04_CORRECT_TIME = 0x04,  // 校准计量模组时间
    FUNC_05_RUN_TIME = 0x05,      // 计量模组运行时间

    /*measure para codes*/
    FUNC_10_PIPE_PARA = 0x10,         // 管段参数
    FUNC_11_START_FLOW_SPEED = 0x11,  // 始动流速
    FUNC_12_ZERO_CORRECT_PARA = 0X12, // 零点校准参数
    FUNC_13_CORRECT_PARA = 0x13,      // 修正系数
    FUNC_14_ZERO_MODE = 0x14,         // 零点模式
    FUNC_15_SET_USAGE = 0x15,         // 设置累积量

    /*Water flow function codes */
    FUNC_20_QUERY_CURRENT_USAGE = 0x20, // 用量信息
    FUNC_2A_CLEAR_CORRECT_DATA = 0x2A,  // 清除校准时用量数据
    FUNC_2C_CLEAR_ALL_DATA = 0x2C,      // 清除所有数据

    /*Querying historical data codes */
    FUNC_A0_DAY_HISTORICAL = 0xA0,    // 查询100日数据
    FUNC_A1_MONTH_HISTORICAL = 0xA1,  // 查询60月数据
    FUNC_A2_CLOSE_SERIAL_PORT = 0xA2, // 关闭调试串口
} E_Function_Code_Pulse;

typedef enum
{
    COMM_00_PULSE_NORMAL = 0x00,               // 处理成功
    COMM_01_PULSE_ERROR_PARA = 0x01,           // 参数错误
    COMM_02_PULSE_ERROR_CMD_NO_SUPPORT = 0x02, // 命令不支持
    COMM_FF_PULSE_ERROR_SYS = 0xFF             // 处理失败
} E_Comm_Result_Pulse;

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

typedef struct
{
    gw_u8 u8Sum_Check;
    gw_u8 pu8Buff[PULSE_BUFF_MAX_SIZE];
    gw_u16 u16BuffLen;
    S_Pulse_Data_Index s_data_index;
    E_Cmd_Code_Pulse e_cmd_code_pulse;
    E_Comm_Result_Pulse e_comm_result_pulse;
    E_Function_Code_Pulse e_func_code_pulse;
} S_Pulse_Data;

typedef struct
{
    /*u8ack=0x01：收到回应（无论成功与否），0x00：未收到回应*/
    gw_u8 u8ack;
    E_Function_Code_Pulse e_func_code_pulse;
    E_Cmd_Code_Pulse e_cmd_code_pulse;
    E_Comm_Result_Pulse e_comm_result_pulse;    
} S_Pulse_Data_Ack;

void Svc_Pulse_Protocol_Parse(gw_u8 *data, gw_u16 len);
void Svc_Pulse_Protocol_Send_Cmd(E_Cmd_Code_Pulse e_cmd_code, E_Function_Code_Pulse e_func_code);
S_Pulse_Data_Ack *Svc_Get_Pulse_Protocol_Ack(void);
#endif
