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:
parent
06e0eb560c
commit
9e4fb17743
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user