diff --git a/src/lib.rs b/src/lib.rs index 2ce93a66..780db375 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,7 @@ #![feature(alloc_layout_extra)] #![feature(const_in_array_repeat_expressions)] #![feature(wake_trait)] +#![feature(async_closure)] #![test_runner(crate::test_runner)] #![reexport_test_harness_main = "test_main"] diff --git a/src/main.rs b/src/main.rs index 2c0448f3..52fa2e3e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,7 @@ entry_point!(kernel_main); fn kernel_main(boot_info: &'static BootInfo) -> ! { use blog_os::allocator; use blog_os::memory::{self, BootInfoFrameAllocator}; - use blog_os::task::{simple_executor::SimpleExecutor, Task, keyboard::ScancodeStream}; + use blog_os::task::{simple_executor::SimpleExecutor, Task, keyboard}; use x86_64::VirtAddr; println!("Hello World{}", "!"); @@ -29,7 +29,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { let mut executor = SimpleExecutor::new(); executor.spawn(Task::new(example_task())); - executor.spawn(Task::new(ScancodeStream::new().print_keypresses())); + executor.spawn(Task::new(keyboard::print_keypresses())); executor.run(); #[cfg(test)] diff --git a/src/task/keyboard.rs b/src/task/keyboard.rs index 5f394a64..a001c73d 100644 --- a/src/task/keyboard.rs +++ b/src/task/keyboard.rs @@ -7,27 +7,16 @@ use crate::print; static SCANCODE_QUEUE: OnceCell> = OnceCell::uninit(); -pub struct ScancodeStream; +pub struct ScancodeStream { + _private: (), +} impl ScancodeStream { pub fn new() -> Self { SCANCODE_QUEUE.try_init_once(|| ArrayQueue::new(100)) .expect("ScancodeStream::new should only be called once"); - ScancodeStream - } - - pub async fn print_keypresses(mut self) { - let mut keyboard = Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore); - - while let Some(scancode) = self.next().await { - if let Ok(Some(key_event)) = keyboard.add_byte(scancode) { - if let Some(key) = keyboard.process_keyevent(key_event) { - match key { - DecodedKey::Unicode(character) => print!("{}", character), - DecodedKey::RawKey(key) => print!("{:?}", key), - } - } - } + ScancodeStream { + _private: (), } } } @@ -45,3 +34,19 @@ impl Stream for ScancodeStream { } } } + +pub async fn print_keypresses() { + let mut scancodes = ScancodeStream::new(); + let mut keyboard = Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore); + + while let Some(scancode) = scancodes.next().await { + if let Ok(Some(key_event)) = keyboard.add_byte(scancode) { + if let Some(key) = keyboard.process_keyevent(key_event) { + match key { + DecodedKey::Unicode(character) => print!("{}", character), + DecodedKey::RawKey(key) => print!("{:?}", key), + } + } + } + } +}