chargeController/APP/businessLogic/Src/hy_protocol.c

1898 lines
83 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <string.h>
#include "hy_protocol.h"
#include "pDebug.h"
#include "comm_types.h"
#include "parameter.h"
#include "cfg_protocol.h"
#include "inFlash.h"
#include "bl_chargControl.h"
#include "bl_comm.h"
#include "chargControlTypes.h"
#include "FM_RTC.h"
// #include "RingQueue.h"
// 声明 beginHYconfigMode 函数
extern void beginHYconfigMode(void);
static BOOL HYconfigModeState = FALSE;
/* 功能码 */
typedef enum
{
HY_batteryStatus = 0x60, /* 电池状态数据报 */
HY_electricityStatistics = 0x61, /* 电量统计数据报 */
HY_sensorNumberConfiguration = 0x62, /* 传感器号码配置 */
HY_sensorNumberInquiry = 0x63, /* 传感器号码查询 */
HY_chargingThresholdVoltageConfiguration = 0x64, /* 充电阈值电压配置 */
HY_chargingRangeVoltageQuery = 0x65, /* 充电域值电压查询 */
HY_resetInstruction = 0x66, /* 复位指令 */
HY_chargingControlConfiguration = 0x6C, /* 充电控制配置 */
HY_chargingControlQuery = 0x6D, /* 充电控制查询 */
HY_configurationTime = 0x6E, /* 配置时间 */
HY_queryTime = 0x6F, /* 查询时间 */
HY_configureProtocolType = 0x70, /* 配置协议类型 */
HY_responseConfigureProtocolType = 0x71, /* 响应配置协议类型 */
HY_queryControlBoxConfiguration = 0x74, /* 查询电池控制盒当前配置 */
HY_querySoftwareVersion = 0x75, /* 查询电池控制盒软件版本 */
HY_enterConfigurationMode = 0x76, /* 进入配置模式 */
HY_configureHardwareID = 0x7B, /* 配置控制盒硬件ID号 */
HY_hardwareID_communicationIDQuery = 0x7C, /* 控制盒硬件ID号及通信ID号原传感器号查询 */
HY_modifyCommunicationID = 0x7D, /* 修改通信ID号原传感器号 */
HY_checkMotherboardTemperature = 0x7E, /* 查询主板温度值 */
}HY_MsgFunctionCode;
/* 解析数据包的长度 */
typedef enum
{
HY_analyzeStartFlag = 1, /* 长度为1时解析起始标志 */
HY_analyzeHardwareID = 7, /* 长度为7时解析硬件ID */
HY_analyzeCommunicationID = 11, /* 长度为10时解析通信ID */
HY_analyzeControlWord = 12, /* 长度为12时解析控制字 */
HY_analyzeDataLen = 14, /* 长度为14时解析数据长度 */
}HY_AnalyzeDataLen;
/* 执行状态 */
typedef enum
{
/* 返回状态 */
HY_success = 0xFF, /* 成功 */
HY_fail = 0x00, /* 失败 */
/* 返回状态 */
HY_success1 = 0x01, /* 成功 */
/* 充电开关状态 */
HY_switchON = 0x01, /* 打开 */
HY_switchOFF = 0x00, /* 关闭 */
/* 控制开关状态 */
HY_cSwitchON = 0x00, /* 打开 */
HY_cSwitchOFF = 0x01, /* 关闭 */
}HY_state;
/* 指定对齐方式为1字节 */
#pragma pack(push,1)
/* 通用参数 */
typedef struct _HY_Recv_pack{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
}HY_Recv_pack;
/* 功能码处理函数 */
typedef void (*HYMsgProcFunc)(device_handle device, void*, uint32_t MsgLen);
typedef struct _HY_FunctionMsgProcTable{
u_int32_t msgId;
HYMsgProcFunc pMsgProc;
}HY_FuncionMsgProcTable;
/* 电池状态数据报查询 */
typedef struct _HY_batteryStatusQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_batteryStatusQuery;
#define HY_batteryStatusQuery_PACK_SIZE (sizeof(HY_batteryStatusQuery))
/* 电池状态数据报响应 */
typedef struct _HY_batteryStatusResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
float_t batteryVoltage; /* 电池电压 */
float_t dischargCurrent; /* 输出电流(流向负载) */
float_t chargCurrent1; /* 充电电流(流向电池+负载) */
float_t SOC; /* 剩余电量 */
float_t openCircuitVoltage1; /* 充电开路电压 */
uint8_t chargSwitchStatus1; /* 充电开关状态 */
float_t chargCurrent2; /* 充电电流(流向电池+负载) */
float_t openCircuitVoltage2; /* 充电开路电压 */
uint8_t chargSwitchStatus2; /* 充电开关状态 */
float_t Mos_Temperature; /* 工作温度 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_batteryStatusResponse;
#define HY_batteryStatusResponse_PACK_SIZE (sizeof(HY_batteryStatusResponse))
#define HY_batteryStatusResponse_dataLen 38
/* 电量统计数据报查询 */
typedef struct _HY_electricityStatisticsQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_electricityStatisticsQuery;
#define HY_electricityStatisticsQuery_PACK_SIZE (sizeof(HY_electricityStatisticsQuery))
/* 电量统计数据报响应 */
typedef struct _HY_electricityStatisticsResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
float_t statisticalDuration; /* 统计时长 */
float_t totalElectricityConsumption; /* 总电量消耗 */
float_t totalChargCapacity; /* 总充电电量 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_electricityStatisticsResponse;
#define HY_electricityStatisticsResponse_PACK_SIZE (sizeof(HY_electricityStatisticsResponse))
#define HY_electricityStatisticsResponse_dataLen 16
/* 传感器号码配置 */
typedef struct _HY_sensorNumberConfig{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t newHardwareID[6]; /* 新硬件ID高字节在前低字节在后保持不变 */
uint8_t newCommunicationID[4]; /* 新通信ID高字节在前低字节在后 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_sensorNumberConfig;
#define HY_sensorNumberConfiguration_PACK_SIZE (sizeof(HY_sensorNumberConfig))
/* 传感器号码配置响应 */
typedef struct _HY_sensorNumberConfigurationResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_sensorNumberConfigurationResponse;
#define HY_sensorNumberConfigurationResponse_PACK_SIZE (sizeof(HY_sensorNumberConfigurationResponse))
#define HY_sensorNumberConfigurationResponse_dataLen 5
/* 传感器号码查询 */
typedef struct _HY_sensorNumberInquiryQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t broadcastTerminal[6]; /* 广播终端ID:0xFF 0xFF 0xFF 0xFF 0xFF 0xFF */
uint8_t broadcastCommunication[4]; /* 广播通信ID:0xFF 0xFF 0xFF 0xFF */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_sensorNumberInquiryQuery;
#define HY_sensorNumberInquiryQuery_PACK_SIZE (sizeof(HY_sensorNumberInquiryQuery))
/* 传感器号码查询响应 */
typedef struct _HY_sensorNumberInquiryResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t hardwareIDR[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationIDR[4]; /* 通信ID高字节在前低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_sensorNumberInquiryResponse;
#define HY_sensorNumberInquiryResponse_PACK_SIZE (sizeof(HY_sensorNumberInquiryResponse))
#define HY_sensorNumberInquiryResponse_dataLen 14
/* 充电阈值电压配置 */
typedef struct _HY_chargingThresholdVoltageConfig{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
float_t chargOpenVoltage; /* 充电开电池电压 */
float_t chargCloseVoltage; /* 充电关电池电压 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_chargingThresholdVoltageConfig;
#define HY_chargingThresholdVoltageConfig_PACK_SIZE (sizeof(HY_chargingThresholdVoltageConfig))
/* 充电阈值电压配置响应 */
typedef struct _HY_chargingThresholdVoltageConfigResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_chargingThresholdVoltageConfigResponse;
#define HY_chargingThresholdVoltageConfigResponse_PACK_SIZE (sizeof(HY_chargingThresholdVoltageConfigResponse))
/* 充电域值电压查询 */
typedef struct _HY_chargRangeVoltageQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_chargRangeVoltageQuery;
#define HY_chargRangeVoltageQuery_PACK_SIZE (sizeof(HY_chargRangeVoltageQuery))
/* 充电域值电压查询响应 */
typedef struct _HY_chargRangeVoltageQueryResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
float_t chargOpenVoltage; /* 充电开电池电压 */
float_t chargCloseVoltage; /* 充电关电池电压 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_chargRangeVoltageQueryResponse;
#define HY_chargRangeVoltageQueryResponse_PACK_SIZE (sizeof(HY_chargRangeVoltageQueryResponse))
/* 复位指令 */
typedef struct _HY_resetInstructionQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_resetInstructionQuery;
#define HY_resetInstructionQuery_PACK_SIZE (sizeof(HY_resetInstructionQuery))
/* 复位指令响应 */
typedef struct _HY_resetInstructionResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_resetInstructionResponse;
#define HY_resetInstructionResponse_PACK_SIZE (sizeof(HY_resetInstructionResponse))
#define HY_resetInstructionResponse_dataLen 5
/* 充电控制配置 */
typedef struct _HY_chargingControlConfig{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t chargInterface; /* 充电接口 */
uint8_t chargInterfaceControl; /* 充电接口控制 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_chargingControlConfig;
#define HY_chargingControlConfig_PACK_SIZE (sizeof(HY_chargingControlConfig))
/* 充电控制配置响应 */
typedef struct _HY_chargingControlConfigResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_chargingControlConfigResponse;
#define HY_chargingControlConfigResponse_PACK_SIZE (sizeof(HY_chargingControlConfigResponse))
#define HY_chargingControlConfigResponse_dataLen 5
/* 充电控制查询 */
typedef struct _HY_QueryChargingControl{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_QueryChargingControl;
#define HY_QueryChargingControl_PACK_SIZE (sizeof(HY_QueryChargingControl))
/* 充电控制查询响应 */
typedef struct _HY_QueryChargingControlResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t chargInterface1; /* 充电接口1状态 */
uint8_t chargInterface2; /* 充电接口2状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_QueryChargingControlResponse;
#define HY_QueryChargingControlResponse_PACK_SIZE (sizeof(HY_QueryChargingControlResponse))
#define HY_QueryChargingControlResponse_dataLen 6
/* 配置协议类型 */
typedef struct _HY_configProtocolType{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t protocolType; /* 协议类型; 0x01表示汇源协议(波特率9600) 0x02表示南瑞协议(波特率115200)*/
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_configProtocolType;
#define HY_configProtocolType_PACK_SIZE (sizeof(HY_configProtocolType))
/* 配置协议类型响应 */
typedef struct _HY_configProtocolTypeResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_configProtocolTypeResponse;
#define HY_configProtocolTypeResponse_PACK_SIZE (sizeof(HY_configProtocolTypeResponse))
#define HY_configProtocolTypeResponse_dataLen 5
/* 查询电池控制盒当前配置 */
typedef struct _HY_queryControlBoxConfigurationQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_queryControlBoxConfigurationQuery;
#define HY_queryControlBoxConfigurationQuery_PACK_SIZE (sizeof(HY_queryControlBoxConfigurationQuery))
/* 查询电池控制盒当前配置响应 */
typedef struct _HY_queryControlBoxConfigurationResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t protocolType; /* 协议类型; 0x01表示汇源协议(波特率9600) 0x02表示南瑞协议(波特率115200)*/
uint8_t voltageLevel; /* 电压等级 */
uint8_t mainBoardTemperatureSensorType; /* 主板温度传感器类型 */
uint8_t batteryTemperatureSensorType; /* 电池温度传感器类型 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_queryControlBoxConfigurationResponse;
#define HY_queryControlBoxConfigurationResponse_PACK_SIZE (sizeof(HY_queryControlBoxConfigurationResponse))
#define HY_queryControlBoxConfigurationResponse_dataLen 8
/* 查询电池控制盒软件版本 */
typedef struct _HY_SoftwareVersionQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_SoftwareVersionQuery;
#define HY_SoftwareVersionQuery_PACK_SIZE (sizeof(HY_SoftwareVersionQuery))
/* 查询电池控制盒软件版本响应 */
typedef struct _HY_SoftwareVersionQueryResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t versionInformation[13]; /* 版本信息 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_SoftwareVersionQueryResponse;
#define HY_SoftwareVersionQueryResponse_PACK_SIZE (sizeof(HY_SoftwareVersionQueryResponse))
#define HY_SoftwareVersionQueryResponse_dataLen 17
/* 进入配置模式 */
typedef struct _HY_enterConfigMode{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_enterConfigMode;
#define HY_enterConfigMode_PACK_SIZE (sizeof(HY_enterConfigMode))
/* 进入配置模式响应 */
typedef struct _HY_enterConfigModeResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_enterConfigModeResponse;
#define HY_enterConfigModeResponse_PACK_SIZE (sizeof(HY_enterConfigModeResponse))
#define HY_enterConfigModeResponse_dataLen 5
/* 配置控制盒硬件ID号 */
typedef struct _HY_configHardwareID{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t newHardwareID[6]; /* 新硬件ID高字节在前低字节在后 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_configHardwareID;
#define HY_configHardwareID_PACK_SIZE (sizeof(HY_configHardwareID))
/* 配置控制盒硬件ID号 响应*/
typedef struct _HY_configHardwareIDResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_configHardwareIDResponse;
#define HY_configHardwareIDResponse_PACK_SIZE (sizeof(HY_configHardwareIDResponse))
#define HY_configHardwareIDResponse_dataLen 5
/* 控制盒硬件ID号及通信ID号原传感器号查询 */
typedef struct _HY_QueryhardwareID_communicationID{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_QueryhardwareID_communicationID;
#define HY_QueryhardwareID_communicationID_PACK_SIZE (sizeof(HY_QueryhardwareID_communicationID))
/* 控制盒硬件ID号及通信ID号原传感器号查询响应 */
typedef struct _HY_QueryhardwareID_communicationIDResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t hardwareIDR[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationIDR[4]; /* 通信ID高字节在前低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_QueryhardwareID_communicationIDResponse;
#define HY_QueryhardwareID_communicationIDResponse_PACK_SIZE (sizeof(HY_QueryhardwareID_communicationIDResponse))
#define HY_QueryhardwareID_dataLen 14
/* 修改通信ID号原传感器号 */
typedef struct _HY_modifyCommunicationIDChange{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t newHardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t newCommunicationID[4]; /* 新通信ID高字节在前低字节在后 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_modifyCommunicationIDChange;
#define HY_modifyCommunicationIDChange_PACK_SIZE (sizeof(HY_modifyCommunicationIDChange))
/* 修改通信ID号原传感器号响应 */
typedef struct _HY_modifyCommunicationIDChangeResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_modifyCommunicationIDChangeResponse;
#define HY_modifyCommunicationIDChangeResponse_PACK_SIZE (sizeof(HY_modifyCommunicationIDChangeResponse))
#define HY_modifyCommunicationIDChangeResponse_dataLen 5
/* 查询主板温度值 */
typedef struct _HY_checkMotherboardTemperatureQuery{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_checkMotherboardTemperatureQuery;
#define HY_checkMotherboardTemperatureQuery_PACK_SIZE (sizeof(HY_checkMotherboardTemperatureQuery))
/* 查询主板温度值响应 */
typedef struct _HY_checkMotherboardTemperatureResponse{
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
float_t MotherboardTemperature; /* 主板温度 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_checkMotherboardTemperatureResponse;
#define HY_checkMotherboardTemperatureResponse_PACK_SIZE (sizeof(HY_checkMotherboardTemperatureResponse))
#define HY_checkMotherboardTemperatureResponse_dataLen 8
/* 配置时间 */
typedef struct _HY_configTime {
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
timeInfo time; /* 年月日时分秒 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_configTime;
#define HY_configTime_PACK_SIZE (sizeof(HY_configTime))
/* 配置时间响应 */
typedef struct _HY_configTimeResponse {
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint8_t state; /* 状态 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_configTimeResponse;
#define HY_configTimeResponse_PACK_SIZE (sizeof(HY_configTimeResponse))
#define HY_configTimeResponse_dataLen 5
/* 查询时间 */
typedef struct _HY_timeQuery {
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_timeQuery;
#define HY_timeQuery_PACK_SIZE (sizeof(HY_timeQuery))
/* 查询时间响应 */
typedef struct _HY_queryTimeResponse {
uint8_t start_Flag; /* 起始标志 */
uint8_t hardwareID[6]; /* 硬件ID高字节在前低字节在后 */
uint8_t communicationID[4]; /* 通信ID高字节在前低字节在后 */
uint8_t controlWord; /* 控制字 */
uint8_t dataLen[2]; /* 数据长度;高字节在前,低字节在后 */
timeInfo time; /* 年月日时分秒 */
uint32_t frameNumber; /* 帧序号 */
uint8_t check_Bit; /* 校验码 */
uint8_t end_Flag; /* 结束标志 */
}HY_queryTimeResponse;
#define HY_queryTimeResponse_PACK_SIZE (sizeof(HY_queryTimeResponse))
#define HY_queryTimeResponse_dataLen 10
/* 恢复默认的对齐设置 */
#pragma pack(pop)
/**
* @brief 校验算法
* @param 采用累加和取反的校验方式,将终端号码、传感器号码、控制字、数据长度
* 和数据区的所有字节进行算术累加,抛弃高位,只保留最后单字节,将单字节取反;
* @retval
*/
static uint8_t HY_CheckFunc(uint8_t *arr_buff, uint8_t len)
{
uint8_t temp = 0x00;
uint32_t sum = 0x00;
for(uint8_t i = 0; i < len; i++) {
sum += *arr_buff++;
}
temp = (~sum) & 0xff;
return temp;
}
/* 电池状态数据报 */
static void HY_MsgProcFunc_batteryStatus(device_handle device, void *pMsg, uint32_t MsgLen);
/* 电量统计数据报 */
static void HY_MsgProcFunc_electricityStatistics(device_handle device, void *pMsg, uint32_t MsgLen);
/* 传感器号码配置 */
static void HY_MsgProcFunc_sensorNumberConfiguration(device_handle device, void *pMsg, uint32_t MsgLen);
/* 传感器号码查询 */
static void HY_MsgProcFunc_sensorNumberInquiry(device_handle device, void *pMsg, uint32_t MsgLen);
/* 充电阈值电压配置 */
static void HY_MsgProcFunc_chargingThresholdVoltageConfiguration(device_handle device, void *pMsg, uint32_t MsgLen);
/* 充电域值电压查询 */
static void HY_MsgProcFunc_chargingRangeVoltageQuery(device_handle device, void *pMsg, uint32_t MsgLen);
/* 复位指令 */
static void HY_MsgProcFunc_resetInstruction(device_handle device, void *pMsg, uint32_t MsgLen);
/* 充电控制配置 */
static void HY_MsgProcFunc_chargingControlConfiguration(device_handle device, void *pMsg, uint32_t MsgLen);
/* 充电控制查询 */
static void HY_MsgProcFunc_chargingControlQuery(device_handle device, void *pMsg, uint32_t MsgLen);
/* 配置时间 */
static void HY_MsgProcFunc_configTime(device_handle device, void *pMsg, uint32_t MsgLen);
/* 查询时间 */
static void HY_MsgProcFunc_queryTime(device_handle device, void *pMsg, uint32_t MsgLen);
/* 配置协议类型 */
static void HY_MsgProcFunc_configureProtocolType(device_handle device, void *pMsg, uint32_t MsgLen);
///* 响应配置协议类型 */
//static void HY_MsgProcFunc_batteryStatus(device_handle device, void *pMsg, uint32_t MsgLen);
/* 查询电池控制盒当前配置 */
static void HY_MsgProcFunc_queryControlBoxConfiguration(device_handle device, void *pMsg, uint32_t MsgLen);
/* 查询电池控制盒软件版本 */
static void HY_MsgProcFunc_querySoftwareVersion(device_handle device, void *pMsg, uint32_t MsgLen);
/* 进入配置模式 */
static void HY_MsgProcFunc_enterConfigurationMode(device_handle device, void *pMsg, uint32_t MsgLen);
/* 配置控制盒硬件ID号 */
static void HY_MsgProcFunc_configureHardwareID(device_handle device, void *pMsg, uint32_t MsgLen);
/* 控制盒硬件ID号及通信ID号原传感器号查询 */
static void HY_MsgProcFunc_hardwareID_communicationIDQuery(device_handle device, void *pMsg, uint32_t MsgLen);
/* 修改通信ID号原传感器号 */
static void HY_MsgProcFunc_modifyCommunicationID(device_handle device, void *pMsg, uint32_t MsgLen);
/* 查询主板温度值 */
static void HY_MsgProcFunc_checkMotherboardTemperature(device_handle device, void *pMsg, uint32_t MsgLen);
/* 功能码处理表 */
HY_FuncionMsgProcTable g_hyMsgTbl[] =
{
{HY_batteryStatus, HY_MsgProcFunc_batteryStatus},
{HY_electricityStatistics, HY_MsgProcFunc_electricityStatistics},
{HY_sensorNumberConfiguration, HY_MsgProcFunc_sensorNumberConfiguration},
{HY_sensorNumberInquiry, HY_MsgProcFunc_sensorNumberInquiry},
{HY_chargingThresholdVoltageConfiguration, HY_MsgProcFunc_chargingThresholdVoltageConfiguration},
{HY_chargingRangeVoltageQuery, HY_MsgProcFunc_chargingRangeVoltageQuery},
{HY_resetInstruction, HY_MsgProcFunc_resetInstruction},
{HY_chargingControlConfiguration, HY_MsgProcFunc_chargingControlConfiguration},
{HY_chargingControlQuery, HY_MsgProcFunc_chargingControlQuery},
{HY_configureProtocolType, HY_MsgProcFunc_configureProtocolType},
// {HY_responseConfigureProtocolType, HY_MsgProcFunc_batteryStatus},
{HY_queryControlBoxConfiguration, HY_MsgProcFunc_queryControlBoxConfiguration},
{HY_querySoftwareVersion, HY_MsgProcFunc_querySoftwareVersion},
{HY_enterConfigurationMode, HY_MsgProcFunc_enterConfigurationMode},
{HY_configureHardwareID, HY_MsgProcFunc_configureHardwareID},
{HY_hardwareID_communicationIDQuery, HY_MsgProcFunc_hardwareID_communicationIDQuery},
{HY_modifyCommunicationID, HY_MsgProcFunc_modifyCommunicationID},
{HY_checkMotherboardTemperature, HY_MsgProcFunc_checkMotherboardTemperature},
{HY_configurationTime, HY_MsgProcFunc_configTime},
{HY_queryTime, HY_MsgProcFunc_queryTime},
};
/**
* @brief 读取HY协议配置状态
* @param None
* @retval TRUE 能修改配置
* FALSE 不能修改配置
*/
BOOL getHYconfigModeState(void)
{
return HYconfigModeState;
}
/**
* @brief 匹配广播ID
* @param address 地址
* @retval 1 匹配成功
* 0 匹配失败
*/
void setHYconfigModeState(BOOL state)
{
if (state == TRUE || state == FALSE) {
HYconfigModeState = state;
}
}
/**
* @brief 匹配广播ID
* @param address 地址
* @retval 1 匹配成功
* 0 匹配失败
*/
static int Match_BroadcastCommunicationID(u_int8_t communicationID[4])
{
if (communicationID[0] == 0xFF && \
communicationID[1] == 0xFF && \
communicationID[2] == 0xFF && \
communicationID[3] == 0xFF) {
// log_info("Match_BroadcastCommunicationID success\r\n");
return 1;
}
return 0;
}
/**
* @brief 匹配设备通信ID
* @param address 地址
* @retval 1 匹配成功
* 0 匹配失败
*/
static int HY_matchCommunicationID(u_int8_t communicationID[4])
{
if ((communicationID[0] == g_cfgParameter.communicationID[0]) && \
(communicationID[1] == g_cfgParameter.communicationID[1]) && \
(communicationID[2] == g_cfgParameter.communicationID[2]) && \
(communicationID[3] == g_cfgParameter.communicationID[3])) {
// log_info("Match_CommunicationIDHY success \r\n");
return 1;
}
return 0;
}
/**
* @brief 匹配设备硬件ID
* @param address 地址
* @retval 1 匹配成功
* 0 匹配失败
*/
static int HY_matchHardwareID(u_int8_t hardwareID[6])
{
if ((hardwareID[0] == g_cfgParameter.hardwareID[0]) && \
(hardwareID[1] == g_cfgParameter.hardwareID[1]) && \
(hardwareID[2] == g_cfgParameter.hardwareID[2]) && \
(hardwareID[3] == g_cfgParameter.hardwareID[3]) && \
(hardwareID[4] == g_cfgParameter.hardwareID[4]) && \
(hardwareID[5] == g_cfgParameter.hardwareID[5])) {
// log_info("Match_hardwareIDHY success \r\n");
return 1;
}
return 0;
}
/**
* @brief 匹配广播硬件ID
* @param address 地址
* @retval 1 匹配成功
* 0 匹配失败
*/
static int Match_BroadcastHardwareID(u_int8_t hardwareID[6])
{
if (hardwareID[0] == 0xFF && \
hardwareID[1] == 0xFF && \
hardwareID[2] == 0xFF && \
hardwareID[3] == 0xFF && \
hardwareID[4] == 0xFF && \
hardwareID[5] == 0xFF) {
// log_info("Match_BroadcastHardwareID success\r\n");
return 1;
}
return 0;
}
/**
* @brief 读取串口数据
* @param uart_handle 串口句柄
* @param buff 缓冲区
* @param buff_size 缓冲区长度
* @retval
*/
static int HY_uart_read_climate_pack(device_handle uart_handle,uint8_t *buff, uint32_t buff_size)
{
uint32_t offset = 0;
uint32_t len = 0;
uint8_t flag_run = 0;
/* 接收到的硬件ID种类
* 0x01 广播ID
* 0x02 硬件ID
**/
uint8_t hardwordIDType = 0;
uint8_t c = 0;
HY_Recv_pack *pack = (HY_Recv_pack *)buff;
buff_size--; //预留一个'\0'位置
for (; offset < buff_size;){
if (uart_dev_char_present(uart_handle) == 0) {
break;
}
c = uart_dev_in_char(uart_handle);
buff[offset++] = c;
inConfigBuff(c);
/* 匹配起始标志位 */
if (offset == HY_analyzeStartFlag || (flag_run > 0)) {
if (pack->start_Flag != g_cfgParameter.startFlagHY) {
// log_info(" Match_start_Flag error %x ", pack->start_Flag);
// printf("1 : %x \n", pack->start_Flag);
memcpy(buff, buff+1, offset-1);
offset--;
continue;
}
// log_info(" Match_start_Flag success ");
// printf("%x\n", pack->start_Flag);
}
/* 匹配硬件ID */
if (offset == HY_analyzeHardwareID || (flag_run > 1)) {
if (HY_matchHardwareID(pack->hardwareID)) {
hardwordIDType = 0x02;
}
else if (Match_BroadcastHardwareID(pack->hardwareID)) {
hardwordIDType = 0x01;
}
else {
// log_info("Match_hardwordID error");
hardwordIDType = 0x00;
if (flag_run < 1) {
flag_run = 1;
}
memcpy(buff, buff+1, offset-1);
offset--;
continue;
}
}
/* 匹配通信ID */
if (offset == HY_analyzeCommunicationID || (flag_run > 2)) {
if (!(HY_matchCommunicationID(pack->communicationID) || Match_BroadcastCommunicationID(pack->communicationID))) {
if (flag_run < 2) {
flag_run = 2;
}
// log_info("Match_CommunicationID error");
memcpy(buff, buff+1, offset-1);
offset--;
continue;
}
}
/* 匹配 */
if (offset == HY_analyzeControlWord || (flag_run > 3)) {
if (pack->controlWord == HY_batteryStatus && hardwordIDType == 0x02) {
len = HY_batteryStatusQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_electricityStatistics && hardwordIDType == 0x02) {
len = HY_electricityStatisticsQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_sensorNumberConfiguration && hardwordIDType == 0x02) {
len = HY_sensorNumberConfiguration_PACK_SIZE;
}
else if (pack->controlWord == HY_sensorNumberInquiry && hardwordIDType == 0x01) {
len = HY_sensorNumberInquiryQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_chargingThresholdVoltageConfiguration && hardwordIDType == 0x02) {
len = HY_chargingThresholdVoltageConfig_PACK_SIZE;
}
else if (pack->controlWord == HY_chargingRangeVoltageQuery && hardwordIDType == 0x02) {
len = HY_chargRangeVoltageQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_resetInstruction && hardwordIDType == 0x02) {
len = HY_resetInstructionQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_chargingControlConfiguration && hardwordIDType == 0x02) {
len = HY_chargingControlConfig_PACK_SIZE;
}
else if (pack->controlWord == HY_chargingControlQuery && hardwordIDType == 0x02) {
len = HY_QueryChargingControl_PACK_SIZE;
}
else if (pack->controlWord == HY_configureProtocolType && hardwordIDType == 0x02) {
len = HY_configProtocolType_PACK_SIZE;
}
else if (pack->controlWord == HY_queryControlBoxConfiguration && hardwordIDType == 0x02) {
len = HY_queryControlBoxConfigurationQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_querySoftwareVersion && hardwordIDType == 0x02) {
len = HY_SoftwareVersionQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_enterConfigurationMode && hardwordIDType == 0x02) {
len = HY_enterConfigMode_PACK_SIZE;
}
else if (pack->controlWord == HY_configureHardwareID && hardwordIDType == 0x02) {
len = HY_configHardwareID_PACK_SIZE;
}
else if (pack->controlWord == HY_hardwareID_communicationIDQuery && hardwordIDType == 0x01) {
len = HY_QueryhardwareID_communicationID_PACK_SIZE;
}
else if (pack->controlWord == HY_modifyCommunicationID && hardwordIDType == 0x02) {
len = HY_modifyCommunicationIDChange_PACK_SIZE;
}
else if (pack->controlWord == HY_checkMotherboardTemperature && hardwordIDType == 0x02) {
len = HY_checkMotherboardTemperatureQuery_PACK_SIZE;
}
else if (pack->controlWord == HY_configurationTime && hardwordIDType == 0x02) {
len = HY_configTime_PACK_SIZE;
}
else if (pack->controlWord == HY_queryTime && hardwordIDType == 0x02) {
len = HY_timeQuery_PACK_SIZE;
}
else {
if (flag_run < 3) {
flag_run = 3;
}
// log_info("Match_controlWord error");
memcpy(buff, buff+1, offset-1);
offset--;
continue;
}
}
/* 匹配数据长度 */
if (offset == HY_analyzeDataLen || (flag_run > 4)) {
if (len != ((pack->dataLen[0] << 8 | pack->dataLen[1]) + 16)) {
if (flag_run < 4) {
flag_run = 4;
}
// log_info("Match_dataLen error: %x", len);
// log_info("Match_dataLen error: %x", (pack->dataLen[0] << 8 | pack->dataLen[1]) + 16);
// log_info("Match_dataLen error: %x", pack->dataLen[0]);
// log_info("Match_dataLen error: %x", pack->dataLen[1]);
memcpy(buff, buff+1, offset-1);
offset--;
continue;
}
}
if (offset == len) {
if (buff[len - 2] != HY_CheckFunc(buff, len - 2)
&& buff[len - 1] != g_cfgParameter.endFlagHY) {
if (flag_run < 5) {
flag_run = 5;
}
// log_info("check: %x, %x", (HY_CheckFunc(buff, len - 2) & 0xff), buff[len - 2]);
memcpy(buff, buff+1, offset-1);
offset--;
continue;
}
zeroConfigBuff();
return len;
}
}
return 0;
}
/**
* @brief 处理一条消息
* @param
* @retval
*/
static void HY_FRT_MsgHandler(device_handle device, uint8_t *pMsg, uint32_t MsgLen)
{
HY_Recv_pack *pack = (HY_Recv_pack *)pMsg;
for (u_int16_t i = 0; i < sizeof(g_hyMsgTbl) / sizeof(HY_FuncionMsgProcTable); i++){
if (pack->controlWord == g_hyMsgTbl[i].msgId){
g_hyMsgTbl[i].pMsgProc(device, pMsg, MsgLen);
}
}
}
/**
* @brief 读取并解析串口数据
* @param
* @retval
*/
void HY_read_and_process_uart_data(device_handle device)
{
// if (uart_dev_char_present(device)) {
// Delay_Ms(20);
// memset(rs485_buff, 0, sizeof(rs485_buff));
// int ret = HY_uart_read_climate_pack(device, rs485_buff, sizeof(rs485_buff));
// if(ret > 0){
// HY_FRT_MsgHandler(device, rs485_buff, ret);
// }
// }
memset(rs485_buff, 0, sizeof(rs485_buff));
int ret = HY_uart_read_climate_pack(device, rs485_buff, sizeof(rs485_buff));
if(ret > 0){
HY_FRT_MsgHandler(device, rs485_buff, ret);
}
}
/* 电池状态数据报 */
void HY_MsgProcFunc_batteryStatus(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_batteryStatusResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = HY_batteryStatus;
pack.dataLen[0] = HY_batteryStatusResponse_dataLen >> 8;
pack.dataLen[1] = HY_batteryStatusResponse_dataLen;
pack.batteryVoltage = getBatteryVoltage();
// pack.batteryVoltage = 6.66;
pack.dischargCurrent = getDischargCurrent();
pack.chargCurrent1 = getChargCurrent();
pack.SOC = getSOC();
pack.openCircuitVoltage1 = getSolarOpenCircuitVoltage();
// if (getDutyRatio() > 0 && getChargCurrent() > 0.05) {
if (getDutyRatio() > 0) {
pack.chargSwitchStatus1 = HY_switchON;
} else {
pack.chargSwitchStatus1 = HY_switchOFF;
}
pack.chargCurrent2 = pack.chargCurrent1;
pack.openCircuitVoltage2 = pack.openCircuitVoltage1;
pack.chargSwitchStatus2 = pack.chargSwitchStatus1;
pack.Mos_Temperature = getHighSideMosTemperature();
HY_batteryStatusQuery *Tpack = (HY_batteryStatusQuery *)pMsg;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_batteryStatusResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
// uart_interruptSend(device, (uint8_t *)&pack, HY_batteryStatusResponse_PACK_SIZE);
uart_dev_write(device, &pack, HY_batteryStatusResponse_PACK_SIZE);
}
/* 电量统计数据报 */
void HY_MsgProcFunc_electricityStatistics(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_electricityStatisticsResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = HY_electricityStatistics;
pack.dataLen[0] = HY_electricityStatisticsResponse_dataLen >> 8;
pack.dataLen[1] = HY_electricityStatisticsResponse_dataLen;
pack.statisticalDuration = 0;
pack.totalChargCapacity = getTotalChargCapacity();
pack.totalElectricityConsumption = getTotalElectricityConsumption();
/* 查询后清空 */
totalChargCapacityInt(0);
totalElectricityConsumptionInt(0);
// float temp = 0;
// // temp = getTotalChargCapacity();
// savetotalChargCapacity(&temp);
// // temp = getTotalElectricityConsumption();
// savetotalElectricityConsumption(&temp);
HY_electricityStatisticsQuery *Tpack = (HY_electricityStatisticsQuery *)pMsg;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_electricityStatisticsResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
// uart_interruptSend(device, (uint8_t *)&pack, HY_electricityStatisticsResponse_PACK_SIZE);
uart_dev_write(device, &pack, HY_electricityStatisticsResponse_PACK_SIZE);
}
/* 传感器号码配置 */
void HY_MsgProcFunc_sensorNumberConfiguration(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_sensorNumberConfigurationResponse pack;
HY_sensorNumberConfig *Tpack = (HY_sensorNumberConfig *)pMsg;
if (HY_matchHardwareID(Tpack->newHardwareID)) {
g_cfgParameter.communicationID[0] = Tpack->newCommunicationID[0];
g_cfgParameter.communicationID[1] = Tpack->newCommunicationID[1];
g_cfgParameter.communicationID[2] = Tpack->newCommunicationID[2];
g_cfgParameter.communicationID[3] = Tpack->newCommunicationID[3];
config_info temp_configInfo;
read_config_info(&temp_configInfo);
temp_configInfo.communicationID[0] = Tpack->newCommunicationID[0];
temp_configInfo.communicationID[1] = Tpack->newCommunicationID[1];
temp_configInfo.communicationID[2] = Tpack->newCommunicationID[2];
temp_configInfo.communicationID[3] = Tpack->newCommunicationID[3];
temp_configInfo.crc = checkModebusCrc((uint8_t *)&temp_configInfo, CONFIG_INFO_SIZE - 2);
saveConfigInfo(&temp_configInfo);
pack.state = HY_success;
}
else {
pack.state = HY_fail;
}
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_sensorNumberConfigurationResponse_dataLen >> 8;
pack.dataLen[1] = HY_sensorNumberConfigurationResponse_dataLen;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_sensorNumberConfigurationResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_sensorNumberConfigurationResponse_PACK_SIZE);
}
/* 传感器号码查询 */
void HY_MsgProcFunc_sensorNumberInquiry(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_sensorNumberInquiryQuery *Tpack = (HY_sensorNumberInquiryQuery *)pMsg;
HY_sensorNumberInquiryResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_sensorNumberInquiryResponse_dataLen >> 8;
pack.dataLen[1] = HY_sensorNumberInquiryResponse_dataLen;
pack.hardwareIDR[0] = g_cfgParameter.hardwareID[0];
pack.hardwareIDR[1] = g_cfgParameter.hardwareID[1];
pack.hardwareIDR[2] = g_cfgParameter.hardwareID[2];
pack.hardwareIDR[3] = g_cfgParameter.hardwareID[3];
pack.hardwareIDR[4] = g_cfgParameter.hardwareID[4];
pack.hardwareIDR[5] = g_cfgParameter.hardwareID[5];
pack.communicationIDR[0] = g_cfgParameter.communicationID[0];
pack.communicationIDR[1] = g_cfgParameter.communicationID[1];
pack.communicationIDR[2] = g_cfgParameter.communicationID[2];
pack.communicationIDR[3] = g_cfgParameter.communicationID[3];
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_sensorNumberInquiryResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_sensorNumberInquiryResponse_PACK_SIZE);
}
/* 充电阈值电压配置 */
void HY_MsgProcFunc_chargingThresholdVoltageConfiguration(device_handle device, void *pMsg, uint32_t MsgLen)
{
}
/* 充电域值电压查询 */
void HY_MsgProcFunc_chargingRangeVoltageQuery(device_handle device, void *pMsg, uint32_t MsgLen)
{
}
/* 复位指令 */
void HY_MsgProcFunc_resetInstruction(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_resetInstructionQuery *Tpack = (HY_resetInstructionQuery *)pMsg;
HY_resetInstructionResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_resetInstructionResponse_dataLen >> 8;
pack.dataLen[1] = HY_resetInstructionResponse_dataLen;
pack.state = HY_success;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_resetInstructionResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_resetInstructionResponse_PACK_SIZE);
/* 复位 */
NVIC_SystemReset();
}
/* 充电控制配置 */
void HY_MsgProcFunc_chargingControlConfiguration(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_chargingControlConfig *Tpack = (HY_chargingControlConfig *)pMsg;
if (Tpack->chargInterfaceControl == HY_cSwitchON) {
if (getDutyRatio() == 0) {
beginChargWork();
}
}
if (Tpack->chargInterfaceControl == HY_cSwitchOFF) {
if (getDutyRatio() != 0) {
stopChargWork();
}
}
HY_chargingControlConfigResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_chargingControlConfigResponse_dataLen >> 8;
pack.dataLen[1] = HY_chargingControlConfigResponse_dataLen;
pack.state = HY_success;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_chargingControlConfigResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_chargingControlConfigResponse_PACK_SIZE);
}
/* 充电控制查询 */
static void HY_MsgProcFunc_chargingControlQuery(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_QueryChargingControl *Tpack = (HY_QueryChargingControl *)pMsg;
HY_QueryChargingControlResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_QueryChargingControlResponse_dataLen >> 8;
pack.dataLen[1] = HY_QueryChargingControlResponse_dataLen;
// if (getDutyRatio() > 0 && g_cfgParameter.Charg_Current > 0.05) {
if (getDutyRatio() > 0) {
pack.chargInterface1 = HY_switchON;
} else {
pack.chargInterface1 = HY_switchOFF;
}
pack.chargInterface2 = pack.chargInterface1;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_QueryChargingControlResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_QueryChargingControlResponse_PACK_SIZE);
}
/* 配置协议类型 */
void HY_MsgProcFunc_configureProtocolType(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_configProtocolType *Tpack = (HY_configProtocolType *)pMsg;
g_cfgParameter.protocolType = Tpack->protocolType;
config_info temp_configInfo;
read_config_info(&temp_configInfo);
temp_configInfo.protocolType = Tpack->protocolType;
temp_configInfo.crc = checkModebusCrc((uint8_t *)&temp_configInfo, CONFIG_INFO_SIZE - 2);
saveConfigInfo(&temp_configInfo);
if (g_cfgParameter.protocolType == 0x01) {
g_cfgParameter.gw485_Baud = 9600;
} else if (g_cfgParameter.protocolType == 0x02) {
g_cfgParameter.gw485_Baud = 115200;
}
HY_chargingControlConfigResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = HY_responseConfigureProtocolType;
pack.dataLen[0] = HY_configProtocolTypeResponse_dataLen >> 8;
pack.dataLen[1] = HY_configProtocolTypeResponse_dataLen;
pack.state = HY_success;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_configProtocolTypeResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_configProtocolTypeResponse_PACK_SIZE);
Init_GW485_uart(g_cfgParameter.gw485_Baud);
}
/* 查询电池控制盒当前配置 */
void HY_MsgProcFunc_queryControlBoxConfiguration(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_queryControlBoxConfigurationQuery *Tpack = (HY_queryControlBoxConfigurationQuery *)pMsg;
HY_queryControlBoxConfigurationResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_queryControlBoxConfigurationResponse_dataLen >> 8;
pack.dataLen[1] = HY_queryControlBoxConfigurationResponse_dataLen;
// pack.state = HY_success;
pack.protocolType = g_cfgParameter.protocolType;
pack.voltageLevel = 0x00; //12V
pack.mainBoardTemperatureSensorType = 0xFF;
pack.batteryTemperatureSensorType = 0xFF;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_queryControlBoxConfigurationResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_queryControlBoxConfigurationResponse_PACK_SIZE);
}
/* 查询电池控制盒软件版本 */
void HY_MsgProcFunc_querySoftwareVersion(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_SoftwareVersionQuery *Tpack = (HY_SoftwareVersionQuery *)pMsg;
HY_SoftwareVersionQueryResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_SoftwareVersionQueryResponse_dataLen >> 8;
pack.dataLen[1] = HY_SoftwareVersionQueryResponse_dataLen;
// strlcpy(pack.versionInformation, getVersionInformation(), 13);
memcpy(pack.versionInformation, getVersionInformation(), 13);
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_SoftwareVersionQueryResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_SoftwareVersionQueryResponse_PACK_SIZE);
}
/* 进入配置模式 */
void HY_MsgProcFunc_enterConfigurationMode(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_enterConfigMode *Tpack = (HY_enterConfigMode *)pMsg;
HY_enterConfigModeResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_enterConfigModeResponse_dataLen >> 8;
pack.dataLen[1] = HY_enterConfigModeResponse_dataLen;
pack.state = HY_success;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_enterConfigModeResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_enterConfigModeResponse_PACK_SIZE);
beginHYconfigMode();
}
/* 配置控制盒硬件ID号 */
void HY_MsgProcFunc_configureHardwareID(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_configHardwareIDResponse pack;
HY_configHardwareID *Tpack = (HY_configHardwareID *)pMsg;
if (getHYconfigModeState() == TRUE) {
g_cfgParameter.hardwareID[0] = Tpack->hardwareID[0];
g_cfgParameter.hardwareID[1] = Tpack->hardwareID[1];
g_cfgParameter.hardwareID[2] = Tpack->hardwareID[2];
g_cfgParameter.hardwareID[3] = Tpack->hardwareID[3];
g_cfgParameter.hardwareID[4] = Tpack->hardwareID[4];
g_cfgParameter.hardwareID[5] = Tpack->hardwareID[5];
config_info temp_configInfo;
read_config_info(&temp_configInfo);
temp_configInfo.hardwareID[0] = Tpack->hardwareID[0];
temp_configInfo.hardwareID[1] = Tpack->hardwareID[1];
temp_configInfo.hardwareID[2] = Tpack->hardwareID[2];
temp_configInfo.hardwareID[3] = Tpack->hardwareID[3];
temp_configInfo.hardwareID[4] = Tpack->hardwareID[4];
temp_configInfo.hardwareID[5] = Tpack->hardwareID[5];
temp_configInfo.crc = checkModebusCrc((uint8_t *)&temp_configInfo, CONFIG_INFO_SIZE - 2);
saveConfigInfo(&temp_configInfo);
pack.state = HY_success;
}
else {
pack.state = HY_fail;
}
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_configHardwareIDResponse_dataLen >> 8;
pack.dataLen[1] = HY_configHardwareIDResponse_dataLen;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_configHardwareIDResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_configHardwareIDResponse_PACK_SIZE);
}
/* 控制盒硬件ID号及通信ID号原传感器号查询 */
void HY_MsgProcFunc_hardwareID_communicationIDQuery(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_QueryhardwareID_communicationID *Tpack = (HY_QueryhardwareID_communicationID *)pMsg;
HY_QueryhardwareID_communicationIDResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_QueryhardwareID_dataLen >> 8;
pack.dataLen[1] = HY_QueryhardwareID_dataLen;
pack.hardwareIDR[0] = g_cfgParameter.hardwareID[0];
pack.hardwareIDR[1] = g_cfgParameter.hardwareID[1];
pack.hardwareIDR[2] = g_cfgParameter.hardwareID[2];
pack.hardwareIDR[3] = g_cfgParameter.hardwareID[3];
pack.hardwareIDR[4] = g_cfgParameter.hardwareID[4];
pack.hardwareIDR[5] = g_cfgParameter.hardwareID[5];
pack.communicationIDR[0] = g_cfgParameter.communicationID[0];
pack.communicationIDR[1] = g_cfgParameter.communicationID[1];
pack.communicationIDR[2] = g_cfgParameter.communicationID[2];
pack.communicationIDR[3] = g_cfgParameter.communicationID[3];
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_QueryhardwareID_communicationIDResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_QueryhardwareID_communicationIDResponse_PACK_SIZE);
}
/* 修改通信ID号原传感器号 */
void HY_MsgProcFunc_modifyCommunicationID(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_modifyCommunicationIDChangeResponse pack;
HY_modifyCommunicationIDChange *Tpack = (HY_modifyCommunicationIDChange *)pMsg;
if (HY_matchHardwareID(Tpack->newHardwareID)) {
g_cfgParameter.communicationID[0] = Tpack->newCommunicationID[0];
g_cfgParameter.communicationID[1] = Tpack->newCommunicationID[1];
g_cfgParameter.communicationID[2] = Tpack->newCommunicationID[2];
g_cfgParameter.communicationID[3] = Tpack->newCommunicationID[3];
config_info temp_configInfo;
read_config_info(&temp_configInfo);
temp_configInfo.communicationID[0] = Tpack->newCommunicationID[0];
temp_configInfo.communicationID[1] = Tpack->newCommunicationID[1];
temp_configInfo.communicationID[2] = Tpack->newCommunicationID[2];
temp_configInfo.communicationID[3] = Tpack->newCommunicationID[3];
temp_configInfo.crc = checkModebusCrc((uint8_t *)&temp_configInfo, CONFIG_INFO_SIZE - 2);
saveConfigInfo(&temp_configInfo);
pack.state = HY_success1;
}
else {
pack.state = HY_fail;
}
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_modifyCommunicationIDChangeResponse_dataLen >> 8;
pack.dataLen[1] = HY_modifyCommunicationIDChangeResponse_dataLen;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_modifyCommunicationIDChangeResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_modifyCommunicationIDChangeResponse_PACK_SIZE);
}
/* 查询主板温度值 */
void HY_MsgProcFunc_checkMotherboardTemperature(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_checkMotherboardTemperatureQuery *Tpack = (HY_checkMotherboardTemperatureQuery *)pMsg;
HY_checkMotherboardTemperatureResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_checkMotherboardTemperatureResponse_dataLen >> 8;
pack.dataLen[1] = HY_checkMotherboardTemperatureResponse_dataLen;
pack.MotherboardTemperature = getHighSideMosTemperature();
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_checkMotherboardTemperatureResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_checkMotherboardTemperatureResponse_PACK_SIZE);
}
/* 配置时间 */
void HY_MsgProcFunc_configTime(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_configTime *Tpack = (HY_configTime *)pMsg;
setRTC_Time(&Tpack->time);
HY_configTimeResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_configTimeResponse_dataLen >> 8;
pack.dataLen[1] = HY_configTimeResponse_dataLen;
pack.state = HY_success;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_configTimeResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_configTimeResponse_PACK_SIZE);
}
/* 查询时间 */
static void HY_MsgProcFunc_queryTime(device_handle device, void *pMsg, uint32_t MsgLen)
{
HY_timeQuery *Tpack = (HY_timeQuery *)pMsg;
HY_queryTimeResponse pack;
pack.start_Flag = g_cfgParameter.startFlagHY;
pack.hardwareID[0] = g_cfgParameter.hardwareID[0];
pack.hardwareID[1] = g_cfgParameter.hardwareID[1];
pack.hardwareID[2] = g_cfgParameter.hardwareID[2];
pack.hardwareID[3] = g_cfgParameter.hardwareID[3];
pack.hardwareID[4] = g_cfgParameter.hardwareID[4];
pack.hardwareID[5] = g_cfgParameter.hardwareID[5];
pack.communicationID[0] = g_cfgParameter.communicationID[0];
pack.communicationID[1] = g_cfgParameter.communicationID[1];
pack.communicationID[2] = g_cfgParameter.communicationID[2];
pack.communicationID[3] = g_cfgParameter.communicationID[3];
pack.controlWord = Tpack->controlWord;
pack.dataLen[0] = HY_queryTimeResponse_dataLen >> 8;
pack.dataLen[1] = HY_queryTimeResponse_dataLen;
timeInfo time;
getRTC_Time(&time);
pack.time = time;
pack.frameNumber = Tpack->frameNumber;
pack.check_Bit = HY_CheckFunc((uint8_t *)(&pack), HY_queryTimeResponse_PACK_SIZE - 2);
pack.end_Flag = g_cfgParameter.endFlagHY;
uart_dev_write(device, &pack, HY_queryTimeResponse_PACK_SIZE);
}