vxKernel/src/keyboard/keycache.c

82 lines
1.9 KiB
C

#include <vhex/keyboard.h>
#include <vhex/keyboard/interface.h>
#include <vhex/keyboard/keycode.h>
#include <vhex/driver/cpu.h>
#include <vhex/timer.h>
#include <vhex/driver.h>
#include <stdlib.h>
#include <string.h>
/* Internal cache, used like chained list.
@note:
The KEYSC have 6 key data 16-bits registers this is why we used 6 * 16 = 96
cache slots. */
struct {
struct keyboard_drv_interface driver;
} keyboard_info;
//---
// Module init
//---
/* keycache_init() : keycache constructor */
void keycache_init(void)
{
struct vhex_driver *driver = vhex_driver_table();
for (int i = 0; i < vhex_driver_count(); ++i) {
if (driver[i].flags.KEYBOARD) {
memcpy(
&keyboard_info.driver,
driver[i].module_data,
sizeof(struct keyboard_drv_interface)
);
break;
}
}
if (keyboard_info.driver.keycache_init != NULL)
keyboard_info.driver.keycache_init();
}
/* keycache_init() : keycache descructor */
void keycache_quit(void)
{
if (keyboard_info.driver.keycache_quit != NULL)
keyboard_info.driver.keycache_quit();
}
//---
// Public API
//---
/* keycache_keydown() : check the current key state */
int keycache_keydown(key_t key)
{
if (keyboard_info.driver.keycache_keydown != NULL)
return keyboard_info.driver.keycache_keydown(key);
return -1;
}
/* keycache_event_wait() : wait until the next event or the timeout != 0 */
void keycache_event_wait(key_event_t *event, volatile int *timeout)
{
if (keyboard_info.driver.keycache_event_wait != NULL)
keyboard_info.driver.keycache_event_wait(event, timeout);
}
/* keycache_event_pop() : pop the first key event in the cache */
void keycache_event_pop(key_event_t * event)
{
if (keyboard_info.driver.keycache_event_pop != NULL)
keyboard_info.driver.keycache_event_pop(event);
}
/* keycache_event_push() : push a key event in the cache */
void keycache_event_push(key_event_t * event)
{
if (keyboard_info.driver.keycache_event_push != NULL)
keyboard_info.driver.keycache_event_push(event);
}