135 lines
3.1 KiB
C
135 lines
3.1 KiB
C
/**
|
|
* @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
|