diff --git a/risc_v/src/syscall.rs b/risc_v/src/syscall.rs index 48a077f..1153582 100755 --- a/risc_v/src/syscall.rs +++ b/risc_v/src/syscall.rs @@ -209,21 +209,28 @@ pub unsafe fn do_syscall(mepc: usize, frame: *mut TrapFrame) -> usize { }, 1002 => { // wait for keyboard events - let ret_pc; let mut ev = KEY_EVENTS.take().unwrap(); - if ev.is_empty() { - (*frame).regs[Registers::A0 as usize] = -1isize as usize; - ret_pc = 0; - } - else { - let event = ev.pop_front().unwrap(); - let ret = ((event.code as usize) << 16) | event.value as usize; - // println!("Code: {}, Value: {}, ret: 0x{:016x}", event.code, event.value, ret); - (*frame).regs[Registers::A0 as usize] = ret; - ret_pc = 0; + let max_events = (*frame).regs[Registers::A1 as usize]; + let vaddr = (*frame).regs[Registers::A0 as usize] as *const Event; + if (*frame).satp >> 60 != 0 { + let process = get_by_pid((*frame).pid as u16); + let table = ((*process).get_table_address() + as *mut Table) + .as_mut() + .unwrap(); + (*frame).regs[Registers::A0 as usize] = 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); - ret_pc + 0 }, 1004 => { // 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() { let paddr = virt_to_phys(table, vaddr.add(i) as usize); if paddr.is_none() { - return 0; + break; } let paddr = paddr.unwrap() as *mut Event; *paddr = ev.pop_front().unwrap(); diff --git a/risc_v/src/userspace/fb.cpp b/risc_v/src/userspace/fb.cpp index a2ffec2..bb2bf96 100644 --- a/risc_v/src/userspace/fb.cpp +++ b/risc_v/src/userspace/fb.cpp @@ -49,53 +49,48 @@ struct Rect { u32 height; }; -u32 lerp(u32 val, u32 mx1, u32 mx2) { +constexpr u32 lerp(u32 val, u32 mx1, u32 mx2) { f64 r = val / static_cast(mx1); return r * mx2; } int main() { - bool mouse_down = true; - int VERSION = -1; - printf("(%d): TESTING FRAMEBUFFER FROM USERSPACE\n", VERSION); + bool pressed = false; 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}; u32 x = 0; u32 y = 0; - u32 width = 40; - u32 height = 50; - unsigned long i = 0; + u32 num_events; - 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 { - - if ((abs = syscall_get_abs(events, MAX_EVENTS)) < 1) { + if ((num_events = syscall_get_key(0, MAX_EVENTS)) > 0) { + 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); continue; } - for (i64 z = 0;z < abs;z++) { + for (u32 z = 0;z < num_events;z++) { Event &ev = events[z]; if (ev.code == ABS_X) { x = lerp(ev.value & 0x7fff, 32767, 640); - fill_rect(fb, x, y, 5, 5, orange_color); } else if (ev.code == ABS_Y) { y = lerp(ev.value & 0x7fff, 32767, 480); + } + if (pressed) { 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); return 0; } diff --git a/risc_v/src/userspace/startlib/syscall.h b/risc_v/src/userspace/startlib/syscall.h index 5f05c3f..a9be642 100644 --- a/risc_v/src/userspace/startlib/syscall.h +++ b/risc_v/src/userspace/startlib/syscall.h @@ -17,7 +17,7 @@ extern "C" #define syscall_sleep(x) make_syscall(10, (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_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_time() make_syscall(1062)