/* * @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 // RT-Thread API #include 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