/***************************************************************************
* @file fw_hmi.c
* @brief
*
****************************************************************************
* @attention
*
* Created on: 2025/05/22
* Author: Software Group
*
****************************************************************************
* @description
*
*
*
****************************************************************************/
/************************ Includes *************************/
#include "main.h"
/************************ Private types *************************/
/************************ Private constants *************************/
/************************ Private macros *************************/
/************************ Private variables *************************/
//static u8 sbuf[8] = {1,2,3,4,5,6,7,8};
/* 数据查询指令队列 */
static QueueHandle_t queue_hmi_data = NULL;
/* 控制、设置指令队列 */
static QueueHandle_t queue_hmi_other = NULL;
/************************ Functions *************************/
static void HmiDataPro(const u8* frame);
static void HmiSetPro(const u8* frame);
static void HmiCtrlPro(const u8* frame);
static void HmiTestPro(const u8* frame);
static void Send2Hmi(const u8 dev, const u16 cmd, const u16* data, const u16 len);
/*****************************
* @funName : FW_InitHmi
* @Input : NULL
*
* @Output :
****************
* @Description : 人机交互模块软件资源初始化
*
*****************
* @Athor : Software Group
* @Version : V0.0.0
* @Date : 2025/06/25
*
*****************************/
void FW_InitHmi(void){
if(NULL == queue_hmi_data){
/* 仅预留一个数据查询指令,避免查询指令堆积 */
queue_hmi_data = xQueueCreate(1, sizeof(UART_Msg_Type));
if(NULL == queue_hmi_data){
/* 队列创建失败 */
}
}
if(NULL == queue_hmi_other){
queue_hmi_other = xQueueCreate(MSG_QUEUE_SIZE, sizeof(UART_Msg_Type));
if(NULL == queue_hmi_other){
/* 队列创建失败 */
}
}
}
/******************************************
* @funName : FW_HmiRecvPro
* @Input : NULL
*
* @Output :
*****************
* @Description : 人机交互接收数据帧处理
*
*
*****************
* @Athor : Software Group
* @Version : V0.0.0
* @Date : 2025/03/22
*
*******************************************/
void FW_HmiRecvPro(void){
UART_Msg_Type RxMsg;
/* 获取有效指令 */
bool bValid = true;
const u8* const frame = RxMsg.buffer;
u16 crc16 = 0, cmd = 0;
while(BSP_Recv4RS485_1(&RxMsg)){
/* 帧头错误 */
if(HMI_FRAME_STX != frame[FRAME_IDX_STX]){
continue;
}
/* 帧长度错误,数据不完整 */
if(RxMsg.len < frame[FRAME_IDX_LEN]){
continue;
}
/* 目的地址不是监控系统 */
if(ADDR_MONITOR != frame[FRAME_IDX_DST]
|| ADDR_PC != frame[FRAME_IDX_SRC]){
continue;
}
crc16 = MB_CRC16(frame, frame[FRAME_IDX_LEN]-2);
/* CRC16 校验错误 */
if(crc16 != ((u16)(frame[frame[FRAME_IDX_LEN]-2] << 8)
| frame[frame[FRAME_IDX_LEN]-1]) ){
continue;
}
cmd = (frame[FRAME_IDX_CMDH]<<8) | frame[FRAME_IDX_CMDL];
switch(cmd){
case 0x0500:
case 0x0501:
case 0x0502:
case 0x0503:
case 0x0504:
{
xQueueSend(queue_hmi_data, &RxMsg, 0);
}break;
case 0x0301:
case 0x0302:
case 0x0401:
case 0x0402:
case 0x0403:
case 0x0404:
case 0x0411:
case 0x0412:
case 0x0413:
case 0x0414:
case 0x0A01:
{
xQueueSend(queue_hmi_other, &RxMsg, 0);
}break;
}
}
/* 优先获取控制、设定指令 */
if(false == xQueueReceive(queue_hmi_other, &RxMsg, 0)){
/* 未获取到控制指令时,尝试获取数据查询指令 */
if(xQueueReceive(queue_hmi_data, &RxMsg, 0)){
bValid = true;
}
else{
bValid = false;
}
}
else{
bValid = true;
}
/* 指令队列中没有获取有效的指令 */
if(!bValid){
return;
}
cmd = (frame[FRAME_IDX_CMDH]<<8)
| frame[FRAME_IDX_CMDL];
switch(cmd){
case 0x0301:
case 0x0302:
{
HmiSetPro(frame);
}break;
/* 整流模块测试 */
case 0x0401:
case 0x0402:
case 0x0403:
case 0x0404:
/* 逆变部件测试 */
case 0x0411:
case 0x0412:
case 0x0413:
case 0x0414:
{
HmiTestPro(frame);
}break;
case 0x0500:
case 0x0501:
case 0x0502:
case 0x0503:
case 0x0504:
{
HmiDataPro(frame);
}break;
case 0x0A01:
{
HmiCtrlPro(frame);
}break;
}
}
/******************************************
* @funName : HmiDataPro
* @Input :
*
* @Output : NULL
*****************
* @Description : 数据流处理
*
*
*****************
* @Athor : Software Group
* @Version : V0.0.0
* @Date : 2025/07/17
*
*******************************************/
static void HmiDataPro(const u8 *RxFrame){
u8 module = 0;
u16 Buff_Rectifer[RECTIFIER_DATA_SIZE] = {0};
u16 Buff_Inverter[INVERTER_DATA_SIZE] = {0};
const u16 event = (u16)(RxFrame[FRAME_IDX_CMDH]<<8) | RxFrame[FRAME_IDX_CMDL];
switch(event){
/* 上传系统数据 */
case 0x0500:
{
/* 整流部件数据流 */
for(module = 0; module < MODULE_RECTIFIER_SIZE; module++){
memset((u8*)Buff_Rectifer, 0, RECTIFIER_DATA_SIZE<<1);
if(FW_CacheReadRectifier(module, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0501+module, Buff_Rectifer, RECTIFIER_DATA_SIZE);
vTaskDelay(TASK_5MS_PERIOD);
}
}
/* 逆变部件数据流 */
for(module = 0; module < MODULE_INVERTER_SIZE; module++){
memset((u8*)Buff_Inverter, 0, INVERTER_DATA_SIZE<<1);
if(FW_CacheWriteInverter(module, 0, Buff_Inverter, INVERTER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0511+module, Buff_Inverter, INVERTER_DATA_SIZE);
vTaskDelay(TASK_5MS_PERIOD);
}
}
}break;
/* 整流部件数据流 */
case 0x0501:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(0, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0501, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0502:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(1, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0502, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0503:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(2, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0503, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0504:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(3, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0504, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0505:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(4, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0505, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0506:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(5, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0506, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0507:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(6, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0507, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0508:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(7, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0508, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
case 0x0509:
{
/* 整流部件数据流 */
if(FW_CacheReadRectifier(8, 0, Buff_Rectifer, RECTIFIER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0509, Buff_Rectifer, RECTIFIER_DATA_SIZE);
}
}break;
/* 逆变部件数据流 */
case 0x0511:
{
/* 逆变部件数据流 */
memset((u8*)Buff_Inverter, 0, INVERTER_DATA_SIZE<<1);
if(FW_CacheWriteInverter(0, 0, Buff_Inverter, INVERTER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0511, Buff_Inverter, INVERTER_DATA_SIZE);
}
}break;
case 0x0512:
{
/* 逆变部件数据流 */
memset((u8*)Buff_Inverter, 0, INVERTER_DATA_SIZE<<1);
if(FW_CacheWriteInverter(1, 0, Buff_Inverter, INVERTER_DATA_SIZE)){
Send2Hmi(ADDR_MONITOR, 0x0512, Buff_Inverter, INVERTER_DATA_SIZE);
}
}break;
/* 系统状态 */
case 0x050E:
{
}break;
}
}
/******************************************
* @funName : HmiSetPro
* @Input :
*
* @Output : NULL
*****************
* @Description : 指令流处理
*
*
*****************
* @Athor : Software Group
* @Version : V0.0.0
* @Date : 2025/07/17
*
*******************************************/
static void HmiSetPro(const u8 *frame){
const u16 event = (u16)(frame[FRAME_IDX_CMDH]<<8) | frame[FRAME_IDX_CMDL];
switch(event){
/* 输出电压设置 */
case 0x0301:
{
}break;
/* 输出电流设置 */
case 0x0302:
{
}break;
/* 输出频率设置 */
case 0x0303:
{
}break;
}
}
/******************************************
* @funName : HmiCtrlPro
* @Input :
*
* @Output : NULL
*****************
* @Description : 控制流处理
*
*
*****************
* @Athor : Software Group
* @Version : V0.0.0
* @Date : 2025/07/17
*
*******************************************/
static void HmiCtrlPro(const u8 *frame){
const u16 event = (u16)(frame[FRAME_IDX_CMDH]<<8) | frame[FRAME_IDX_CMDL];
switch(event){
/* 开关机 */
case 0x0A01:
{
}break;
/* 工作模式 */
case 0x0A02:
{
}break;
}
}
/******************************************
* @funName : HmiTestPro
* @Input :
*
* @Output : NULL
*****************
* @Description : 测试使用
*
*
*****************
* @Athor : Software Group
* @Version : V0.0.0
* @Date : 2025/09/08
*
*******************************************/
static void HmiTestPro(const u8 *frame){
const u16 event = (u16)(frame[FRAME_IDX_CMDH]<<8) | frame[FRAME_IDX_CMDL];
switch(event){
/*************** 整流模块测试 ***************/
case 0x0401:
{
/* 拨码方式分配地址 */
FW_SetRectifierAddrAssignType(1);
}break;
case 0x0402:
{
/* 设置组号 */
FW_SetRectifierGroup(0);
}break;
case 0x0403:
{
const u16 V = (frame[FRAME_IDX_DAT]<<8)|frame[FRAME_IDX_DAT+1];
const u16 I = (frame[FRAME_IDX_DAT+2]<<8)|frame[FRAME_IDX_DAT+3];
/* 设置参数 */
FW_SetRectifierPara(V, I);
}break;
case 0x0404:
{
/* 开机启动 0-开机 1-关机*/
FW_PowerRectifier(frame[FRAME_IDX_DAT]);
}break;
/*************** 逆变部件测试 ***************/
case 0x0411:
{
}break;
case 0x0412:
{
}break;
case 0x0413:
{
}break;
case 0x0414:
{
}break;
}
}
static void Send2Hmi(const u8 dev, const u16 cmd, const u16* data, const u16 len){
static u8 i = 0, byte[DMA_TX_BUFF_SIZE] = {0};
u16 crc16 = 0;
memset(byte, 0, DMA_TX_BUFF_SIZE);
byte[FRAME_IDX_STX] = HMI_FRAME_STX;
byte[FRAME_IDX_LEN] = len*2 + 8;
byte[FRAME_IDX_DST] = ADDR_PC;
byte[FRAME_IDX_SRC] = dev;
/* 指令 */
byte[FRAME_IDX_CMDH] = cmd>>8;
byte[FRAME_IDX_CMDL] = cmd&0xff;
for(i = 0; i < len; i++){
byte[FRAME_IDX_DAT + 2*i] = (data[i] >> 8) & 0xff;
byte[FRAME_IDX_DAT + 2*i + 1] = data[i] & 0xff;
}
crc16 = MB_CRC16(byte, byte[FRAME_IDX_LEN]-2);
byte[byte[FRAME_IDX_LEN]-2] = (crc16 >> 8) & 0xff;
byte[byte[FRAME_IDX_LEN]-1] = crc16 & 0xff;
BSP_Send2RS485_1(byte, byte[FRAME_IDX_LEN]);
}
/************************ End of file *************************/
逐字逐句解析这段代码