Decode input events in inputdev_event.rs

This commit is contained in:
Yifan Wu 2023-01-12 00:21:57 -08:00
parent 4430e86d5a
commit f0cecc4940
9 changed files with 67 additions and 67 deletions

View file

@ -13,10 +13,8 @@ buddy_system_allocator = "0.6"
bitflags = "1.2.1" bitflags = "1.2.1"
xmas-elf = "0.7.0" xmas-elf = "0.7.0"
volatile = "0.3" volatile = "0.3"
#virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers", rev = "4ee80e5" } virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers", rev = "4ee80e5" }
virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers", rev = "70b5850" }
easy-fs = { path = "../easy-fs" } easy-fs = { path = "../easy-fs" }
#virtio-input-decoder = "0.1.4"
embedded-graphics = "0.7.1" embedded-graphics = "0.7.1"
tinybmp = "0.3.1" tinybmp = "0.3.1"

View file

@ -16,41 +16,20 @@ struct VirtIOInputInner {
struct VirtIOInputWrapper { struct VirtIOInputWrapper {
inner: UPIntrFreeCell<VirtIOInputInner>, inner: UPIntrFreeCell<VirtIOInputInner>,
//condvars: BTreeMap<u16, Condvar>,
//condvar: Arc::<Condvar> ,
condvar: Condvar, condvar: Condvar,
} }
pub trait InputDevice: Send + Sync + Any { pub trait InputDevice: Send + Sync + Any {
fn read_event(&self) -> u64; fn read_event(&self) -> u64;
fn handle_irq(&self); fn handle_irq(&self);
// fn events(&self) -> &VecDeque<u64>;
fn is_empty(&self) -> bool; fn is_empty(&self) -> bool;
} }
lazy_static::lazy_static!( lazy_static::lazy_static!(
pub static ref KEYBOARD_DEVICE: Arc<dyn InputDevice> = Arc::new(VirtIOInputWrapper::new(VIRTIO5)); pub static ref KEYBOARD_DEVICE: Arc<dyn InputDevice> = Arc::new(VirtIOInputWrapper::new(VIRTIO5));
pub static ref MOUSE_DEVICE: Arc<dyn InputDevice> = Arc::new(VirtIOInputWrapper::new(VIRTIO6)); pub static ref MOUSE_DEVICE: Arc<dyn InputDevice> = Arc::new(VirtIOInputWrapper::new(VIRTIO6));
// pub static ref INPUT_CONDVAR: Arc::<Condvar> = Arc::new(Condvar::new());
); );
// from virtio-drivers/src/input.rs
//const QUEUE_SIZE: u16 = 32;
// pub fn read_input_event() -> u64 {
// loop {
// //let mut inner = self.inner.exclusive_access();
// let kb=KEYBOARD_DEVICE.clone();
// let evs = kb.events();
// if let Some(event) = evs.pop_front() {
// return event;
// } else {
// let task_cx_ptr = INPUT_CONDVAR.clone().wait_no_sched();
// drop(inner);
// schedule(task_cx_ptr);
// }
// }
// }
impl VirtIOInputWrapper { impl VirtIOInputWrapper {
pub fn new(addr: usize) -> Self { pub fn new(addr: usize) -> Self {
let inner = VirtIOInputInner { let inner = VirtIOInputInner {
@ -59,17 +38,8 @@ impl VirtIOInputWrapper {
}, },
events: VecDeque::new(), events: VecDeque::new(),
}; };
// let mut condvars = BTreeMap::new();
// let channels = QUEUE_SIZE;
// for i in 0..channels {
// let condvar = Condvar::new();
// condvars.insert(i, condvar);
// }
Self { Self {
inner: unsafe { UPIntrFreeCell::new(inner) }, inner: unsafe { UPIntrFreeCell::new(inner) },
//condvar: INPUT_CONDVAR.clone(),
condvar: Condvar::new(), condvar: Condvar::new(),
} }
} }
@ -93,29 +63,20 @@ impl InputDevice for VirtIOInputWrapper {
} }
} }
// fn events(&self) -> &VecDeque<u64> {
// &self.inner.exclusive_access().events
// }
fn handle_irq(&self) { fn handle_irq(&self) {
let mut count = 0; let mut count = 0;
let mut result = 0; let mut result = 0;
let mut key = 0;
self.inner.exclusive_session(|inner| { self.inner.exclusive_session(|inner| {
inner.virtio_input.ack_interrupt(); inner.virtio_input.ack_interrupt();
while let Some((token, event)) = inner.virtio_input.pop_pending_event() { while let Some(event) = inner.virtio_input.pop_pending_event() {
count += 1; count += 1;
key = token;
result = (event.event_type as u64) << 48 result = (event.event_type as u64) << 48
| (event.code as u64) << 32 | (event.code as u64) << 32
| (event.value) as u64; | (event.value) as u64;
inner.events.push_back(result); inner.events.push_back(result);
// for test
//println!("[KERN] inputdev_handle_irq: event: {:x}", result);
} }
}); });
if count > 0 { if count > 0 {
//self.condvars.get(&key).unwrap().signal();
self.condvar.signal(); self.condvar.signal();
}; };
} }

View file

@ -29,7 +29,6 @@ mod trap;
use crate::drivers::chardev::CharDevice; use crate::drivers::chardev::CharDevice;
use crate::drivers::chardev::UART; use crate::drivers::chardev::UART;
//use syscall::create_desktop; //for test
core::arch::global_asm!(include_str!("entry.asm")); core::arch::global_asm!(include_str!("entry.asm"));
@ -59,7 +58,6 @@ pub fn rust_main() -> ! {
UART.init(); UART.init();
println!("KERN: init gpu"); println!("KERN: init gpu");
let _gpu = GPU_DEVICE.clone(); let _gpu = GPU_DEVICE.clone();
//let _input_condvar = INPUT_CONDVAR.clone();
println!("KERN: init keyboard"); println!("KERN: init keyboard");
let _keyboard = KEYBOARD_DEVICE.clone(); let _keyboard = KEYBOARD_DEVICE.clone();
println!("KERN: init mouse"); println!("KERN: init mouse");

View file

@ -12,5 +12,7 @@ bitflags = "1.2.1"
riscv = { git = "https://github.com/rcore-os/riscv", features = ["inline-asm"] } riscv = { git = "https://github.com/rcore-os/riscv", features = ["inline-asm"] }
embedded-graphics = "0.7.1" embedded-graphics = "0.7.1"
oorandom ="11" oorandom ="11"
virtio-input-decoder = "0.1.4"
[profile.release] [profile.release]
debug = true debug = true

View file

@ -48,7 +48,6 @@ impl DrawingBoard {
#[no_mangle] #[no_mangle]
pub fn main() -> i32 { pub fn main() -> i32 {
// let fb_ptr = framebuffer() as *mut u8;
let mut board = DrawingBoard::new(); let mut board = DrawingBoard::new();
let _ = board.disp.clear(Rgb888::BLACK).unwrap(); let _ = board.disp.clear(Rgb888::BLACK).unwrap();
for i in 0..20 { for i in 0..20 {

View file

@ -1,7 +1,6 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
#[macro_use]
extern crate user_lib; extern crate user_lib;
use user_lib::{VIRTGPU_XRES, VIRTGPU_YRES, Display}; use user_lib::{VIRTGPU_XRES, VIRTGPU_YRES, Display};

View file

@ -1,7 +1,6 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
#[macro_use]
extern crate user_lib; extern crate user_lib;
extern crate alloc; extern crate alloc;

View file

@ -1,7 +1,7 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
use user_lib::{event_get}; use user_lib::{event_get, DecodeType, Key, KeyType};
#[macro_use] #[macro_use]
extern crate user_lib; extern crate user_lib;
@ -9,13 +9,17 @@ extern crate user_lib;
#[no_mangle] #[no_mangle]
pub fn main() -> i32 { pub fn main() -> i32 {
println!("Input device event test"); println!("Input device event test");
let mut event=0; loop {
for _ in 0..3 { if let Some(event) = event_get() {
while event==0 { if let Some(decoder_type) = event.decode() {
event = event_get(); println!("{:?}", decoder_type);
} if let DecodeType::Key(key, keytype) = decoder_type {
println!("event: {:?}", event); if key == Key::Enter && keytype == KeyType::Press {
break;
}
}
}
}
} }
0 0
} }

View file

@ -2,6 +2,8 @@ use super::*;
use embedded_graphics::prelude::{RgbColor, Size}; use embedded_graphics::prelude::{RgbColor, Size};
use embedded_graphics::{draw_target::DrawTarget, prelude::OriginDimensions}; use embedded_graphics::{draw_target::DrawTarget, prelude::OriginDimensions};
use embedded_graphics::pixelcolor::Rgb888; use embedded_graphics::pixelcolor::Rgb888;
use virtio_input_decoder::Decoder;
pub use virtio_input_decoder::{DecodeType, Key, KeyType, Mouse};
pub const VIRTGPU_XRES: u32 = 1280; pub const VIRTGPU_XRES: u32 = 1280;
pub const VIRTGPU_YRES: u32 = 800; pub const VIRTGPU_YRES: u32 = 800;
@ -14,17 +16,6 @@ pub fn framebuffer_flush() -> isize {
sys_framebuffer_flush() sys_framebuffer_flush()
} }
pub fn event_get() -> isize {
sys_event_get()
}
pub fn key_pressed() -> bool {
if sys_key_pressed() == 1 {
true
} else {
false
}
}
pub struct Display { pub struct Display {
pub size: Size, pub size: Size,
pub fb: &'static mut [u8], pub fb: &'static mut [u8],
@ -76,3 +67,52 @@ impl DrawTarget for Display {
Ok(()) Ok(())
} }
} }
pub fn event_get() -> Option<InputEvent> {
let raw_value = sys_event_get();
if raw_value == 0 {
None
} else {
Some((raw_value as u64).into())
}
}
pub fn key_pressed() -> bool {
if sys_key_pressed() == 1 {
true
} else {
false
}
}
#[repr(C)]
pub struct InputEvent {
pub event_type: u16,
pub code: u16,
pub value: u32,
}
impl From<u64> for InputEvent {
fn from(mut v: u64) -> Self {
let value = v as u32;
v >>= 32;
let code = v as u16;
v >>= 16;
let event_type = v as u16;
Self {
event_type,
code,
value,
}
}
}
impl InputEvent {
pub fn decode(&self) -> Option<DecodeType> {
Decoder::decode(
self.event_type as usize,
self.code as usize,
self.value as usize,
).ok()
}
}