mirror of
https://github.com/XunilGroup/XunilOS.git
synced 2026-04-25 11:49:03 +02:00
Remove micromath dependency, improve primitive drawing speed by 300x,
add mouse support and interrupts on x86_64 using a ps2 mouse which needed pic unmasking, add span filling to framebuffer, add back without_interrupts to serial console and framebuffer, add a mouse rectangle which tracks the mouse position and test the performance of the drawing.
This commit is contained in:
67
kernel/src/driver/mouse.rs
Normal file
67
kernel/src/driver/mouse.rs
Normal file
@@ -0,0 +1,67 @@
|
||||
use core::sync::atomic::{AtomicI16, AtomicU8, Ordering};
|
||||
|
||||
use spin::Mutex;
|
||||
|
||||
pub struct Mouse {
|
||||
left_button_pressed: AtomicU8,
|
||||
right_button_pressed: AtomicU8,
|
||||
middle_button_pressed: AtomicU8,
|
||||
x_delta: AtomicI16,
|
||||
y_delta: AtomicI16,
|
||||
status: AtomicU8,
|
||||
}
|
||||
|
||||
impl Mouse {
|
||||
const fn new() -> Mouse {
|
||||
Mouse {
|
||||
left_button_pressed: AtomicU8::new(0),
|
||||
right_button_pressed: AtomicU8::new(0),
|
||||
middle_button_pressed: AtomicU8::new(0),
|
||||
x_delta: AtomicI16::new(0),
|
||||
y_delta: AtomicI16::new(0),
|
||||
status: AtomicU8::new(0),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn interrupt(
|
||||
&self,
|
||||
left_button_pressed: u8,
|
||||
right_button_pressed: u8,
|
||||
middle_button_pressed: u8,
|
||||
x_delta: i16,
|
||||
y_delta: i16,
|
||||
) {
|
||||
self.left_button_pressed
|
||||
.store(left_button_pressed, Ordering::Relaxed);
|
||||
self.right_button_pressed
|
||||
.store(right_button_pressed, Ordering::Relaxed);
|
||||
self.middle_button_pressed
|
||||
.store(middle_button_pressed, Ordering::Relaxed);
|
||||
self.x_delta.fetch_add(x_delta, Ordering::Relaxed);
|
||||
self.y_delta.fetch_add(y_delta, Ordering::Relaxed);
|
||||
}
|
||||
|
||||
pub fn is_left_button_pressed(&self) -> u8 {
|
||||
self.left_button_pressed.load(Ordering::Relaxed)
|
||||
}
|
||||
pub fn is_right_button_pressed(&self) -> u8 {
|
||||
self.right_button_pressed.load(Ordering::Relaxed)
|
||||
}
|
||||
pub fn is_middle_button_pressed(&self) -> u8 {
|
||||
self.middle_button_pressed.load(Ordering::Relaxed)
|
||||
}
|
||||
pub fn get_x_delta(&self) -> i16 {
|
||||
self.x_delta.swap(0, Ordering::Relaxed)
|
||||
}
|
||||
pub fn get_y_delta(&self) -> i16 {
|
||||
self.y_delta.swap(0, Ordering::Relaxed)
|
||||
}
|
||||
pub fn set_status(&self, status: u8) {
|
||||
self.status.store(status, Ordering::Relaxed);
|
||||
}
|
||||
pub fn get_status(&self) -> u8 {
|
||||
self.status.load(Ordering::Relaxed)
|
||||
}
|
||||
}
|
||||
|
||||
pub static MOUSE: Mouse = Mouse::new();
|
||||
Reference in New Issue
Block a user