Prepare non-canonical mode

This commit is contained in:
Baptiste Wicht 2016-08-17 21:25:39 +02:00
parent 19e3a6d24d
commit ede66a39a6
2 changed files with 22 additions and 1 deletions

View File

@ -24,6 +24,7 @@ struct virtual_terminal {
circular_buffer<char, INPUT_BUFFER_SIZE> input_buffer;
circular_buffer<char, 2 * INPUT_BUFFER_SIZE> canonical_buffer;
circular_buffer<size_t, 3 * INPUT_BUFFER_SIZE> 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;

View File

@ -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];