From 42b119d624d298c0b5f86253e6cacaa13a4bcb10 Mon Sep 17 00:00:00 2001 From: Matheus Date: Fri, 9 Sep 2022 18:19:23 -0300 Subject: [PATCH] consoledev: keyboard input and better sync --- src/video/consoledev.c | 83 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/src/video/consoledev.c b/src/video/consoledev.c index 861a9a88..03f658f2 100644 --- a/src/video/consoledev.c +++ b/src/video/consoledev.c @@ -3,22 +3,92 @@ #include #include #include +#include +#include +#include +#include #define CONSOLE_MAJOR 1 +static ringbuffer_t input; +static thread_t* thread; +static event_t outputevent; +static event_t inputevent; +static int outputlock; + +void console_write(char* str, size_t count){ + + + while(!spinlock_trytoacquire(&outputlock)){ + event_wait(&outputevent, false); + } + + liminetty_writeuser(str, count); + + spinlock_release(&outputlock); + +} + +__attribute__((noreturn)) static void console_thread(){ + + for(;;){ + kbpacket_t packet; + + keyboard_getandwait(0, &packet); + + + if(packet.ascii && (KBPACKET_FLAGS_RELEASED & packet.flags) == 0){ + + // echo + + console_write(&packet.ascii, 1); + + arch_interrupt_disable(); + + ringbuffer_write(&input, &packet.ascii, 1); + + arch_interrupt_enable(); + + event_signal(&inputevent, true); + } + } + +} + static int isatty(int minor){ return 0; } static int read(int *error, int dev, void* buff, size_t count, size_t offset){ - *error = ENOSYS; - return -1; + + int readc = 0; + + *error = 0; + + while(readc == 0){ + + arch_interrupt_disable(); + + readc = ringbuffer_read(&input, buff, count); + + arch_interrupt_enable(); + + if(!readc) *error = event_wait(&inputevent, true); + + if(*error) + return -1; + + + + } + + return readc; } static int write(int *error, int dev, void* buff, size_t count, size_t offset){ *error = 0; - liminetty_writeuser(buff, count); + console_write(buff, count); return count; } @@ -33,5 +103,12 @@ void consoledev_init(){ if(devman_newdevice("console", TYPE_CHARDEV, CONSOLE_MAJOR, 0, &calls)) _panic("Failed to create console device", 0); + if(ringbuffer_init(&input, 4096)) + _panic("Failed to initialise console ringbuffer", 0); + thread = sched_newkthread(console_thread, 4096*10, true, THREAD_PRIORITY_KERNEL); + + if(!thread) + _panic("Failed to initialise console thread", 0); + }