如何在uefi rs(uefi Rust包装器)中读取用户输入



我想知道是否有任何方法可以使用UEFI rs Rust包装器读取UEFI中的用户输入。(或者我可以通过Rust在UEFI中收集用户输入的任何其他方式(

我对read_key这个键事件尝试了很多不同的方法,其中一种甚至没有编译,另一种只打印零。我还浏览了几十个GitHub存储库,但似乎没有一个使用这些方法。

第一种方法(读取密钥(:

let bs = st.boot_services();
let read_key =  st.stdin().read_key();
let unwrap = read_key.unwrap();
if unwrap.is_some() {
st.stdout().write_str(&unwrap.expect("Error").fmt(&mut fmt::Formatter).to_string()).expect("Failed to write to the console.");
}

第二种方法(等待事件(:

let mut binding = st.unsafe_clone();
key_event = binding.stdin().wait_for_key_event();
let result = bs.wait_for_event(&mut [key_event.unsafe_clone()]);
let usize = result.unwrap();
st.stdout().write_str(&usize.to_string()).expect("Failed to write to the console.");

那里可能有很多初学者的错误,因为我对Rust没有太多的经验。我做了几个项目,现在我发现了这个,所以我想尝试一下。在Assembly中,用户输入是一件相对容易的事情。(根据我迄今为止对Rust的经验(

如果有人知道我可以检查的存储库,或者知道答案,请帮忙。我已经为此工作了好几个小时了。

板条箱文档链接:https://docs.rs/uefi/latest/uefi/源代码:https://github.com/rust-osdev/uefi-rs

这里有一个简短的示例,用于在用户按下"ESC"之前读取输入。

#![no_main]
#![no_std]
#![feature(abi_efiapi)]
use core::fmt::{Write};
use uefi::{prelude::*, proto::console::text::ScanCode, Char16};
#[entry]
fn main(_handle: Handle, mut st: SystemTable<Boot>) -> Status {
uefi_services::init(&mut st).unwrap();

let mut exit_flag = false;
while !exit_flag {
let key = st.stdin().read_key().expect("Expected input");
let _ = match key {
Some(k) =>  {
match k {
uefi::proto::console::text::Key::Printable(p) => {
write!(st.stdout(), "A printable key was entered: {:?}rn", p).expect("Write failed");
if p == Char16::try_from(27u16).expect("Unable to convert the ESC ascii code to Char16") {
exit_flag = true;
}
}
uefi::proto::console::text::Key::Special(s) => {
write!(st.stdout(), "A special key was entered: {:?}rn", s).expect("Write failed");
if s == ScanCode::ESCAPE {
exit_flag = true;
}
}
};             
},
None => {}
};
}
Status::SUCCESS
}

我以前从未使用过uefi rs,可能有更好的解决方案来处理这个机箱的输入。

以模板为起点,替换main.rs。使用:cargo +nightly build --target x86_64-unknown-uefi构建

相关内容

  • 没有找到相关文章

最新更新