1
0
mirror of https://github.com/sgmarz/osblog.git synced 2024-11-23 18:06:20 +04:00

Added keyboard event gather. Fixed bug where we didn't replace the event queues.

This commit is contained in:
Stephen Marz 2020-05-28 16:06:05 -04:00
parent f9f93ada71
commit 8132b63f9c
3 changed files with 39 additions and 37 deletions

View File

@ -209,21 +209,28 @@ pub unsafe fn do_syscall(mepc: usize, frame: *mut TrapFrame) -> usize {
}, },
1002 => { 1002 => {
// wait for keyboard events // wait for keyboard events
let ret_pc;
let mut ev = KEY_EVENTS.take().unwrap(); let mut ev = KEY_EVENTS.take().unwrap();
if ev.is_empty() { let max_events = (*frame).regs[Registers::A1 as usize];
(*frame).regs[Registers::A0 as usize] = -1isize as usize; let vaddr = (*frame).regs[Registers::A0 as usize] as *const Event;
ret_pc = 0; if (*frame).satp >> 60 != 0 {
} let process = get_by_pid((*frame).pid as u16);
else { let table = ((*process).get_table_address()
let event = ev.pop_front().unwrap(); as *mut Table)
let ret = ((event.code as usize) << 16) | event.value as usize; .as_mut()
// println!("Code: {}, Value: {}, ret: 0x{:016x}", event.code, event.value, ret); .unwrap();
(*frame).regs[Registers::A0 as usize] = ret; (*frame).regs[Registers::A0 as usize] = 0;
ret_pc = 0; for i in 0..ev.len() {
let paddr = virt_to_phys(table, vaddr.add(i) as usize);
if paddr.is_none() {
break;
}
let paddr = paddr.unwrap() as *mut Event;
*paddr = ev.pop_front().unwrap();
(*frame).regs[Registers::A0 as usize] += 1;
}
} }
KEY_EVENTS.replace(ev); KEY_EVENTS.replace(ev);
ret_pc 0
}, },
1004 => { 1004 => {
// wait for abs events // wait for abs events
@ -240,7 +247,7 @@ pub unsafe fn do_syscall(mepc: usize, frame: *mut TrapFrame) -> usize {
for i in 0..ev.len() { for i in 0..ev.len() {
let paddr = virt_to_phys(table, vaddr.add(i) as usize); let paddr = virt_to_phys(table, vaddr.add(i) as usize);
if paddr.is_none() { if paddr.is_none() {
return 0; break;
} }
let paddr = paddr.unwrap() as *mut Event; let paddr = paddr.unwrap() as *mut Event;
*paddr = ev.pop_front().unwrap(); *paddr = ev.pop_front().unwrap();

View File

@ -49,53 +49,48 @@ struct Rect {
u32 height; u32 height;
}; };
u32 lerp(u32 val, u32 mx1, u32 mx2) { constexpr u32 lerp(u32 val, u32 mx1, u32 mx2) {
f64 r = val / static_cast<f64>(mx1); f64 r = val / static_cast<f64>(mx1);
return r * mx2; return r * mx2;
} }
int main() int main()
{ {
bool mouse_down = true; bool pressed = false;
int VERSION = -1;
printf("(%d): TESTING FRAMEBUFFER FROM USERSPACE\n", VERSION);
Pixel *fb = (Pixel *)syscall_get_fb(6); Pixel *fb = (Pixel *)syscall_get_fb(6);
Pixel blue_color = {0, 0, 255, 255};
Pixel red_color = {255, 0, 0, 255};
Pixel green_color = {0, 255, 0, 255};
Pixel white_color = {255, 255, 255, 255};
Pixel orange_color = {255, 150, 0, 255}; Pixel orange_color = {255, 150, 0, 255};
u32 x = 0; u32 x = 0;
u32 y = 0; u32 y = 0;
u32 width = 40; u32 num_events;
u32 height = 50;
unsigned long i = 0;
fill_rect(fb, 0, 0, 640, 480, white_color);
stroke_rect(fb, 10, 10, 20, 20, blue_color, 5);
stroke_rect(fb, 50, 50, 40, 40, green_color, 10);
stroke_rect(fb, 150, 150, 140, 140, red_color, 15);
draw_cosine(fb, 0, 400, 500, 50, red_color);
syscall_inv_rect(6, x, y, 640, 480);
i64 abs;
do { do {
if ((num_events = syscall_get_key(0, MAX_EVENTS)) > 0) {
if ((abs = syscall_get_abs(events, MAX_EVENTS)) < 1) { for (u32 z = 0;z < num_events;z++) {
Event &ev = events[z];
if (ev.code == BTN_MOUSE) {
pressed = (ev.value & 1) == 1;
}
}
}
if ((num_events = syscall_get_abs(events, MAX_EVENTS)) < 1) {
syscall_sleep(noevt_slptm); syscall_sleep(noevt_slptm);
continue; continue;
} }
for (i64 z = 0;z < abs;z++) { for (u32 z = 0;z < num_events;z++) {
Event &ev = events[z]; Event &ev = events[z];
if (ev.code == ABS_X) { if (ev.code == ABS_X) {
x = lerp(ev.value & 0x7fff, 32767, 640); x = lerp(ev.value & 0x7fff, 32767, 640);
fill_rect(fb, x, y, 5, 5, orange_color);
} }
else if (ev.code == ABS_Y) { else if (ev.code == ABS_Y) {
y = lerp(ev.value & 0x7fff, 32767, 480); y = lerp(ev.value & 0x7fff, 32767, 480);
}
if (pressed) {
fill_rect(fb, x, y, 5, 5, orange_color); fill_rect(fb, x, y, 5, 5, orange_color);
} }
} }
syscall_inv_rect(6, 0, 0, 640, 480); if (pressed) {
syscall_inv_rect(6, 0, 0, 640, 480);
}
} while (true); } while (true);
return 0; return 0;
} }

View File

@ -17,7 +17,7 @@ extern "C"
#define syscall_sleep(x) make_syscall(10, (unsigned long)x) #define syscall_sleep(x) make_syscall(10, (unsigned long)x)
#define syscall_get_fb(x) make_syscall(1000, (unsigned long)x) #define syscall_get_fb(x) make_syscall(1000, (unsigned long)x)
#define syscall_inv_rect(d, x, y, w, h) make_syscall(1001, (unsigned long) d, (unsigned long)x, (unsigned long)y, (unsigned long)w, (unsigned long)h) #define syscall_inv_rect(d, x, y, w, h) make_syscall(1001, (unsigned long) d, (unsigned long)x, (unsigned long)y, (unsigned long)w, (unsigned long)h)
#define syscall_get_key(x) make_syscall(1002) #define syscall_get_key(x, y) make_syscall(1002, (unsigned long)x, (unsigned long)y)
#define syscall_get_abs(x, y) make_syscall(1004, (unsigned long)x, (unsigned long)y) #define syscall_get_abs(x, y) make_syscall(1004, (unsigned long)x, (unsigned long)y)
#define syscall_get_time() make_syscall(1062) #define syscall_get_time() make_syscall(1062)