#menu #cycle #no-std

no-std cycle-menu

一个简单的no-std兼容库,用于创建可循环并通过自定义输入/输出显示的菜单

6个版本 (3个重大更新)

0.4.2 2024年5月22日
0.4.1 2024年2月16日
0.3.0 2024年2月16日
0.2.0 2024年1月31日
0.1.0 2024年1月28日

#7 in #cycle

MIT/Apache

12KB
246

cycle-menu

一个简单的no-std兼容库,用于创建可循环并通过自定义输入/输出显示的菜单。

菜单对象有两个函数,next和ok,用于控制它。创建菜单时,会提供一个回调,稍后用于显示菜单项。存在两种不同的菜单项

  • 操作:包含在选中时执行的回调
  • 子菜单:包含菜单项列表

示例

此示例使用edge-executor运行两个任务,这两个任务等待按钮输入并控制菜单。项目将打印到控制台

pub fn setup<P1: Pin, P2: Pin>(
    ex: &LocalExecutor,
    btn1: PinDriver<'static, P1, Input>,
    btn2: PinDriver<'static, P2, Input>,
) {
    let menu = Box::leak(Box::new(Mutex::new(create_menu())));
    // left button
    ex.spawn(btn_task(btn1, || {
        if let Ok(mut menu) = menu.try_lock() {
            menu.skip();
        } else {
            info!("Menu is locked");
        };
    }))
    .detach();

    // right button
    ex.spawn(btn_task(btn2, || {
        if let Ok(mut menu) = menu.try_lock() {
            menu.ok();
        } else {
            info!("Menu is locked");
        };
    }))
    .detach();
}

fn create_menu() -> Menu<'static> {
    let items = vec![
        Item::new_action("Test 1", || println!("Test activated")),
        Item::new_submenu(
            "Sub",
            vec![
                Item::new_action("Sub 1", || println!("Sub 1 activated")),
                Item::new_action("Sub 2", || println!("Sub 2 activated")),
            ],
        ),
    ];
    Menu::new(items, display)
}

fn display(text: &str) {
    info!("Menu: {text}")
}

无运行时依赖

特性