Continue working on terminal (not in good shape ;) )

This commit is contained in:
Baptiste Wicht 2014-02-01 23:24:08 +01:00
parent 50c1acee27
commit 7cc6c9dc5a
4 changed files with 58 additions and 5 deletions

View File

@ -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<char, INPUT_BUFFER_SIZE> 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();

View File

@ -109,7 +109,7 @@ void give_char(scheduler::pid_t pid, char t){
void keyboard_handler(const interrupt::syscall_regs&){
auto key = static_cast<char>(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

View File

@ -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<char*>(regs.rbx), regs.rcx);
}
} //End of anonymous namespace

View File

@ -9,6 +9,7 @@
#include "terminal.hpp"
#include "keyboard.hpp"
#include "console.hpp"
namespace {
@ -21,6 +22,11 @@ std::vector<stdio::virtual_terminal> 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];
}