#include #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 "interruptSend.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]; /* 数据长度;高字节在前,低字节在后 */ uint32_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]; /* 数据长度;高字节在前,低字节在后 */ timeInfo time; /* 年月日时分秒 */ uint32_t frameNumber; /* 帧序号 */ 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; timeInfo time1, time2 = {0}; getRTC_Time(&time1); time2 = getLastTime(); pack.statisticalDuration = differTime(&time1, &time2); setLastTime(time1); // 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_interruptSend(device, (uint8_t *)&pack, HY_sensorNumberConfigurationResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_sensorNumberInquiryResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_resetInstructionResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_chargingControlConfigResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_QueryChargingControlResponse_PACK_SIZE); uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_configProtocolTypeResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_queryControlBoxConfigurationResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_SoftwareVersionQueryResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_enterConfigModeResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_configHardwareIDResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_QueryhardwareID_communicationIDResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_modifyCommunicationIDChangeResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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_interruptSend(device, (uint8_t *)&pack, HY_checkMotherboardTemperatureResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&pack, HY_checkMotherboardTemperatureResponse_PACK_SIZE); } /* 配置时间 */ void HY_MsgProcFunc_configTime(device_handle device, void *pMsg, uint32_t MsgLen) { HY_configTime *Tpack = (HY_configTime *)pMsg; // static timeInfo time; // time = Tpack->time; // setRTC_Time(&time); setRTC_Time((timeInfo *)&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_interruptSend(device, (uint8_t *)&pack, HY_configTimeResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&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; static 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_interruptSend(device, (uint8_t *)&pack, HY_queryTimeResponse_PACK_SIZE); // uart_dev_write(device, (uint8_t *)&pack, HY_queryTimeResponse_PACK_SIZE); }