Joystick: Add support for more axis types to the Windows raw input backend

This commit is contained in:
Alexander Babikov
2024-02-18 16:38:49 +05:00
parent d789292f65
commit 394e078991
2 changed files with 137 additions and 11 deletions

View File

@@ -35,6 +35,29 @@
#include <86box/gameport.h>
#include <86box/win.h>
/* These are defined in hidusage.h in the Windows SDK, but not in mingw-w64. */
#ifndef HID_USAGE_SIMULATION_AILERON
# define HID_USAGE_SIMULATION_AILERON ((USAGE) 0xb0)
#endif
#ifndef HID_USAGE_SIMULATION_ELEVATOR
# define HID_USAGE_SIMULATION_ELEVATOR ((USAGE) 0xb8)
#endif
#ifndef HID_USAGE_SIMULATION_ACCELLERATOR
# define HID_USAGE_SIMULATION_ACCELLERATOR ((USAGE) 0xc4)
#endif
#ifndef HID_USAGE_SIMULATION_BRAKE
# define HID_USAGE_SIMULATION_BRAKE ((USAGE) 0xc5)
#endif
#ifndef HID_USAGE_SIMULATION_CLUTCH
# define HID_USAGE_SIMULATION_CLUTCH ((USAGE) 0xc6)
#endif
#ifndef HID_USAGE_SIMULATION_SHIFTER
# define HID_USAGE_SIMULATION_SHIFTER ((USAGE) 0xc7)
#endif
#ifndef HID_USAGE_SIMULATION_STEERING
# define HID_USAGE_SIMULATION_STEERING ((USAGE) 0xc8)
#endif
#ifdef ENABLE_JOYSTICK_LOG
int joystick_do_log = ENABLE_JOYSTICK_LOG;
@@ -120,6 +143,42 @@ joystick_add_axis(raw_joystick_t *rawjoy, plat_joystick_t *joy, PHIDP_VALUE_CAPS
case HID_USAGE_GENERIC_RZ:
sprintf(joy->axis[joy->nr_axes].name, "RZ");
break;
case HID_USAGE_GENERIC_SLIDER:
sprintf(joy->axis[joy->nr_axes].name, "Slider");
break;
case HID_USAGE_GENERIC_DIAL:
sprintf(joy->axis[joy->nr_axes].name, "Dial");
break;
case HID_USAGE_GENERIC_WHEEL:
sprintf(joy->axis[joy->nr_axes].name, "Wheel");
break;
case HID_USAGE_SIMULATION_AILERON:
sprintf(joy->axis[joy->nr_axes].name, "Aileron");
break;
case HID_USAGE_SIMULATION_ELEVATOR:
sprintf(joy->axis[joy->nr_axes].name, "Elevator");
break;
case HID_USAGE_SIMULATION_RUDDER:
sprintf(joy->axis[joy->nr_axes].name, "Rudder");
break;
case HID_USAGE_SIMULATION_THROTTLE:
sprintf(joy->axis[joy->nr_axes].name, "Throttle");
break;
case HID_USAGE_SIMULATION_ACCELLERATOR:
sprintf(joy->axis[joy->nr_axes].name, "Accelerator");
break;
case HID_USAGE_SIMULATION_BRAKE:
sprintf(joy->axis[joy->nr_axes].name, "Brake");
break;
case HID_USAGE_SIMULATION_CLUTCH:
sprintf(joy->axis[joy->nr_axes].name, "Clutch");
break;
case HID_USAGE_SIMULATION_SHIFTER:
sprintf(joy->axis[joy->nr_axes].name, "Shifter");
break;
case HID_USAGE_SIMULATION_STEERING:
sprintf(joy->axis[joy->nr_axes].name, "Steering");
break;
default:
return;
}
@@ -367,10 +426,10 @@ win_joystick_handle(PRAWINPUT raw)
/* Read axes */
for (int a = 0; a < plat_joystick_state[j].nr_axes; a++) {
struct raw_axis_t *axis = &raw_joystick_state[j].axis[a];
ULONG uvalue = 0;
LONG value = 0;
LONG center = (axis->max - axis->min + 1) / 2;
const struct raw_axis_t *axis = &raw_joystick_state[j].axis[a];
ULONG uvalue = 0;
LONG value = 0;
LONG center = (axis->max - axis->min + 1) / 2;
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, axis->link, axis->usage, &uvalue,
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
@@ -395,14 +454,16 @@ win_joystick_handle(PRAWINPUT raw)
}
plat_joystick_state[j].a[a] = value;
// joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
#if 0
joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
#endif
}
/* read povs */
for (int p = 0; p < plat_joystick_state[j].nr_povs; p++) {
struct raw_pov_t *pov = &raw_joystick_state[j].pov[p];
ULONG uvalue = 0;
LONG value = -1;
const struct raw_pov_t *pov = &raw_joystick_state[j].pov[p];
ULONG uvalue = 0;
LONG value = -1;
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, pov->link, pov->usage, &uvalue,
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
@@ -415,9 +476,13 @@ win_joystick_handle(PRAWINPUT raw)
plat_joystick_state[j].p[p] = value;
// joystick_log("%s %-3d ", plat_joystick_state[j].pov[p].name, plat_joystick_state[j].p[p]);
#if 0
joystick_log("%s %-3d ", plat_joystick_state[j].pov[p].name, plat_joystick_state[j].p[p]);
#endif
}
// joystick_log("\n");
#if 0
joystick_log("\n");
#endif
}
static int

View File

@@ -35,6 +35,29 @@
#include <86box/gameport.h>
#include <86box/win.h>
/* These are defined in hidusage.h in the Windows SDK, but not in mingw-w64. */
#ifndef HID_USAGE_SIMULATION_AILERON
# define HID_USAGE_SIMULATION_AILERON ((USAGE) 0xb0)
#endif
#ifndef HID_USAGE_SIMULATION_ELEVATOR
# define HID_USAGE_SIMULATION_ELEVATOR ((USAGE) 0xb8)
#endif
#ifndef HID_USAGE_SIMULATION_ACCELLERATOR
# define HID_USAGE_SIMULATION_ACCELLERATOR ((USAGE) 0xc4)
#endif
#ifndef HID_USAGE_SIMULATION_BRAKE
# define HID_USAGE_SIMULATION_BRAKE ((USAGE) 0xc5)
#endif
#ifndef HID_USAGE_SIMULATION_CLUTCH
# define HID_USAGE_SIMULATION_CLUTCH ((USAGE) 0xc6)
#endif
#ifndef HID_USAGE_SIMULATION_SHIFTER
# define HID_USAGE_SIMULATION_SHIFTER ((USAGE) 0xc7)
#endif
#ifndef HID_USAGE_SIMULATION_STEERING
# define HID_USAGE_SIMULATION_STEERING ((USAGE) 0xc8)
#endif
#ifdef ENABLE_JOYSTICK_LOG
int joystick_do_log = ENABLE_JOYSTICK_LOG;
@@ -120,6 +143,42 @@ joystick_add_axis(raw_joystick_t *rawjoy, plat_joystick_t *joy, PHIDP_VALUE_CAPS
case HID_USAGE_GENERIC_RZ:
sprintf(joy->axis[joy->nr_axes].name, "RZ");
break;
case HID_USAGE_GENERIC_SLIDER:
sprintf(joy->axis[joy->nr_axes].name, "Slider");
break;
case HID_USAGE_GENERIC_DIAL:
sprintf(joy->axis[joy->nr_axes].name, "Dial");
break;
case HID_USAGE_GENERIC_WHEEL:
sprintf(joy->axis[joy->nr_axes].name, "Wheel");
break;
case HID_USAGE_SIMULATION_AILERON:
sprintf(joy->axis[joy->nr_axes].name, "Aileron");
break;
case HID_USAGE_SIMULATION_ELEVATOR:
sprintf(joy->axis[joy->nr_axes].name, "Elevator");
break;
case HID_USAGE_SIMULATION_RUDDER:
sprintf(joy->axis[joy->nr_axes].name, "Rudder");
break;
case HID_USAGE_SIMULATION_THROTTLE:
sprintf(joy->axis[joy->nr_axes].name, "Throttle");
break;
case HID_USAGE_SIMULATION_ACCELLERATOR:
sprintf(joy->axis[joy->nr_axes].name, "Accelerator");
break;
case HID_USAGE_SIMULATION_BRAKE:
sprintf(joy->axis[joy->nr_axes].name, "Brake");
break;
case HID_USAGE_SIMULATION_CLUTCH:
sprintf(joy->axis[joy->nr_axes].name, "Clutch");
break;
case HID_USAGE_SIMULATION_SHIFTER:
sprintf(joy->axis[joy->nr_axes].name, "Shifter");
break;
case HID_USAGE_SIMULATION_STEERING:
sprintf(joy->axis[joy->nr_axes].name, "Steering");
break;
default:
return;
}
@@ -395,7 +454,9 @@ win_joystick_handle(PRAWINPUT raw)
}
plat_joystick_state[j].a[a] = value;
// joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
#if 0
joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
#endif
}
/* read povs */