idz, idac, swdc: Added deadzone config

This commit is contained in:
2023-08-29 02:22:05 +02:00
parent f6e961d4f4
commit ca4a8bd84d
12 changed files with 168 additions and 78 deletions

View File

@ -87,6 +87,18 @@ void idz_xi_config_load(struct idz_xi_config *cfg, const wchar_t *filename)
L"linearSteering",
0,
filename);
cfg->left_stick_deadzone = GetPrivateProfileIntW(
L"io3",
L"leftStickDeadzone",
7849,
filename);
cfg->right_stick_deadzone = GetPrivateProfileIntW(
L"io3",
L"rightStickDeadzone",
8689,
filename);
}
void idz_io_config_load(struct idz_io_config *cfg, const wchar_t *filename)

View File

@ -25,6 +25,8 @@ struct idz_di_config {
struct idz_xi_config {
bool single_stick_steering;
bool linear_steering;
uint16_t left_stick_deadzone;
uint16_t right_stick_deadzone;
};
struct idz_io_config {

View File

@ -28,6 +28,8 @@ static const struct idz_io_backend idz_xi_backend = {
static bool idz_xi_single_stick_steering;
static bool idz_xi_linear_steering;
static uint16_t idz_xi_left_stick_deadzone;
static uint16_t idz_xi_right_stick_deadzone;
HRESULT idz_xi_init(const struct idz_xi_config *cfg, const struct idz_io_backend **backend)
{
@ -47,15 +49,29 @@ HRESULT idz_xi_init(const struct idz_xi_config *cfg, const struct idz_io_backend
return S_OK;
}
static HRESULT idz_xi_config_apply(const struct idz_xi_config *cfg)
{
static HRESULT idz_xi_config_apply(const struct idz_xi_config *cfg) {
/* Deadzones check */
if (cfg->left_stick_deadzone > 32767 || cfg->left_stick_deadzone < 0) {
dprintf("XInput: Left stick deadzone is too large or negative\n");
return E_INVALIDARG;
}
if (cfg->right_stick_deadzone > 32767 || cfg->right_stick_deadzone < 0) {
dprintf("XInput: Right stick deadzone is too large or negative\n");
return E_INVALIDARG;
}
dprintf("XInput: --- Begin configuration ---\n");
dprintf("XInput: Single Stick Steering : %i\n", cfg->single_stick_steering);
dprintf("XInput: Linear Steering . . . : %i\n", cfg->linear_steering);
dprintf("XInput: Left Deadzone . . . . : %i\n", cfg->left_stick_deadzone);
dprintf("XInput: Right Deadzone . . . : %i\n", cfg->right_stick_deadzone);
dprintf("XInput: --- End configuration ---\n");
idz_xi_single_stick_steering = cfg->single_stick_steering;
idz_xi_linear_steering = cfg->linear_steering;
idz_xi_left_stick_deadzone = cfg->left_stick_deadzone;
idz_xi_right_stick_deadzone = cfg->right_stick_deadzone;
return S_OK;
}
@ -168,21 +184,21 @@ static void idz_xi_jvs_read_analogs(struct idz_io_analog_state *out)
if (!idz_xi_linear_steering) {
// Apply non-linear transform for both sticks
left = apply_non_linear_transform(left, XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE);
right = apply_non_linear_transform(right, XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE);
left = apply_non_linear_transform(left, idz_xi_left_stick_deadzone);
right = apply_non_linear_transform(right, idz_xi_right_stick_deadzone);
} else {
if (left < -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) {
left += XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE;
} else if (left > XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) {
left -= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE;
if (left < -idz_xi_left_stick_deadzone) {
left += idz_xi_left_stick_deadzone;
} else if (left > idz_xi_left_stick_deadzone) {
left -= idz_xi_left_stick_deadzone;
} else {
left = 0;
}
if (right < -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) {
right += XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE;
} else if (right > XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) {
right -= XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE;
if (right < -idz_xi_right_stick_deadzone) {
right += idz_xi_right_stick_deadzone;
} else if (right > idz_xi_right_stick_deadzone) {
right -= idz_xi_right_stick_deadzone;
} else {
right = 0;
}