#include #include #include #include #include #include #include /* 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); }