#include "hostMcuComm.h" #include "hostQueueUart.h" #include "hostParameter.h" #include "uart_dev.h" #include "FM_GPIO.h" #include "FreeRTOS.h" #include "task.h" #include "mcu_common.h" /* 配置文件数据类型表 */ enum { workCurrent = 0x0000, workVoltage = 0x0001, workTemperature = 0x0002, J1_Power = 0x0003, J2_Power = 0x0004, J3_Power = 0x0005, J4_Power = 0x0006, J5_Power = 0x0007, J6_Power = 0x0008, J7_Power = 0x0009, J8_Power = 0x000A, J9_Power = 0x000B, /* (1字节)对智能模块通信波特率(00H:不使用该串口, 01H:4800;02H:9600;03H:19200;04H:38400;05H:57600;06H:115200) */ J0_485_Communication_Baud_Rate = 0x000C, J2_485_Communication_Baud_Rate = 0x000D, J4_485_Communication_Baud_Rate = 0x000E, J6_485_Communication_Baud_Rate = 0x000F, Lora_uart_Communication_Baud_Rate = 0x0010, }; /* 寄存器解析 */ static uint16_t ReadRegisterWorkCurrent(void *pMsg); static uint16_t ReadRegisterWorkVoltage(void *pMsg); static uint16_t ReadRegisterWorkTemperature(void *pMsg); static uint16_t ReadRegisterJ1_Power(void *pMsg); static uint16_t ReadRegisterJ2_Power(void *pMsg); static uint16_t ReadRegisterJ3_Power(void *pMsg); static uint16_t ReadRegisterJ4_Power(void *pMsg); static uint16_t ReadRegisterJ5_Power(void *pMsg); static uint16_t ReadRegisterJ6_Power(void *pMsg); static uint16_t ReadRegisterJ7_Power(void *pMsg); static uint16_t ReadRegisterJ8_Power(void *pMsg); static uint16_t ReadRegisterJ9_Power(void *pMsg); static uint16_t ReadRegisterJ0Baud(void *pMsg); static uint16_t ReadRegisterJ2Baud(void *pMsg); static uint16_t ReadRegisterJ4Baud(void *pMsg); static uint16_t ReadRegisterJ6Baud(void *pMsg); static uint16_t ReadRegisterLoraBaud(void *pMsg); static uint16_t WriteRegisterJ1_Power(void *pMsg); static uint16_t WriteRegisterJ2_Power(void *pMsg); static uint16_t WriteRegisterJ3_Power(void *pMsg); static uint16_t WriteRegisterJ4_Power(void *pMsg); static uint16_t WriteRegisterJ5_Power(void *pMsg); static uint16_t WriteRegisterJ6_Power(void *pMsg); static uint16_t WriteRegisterJ7_Power(void *pMsg); static uint16_t WriteRegisterJ8_Power(void *pMsg); static uint16_t WriteRegisterJ9_Power(void *pMsg); static uint16_t WriteRegisterJ0Baud(void *pMsg); static uint16_t WriteRegisterJ2Baud(void *pMsg); static uint16_t WriteRegisterJ4Baud(void *pMsg); static uint16_t WriteRegisterJ6Baud(void *pMsg); static uint16_t WriteRegisterLoraBaud(void *pMsg); /* 寄存器处理表 */ typedef uint16_t (*RegProcFunc)(void*); typedef struct _SL_RegProcTable{ uint32_t regId; RegProcFunc pRegProc; }SL_RegProcTable; /* 读取寄存器处理表 */ SL_RegProcTable m_host_RegTblR[] = { {workCurrent, ReadRegisterWorkCurrent}, {workVoltage, ReadRegisterWorkVoltage}, {workTemperature, ReadRegisterWorkTemperature}, {J1_Power, ReadRegisterJ1_Power}, {J2_Power, ReadRegisterJ2_Power}, {J3_Power, ReadRegisterJ3_Power}, {J4_Power, ReadRegisterJ4_Power}, {J5_Power, ReadRegisterJ5_Power}, {J6_Power, ReadRegisterJ6_Power}, {J7_Power, ReadRegisterJ7_Power}, {J8_Power, ReadRegisterJ8_Power}, {J9_Power, ReadRegisterJ9_Power}, {J0_485_Communication_Baud_Rate, ReadRegisterJ0Baud}, {J2_485_Communication_Baud_Rate, ReadRegisterJ2Baud}, {J4_485_Communication_Baud_Rate, ReadRegisterJ4Baud}, {J6_485_Communication_Baud_Rate, ReadRegisterJ6Baud}, {Lora_uart_Communication_Baud_Rate, ReadRegisterLoraBaud}, }; /* 写入寄存器处理表 */ SL_RegProcTable m_host_RegTblW[] = { {J1_Power, WriteRegisterJ1_Power}, {J2_Power, WriteRegisterJ2_Power}, {J3_Power, WriteRegisterJ3_Power}, {J4_Power, WriteRegisterJ4_Power}, {J5_Power, WriteRegisterJ5_Power}, {J6_Power, WriteRegisterJ6_Power}, {J7_Power, WriteRegisterJ7_Power}, {J8_Power, WriteRegisterJ8_Power}, {J9_Power, WriteRegisterJ9_Power}, {J0_485_Communication_Baud_Rate, WriteRegisterJ0Baud}, {J2_485_Communication_Baud_Rate, WriteRegisterJ2Baud}, {J4_485_Communication_Baud_Rate, WriteRegisterJ4Baud}, {J6_485_Communication_Baud_Rate, WriteRegisterJ6Baud}, {Lora_uart_Communication_Baud_Rate, WriteRegisterLoraBaud}, }; /** * @brief 读取工作电流 * @param * @retval */ uint16_t ReadRegisterWorkCurrent(void *pMsg) { return (uint16_t)(getWorkCurrent() * 10); } /** * @brief 读取工作电压 * @param * @retval */ uint16_t ReadRegisterWorkVoltage(void *pMsg) { return (uint16_t)(getWorkVoltage() * 10); } /** * @brief 读取工作温度 * @param * @retval */ uint16_t ReadRegisterWorkTemperature(void *pMsg) { return (uint16_t)(getBoardTemperature() * 10); } /** * @brief 读取J1电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ1_Power(void *pMsg) { return readPwrCtrlState(J1_PwrCtrl); } /** * @brief 读取J2电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ2_Power(void *pMsg) { return readPwrCtrlState(J2_PwrCtrl); } /** * @brief 读取J3电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ3_Power(void *pMsg) { return readPwrCtrlState(J3_PwrCtrl); } /** * @brief 读取J4电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ4_Power(void *pMsg) { return readPwrCtrlState(J4_PwrCtrl); } /** * @brief 读取J5电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ5_Power(void *pMsg) { return readPwrCtrlState(J5_PwrCtrl); } /** * @brief 读取J6电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ6_Power(void *pMsg) { return readPwrCtrlState(J6_PwrCtrl); } /** * @brief 读取J7电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ7_Power(void *pMsg) { return readPwrCtrlState(J7_PwrCtrl); } /** * @brief 读取J8电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ8_Power(void *pMsg) { return readPwrCtrlState(J8_PwrCtrl); } /** * @brief 读取J9电源开关状态 * @param * @retval */ uint16_t ReadRegisterJ9_Power(void *pMsg) { return readPwrCtrlState(J9_PwrCtrl); } /** * @brief 读取J0通信波特率 * @param * @retval */ uint16_t ReadRegisterJ0Baud(void *pMsg) { return baudConversionConfig(getJ0_485_Baud()); } /** * @brief 读取J2通信波特率 * @param * @retval */ uint16_t ReadRegisterJ2Baud(void *pMsg) { return baudConversionConfig(getJ2_485_Baud()); } /** * @brief 读取J4通信波特率 * @param * @retval */ uint16_t ReadRegisterJ4Baud(void *pMsg) { return baudConversionConfig(getJ4_485_Baud()); } /** * @brief 读取J6通信波特率 * @param * @retval */ uint16_t ReadRegisterJ6Baud(void *pMsg) { return baudConversionConfig(getJ6_485_Baud()); } /** * @brief 读取J6通信波特率 * @param * @retval */ uint16_t ReadRegisterLoraBaud(void *pMsg) { return baudConversionConfig(getLora_Uart_Baud()); } /** * @brief 设置J1电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ1_Power(void *pMsg) { writePwrCtrlState(J1_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J2电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ2_Power(void *pMsg) { writePwrCtrlState(J2_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J3电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ3_Power(void *pMsg) { writePwrCtrlState(J3_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J4电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ4_Power(void *pMsg) { writePwrCtrlState(J4_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J5电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ5_Power(void *pMsg) { writePwrCtrlState(J5_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J6电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ6_Power(void *pMsg) { writePwrCtrlState(J6_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J7电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ7_Power(void *pMsg) { writePwrCtrlState(J7_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J8电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ8_Power(void *pMsg) { writePwrCtrlState(J8_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J9电源开关状态 * @param * @retval */ uint16_t WriteRegisterJ9_Power(void *pMsg) { writePwrCtrlState(J9_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg)); return 0; } /** * @brief 设置J0通信波特率 * @param * @retval */ uint16_t WriteRegisterJ0Baud(void *pMsg) { setJ0_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J0_485(getJ0_485_Baud()); return 0; } /** * @brief 设置J2通信波特率 * @param * @retval */ uint16_t WriteRegisterJ2Baud(void *pMsg) { setJ2_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J2_485(getJ2_485_Baud()); return 0; } /** * @brief 设置J4通信波特率 * @param * @retval */ uint16_t WriteRegisterJ4Baud(void *pMsg) { setJ4_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J4_485(getJ4_485_Baud()); return 0; } /** * @brief 设置J6通信波特率 * @param * @retval */ uint16_t WriteRegisterJ6Baud(void *pMsg) { setJ6_485_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J6_485(getJ6_485_Baud()); return 0; } /** * @brief 设置J6通信波特率 * @param * @retval */ uint16_t WriteRegisterLoraBaud(void *pMsg) { setLora_Uart_Baud(configConversionBaud(*(uint16_t *)pMsg)); Init_J6_485(getLora_Uart_Baud()); return 0; } /** * @brief 读取一帧数据 * @param * @retval */ static void hostMcuReadRegister(uint8_t *buff, uint8_t dataLen) { uint16_t Register_Start_Address = (buff[6] << 8) | buff[7]; uint16_t Register_Number = (buff[8] << 8) | buff[9]; /* 初始化发送内存 */ //系统内存不足,丢去当前包 uint32_t tempLen = 13 + 2 * Register_Number + hostQueueUartSendInfoSize; if (xPortGetFreeHeapSize() < tempLen + 1024) { return; } uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen); hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff; sendBuff->length = 13 + 2 * Register_Number; sendBuff->data = Buff + hostQueueUartSendInfoSize; uint8_t *replay_pack = sendBuff->data; /* 起始标志 */ *(replay_pack) = 'S'; *(replay_pack + 1) = 'L'; /* 端口号 */ replay_pack += 2; *(replay_pack) = HostMcu; /* 回复字节长度 */ replay_pack += 1; *(replay_pack) = (uint8_t)((sendBuff->length - 6) >> 8); *(replay_pack + 1) = (uint8_t)(sendBuff->length - 6); /* 功能码 */ replay_pack += 2; *(replay_pack) = SL_Function_Code_Read_Register; /* 读取寄存器起始地址 */ replay_pack += 1; *(replay_pack) = buff[6]; *(replay_pack + 1) = buff[7]; /* 回复字节长度 */ replay_pack += 2; *(replay_pack) = (uint8_t)((sendBuff->length - 13) >> 8); *(replay_pack + 1) = (uint8_t)(sendBuff->length - 13); /* 回复数据内容 */ /* 读取数据 */ for ( uint16_t pos = 0; pos < Register_Number; pos++) { for (uint16_t var = 0; var < sizeof(m_host_RegTblR) / sizeof(SL_RegProcTable); var++) { if (m_host_RegTblR[var].regId == (Register_Start_Address + pos)) { uint16_t temp = m_host_RegTblR[var].pRegProc(NULL); replay_pack += 2; *(replay_pack) = (uint8_t)(temp >> 8); *(replay_pack + 1) = (uint8_t)(temp); } } } /* 校验位 */ replay_pack += 2; uint16_t crc_temp = modebusCrc(sendBuff->data, sendBuff->length - 3); *replay_pack = (uint8_t)(crc_temp >> 8); replay_pack += 1; *replay_pack = (uint8_t)crc_temp; /* 结束标志 */ replay_pack += 1; *replay_pack = 0x17; /* 队列中有空间,则将发送数据 */ if (uxQueueSpacesAvailable(hostMcu_uart_Queue)) { xQueueSend(hostMcu_uart_Queue, &Buff, 10); } else { vPortFree(Buff); } } /** * @brief 写入一帧数据 * @param * @retval */ static void hostMcuWriteRegister(uint8_t *buff, uint8_t dataLen) { uint16_t Register_Start_Address = (buff[6] << 8) | buff[7]; uint16_t Register_Number = (buff[8] << 8) | buff[9]; /* 将数据写入到寄存器中 */ for ( uint16_t pos = 0; pos < Register_Number; pos++) { for (uint16_t i = 0; i < sizeof(m_host_RegTblW) / sizeof(SL_RegProcTable); i++) { if (m_host_RegTblW[i].regId == (Register_Start_Address + pos)) { uint16_t data = buff[10 + 2 * pos] << 8 | buff[10 + 2 * pos + 1]; m_host_RegTblW[i].pRegProc(&data); } } } /* 后续将数据存入配置文件中 */ } /** * @brief * @param * @retval */ void hostFrameDataAnalyze(uint8_t *buff, uint8_t dataLen) { uint16_t crc = (buff[dataLen - 4] << 8) | buff[dataLen - 3]; if (crc != modebusCrc(buff, dataLen - 3)) { return; } if (buff[5] == SL_Function_Code_Read_Register) { hostMcuReadRegister(buff, dataLen); } else if (buff[5] == SL_Function_Code_Write_Register) { hostMcuWriteRegister(buff, dataLen); } }