/** ********************************************************************************************************************** * @file menu_port.h * @brief 菜单组件硬件端口层定义 * @author menu_component * @date 2025-12-19 ********************************************************************************************************************** */ #ifndef MENU_PORT_H #define MENU_PORT_H /* Includes ----------------------------------------------------------------------------------------------------------*/ #include "../src/core/menu_config.h" #include /* 类型定义 ---------------------------------------------------------------------------------------------------------*/ /** * @brief Modbus寄存器类型 */ typedef enum { MODBUS_REG_TYPE_COIL, /*!< 线圈寄存器 */ MODBUS_REG_TYPE_DISCRETE_INPUT, /*!< 离散输入寄存器 */ MODBUS_REG_TYPE_HOLDING_REG, /*!< 保持寄存器 */ MODBUS_REG_TYPE_INPUT_REG, /*!< 输入寄存器 */ } ModbusRegType; /** * @brief 持久化操作回调函数类型定义 */ typedef MenuErrCode (*MenuPersistenceSaveCallback)(const uint8_t* data, uint16_t size); ///< 保存持久化数据回调 typedef MenuErrCode (*MenuPersistenceRestoreCallback)(uint8_t* data, uint16_t* size); ///< 恢复持久化数据回调 /** * @brief 硬件驱动结构体 */ typedef struct { void (*printf)(const char* fmt, va_list args); ///< 硬件打印接口 uint32_t (*get_tick)(void); ///< 获取系统滴答时间 void (*delay_ms)(uint32_t ms); ///< 硬件延迟函数 void (*display)(const char* menu_name, uint16_t menu_id); ///< 菜单显示接口 MenuEventType (*key_scan)(void); ///< 按键扫描接口(可选) void (*irq_ctrl)(bool enable); ///< 中断管理接口(可选) void (*error_handler)(MenuErrCode err_code); ///< 错误处理接口(可选) MenuErrCode (*modbus_send)(ModbusRegType reg_type, uint16_t reg_addr, const uint8_t* reg_buf, uint8_t buf_len); ///< Modbus发送接口(可选) MenuErrCode (*modbus_receive)(ModbusRegType reg_type, uint16_t reg_addr, uint8_t* reg_buf, uint8_t buf_len); ///< Modbus接收接口(可选) MenuPersistenceSaveCallback persistence_save; ///< 持久化数据保存接口(可选) MenuPersistenceRestoreCallback persistence_restore; ///< 持久化数据恢复接口(可选) } MenuPortDriver; /* 函数声明 ---------------------------------------------------------------------------------------------------------*/ /** * @brief 初始化硬件端口层 * @param driver 硬件驱动结构体指针 * @return 错误码 */ MenuErrCode menu_port_init(const MenuPortDriver* driver); /** * @brief 反初始化硬件端口层 * @return 错误码 */ MenuErrCode menu_port_deinit(void); /** * @brief 获取当前系统时间(ms) * @return 系统时间(ms) */ uint32_t menu_port_get_tick(void); /** * @brief 硬件延迟函数 * @param ms 延迟时间(ms) */ void menu_port_delay_ms(uint32_t ms); /** * @brief 打印函数 * @param fmt 格式化字符串 * @param ... 可变参数 */ void menu_port_printf(const char* fmt, ...); /** * @brief 菜单显示函数 * @param menu_name 菜单名称 * @param menu_id 菜单ID */ void menu_port_display(const char* menu_name, uint16_t menu_id); /** * @brief 按键扫描函数 * @return 按键事件类型 */ MenuEventType menu_port_key_scan(void); /** * @brief 中断管理函数 * @param enable 是否启用中断 */ void menu_port_irq_ctrl(bool enable); /** * @brief 错误处理函数 * @param err_code 错误码 */ void menu_port_error_handler(MenuErrCode err_code); #endif /* MENU_PORT_H */