小忍者项目相关文件上传
This commit is contained in:
134
MXC-A36/xrz/lv_drivers/indev/keyboard.c
Normal file
134
MXC-A36/xrz/lv_drivers/indev/keyboard.c
Normal file
@ -0,0 +1,134 @@
|
||||
/**
|
||||
* @file sdl_kb.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "keyboard.h"
|
||||
#if USE_KEYBOARD
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static uint32_t keycode_to_ascii(uint32_t sdl_key);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
static uint32_t last_key;
|
||||
static lv_indev_state_t state;
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Initialize the keyboard
|
||||
*/
|
||||
void keyboard_init(void)
|
||||
{
|
||||
/*Nothing to init*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last pressed or released character from the PC's keyboard
|
||||
* @param indev_drv pointer to the related input device driver
|
||||
* @param data store the read data here
|
||||
* @return false: because the points are not buffered, so no more data to be read
|
||||
*/
|
||||
void keyboard_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||||
{
|
||||
(void) indev_drv; /*Unused*/
|
||||
data->state = state;
|
||||
data->key = keycode_to_ascii(last_key);
|
||||
}
|
||||
|
||||
/**
|
||||
* It is called periodically from the SDL thread to check a key is pressed/released
|
||||
* @param event describes the event
|
||||
*/
|
||||
void keyboard_handler(SDL_Event * event)
|
||||
{
|
||||
/* We only care about SDL_KEYDOWN and SDL_KEYUP events */
|
||||
switch(event->type) {
|
||||
case SDL_KEYDOWN: /*Button press*/
|
||||
last_key = event->key.keysym.sym; /*Save the pressed key*/
|
||||
state = LV_INDEV_STATE_PRESSED; /*Save the key is pressed now*/
|
||||
break;
|
||||
case SDL_KEYUP: /*Button release*/
|
||||
state = LV_INDEV_STATE_RELEASED; /*Save the key is released but keep the last key*/
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Convert the key code LV_KEY_... "codes" or leave them if they are not control characters
|
||||
* @param sdl_key the key code
|
||||
* @return
|
||||
*/
|
||||
static uint32_t keycode_to_ascii(uint32_t sdl_key)
|
||||
{
|
||||
/*Remap some key to LV_KEY_... to manage groups*/
|
||||
switch(sdl_key) {
|
||||
case SDLK_RIGHT:
|
||||
case SDLK_KP_PLUS:
|
||||
return LV_KEY_RIGHT;
|
||||
|
||||
case SDLK_LEFT:
|
||||
case SDLK_KP_MINUS:
|
||||
return LV_KEY_LEFT;
|
||||
|
||||
case SDLK_UP:
|
||||
return LV_KEY_UP;
|
||||
|
||||
case SDLK_DOWN:
|
||||
return LV_KEY_DOWN;
|
||||
|
||||
case SDLK_ESCAPE:
|
||||
return LV_KEY_ESC;
|
||||
|
||||
#ifdef LV_KEY_BACKSPACE /*For backward compatibility*/
|
||||
case SDLK_BACKSPACE:
|
||||
return LV_KEY_BACKSPACE;
|
||||
#endif
|
||||
|
||||
#ifdef LV_KEY_DEL /*For backward compatibility*/
|
||||
case SDLK_DELETE:
|
||||
return LV_KEY_DEL;
|
||||
#endif
|
||||
case SDLK_KP_ENTER:
|
||||
case '\r':
|
||||
return LV_KEY_ENTER;
|
||||
|
||||
case SDLK_PAGEDOWN:
|
||||
return LV_KEY_NEXT;
|
||||
|
||||
case SDLK_PAGEUP:
|
||||
return LV_KEY_PREV;
|
||||
|
||||
default:
|
||||
return sdl_key;
|
||||
}
|
||||
}
|
||||
#endif
|
Reference in New Issue
Block a user