From 7cc6c9dc5a978728c93bfc7da012f3f0b99ad0c7 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 1 Feb 2014 23:24:08 +0100 Subject: [PATCH] Continue working on terminal (not in good shape ;) ) --- kernel/include/terminal.hpp | 13 ++++++++++++ kernel/src/keyboard.cpp | 2 +- kernel/src/system_calls.cpp | 6 +++++- kernel/src/terminal.cpp | 42 ++++++++++++++++++++++++++++++++++--- 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/kernel/include/terminal.hpp b/kernel/include/terminal.hpp index c33d77eb..de49a000 100644 --- a/kernel/include/terminal.hpp +++ b/kernel/include/terminal.hpp @@ -11,6 +11,8 @@ #include "stl/types.hpp" #include "stl/circular_buffer.hpp" +#include "sleep_queue.hpp" + namespace stdio { constexpr const size_t INPUT_BUFFER_SIZE = 128; @@ -22,8 +24,19 @@ struct virtual_terminal { circular_buffer input_buffer; + sleep_queue input_queue; + void print(char c); void send_input(char c); + size_t read_input(char* buffer, size_t max); + + virtual_terminal() : id(65535) {} + +/* virtual_terminal(const virtual_terminal& rhs) = delete; + virtual_terminal& operator=(const virtual_terminal& rhs) = delete; + + virtual_terminal(virtual_terminal&& rhs) = default; + virtual_terminal& operator=(virtual_terminal&& rhs) = default;*/ }; void init_terminals(); diff --git a/kernel/src/keyboard.cpp b/kernel/src/keyboard.cpp index b3a69ac3..41019563 100644 --- a/kernel/src/keyboard.cpp +++ b/kernel/src/keyboard.cpp @@ -109,7 +109,7 @@ void give_char(scheduler::pid_t pid, char t){ void keyboard_handler(const interrupt::syscall_regs&){ auto key = static_cast(in_byte(0x60)); - stdio::get_active_terminal().send_input(key); + //TODO stdio::get_active_terminal().send_input(key); if(count == BUFFER_SIZE){ //The buffer is full, we loose the characters diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 288c0c20..b5756382 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -9,6 +9,7 @@ #include "console.hpp" #include "scheduler.hpp" #include "keyboard.hpp" +#include "terminal.hpp" namespace { @@ -25,7 +26,10 @@ void sc_print_digit(const interrupt::syscall_regs& regs){ } void sc_get_input(const interrupt::syscall_regs& regs){ - //TODO + auto ttyid = scheduler::get_process(scheduler::get_pid()).tty; + auto& tty = stdio::get_terminal(ttyid); + + tty.read_input(reinterpret_cast(regs.rbx), regs.rcx); } } //End of anonymous namespace diff --git a/kernel/src/terminal.cpp b/kernel/src/terminal.cpp index 8e1eb779..cdd72fcf 100644 --- a/kernel/src/terminal.cpp +++ b/kernel/src/terminal.cpp @@ -9,6 +9,7 @@ #include "terminal.hpp" #include "keyboard.hpp" +#include "console.hpp" namespace { @@ -21,6 +22,11 @@ std::vector terminals; } //end of anonymous namespace +void stdio::virtual_terminal::print(char key){ + //TODO If it is not the active terminal, buffer it + k_print(key); +} + void stdio::virtual_terminal::send_input(char key){ if(canonical){ //Key released @@ -46,16 +52,42 @@ void stdio::virtual_terminal::send_input(char key){ : keyboard::key_to_ascii(key); if(qwertz_key){ - input_buffer.push(qwertz_key); + if(input_queue.empty()){ + input_buffer.push(qwertz_key); + } else { + //TODO + } print(qwertz_key); } } } } else { - + //TODO } - //TODO +} + +size_t stdio::virtual_terminal::read_input(char* buffer, size_t max){ + size_t read = 0; + + while(read < max && !input_buffer.empty()){ + buffer[read] = input_buffer.pop(); + + if(buffer[read] == '\n'){ + ++read; + break; + } + + ++read; + } + + if(read == max || buffer[read] == '\n'){ + scheduler::get_process(scheduler::get_pid()).regs.rax = read; + } else { + input_queue.sleep(); + } + + return 0; } void stdio::init_terminals(){ @@ -74,3 +106,7 @@ void stdio::init_terminals(){ stdio::virtual_terminal& stdio::get_active_terminal(){ return terminals[active_terminal]; } + +stdio::virtual_terminal& stdio::get_terminal(size_t id){ + return terminals[id]; +}