forked from TeamTofuShop/segatools
idz, idac, swdc: Added deadzone config
This commit is contained in:
@ -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)
|
||||
|
@ -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 {
|
||||
|
40
idzio/xi.c
40
idzio/xi.c
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user