gateway_mcu/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuComm.c

582 lines
14 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 "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不使用该串口, 01H4800;02H9600;03H19200;04H38400;05H57600;06H115200) */
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);
}
}