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
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}")
}