From 90abd5c8c5e44760f8616757e9dbe9afd8978f8e Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 22 Mar 2020 12:45:24 +0100 Subject: [PATCH] Add a keyboard task that prints keypresses --- src/main.rs | 3 ++- src/task/keyboard.rs | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 40da8c06..797c5daf 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}; + use blog_os::task::{keyboard, simple_executor::SimpleExecutor, Task}; use x86_64::VirtAddr; println!("Hello World{}", "!"); @@ -29,6 +29,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! { let mut executor = SimpleExecutor::new(); executor.spawn(Task::new(example_task())); + executor.spawn(Task::new(keyboard::print_keypresses())); executor.run(); #[cfg(test)] diff --git a/src/task/keyboard.rs b/src/task/keyboard.rs index 97e7331b..c33a4b19 100644 --- a/src/task/keyboard.rs +++ b/src/task/keyboard.rs @@ -1,3 +1,4 @@ +use crate::print; use crate::println; use conquer_once::spin::OnceCell; use core::{ @@ -5,7 +6,9 @@ use core::{ task::{Context, Poll}, }; use crossbeam_queue::ArrayQueue; +use futures_util::stream::StreamExt; use futures_util::{stream::Stream, task::AtomicWaker}; +use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1}; static SCANCODE_QUEUE: OnceCell> = OnceCell::uninit(); static WAKER: AtomicWaker = AtomicWaker::new(); @@ -58,3 +61,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), + } + } + } + } +}