Reviewed RPI inputs

This commit is contained in:
Ray San 2016-02-19 19:57:25 +01:00
parent 09f28d0f57
commit 98c60838fe
2 changed files with 101 additions and 113 deletions

View file

@ -125,7 +125,7 @@
//#define DEFAULT_MOUSE_DEV "/dev/input/eventN"
//#define DEFAULT_GAMEPAD_DEV "/dev/input/eventN"
#define MOUSE_SENSITIVITY 1.0f
#define MOUSE_SENSITIVITY 0.8f
#define MAX_GAMEPAD_BUTTONS 11
#endif
@ -156,13 +156,6 @@ static EGL_DISPMANX_WINDOW_T nativeWindow; // Native window (graphic device
// NOTE: For keyboard we will use the standard input (but reconfigured...)
static struct termios defaultKeyboardSettings; // Used to store default keyboard settings
static int defaultKeyboardMode; // Used to store default keyboard mode
static int keyboardMode = 0; // Register Keyboard mode: 1 - KEYCODES, 2 - ASCII
// This array maps Unix keycodes to ASCII equivalent and to GLFW3 equivalent for special function keys (>256)
const short UnixKeycodeToASCII[128] = { 256, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 45, 61, 259, 9, 81, 87, 69, 82, 84, 89, 85, 73, 79, 80, 91, 93, 257, 341, 65, 83, 68,
70, 71, 72, 74, 75, 76, 59, 39, 96, 340, 92, 90, 88, 67, 86, 66, 78, 77, 44, 46, 47, 344, -1, 342, 32, -1, 290, 291, 292, 293, 294, 295, 296,
297, 298, 299, -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, 345, 47, -1,
346, -1, -1, 265, -1, 263, 262, -1, 264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
// Mouse input variables
static int mouseStream = -1; // Mouse device file descriptor
@ -227,7 +220,9 @@ static int exitKey = KEY_ESCAPE; // Default exit key (ESC)
static int lastKeyPressed = -1; // Register last key pressed
static bool cursorHidden; // Track if cursor is hidden
#endif
#if defined(PLATFORM_DESKTOP)
static char **dropFilesPath; // Store dropped files paths as strings
static int dropFilesCount = 0; // Count stored strings
#endif
@ -781,7 +776,7 @@ void ShowLogo(void)
showLogo = true;
}
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
#if defined(PLATFORM_DESKTOP)
// Check if a file have been dropped into window
bool IsFileDropped(void)
{
@ -1212,14 +1207,15 @@ bool IsGamepadButtonPressed(int gamepad, int button)
bool IsGamepadButtonDown(int gamepad, int button)
{
bool result = false;
const unsigned char *buttons;
int buttonsCount;
#if defined(PLATFORM_RPI)
// Get gamepad buttons information
if ((gamepad == 0) && (gamepadButtons[button] == 1)) result = true;
else result = false;
#else
const unsigned char *buttons;
int buttonsCount;
buttons = glfwGetJoystickButtons(gamepad, &buttonsCount);
if ((buttons != NULL) && (buttons[button] == GLFW_PRESS)) result = true;
@ -1250,14 +1246,15 @@ bool IsGamepadButtonReleased(int gamepad, int button)
bool IsGamepadButtonUp(int gamepad, int button)
{
bool result = false;
const unsigned char *buttons;
int buttonsCount;
#if defined(PLATFORM_RPI)
// Get gamepad buttons information
if ((gamepad == 0) && (gamepadButtons[button] == 0)) result = true;
else result = false;
#else
const unsigned char *buttons;
int buttonsCount;
buttons = glfwGetJoystickButtons(gamepad, &buttonsCount);
if ((buttons != NULL) && (buttons[button] == GLFW_RELEASE)) result = true;
@ -2235,8 +2232,6 @@ static void InitKeyboard(void)
{
// NOTE: It could mean we are using a remote keyboard through ssh!
TraceLog(WARNING, "Could not change keyboard mode (SSH keyboard?)");
keyboardMode = 2; // ASCII
}
else
{
@ -2246,102 +2241,108 @@ static void InitKeyboard(void)
// - ASCII chars (K_XLATE)
// - UNICODE chars (K_UNICODE)
ioctl(STDIN_FILENO, KDSKBMODE, K_XLATE);
//http://lct.sourceforge.net/lct/x60.html
keyboardMode = 2; // keycodes
}
// Register keyboard restore when program finishes
atexit(RestoreKeyboard);
}
// Process keyboard inputs
// TODO: Most probably input reading and processing should be in a separate thread
static void ProcessKeyboard(void)
{
#define MAX_KEYBUFFER_SIZE 32 // Max size in bytes to read
// Keyboard input polling (fill keys[256] array with status)
int numKeysBuffer = 0; // Keys available on buffer
char keysBuffer[32]; // Max keys to be read at a time
int bufferByteCount = 0; // Bytes available on the buffer
char keysBuffer[MAX_KEYBUFFER_SIZE]; // Max keys to be read at a time
// Reset pressed keys array
for (int i = 0; i < 512; i++) currentKeyState[i] = 0;
// Read availables keycodes from stdin
numKeysBuffer = read(STDIN_FILENO, keysBuffer, 32); // POSIX system call
bufferByteCount = read(STDIN_FILENO, keysBuffer, MAX_KEYBUFFER_SIZE); // POSIX system call
// Fill array with pressed keys
for (int i = 0; i < numKeysBuffer; i++)
// Fill all read bytes (looking for keys)
for (int i = 0; i < bufferByteCount; i++)
{
//TraceLog(INFO, "Bytes on keysBuffer: %i", numKeysBuffer);
TraceLog(DEBUG, "Bytes on keysBuffer: %i", bufferByteCount);
int key = keysBuffer[i];
//printf("Key(s) bytes: ");
//for (int i = 0; i < bufferByteCount; i++) printf("0x%02x ", keysBuffer[i]);
//printf("\n");
if (keyboardMode == 2) // ASCII chars (K_XLATE mode)
{
// NOTE: If (key == 0x1b), depending on next key, it could be a special keymap code!
// Up -> 1b 5b 41 / Left -> 1b 5b 44 / Right -> 1b 5b 43 / Down -> 1b 5b 42
if (key == 0x1b)
if (keysBuffer[i] == 0x1b)
{
if (keysBuffer[i+1] == 0x5b) // Special function key
// Detect ESC to stop program
if (bufferByteCount == 1) currentKeyState[256] = 1; // raylib key: KEY_ESCAPE
else
{
switch (keysBuffer[i+2])
if (keysBuffer[i + 1] == 0x5b) // Special function key
{
case 0x41: currentKeyState[265] = 1; break;
case 0x42: currentKeyState[264] = 1; break;
case 0x43: currentKeyState[262] = 1; break;
case 0x44: currentKeyState[263] = 1; break;
if ((keysBuffer[i + 2] == 0x5b) || (keysBuffer[i + 2] == 0x31) || (keysBuffer[i + 2] == 0x32))
{
// Process special function keys (F1 - F12)
switch (keysBuffer[i + 3])
{
case 0x41: currentKeyState[290] = 1; break; // raylib KEY_F1
case 0x42: currentKeyState[291] = 1; break; // raylib KEY_F2
case 0x43: currentKeyState[292] = 1; break; // raylib KEY_F3
case 0x44: currentKeyState[293] = 1; break; // raylib KEY_F4
case 0x45: currentKeyState[294] = 1; break; // raylib KEY_F5
case 0x37: currentKeyState[295] = 1; break; // raylib KEY_F6
case 0x38: currentKeyState[296] = 1; break; // raylib KEY_F7
case 0x39: currentKeyState[297] = 1; break; // raylib KEY_F8
case 0x30: currentKeyState[298] = 1; break; // raylib KEY_F9
case 0x31: currentKeyState[299] = 1; break; // raylib KEY_F10
case 0x33: currentKeyState[300] = 1; break; // raylib KEY_F11
case 0x34: currentKeyState[301] = 1; break; // raylib KEY_F12
default: break;
}
i += 2; // Jump to next key
// NOTE: Other special function keys (F1, F2...) are not contempled for this keyboardMode...
// ...or they are just not directly keymapped (CTRL, ALT, SHIFT)
if (keysBuffer[i + 2] == 0x5b) i += 4;
else if ((keysBuffer[i + 2] == 0x31) || (keysBuffer[i + 2] == 0x32)) i += 5;
}
}
else if (key == 0x0a) currentKeyState[257] = 1; // raylib KEY_ENTER (don't mix with <linux/input.h> KEY_*)
else if (key == 0x7f) currentKeyState[259] = 1;
else
{
TraceLog(DEBUG, "Pressed key (ASCII): 0x%02x", key);
currentKeyState[key] = 1;
}
// Detect ESC to stop program
if ((key == 0x1b) && (numKeysBuffer == 1)) windowShouldClose = true;
}
else if (keyboardMode == 1) // keycodes (K_MEDIUMRAW mode)
switch (keysBuffer[i + 2])
{
TraceLog(DEBUG, "Pressed key (keycode): 0x%02x", key);
// NOTE: Each key is 7-bits (high bit in the byte is 0 for down, 1 for up)
// TODO: Review (or rewrite) this code... not clear... replace by events!
int asciiKey = -1;
// Convert keycode to some recognized key (ASCII or GLFW3 equivalent)
if (key < 128) asciiKey = (int)UnixKeycodeToASCII[key];
// Record equivalent key state
if ((asciiKey >= 0) && (asciiKey < 512)) currentKeyState[asciiKey] = 1;
// In case of letter, we also activate lower case version
if ((asciiKey >= 65) && (asciiKey <=90)) currentKeyState[asciiKey + 32] = 1;
// Detect KEY_ESC to stop program
if (key == 0x01) windowShouldClose = true;
case 0x41: currentKeyState[265] = 1; break; // raylib KEY_UP
case 0x42: currentKeyState[264] = 1; break; // raylib KEY_DOWN
case 0x43: currentKeyState[262] = 1; break; // raylib KEY_RIGHT
case 0x44: currentKeyState[263] = 1; break; // raylib KEY_LEFT
default: break;
}
// Same functionality as GLFW3 KeyCallback()
/*
if (asciiKey == exitKey) windowShouldClose = true;
else if (key == GLFW_KEY_F12 && action == GLFW_PRESS)
i += 3; // Jump to next key
}
// NOTE: Some keys are not directly keymapped (CTRL, ALT, SHIFT)
}
}
}
else if (keysBuffer[i] == 0x0a) currentKeyState[257] = 1; // raylib KEY_ENTER (don't mix with <linux/input.h> KEY_*)
else if (keysBuffer[i] == 0x7f) currentKeyState[259] = 1; // raylib KEY_BACKSPACE
else
{
TakeScreenshot();
TraceLog(DEBUG, "Pressed key (ASCII): 0x%02x", keysBuffer[i]);
// Translate lowercase a-z letters to A-Z
if ((keysBuffer[i] >= 97) && (keysBuffer[i] <= 122))
{
currentKeyState[(int)keysBuffer[i] - 32] = 1;
}
*/
else currentKeyState[(int)keysBuffer[i]] = 1;
}
}
// Check exit key (same functionality as GLFW3 KeyCallback())
if (currentKeyState[exitKey] == 1) windowShouldClose = true;
// Check screen capture key
if (currentKeyState[301] == 1) TakeScreenshot(); // raylib key: KEY_F12 (GLFW_KEY_F12)
}
// Restore default keyboard input
@ -2414,10 +2415,12 @@ static void *MouseThread(void *arg)
if ((mouse.buttons & XSIGN) > 0) mouseRelX = -1*(255 - mouseRelX);
if ((mouse.buttons & YSIGN) > 0) mouseRelY = -1*(255 - mouseRelY);
// TODO: Mouse movement should not depend on screenWidth and screenHeight, normalize!
// NOTE: Mouse movement is normalized to not be screen resolution dependant
// We suppose 2*255 (max relative movement) is equivalent to screenWidth (max pixels width)
// Result after normalization is multiplied by MOUSE_SENSITIVITY factor
mousePosition.x += (float)mouseRelX/MOUSE_SENSITIVITY;
mousePosition.y -= (float)mouseRelY/MOUSE_SENSITIVITY;
mousePosition.x += (float)mouseRelX*((float)screenWidth/(2*255))*MOUSE_SENSITIVITY;
mousePosition.y -= (float)mouseRelY*((float)screenHeight/(2*255))*MOUSE_SENSITIVITY;
if (mousePosition.x < 0) mousePosition.x = 0;
if (mousePosition.y < 0) mousePosition.y = 0;
@ -2479,36 +2482,18 @@ static void *GamepadThread(void *arg)
// Process gamepad events by type
if (gamepadEvent.type == JS_EVENT_BUTTON)
{
TraceLog(DEBUG, "Gamepad button: %i, value: %i", gamepadEvent.number, gamepadEvent.value);
if (gamepadEvent.number < MAX_GAMEPAD_BUTTONS)
{
switch (gamepadEvent.value)
{
case 0:
case 1: gamepadButtons[gamepadEvent.number] = (int)gamepadEvent.value; break;
default: break;
// 1 - button pressed, 0 - button released
gamepadButtons[gamepadEvent.number] = (int)gamepadEvent.value;
}
}
/*
switch (gamepadEvent.number)
{
case 0: // 1st Axis X
case 1: // 1st Axis Y
case 2: // 2st Axis X
case 3: // 2st Axis Y
case 4:
{
if (gamepadEvent.value == 1) // Button pressed, 0 release
{
}
} break;
// Buttons is similar, variable for every joystick
}
*/
}
else if (gamepadEvent.type == JS_EVENT_AXIS)
{
TraceLog(DEBUG, "Gamepad axis: %i, value: %i", gamepadEvent.number, gamepadEvent.value);
if (gamepadEvent.number == joystickAxisX) gamepadAxisX = (int)gamepadEvent.value;
if (gamepadEvent.number == joystickAxisY) gamepadAxisY = (int)gamepadEvent.value;
/*
@ -2518,12 +2503,13 @@ static void *GamepadThread(void *arg)
case 1: // 1st Axis Y
case 2: // 2st Axis X
case 3: // 2st Axis Y
// Buttons is similar, variable for every joystick
}
*/
}
}
}
return NULL;
}
#endif

View file

@ -111,6 +111,8 @@
#define KEY_F8 297
#define KEY_F9 298
#define KEY_F10 299
#define KEY_F11 300
#define KEY_F12 301
#define KEY_LEFT_SHIFT 340
#define KEY_LEFT_CONTROL 341
#define KEY_LEFT_ALT 342