From ede66a39a6808310eaa88be79192db3839f7c44b Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Wed, 17 Aug 2016 21:25:39 +0200 Subject: [PATCH] Prepare non-canonical mode --- kernel/include/terminal.hpp | 7 +++++++ kernel/src/terminal.cpp | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/kernel/include/terminal.hpp b/kernel/include/terminal.hpp index 84f31f59..faf64b9c 100644 --- a/kernel/include/terminal.hpp +++ b/kernel/include/terminal.hpp @@ -24,6 +24,7 @@ struct virtual_terminal { circular_buffer input_buffer; circular_buffer canonical_buffer; + circular_buffer raw_buffer; sleep_queue input_queue; @@ -38,6 +39,12 @@ struct virtual_terminal { */ size_t read_input_can(char* buffer, size_t max); + /*! + * \brief Reads non-canonical input in the given buffer + * \return the keyboard scan code + */ + size_t read_input_raw(); + virtual_terminal(){} virtual_terminal(const virtual_terminal& rhs) = delete; diff --git a/kernel/src/terminal.cpp b/kernel/src/terminal.cpp index b464339a..24084ee5 100644 --- a/kernel/src/terminal.cpp +++ b/kernel/src/terminal.cpp @@ -71,7 +71,13 @@ void stdio::virtual_terminal::send_input(char key){ } } } else { - //TODO + // The complete processing of the key will be done by the + // userspace program + raw_buffer.push(key); + + if(!input_queue.empty()){ + input_queue.wake_up(); + } } } @@ -93,6 +99,14 @@ size_t stdio::virtual_terminal::read_input_can(char* buffer, size_t max){ } } +size_t stdio::virtual_terminal::read_input_raw(){ + if(raw_buffer.empty()){ + input_queue.sleep(); + } + + return raw_buffer.pop(); +} + void stdio::init_terminals(){ for(size_t i = 0; i < MAX_TERMINALS; ++i){ auto& terminal = terminals[i];