This commit is contained in:
Philipp Oppermann
2020-03-22 11:58:16 +01:00
parent 816f8746fb
commit ca8cd46863
3 changed files with 24 additions and 18 deletions

View File

@@ -7,6 +7,7 @@
#![feature(alloc_layout_extra)] #![feature(alloc_layout_extra)]
#![feature(const_in_array_repeat_expressions)] #![feature(const_in_array_repeat_expressions)]
#![feature(wake_trait)] #![feature(wake_trait)]
#![feature(async_closure)]
#![test_runner(crate::test_runner)] #![test_runner(crate::test_runner)]
#![reexport_test_harness_main = "test_main"] #![reexport_test_harness_main = "test_main"]

View File

@@ -15,7 +15,7 @@ entry_point!(kernel_main);
fn kernel_main(boot_info: &'static BootInfo) -> ! { fn kernel_main(boot_info: &'static BootInfo) -> ! {
use blog_os::allocator; use blog_os::allocator;
use blog_os::memory::{self, BootInfoFrameAllocator}; 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; use x86_64::VirtAddr;
println!("Hello World{}", "!"); println!("Hello World{}", "!");
@@ -29,7 +29,7 @@ fn kernel_main(boot_info: &'static BootInfo) -> ! {
let mut executor = SimpleExecutor::new(); let mut executor = SimpleExecutor::new();
executor.spawn(Task::new(example_task())); executor.spawn(Task::new(example_task()));
executor.spawn(Task::new(ScancodeStream::new().print_keypresses())); executor.spawn(Task::new(keyboard::print_keypresses()));
executor.run(); executor.run();
#[cfg(test)] #[cfg(test)]

View File

@@ -7,27 +7,16 @@ use crate::print;
static SCANCODE_QUEUE: OnceCell<ArrayQueue<u8>> = OnceCell::uninit(); static SCANCODE_QUEUE: OnceCell<ArrayQueue<u8>> = OnceCell::uninit();
pub struct ScancodeStream; pub struct ScancodeStream {
_private: (),
}
impl ScancodeStream { impl ScancodeStream {
pub fn new() -> Self { pub fn new() -> Self {
SCANCODE_QUEUE.try_init_once(|| ArrayQueue::new(100)) SCANCODE_QUEUE.try_init_once(|| ArrayQueue::new(100))
.expect("ScancodeStream::new should only be called once"); .expect("ScancodeStream::new should only be called once");
ScancodeStream ScancodeStream {
} _private: (),
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),
}
}
}
} }
} }
} }
@@ -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),
}
}
}
}
}