增加modbus绑定
This commit is contained in:
@ -1,304 +1,341 @@
|
||||
/**
|
||||
* @file menu_example.c
|
||||
* @brief 菜单组件使用示例
|
||||
* @brief 菜单组件完整使用示例(包含Modbus映射功能演示)
|
||||
* @note 工业级嵌入式菜单组件 - 使用示例
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
#include "menu_port.h"
|
||||
#include <stdio.h>
|
||||
#include "menu_def.h"
|
||||
|
||||
// 条件编译:处理不同平台的键盘输入函数
|
||||
#if defined(_WIN32)
|
||||
#include <conio.h> // Windows平台
|
||||
#else
|
||||
// MinGW或其他平台的模拟实现
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
/************************** 示例配置 **************************/
|
||||
// 菜单节点ID定义
|
||||
#define MENU_ROOT_ID 1 // 根节点
|
||||
#define MENU_PARAM_ID 2 // 参数设置节点
|
||||
#define MENU_MODBUS_ID 3 // Modbus设置节点
|
||||
#define MENU_TEMP_ID 4 // 温度参数节点
|
||||
#define MENU_HUMID_ID 5 // 湿度参数节点
|
||||
#define MENU_PRESS_ID 6 // 压力参数节点
|
||||
|
||||
int _kbhit(void)
|
||||
{
|
||||
struct termios oldt, newt;
|
||||
int ch;
|
||||
int oldf;
|
||||
// 参数ID定义
|
||||
#define PARAM_TEMP_ID 1 // 温度参数ID
|
||||
#define PARAM_HUMID_ID 2 // 湿度参数ID
|
||||
#define PARAM_PRESS_ID 3 // 压力参数ID
|
||||
|
||||
tcgetattr(STDIN_FILENO, &oldt);
|
||||
newt = oldt;
|
||||
newt.c_lflag &= ~(ICANON | ECHO);
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
|
||||
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
|
||||
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
|
||||
|
||||
ch = getchar();
|
||||
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
|
||||
fcntl(STDIN_FILENO, F_SETFL, oldf);
|
||||
|
||||
if(ch != EOF)
|
||||
{
|
||||
ungetc(ch, stdin);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
// Modbus寄存器地址定义
|
||||
#define REG_TEMP_ADDR 40001 // 温度寄存器地址
|
||||
#define REG_HUMID_ADDR 40003 // 湿度寄存器地址
|
||||
#define REG_PRESS_ADDR 40005 // 压力寄存器地址
|
||||
|
||||
int _getch(void)
|
||||
{
|
||||
struct termios oldt, newt;
|
||||
int ch;
|
||||
|
||||
tcgetattr(STDIN_FILENO, &oldt);
|
||||
newt = oldt;
|
||||
newt.c_lflag &= ~(ICANON | ECHO);
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
|
||||
|
||||
ch = getchar();
|
||||
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
|
||||
|
||||
return ch;
|
||||
}
|
||||
#endif
|
||||
|
||||
/************************** 菜单节点ID定义 **************************/
|
||||
#define MENU_ID_MAIN 100 ///< 主菜单
|
||||
#define MENU_ID_SETTINGS 200 ///< 设置菜单
|
||||
#define MENU_ID_DISPLAY 201 ///< 显示设置
|
||||
#define MENU_ID_LANGUAGE 202 ///< 语言设置
|
||||
#define MENU_ID_PARAMETER 300 ///< 参数设置
|
||||
#define MENU_ID_ABOUT 400 ///< 关于
|
||||
|
||||
/************************** 参数ID定义 **************************/
|
||||
#define PARAM_ID_BRIGHTNESS 1000 ///< 亮度参数
|
||||
#define PARAM_ID_CONTRAST 1001 ///< 对比度参数
|
||||
/************************** 全局变量 **************************/
|
||||
// 模拟Modbus寄存器缓冲区
|
||||
uint8_t g_modbus_reg_buf[256] = {0};
|
||||
|
||||
/************************** 菜单回调函数 **************************/
|
||||
/**
|
||||
* @brief 主菜单进入回调
|
||||
* @brief 进入参数设置菜单回调
|
||||
* @param node_id 菜单节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
static MenuErrCode menu_cb_main(MenuNodeId node_id)
|
||||
static MenuErrCode menu_cb_enter_param(MenuNodeId node_id)
|
||||
{
|
||||
(void)node_id; // 未使用的参数
|
||||
printf("Enter Main Menu\r\n");
|
||||
MENU_DEBUG("Enter param menu: %d", node_id);
|
||||
return MENU_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 设置菜单进入回调
|
||||
* @brief 退出参数设置菜单回调
|
||||
* @param node_id 菜单节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
static MenuErrCode menu_cb_settings(MenuNodeId node_id)
|
||||
static MenuErrCode menu_cb_exit_param(MenuNodeId node_id)
|
||||
{
|
||||
(void)node_id; // 未使用的参数
|
||||
printf("Enter Settings Menu\r\n");
|
||||
MENU_DEBUG("Exit param menu: %d", node_id);
|
||||
return MENU_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 显示设置进入回调
|
||||
* @brief 进入Modbus设置菜单回调
|
||||
* @param node_id 菜单节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
static MenuErrCode menu_cb_display(MenuNodeId node_id)
|
||||
static MenuErrCode menu_cb_enter_modbus(MenuNodeId node_id)
|
||||
{
|
||||
(void)node_id; // 未使用的参数
|
||||
printf("Enter Display Settings\r\n");
|
||||
MENU_DEBUG("Enter Modbus menu: %d", node_id);
|
||||
return MENU_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 语言设置进入回调
|
||||
* @param node_id 菜单节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
static MenuErrCode menu_cb_language(MenuNodeId node_id)
|
||||
{
|
||||
(void)node_id; // 未使用的参数
|
||||
printf("Enter Language Settings\r\n");
|
||||
return MENU_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 参数设置进入回调
|
||||
* @param node_id 菜单节点ID
|
||||
* @return 错误码
|
||||
* @brief 模拟Modbus通信流程
|
||||
*/
|
||||
static MenuErrCode menu_cb_parameter(MenuNodeId node_id)
|
||||
static void modbus_communication_demo(void)
|
||||
{
|
||||
(void)node_id; // 未使用的参数
|
||||
printf("Enter Parameter Settings\r\n");
|
||||
return MENU_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 关于菜单进入回调
|
||||
* @param node_id 菜单节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
static MenuErrCode menu_cb_about(MenuNodeId node_id)
|
||||
{
|
||||
(void)node_id; // 未使用的参数
|
||||
printf("Enter About Menu\r\n");
|
||||
printf("Industrial Menu Component v1.0\r\n");
|
||||
printf("Highly Portable & Modular\r\n");
|
||||
return MENU_OK;
|
||||
}
|
||||
|
||||
/************************** 辅助函数 **************************/
|
||||
/**
|
||||
* @brief 按键扫描函数(Windows平台示例)
|
||||
* @return 按键事件类型
|
||||
*/
|
||||
static MenuEventType key_scan(void)
|
||||
{
|
||||
if (_kbhit())
|
||||
{
|
||||
int key = _getch();
|
||||
switch (key)
|
||||
#if MENU_CONFIG_ENABLE_MODBUS_MAP
|
||||
MENU_DEBUG("=== Modbus Communication Demo ===");
|
||||
|
||||
// 1. 模拟参数到寄存器的转换(参数修改后更新寄存器)
|
||||
{
|
||||
MENU_DEBUG("1. Param to Reg Demo:");
|
||||
|
||||
// 设置温度参数为28.5
|
||||
menu_param_set_value(PARAM_TEMP_ID, 28.5f);
|
||||
|
||||
// 将温度参数转换到Modbus寄存器
|
||||
uint8_t buf_len = 4;
|
||||
uint8_t reg_buf[4] = {0};
|
||||
MenuErrCode err = menu_modbus_map_param_to_reg(PARAM_TEMP_ID, reg_buf, &buf_len);
|
||||
if (err == MENU_OK)
|
||||
{
|
||||
case 'w':
|
||||
case 'W':
|
||||
case 72: // 上箭头
|
||||
return MENU_EVENT_KEY_UP;
|
||||
case 's':
|
||||
case 'S':
|
||||
case 80: // 下箭头
|
||||
return MENU_EVENT_KEY_DOWN;
|
||||
case 13: // 回车键
|
||||
return MENU_EVENT_KEY_ENTER;
|
||||
case 'b':
|
||||
case 'B':
|
||||
case 27: // ESC键
|
||||
return MENU_EVENT_KEY_BACK;
|
||||
default:
|
||||
break;
|
||||
MENU_DEBUG(" Temp param (28.5f) to reg: [0x%02X, 0x%02X, 0x%02X, 0x%02X]",
|
||||
reg_buf[0], reg_buf[1], reg_buf[2], reg_buf[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
MENU_DEBUG(" Param to reg failed: %d", err);
|
||||
}
|
||||
}
|
||||
return MENU_EVENT_NONE;
|
||||
|
||||
// 2. 模拟寄存器到参数的转换(接收到Modbus写入请求后更新参数)
|
||||
{
|
||||
MENU_DEBUG("2. Reg to Param Demo:");
|
||||
|
||||
// 模拟Modbus写入湿度参数(65.0%)
|
||||
// 65.0f的二进制表示(大端):0x42820000,对应Modbus标准字节序为0x8242 0x0000
|
||||
uint8_t reg_buf[4] = {0x82, 0x42, 0x00, 0x00};
|
||||
|
||||
// 将Modbus寄存器数据转换为参数值
|
||||
MenuErrCode err = menu_modbus_map_reg_to_param(PARAM_HUMID_ID, reg_buf, sizeof(reg_buf));
|
||||
if (err == MENU_OK)
|
||||
{
|
||||
// 读取转换后的参数值
|
||||
float humid_val;
|
||||
menu_param_get_value(PARAM_HUMID_ID, &humid_val);
|
||||
MENU_DEBUG(" Reg data [0x82, 0x42, 0x00, 0x00] to humid param: %.1f%%", humid_val);
|
||||
}
|
||||
else
|
||||
{
|
||||
MENU_DEBUG(" Reg to param failed: %d", err);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 模拟Modbus读取请求处理
|
||||
{
|
||||
MENU_DEBUG("3. Modbus Read Request Demo:");
|
||||
|
||||
// 模拟Modbus主机读取压力参数
|
||||
uint8_t buf_len = 4;
|
||||
uint8_t reg_buf[4] = {0};
|
||||
|
||||
// 这里应该先调用menu_modbus_map_param_to_reg将参数转换到寄存器缓冲区
|
||||
MenuErrCode err = menu_modbus_map_param_to_reg(PARAM_PRESS_ID, reg_buf, &buf_len);
|
||||
if (err == MENU_OK)
|
||||
{
|
||||
// 然后返回给Modbus主机
|
||||
MENU_DEBUG(" Read pressure reg: [0x%02X, 0x%02X, 0x%02X, 0x%02X]",
|
||||
reg_buf[0], reg_buf[1], reg_buf[2], reg_buf[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
MENU_DEBUG(" Read pressure failed: %d", err);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 模拟Modbus写入请求处理
|
||||
{
|
||||
MENU_DEBUG("4. Modbus Write Request Demo:");
|
||||
|
||||
// 模拟Modbus主机写入温度参数(30.0°C)
|
||||
// 30.0f的二进制表示(大端):0x41F00000,对应Modbus标准字节序为0xF041 0x0000
|
||||
uint8_t reg_buf[4] = {0xF0, 0x41, 0x00, 0x00};
|
||||
|
||||
// 调用menu_modbus_map_reg_to_param将寄存器数据转换为参数值
|
||||
MenuErrCode err = menu_modbus_map_reg_to_param(PARAM_TEMP_ID, reg_buf, sizeof(reg_buf));
|
||||
if (err == MENU_OK)
|
||||
{
|
||||
// 读取转换后的参数值
|
||||
float temp_val;
|
||||
menu_param_get_value(PARAM_TEMP_ID, &temp_val);
|
||||
MENU_DEBUG(" Write temp reg: [0xF0, 0x41, 0x00, 0x00] -> temp param: %.1f°C", temp_val);
|
||||
}
|
||||
else
|
||||
{
|
||||
MENU_DEBUG(" Write temp failed: %d", err);
|
||||
}
|
||||
}
|
||||
|
||||
MENU_DEBUG("=== Modbus Communication Demo End ===");
|
||||
#endif
|
||||
}
|
||||
|
||||
/************************** 主函数 **************************/
|
||||
int main(void)
|
||||
{
|
||||
printf("Industrial Menu Component Example\r\n");
|
||||
printf("==================================\r\n");
|
||||
printf("Controls:\r\n");
|
||||
printf(" W/Up Arrow - Up\r\n");
|
||||
printf(" S/Down Arrow - Down\r\n");
|
||||
printf(" Enter - Enter\r\n");
|
||||
printf(" B/ESC - Back\r\n");
|
||||
printf(" Q - Quit\r\n");
|
||||
printf("==================================\r\n\r\n");
|
||||
|
||||
/************************** 初始化菜单组件 **************************/
|
||||
MENU_DEBUG("=== Menu Component Example ===");
|
||||
|
||||
/************************** 1. 初始化硬件 **************************/
|
||||
MENU_DEBUG("1. Initialize hardware...");
|
||||
// 这里应该初始化硬件,如UART、LCD、SysTick等
|
||||
// hal_init();
|
||||
|
||||
/************************** 2. 初始化菜单组件 **************************/
|
||||
MENU_DEBUG("2. Initialize menu component...");
|
||||
MenuErrCode err = menu_init();
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Menu initialization failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Menu init failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
printf("Menu initialized successfully\r\n\r\n");
|
||||
|
||||
/************************** 注册菜单节点 **************************/
|
||||
// 注册主菜单
|
||||
err = menu_register_node(0, MENU_ID_MAIN, "Main Menu", menu_cb_main, NULL);
|
||||
|
||||
/************************** 3. 注册菜单节点 **************************/
|
||||
MENU_DEBUG("3. Register menu nodes...");
|
||||
|
||||
// 注册根节点
|
||||
err = menu_register_node(0, MENU_ROOT_ID, "主菜单", NULL, NULL);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register Main Menu failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register root node failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册设置菜单
|
||||
err = menu_register_node(MENU_ID_MAIN, MENU_ID_SETTINGS, "Settings", menu_cb_settings, NULL);
|
||||
|
||||
// 注册参数设置节点
|
||||
err = menu_register_node(MENU_ROOT_ID, MENU_PARAM_ID, "参数设置", menu_cb_enter_param, menu_cb_exit_param);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register Settings Menu failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register param node failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册显示设置菜单
|
||||
err = menu_register_node(MENU_ID_SETTINGS, MENU_ID_DISPLAY, "Display Settings", menu_cb_display, NULL);
|
||||
|
||||
// 注册Modbus设置节点
|
||||
err = menu_register_node(MENU_ROOT_ID, MENU_MODBUS_ID, "Modbus设置", menu_cb_enter_modbus, NULL);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register Display Menu failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register modbus node failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册语言设置菜单
|
||||
err = menu_register_node(MENU_ID_SETTINGS, MENU_ID_LANGUAGE, "Language", menu_cb_language, NULL);
|
||||
|
||||
// 注册温度参数节点
|
||||
err = menu_register_node(MENU_PARAM_ID, MENU_TEMP_ID, "温度设置", NULL, NULL);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register Language Menu failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register temp node failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册参数设置菜单
|
||||
err = menu_register_node(MENU_ID_MAIN, MENU_ID_PARAMETER, "Parameters", menu_cb_parameter, NULL);
|
||||
|
||||
// 注册湿度参数节点
|
||||
err = menu_register_node(MENU_PARAM_ID, MENU_HUMID_ID, "湿度设置", NULL, NULL);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register Parameter Menu failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register humid node failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册关于菜单
|
||||
err = menu_register_node(MENU_ID_MAIN, MENU_ID_ABOUT, "About", menu_cb_about, NULL);
|
||||
|
||||
// 注册压力参数节点
|
||||
err = menu_register_node(MENU_PARAM_ID, MENU_PRESS_ID, "压力设置", NULL, NULL);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register About Menu failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register press node failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/************************** 注册参数 **************************/
|
||||
#if MENU_CONFIG_ENABLE_PARAM
|
||||
// 注册亮度参数(范围0-100,默认50,步长1)
|
||||
err = menu_param_register(MENU_ID_DISPLAY, PARAM_ID_BRIGHTNESS,
|
||||
MENU_PARAM_TYPE_UINT8, 0.0f, 100.0f, 50.0f, 1.0f);
|
||||
|
||||
/************************** 4. 注册参数 **************************/
|
||||
MENU_DEBUG("4. Register parameters...");
|
||||
|
||||
#if MENU_CONFIG_ENABLE_PARAM
|
||||
// 注册温度参数(范围:-40.0°C ~ 120.0°C,默认25.0°C,精度0.1°C)
|
||||
err = menu_param_register(MENU_TEMP_ID, PARAM_TEMP_ID, MENU_PARAM_TYPE_FLOAT,
|
||||
-40.0f, 120.0f, 25.0f, 0.1f);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register Brightness Param failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register temp param failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册对比度参数(范围0-100,默认50,步长1)
|
||||
err = menu_param_register(MENU_ID_DISPLAY, PARAM_ID_CONTRAST,
|
||||
MENU_PARAM_TYPE_UINT8, 0.0f, 100.0f, 50.0f, 1.0f);
|
||||
|
||||
// 注册湿度参数(范围:0.0% ~ 100.0%,默认50.0%,精度0.1%)
|
||||
err = menu_param_register(MENU_HUMID_ID, PARAM_HUMID_ID, MENU_PARAM_TYPE_FLOAT,
|
||||
0.0f, 100.0f, 50.0f, 0.1f);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
printf("Register Contrast Param failed: %d\r\n", err);
|
||||
MENU_DEBUG(" Register humid param failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
printf("Menu nodes registered successfully\r\n\r\n");
|
||||
|
||||
/************************** 主循环 **************************/
|
||||
|
||||
// 注册压力参数(范围:0.0kPa ~ 1000.0kPa,默认101.3kPa,精度0.1kPa)
|
||||
err = menu_param_register(MENU_PRESS_ID, PARAM_PRESS_ID, MENU_PARAM_TYPE_FLOAT,
|
||||
0.0f, 1000.0f, 101.3f, 0.1f);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
MENU_DEBUG(" Register press param failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/************************** 5. 注册Modbus映射 **************************/
|
||||
MENU_DEBUG("5. Register Modbus mappings...");
|
||||
|
||||
// 注册温度参数到Modbus寄存器映射
|
||||
err = menu_modbus_map_register(
|
||||
PARAM_TEMP_ID, // 参数ID
|
||||
MODBUS_REG_TYPE_HOLDING_REG, // 寄存器类型
|
||||
REG_TEMP_ADDR, // 起始地址
|
||||
2, // 寄存器数量(浮点型占2个16位寄存器)
|
||||
MODBUS_PERM_READ_WRITE, // 读写权限
|
||||
2 // 字节序(Modbus标准)
|
||||
);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
MENU_DEBUG(" Register temp modbus map failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册湿度参数到Modbus寄存器映射
|
||||
err = menu_modbus_map_register(
|
||||
PARAM_HUMID_ID, // 参数ID
|
||||
MODBUS_REG_TYPE_HOLDING_REG, // 寄存器类型
|
||||
REG_HUMID_ADDR, // 起始地址
|
||||
2, // 寄存器数量
|
||||
MODBUS_PERM_READ_WRITE, // 读写权限
|
||||
2 // 字节序(Modbus标准)
|
||||
);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
MENU_DEBUG(" Register humid modbus map failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 注册压力参数到Modbus寄存器映射
|
||||
err = menu_modbus_map_register(
|
||||
PARAM_PRESS_ID, // 参数ID
|
||||
MODBUS_REG_TYPE_HOLDING_REG, // 寄存器类型
|
||||
REG_PRESS_ADDR, // 起始地址
|
||||
2, // 寄存器数量
|
||||
MODBUS_PERM_READ_WRITE, // 读写权限
|
||||
2 // 字节序(Modbus标准)
|
||||
);
|
||||
if (err != MENU_OK)
|
||||
{
|
||||
MENU_DEBUG(" Register press modbus map failed: %d", err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/************************** 6. 运行Modbus通信演示 **************************/
|
||||
MENU_DEBUG("6. Run Modbus communication demo...");
|
||||
modbus_communication_demo();
|
||||
|
||||
/************************** 7. 进入主循环 **************************/
|
||||
MENU_DEBUG("7. Enter main loop...");
|
||||
while (1)
|
||||
{
|
||||
// 扫描按键
|
||||
MenuEventType event = key_scan();
|
||||
if (event != MENU_EVENT_NONE)
|
||||
{
|
||||
// 发送按键事件到菜单组件
|
||||
menu_post_event(event, 0);
|
||||
}
|
||||
|
||||
// 处理菜单主循环
|
||||
// 处理菜单事件和刷新显示
|
||||
menu_main_loop();
|
||||
|
||||
// 检查退出条件
|
||||
if (_kbhit() && _getch() == 'q')
|
||||
{
|
||||
printf("\r\nQuit program\r\n");
|
||||
break;
|
||||
}
|
||||
|
||||
// 轻微延迟,避免CPU占用过高
|
||||
|
||||
// 其他业务逻辑
|
||||
// ...
|
||||
|
||||
// 模拟延时
|
||||
menu_port_delay_ms(10);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user