Added more controller options to idzio

Add axis reversal for dinput and single stick steering for xinput.
This commit is contained in:
85be42b2ce67a8e34b32793360824b056c0c2444 2019-11-22 00:59:08 +00:00 committed by da5669c09fdb0a288ba01e259a609d7779ac7fc9
parent 4bc7eee909
commit 5b50824e2f
7 changed files with 91 additions and 6 deletions

View File

@ -45,6 +45,9 @@ mode=xinput
; Automatically reset the simulated shifter to Neutral when XInput Start is ; Automatically reset the simulated shifter to Neutral when XInput Start is
; pressed (e.g. when navigating menus between races). ; pressed (e.g. when navigating menus between races).
autoNeutral=1 autoNeutral=1
; Use the left thumbstick for steering instead of both on XInput Controllers.
; Not recommended as it will not give you the precision needed for this game
singleStickSteering=0
[dinput] [dinput]
; Name of the DirectInput wheel to use (or any text that occurs in its name) ; Name of the DirectInput wheel to use (or any text that occurs in its name)
@ -83,3 +86,7 @@ gear3=3
gear4=4 gear4=4
gear5=5 gear5=5
gear6=6 gear6=6
; Invert the accelerator and or brake axis
; (Needed when using DirectInput for the Dualshock 4 for example)
reverseAccelAxis=0
reverseBrakeAxis=0

View File

@ -53,6 +53,17 @@ void idz_di_config_load(struct idz_di_config *cfg, const wchar_t *filename)
cfg->shift_dn = GetPrivateProfileIntW(L"dinput", L"shiftDn", 0, filename); cfg->shift_dn = GetPrivateProfileIntW(L"dinput", L"shiftDn", 0, filename);
cfg->shift_up = GetPrivateProfileIntW(L"dinput", L"shiftUp", 0, filename); cfg->shift_up = GetPrivateProfileIntW(L"dinput", L"shiftUp", 0, filename);
cfg->reverse_brake_axis = GetPrivateProfileIntW(
L"dinput",
L"reverseBrakeAxis",
0,
filename);
cfg->reverse_accel_axis = GetPrivateProfileIntW(
L"dinput",
L"reverseAccelAxis",
0,
filename);
for (i = 0 ; i < 6 ; i++) { for (i = 0 ; i < 6 ; i++) {
swprintf_s(key, _countof(key), L"gear%i", i + 1); swprintf_s(key, _countof(key), L"gear%i", i + 1);
cfg->gear[i] = GetPrivateProfileIntW(L"dinput", key, i + 1, filename); cfg->gear[i] = GetPrivateProfileIntW(L"dinput", key, i + 1, filename);
@ -60,6 +71,18 @@ void idz_di_config_load(struct idz_di_config *cfg, const wchar_t *filename)
} }
void idz_xi_config_load(struct idz_xi_config *cfg, const wchar_t *filename)
{
assert(cfg != NULL);
assert(filename != NULL);
cfg->single_stick_steering = GetPrivateProfileIntW(
L"io3",
L"singleStickSteering",
0,
filename);
}
void idz_io_config_load(struct idz_io_config *cfg, const wchar_t *filename) void idz_io_config_load(struct idz_io_config *cfg, const wchar_t *filename)
{ {
assert(cfg != NULL); assert(cfg != NULL);
@ -80,6 +103,7 @@ void idz_io_config_load(struct idz_io_config *cfg, const wchar_t *filename)
idz_shifter_config_load(&cfg->shifter, filename); idz_shifter_config_load(&cfg->shifter, filename);
idz_di_config_load(&cfg->di, filename); idz_di_config_load(&cfg->di, filename);
idz_xi_config_load(&cfg->xi, filename);
} }
void idz_shifter_config_load( void idz_shifter_config_load(

View File

@ -18,6 +18,12 @@ struct idz_di_config {
uint8_t shift_dn; uint8_t shift_dn;
uint8_t shift_up; uint8_t shift_up;
uint8_t gear[6]; uint8_t gear[6];
bool reverse_brake_axis;
bool reverse_accel_axis;
};
struct idz_xi_config {
bool single_stick_steering;
}; };
struct idz_io_config { struct idz_io_config {
@ -28,9 +34,11 @@ struct idz_io_config {
int restrict_; int restrict_;
struct idz_shifter_config shifter; struct idz_shifter_config shifter;
struct idz_di_config di; struct idz_di_config di;
struct idz_xi_config xi;
}; };
void idz_di_config_load(struct idz_di_config *cfg, const wchar_t *filename); void idz_di_config_load(struct idz_di_config *cfg, const wchar_t *filename);
void idz_xi_config_load(struct idz_xi_config *cfg, const wchar_t *filename);
void idz_io_config_load(struct idz_io_config *cfg, const wchar_t *filename); void idz_io_config_load(struct idz_io_config *cfg, const wchar_t *filename);
void idz_shifter_config_load( void idz_shifter_config_load(
struct idz_shifter_config *cfg, struct idz_shifter_config *cfg,

View File

@ -66,6 +66,8 @@ static uint8_t idz_di_shift_up;
static uint8_t idz_di_view_chg; static uint8_t idz_di_view_chg;
static uint8_t idz_di_start; static uint8_t idz_di_start;
static uint8_t idz_di_gear[6]; static uint8_t idz_di_gear[6];
static bool idz_di_reverse_brake_axis;
static bool idz_di_reverse_accel_axis;
HRESULT idz_di_init( HRESULT idz_di_init(
const struct idz_di_config *cfg, const struct idz_di_config *cfg,
@ -265,6 +267,8 @@ static HRESULT idz_di_config_apply(const struct idz_di_config *cfg)
dprintf("Wheel: View Change button : %i\n", cfg->view_chg); dprintf("Wheel: View Change button : %i\n", cfg->view_chg);
dprintf("Wheel: Shift Down button . : %i\n", cfg->shift_dn); dprintf("Wheel: Shift Down button . : %i\n", cfg->shift_dn);
dprintf("Wheel: Shift Up button . . : %i\n", cfg->shift_up); dprintf("Wheel: Shift Up button . . : %i\n", cfg->shift_up);
dprintf("Wheel: Reverse Brake Axis : %i\n", cfg->reverse_brake_axis);
dprintf("Wheel: Reverse Accel Axis : %i\n", cfg->reverse_accel_axis);
dprintf("Wheel: --- End configuration ---\n"); dprintf("Wheel: --- End configuration ---\n");
if (cfg->shifter_name[0] != L'\0') { if (cfg->shifter_name[0] != L'\0') {
@ -287,6 +291,8 @@ static HRESULT idz_di_config_apply(const struct idz_di_config *cfg)
idz_di_view_chg = cfg->view_chg; idz_di_view_chg = cfg->view_chg;
idz_di_shift_dn = cfg->shift_dn; idz_di_shift_dn = cfg->shift_dn;
idz_di_shift_up = cfg->shift_up; idz_di_shift_up = cfg->shift_up;
idz_di_reverse_brake_axis = cfg->reverse_brake_axis;
idz_di_reverse_accel_axis = cfg->reverse_accel_axis;
for (i = 0 ; i < 6 ; i++) { for (i = 0 ; i < 6 ; i++) {
idz_di_gear[i] = cfg->gear[i]; idz_di_gear[i] = cfg->gear[i];
@ -501,6 +507,16 @@ static void idz_di_jvs_read_analogs(struct idz_io_analog_state *out)
accel = (LONG *) &state.bytes[idz_di_off_accel]; accel = (LONG *) &state.bytes[idz_di_off_accel];
out->wheel = state.st.lX - 32768; out->wheel = state.st.lX - 32768;
out->brake = 65535 - *brake;
out->accel = 65535 - *accel; if (idz_di_reverse_brake_axis) {
out->brake = *brake;
} else {
out->brake = 65535 - *brake;
}
if (idz_di_reverse_accel_axis) {
out->accel = *accel;
} else {
out->accel = 65535 - *accel;
}
} }

View File

@ -30,7 +30,7 @@ HRESULT idz_io_jvs_init(void)
if (wstr_ieq(idz_io_cfg.mode, L"dinput")) { if (wstr_ieq(idz_io_cfg.mode, L"dinput")) {
hr = idz_di_init(&idz_io_cfg.di, idz_io_hmodule, &idz_io_backend); hr = idz_di_init(&idz_io_cfg.di, idz_io_hmodule, &idz_io_backend);
} else if (wstr_ieq(idz_io_cfg.mode, L"xinput")) { } else if (wstr_ieq(idz_io_cfg.mode, L"xinput")) {
hr = idz_xi_init(&idz_io_backend); hr = idz_xi_init(&idz_io_cfg.xi, &idz_io_backend);
} else { } else {
hr = E_INVALIDARG; hr = E_INVALIDARG;
dprintf("IDZ IO: Invalid IO mode \"%S\", use dinput or xinput\n", dprintf("IDZ IO: Invalid IO mode \"%S\", use dinput or xinput\n",

View File

@ -6,6 +6,7 @@
#include <stdint.h> #include <stdint.h>
#include "idzio/backend.h" #include "idzio/backend.h"
#include "idzio/config.h"
#include "idzio/idzio.h" #include "idzio/idzio.h"
#include "idzio/shifter.h" #include "idzio/shifter.h"
#include "idzio/xi.h" #include "idzio/xi.h"
@ -16,22 +17,45 @@ static void idz_xi_jvs_read_buttons(uint8_t *gamebtn_out);
static void idz_xi_jvs_read_shifter(uint8_t *gear); static void idz_xi_jvs_read_shifter(uint8_t *gear);
static void idz_xi_jvs_read_analogs(struct idz_io_analog_state *out); static void idz_xi_jvs_read_analogs(struct idz_io_analog_state *out);
static HRESULT idz_xi_config_apply(const struct idz_xi_config *cfg);
static const struct idz_io_backend idz_xi_backend = { static const struct idz_io_backend idz_xi_backend = {
.jvs_read_buttons = idz_xi_jvs_read_buttons, .jvs_read_buttons = idz_xi_jvs_read_buttons,
.jvs_read_shifter = idz_xi_jvs_read_shifter, .jvs_read_shifter = idz_xi_jvs_read_shifter,
.jvs_read_analogs = idz_xi_jvs_read_analogs, .jvs_read_analogs = idz_xi_jvs_read_analogs,
}; };
HRESULT idz_xi_init(const struct idz_io_backend **backend) static bool idz_xi_single_stick_steering;
HRESULT idz_xi_init(const struct idz_xi_config *cfg, const struct idz_io_backend **backend)
{ {
HRESULT hr;
assert(cfg != NULL);
assert(backend != NULL); assert(backend != NULL);
hr = idz_xi_config_apply(cfg);
if (FAILED(hr)) {
return hr;
}
dprintf("XInput: Using XInput controller\n"); dprintf("XInput: Using XInput controller\n");
*backend = &idz_xi_backend; *backend = &idz_xi_backend;
return S_OK; return S_OK;
} }
static HRESULT idz_xi_config_apply(const struct idz_xi_config *cfg)
{
dprintf("XInput: --- Begin configuration ---\n");
dprintf("XInput: Single Stick Steering : %i\n", cfg->single_stick_steering);
dprintf("XInput: --- End configuration ---\n");
idz_xi_single_stick_steering = cfg->single_stick_steering;
return S_OK;
}
static void idz_xi_jvs_read_buttons(uint8_t *gamebtn_out) static void idz_xi_jvs_read_buttons(uint8_t *gamebtn_out)
{ {
uint8_t gamebtn; uint8_t gamebtn;
@ -130,7 +154,12 @@ static void idz_xi_jvs_read_analogs(struct idz_io_analog_state *out)
right = 0; right = 0;
} }
out->wheel = (left + right) / 2; if(idz_xi_single_stick_steering) {
out->wheel = left;
} else {
out->wheel = (left + right) / 2;
}
out->accel = xi.Gamepad.bRightTrigger << 8; out->accel = xi.Gamepad.bRightTrigger << 8;
out->brake = xi.Gamepad.bLeftTrigger << 8; out->brake = xi.Gamepad.bLeftTrigger << 8;
} }

View File

@ -5,5 +5,6 @@
#include <windows.h> #include <windows.h>
#include "idzio/backend.h" #include "idzio/backend.h"
#include "idzio/config.h"
HRESULT idz_xi_init(const struct idz_io_backend **backend); HRESULT idz_xi_init(const struct idz_xi_config *cfg, const struct idz_io_backend **backend);