polarimeter_software/User/app/mb_hmi/mb_command.h

78 lines
2.6 KiB
C
Raw Permalink Normal View History

2025-09-30 02:37:23 +00:00
/*
* @Author: mypx
* @Date: 2025-08-01 16:41:56
* @LastEditTime: 2025-09-25 16:52:54
* @LastEditors: mypx mypx_coder@163.com
* @Description:
*/
#ifndef __MB_COMMAND_H__
#define __MB_COMMAND_H__
#include "mb_regs_def.h"
#include "nanomodbus.h"
#include "pm_common.h"
#include "pm_params.h"
#include <stdint.h>
// RT-Thread API
#include <rtthread.h>
typedef enum
{
SYS_CTRL_INIT_CODE = 0x0001, // 设备初始化
SYS_CTRL_START_MEAS_CODE = 0x0002, // 开始测量
SYS_CTRL_STOP_MEAS_CODE = 0x0003, // 停止测量
SYS_CTRL_CLEAR_DATA_CODE = 0x0004, // 数据清零
SYS_CTRL_START_TEMP_CTRL_CODE = 0x0005, // 开始控温
SYS_CTRL_STOP_TEMP_CTRL_CODE = 0x0006, // 停止控温
} SysCtrlCode;
typedef int (*system_ctrl_handler_t)(SysCtrlCode code);
typedef void (*meas_mode_handler_t)(uint8_t mode);
typedef void (*target_temp_handler_t)(float temp);
typedef void (*tube_length_handler_t)(uint16_t length);
typedef void (*meas_precision_handler_t)(uint8_t precision);
typedef void (*auto_measure_count_handler_t)(uint8_t count);
typedef struct
{
system_ctrl_handler_t system_ctrl_handler;
meas_mode_handler_t meas_mode_handler;
target_temp_handler_t target_temp_handler;
tube_length_handler_t tube_length_handler;
meas_precision_handler_t meas_precision_handler;
auto_measure_count_handler_t auto_measure_count_handler;
} mb_cmd_handler_t;
#define IR_BUF_SIZE 128
#define REG_BUF_SIZE 128
typedef struct
{
uint16_t regs[REG_BUF_SIZE]; // 保持寄存器(可读写)
uint16_t input_regs[IR_BUF_SIZE]; // 输入寄存器(只读)
mb_cmd_handler_t *handler;
/* 保护 input_regs 的互斥锁 */
rt_mutex_t input_lock;
} mb_command_t;
// 初始化命令处理模块
void mb_command_init(mb_command_t *handler);
// 返回当前命令实例(用于访问 input_regs/regs
mb_command_t *get_command_instance(void);
// 处理保持寄存器写入3xxxx
nmbs_error mb_handle_write_holding_registers(uint16_t address, uint16_t quantity, const uint16_t *registers);
// 处理输入寄存器读取4xxxx-0x04
nmbs_error mb_handle_read_input_registers(uint16_t address, uint16_t quantity, uint16_t *registers_out);
// 输入寄存器同步接口声明
void mb_sync_running_status_reg(PmRunningState state);
void mb_sync_exception_reg(uint32_t exception, bool set);
void mb_sync_realtime_temp(float temperature);
void mb_sync_realtime_rotation(float rotation);
void mb_sync_result(uint8_t mode, float value, float temp);
void mb_sync_meas_done_flag(bool done);
#endif