1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-02-24 23:42:49 +01:00

#15 Raspberry Pi fix for XInput gamepad mapping

This commit is contained in:
XProger 2018-03-06 05:57:56 +03:00
parent 06e0eb560c
commit 9e4fb17743
2 changed files with 57 additions and 17 deletions

View File

@ -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;

View File

@ -1,6 +1,7 @@
#include <string.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <linux/input.h>
#include <unistd.h>
#include <pwd.h>
#include <pthread.h>
@ -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);