Espresso 0.0.2c
This commit is contained in:
@ -3,6 +3,8 @@
|
||||
#include <tty.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <new_tty.h>
|
||||
|
||||
|
||||
#include <drivers/ps2_keyboard.h>
|
||||
|
||||
@ -62,6 +64,8 @@ volatile int32_t current_length = 0;
|
||||
volatile int32_t capacity = 0;
|
||||
volatile uint16_t current_key;
|
||||
|
||||
volatile bool use_new_tty = false;
|
||||
|
||||
volatile ps2_hook_t* hooks = NULL;
|
||||
volatile int hook_count = 0;
|
||||
|
||||
@ -84,6 +88,10 @@ static const char scancode_map[128] = {
|
||||
/* The rest are function and control keys */
|
||||
};
|
||||
|
||||
void set_use_new_tty(bool t)
|
||||
{
|
||||
use_new_tty = t;
|
||||
}
|
||||
|
||||
void keyboard_init(void)
|
||||
{
|
||||
@ -94,6 +102,8 @@ void keyboard_init(void)
|
||||
outb(0x64, 0xAE); /* Enable keyboard interface (often optional, but here for safety) */
|
||||
|
||||
hooks = NULL;
|
||||
|
||||
set_use_new_tty(true);
|
||||
|
||||
ps2keyboard_initialized = true;
|
||||
|
||||
@ -199,6 +209,7 @@ void call_hooks(char c)
|
||||
|
||||
if (hook_count == 0)
|
||||
{
|
||||
_sti_asm();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -396,32 +407,45 @@ void free_current_string(void)
|
||||
}
|
||||
}
|
||||
|
||||
void keyboard_handler(void)
|
||||
|
||||
registers_t* ps2_keyboard_handler(registers_t* regs)
|
||||
{
|
||||
#if 0
|
||||
uint8_t scancode = inb(PS2_DATA_PORT);
|
||||
|
||||
/* Handle shift press/release */
|
||||
if (scancode == 0x2A || scancode == 0x36)
|
||||
{
|
||||
shift_pressed = true;
|
||||
return;
|
||||
return regs;
|
||||
}
|
||||
else if (scancode == 0xAA || scancode == 0xB6)
|
||||
{
|
||||
shift_pressed = false;
|
||||
return;
|
||||
return regs;
|
||||
}
|
||||
else if (scancode == 0x3A)
|
||||
{
|
||||
capslock_pressed = !capslock_pressed;
|
||||
return;
|
||||
return regs;
|
||||
}
|
||||
else if (scancode == 0xE0)
|
||||
{
|
||||
extended = true;
|
||||
return;
|
||||
return regs;
|
||||
}
|
||||
|
||||
uint32_t flags = 0;
|
||||
|
||||
if (capslock_pressed)
|
||||
{
|
||||
flags |= MODIFIER_CAPS;
|
||||
}
|
||||
|
||||
if (shift_pressed)
|
||||
{
|
||||
flags |= MODIFIER_SHIFT;
|
||||
}
|
||||
|
||||
if (scancode & 0x80)
|
||||
{
|
||||
@ -430,84 +454,94 @@ void keyboard_handler(void)
|
||||
else
|
||||
{
|
||||
uint16_t c = (uint16_t) scancode_map[scancode];
|
||||
if ((shift_pressed ^ capslock_pressed) && ((char) c >= 'a') && ((char) c <= 'z'))
|
||||
|
||||
if (!use_new_tty)
|
||||
{
|
||||
c -= 32; /* Convert to uppercase */
|
||||
if ((shift_pressed ^ capslock_pressed) && ((char) c >= 'a') && ((char) c <= 'z'))
|
||||
{
|
||||
c -= 32; /* Convert to uppercase */
|
||||
}
|
||||
else if (shift_pressed)
|
||||
{
|
||||
c = (uint16_t) terminal_get_shifted((unsigned char) c);
|
||||
}
|
||||
|
||||
if (extended)
|
||||
{
|
||||
switch (scancode)
|
||||
{
|
||||
case 0x48:
|
||||
c = KEY_ARROW_UP;
|
||||
break;
|
||||
case 0x50:
|
||||
c = KEY_ARROW_DOWN;
|
||||
break;
|
||||
case 0x4B:
|
||||
c = KEY_ARROW_LEFT;
|
||||
break;
|
||||
case 0x4D:
|
||||
c = KEY_ARROW_RIGHT;
|
||||
break;
|
||||
default:
|
||||
c = KEY_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (gets_called)
|
||||
{
|
||||
gets_append_char(c);
|
||||
|
||||
return regs;
|
||||
}
|
||||
|
||||
current_key = c;
|
||||
|
||||
is_new_key = true;
|
||||
extended = false;
|
||||
|
||||
return regs;
|
||||
}
|
||||
|
||||
if (gets_called)
|
||||
{
|
||||
gets_append_char(c);
|
||||
|
||||
return regs;
|
||||
}
|
||||
|
||||
if (c)
|
||||
{
|
||||
if (c != '\n')
|
||||
{
|
||||
append_char(c);
|
||||
}
|
||||
|
||||
current_char = c;
|
||||
is_new_char = true;
|
||||
|
||||
if (c == '\n')
|
||||
{
|
||||
/*append_char(c);
|
||||
current_char = c;
|
||||
is_new_char = true;*/
|
||||
|
||||
free_current_string();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (shift_pressed)
|
||||
else
|
||||
{
|
||||
c = (uint16_t) terminal_get_shifted((unsigned char) c);
|
||||
tty_receive_char(c, flags);
|
||||
}
|
||||
|
||||
if (hook_count > 0)
|
||||
{
|
||||
call_hooks(c);
|
||||
}
|
||||
|
||||
if (extended)
|
||||
{
|
||||
switch (scancode)
|
||||
{
|
||||
case 0x48:
|
||||
c = KEY_ARROW_UP;
|
||||
break;
|
||||
case 0x50:
|
||||
c = KEY_ARROW_DOWN;
|
||||
break;
|
||||
case 0x4B:
|
||||
c = KEY_ARROW_LEFT;
|
||||
break;
|
||||
case 0x4D:
|
||||
c = KEY_ARROW_RIGHT;
|
||||
break;
|
||||
default:
|
||||
c = KEY_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (gets_called)
|
||||
{
|
||||
gets_append_char(c);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
current_key = c;
|
||||
|
||||
is_new_key = true;
|
||||
extended = false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (gets_called)
|
||||
{
|
||||
gets_append_char(c);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (c)
|
||||
{
|
||||
if (c != '\n')
|
||||
{
|
||||
append_char(c);
|
||||
}
|
||||
|
||||
current_char = c;
|
||||
is_new_char = true;
|
||||
|
||||
if (c == '\n')
|
||||
{
|
||||
/*append_char(c);
|
||||
current_char = c;
|
||||
is_new_char = true;*/
|
||||
|
||||
free_current_string();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
return regs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user