From 9e4fb177439dca427f2da2680a157092c7dd34ec Mon Sep 17 00:00:00 2001 From: XProger Date: Tue, 6 Mar 2018 05:57:56 +0300 Subject: [PATCH] #15 Raspberry Pi fix for XInput gamepad mapping --- src/platform/nix/main.cpp | 18 +++++++------ src/platform/rpi/main.cpp | 56 ++++++++++++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/src/platform/nix/main.cpp b/src/platform/nix/main.cpp index c76fa91..932610e 100644 --- a/src/platform/nix/main.cpp +++ b/src/platform/nix/main.cpp @@ -374,21 +374,23 @@ void joyUpdate() { switch (event.number) { // Left stick - case 0 : joy.L.x = joyAxisValue(event.value); break; - case 1 : joy.L.y = joyAxisValue(event.value); break; + case ABS_X : joy.L.x = joyAxisValue(event.value); break; + case ABS_Y : joy.L.y = joyAxisValue(event.value); break; // Right stick - case 3 : joy.R.x = joyAxisValue(event.value); break; - case 4 : joy.R.y = joyAxisValue(event.value); break; + case ABS_RX : joy.R.x = joyAxisValue(event.value); break; + case ABS_RY : joy.R.y = joyAxisValue(event.value); break; // Left trigger - case 2 : Input::setJoyPos(i, jkLT, joyTrigger(event.value)); break; + case ABS_Z : Input::setJoyPos(i, jkLT, joyTrigger(event.value)); break; // Right trigger - case 5 : Input::setJoyPos(i, jkRT, joyTrigger(event.value)); break; + case ABS_RZ : Input::setJoyPos(i, jkRT, joyTrigger(event.value)); break; // D-PAD - case 6 : + case ABS_HAT0X : + case ABS_THROTTLE : Input::setJoyDown(i, jkLeft, event.value < -0x4000); Input::setJoyDown(i, jkRight, event.value > 0x4000); break; - case 7 : + case ABS_HAT0Y : + case ABS_RUDDER : Input::setJoyDown(i, jkUp, event.value < -0x4000); Input::setJoyDown(i, jkDown, event.value > 0x4000); break; diff --git a/src/platform/rpi/main.cpp b/src/platform/rpi/main.cpp index 082b7db..d4fb732 100644 --- a/src/platform/rpi/main.cpp +++ b/src/platform/rpi/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -297,7 +298,7 @@ int udevMon_fd; vec2 joyL, joyR; bool osJoyReady(int index) { - return true; // TODO + return index == 0; // TODO } void osJoyVibrate(int index, float L, float R) { @@ -454,6 +455,23 @@ void inputFree() { udev_unref(udevObj); } +#define JOY_DEAD_ZONE_STICK 8192 + +float joyAxisValue(int value) { + if (value > -JOY_DEAD_ZONE_STICK && value < JOY_DEAD_ZONE_STICK) + return 0.0f; + return value / 32767.0f; +} + +float joyTrigger(int value) { + return min(1.0f, value / 255.0f); +} + +vec2 joyDir(const vec2 &value) { + float dist = min(1.0f, value.length()); + return value.normal() * dist; +} + void inputUpdate() { // get input events input_event events[16]; @@ -462,6 +480,8 @@ void inputUpdate() { if (inputDevices[i] == -1) continue; int rb = read(inputDevices[i], events, sizeof(events)); + int joyIndex = 0; // TODO: joy index + input_event *e = events; while (rb > 0) { switch (e->type) { @@ -473,7 +493,7 @@ void inputUpdate() { Input::setDown(key, e->value != 0); } else { JoyKey key = codeToJoyKey(e->code); - Input::setJoyDown(0, key, e->value != 0); + Input::setJoyDown(joyIndex, key, e->value != 0); } break; } @@ -484,13 +504,32 @@ void inputUpdate() { break; } case EV_ABS : { - float v = float(e->value) / 128.0f - 1.0f; switch (e->code) { - case ABS_X : joyL.x = v; break; - case ABS_Y : joyL.y = v; break; - case ABS_Z : joyR.x = v; break; - case ABS_RZ : joyR.y = v; break; + // Left stick + case ABS_X : joyL.x = joyAxisValue(e->value); break; + case ABS_Y : joyL.y = joyAxisValue(e->value); break; + // Right stick + case ABS_RX : joyR.x = joyAxisValue(e->value); break; + case ABS_RY : joyR.y = joyAxisValue(e->value); break; + // Left trigger + case ABS_Z : Input::setJoyPos(joyIndex, jkLT, joyTrigger(e->value)); break; + // Right trigger + case ABS_RZ : Input::setJoyPos(joyIndex, jkRT, joyTrigger(e->value)); break; + // D-PAD + case ABS_HAT0X : + case ABS_THROTTLE : + Input::setJoyDown(joyIndex, jkLeft, e->value < 0); + Input::setJoyDown(joyIndex, jkRight, e->value > 0); + break; + case ABS_HAT0Y : + case ABS_RUDDER : + Input::setJoyDown(joyIndex, jkUp, e->value < 0); + Input::setJoyDown(joyIndex, jkDown, e->value > 0); + break; } + + Input::setJoyPos(joyIndex, jkL, joyDir(joyL)); + Input::setJoyPos(joyIndex, jkR, joyDir(joyR)); } } //LOG("input: type = %d, code = %d, value = %d\n", int(e->type), int(e->code), int(e->value)); @@ -498,8 +537,7 @@ void inputUpdate() { rb -= sizeof(events[0]); } } - Input::setJoyPos(0, jkL, joyL); - Input::setJoyPos(0, jkR, joyR); + // monitoring plug and unplug input devices fd_set fds; FD_ZERO(&fds);