82 lines
1.9 KiB
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);
|
|
}
|