implement prover stdin reading
This commit is contained in:
+57
-30
@@ -1,5 +1,11 @@
|
||||
#include "../include/keyboard.h"
|
||||
#include <stdbool.h>
|
||||
#include "../include/task.h"
|
||||
#include "../include/string.h"
|
||||
|
||||
char stdin_buffer[STDIN_BUFFER_SIZE];
|
||||
int stdin_pos = 0;
|
||||
bool stdin_has_line = false;
|
||||
|
||||
unsigned char kbdus[128] =
|
||||
{
|
||||
@@ -87,39 +93,60 @@ bool caps_pressed;
|
||||
|
||||
void keyboard_wait();
|
||||
|
||||
void handle_keyboard()
|
||||
{//3a
|
||||
uint8_t scancode = inb(0x60);
|
||||
void handle_keyboard() {
|
||||
uint8_t scancode = inb(0x60);
|
||||
|
||||
if(scancode & 0x80)//key released
|
||||
{
|
||||
scancode = scancode-0x80;
|
||||
if(scancode == 0x2a || scancode == 0x36)
|
||||
shift_pressed = false;
|
||||
//printf("(%X)%c released ", scancode, kbdus[scancode-0x80]);
|
||||
}
|
||||
else//key pressed
|
||||
{
|
||||
if(scancode == 0x2a || scancode == 0x36)
|
||||
{
|
||||
shift_pressed = true;
|
||||
return;
|
||||
}
|
||||
if (scancode & 0x80) { // Released
|
||||
scancode -= 0x80;
|
||||
if (scancode == 0x2A || scancode == 0x36) shift_pressed = false;
|
||||
} else { // Pressed
|
||||
if (scancode == 0x2A || scancode == 0x36) {
|
||||
shift_pressed = true;
|
||||
return;
|
||||
}
|
||||
if (scancode == 0x3A) { // Caps
|
||||
return;
|
||||
}
|
||||
|
||||
if(scancode == 0x3a)
|
||||
{
|
||||
caps_pressed = !caps_pressed;
|
||||
outb(0x60, 0xed);//set LED command
|
||||
keyboard_wait();
|
||||
outb(0x60, caps_pressed << 2);//0 is scroll lock, 1 is numlock, 2 is caps lock
|
||||
return;
|
||||
}
|
||||
char c;
|
||||
if (shift_pressed || caps_pressed) c = kbdus2[scancode];
|
||||
else c = kbdus[scancode];
|
||||
|
||||
if(shift_pressed || caps_pressed)
|
||||
printf("%c", kbdus2[scancode]);
|
||||
else
|
||||
printf("%c", kbdus[scancode]); //printf("(0x%X)%c", scancode, kbdus[scancode]);
|
||||
}
|
||||
if (c == '\b') { //Backspace
|
||||
if (stdin_pos > 0) {
|
||||
stdin_pos--;
|
||||
printf("\b \b");
|
||||
}
|
||||
} else if (c == '\n') { // Enter
|
||||
if (stdin_pos < STDIN_BUFFER_SIZE - 1) {
|
||||
stdin_buffer[stdin_pos++] = '\n';
|
||||
printf("\n");
|
||||
}
|
||||
stdin_has_line = true;
|
||||
|
||||
// Wake-up: wake up all Waiting tasks on STDIN
|
||||
scheduler_lock();
|
||||
Process *p = queue;
|
||||
while (p) {
|
||||
if (p->state == Waiting && p->waiting_reason == STDIN) {
|
||||
p->state = Ready;
|
||||
p->waiting_reason = NONE;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
scheduler_unlock();
|
||||
} else if (c != 0 && stdin_pos < STDIN_BUFFER_SIZE - 1) {//if printable
|
||||
stdin_buffer[stdin_pos++] = c;
|
||||
printf("%c", c);//echo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void init_keyboard()
|
||||
{
|
||||
memset(stdin_buffer, 0, STDIN_BUFFER_SIZE);
|
||||
stdin_pos = 0;
|
||||
stdin_has_line = false;
|
||||
}
|
||||
|
||||
void keyboard_wait()
|
||||
|
||||
Reference in New Issue
Block a user