diff --git a/dist/idac/segatools.ini b/dist/idac/segatools.ini index a99f2f8..8b72d4e 100644 --- a/dist/idac/segatools.ini +++ b/dist/idac/segatools.ini @@ -144,6 +144,11 @@ accelAxis=Y ; numbered from 1; some software numbers buttons from 0. start=1 viewChg=2 +; DPad is already emulated, but in order to trigger "Time Up" and exit the +; course you need to press both left and right on the DPad at the same time. +; This is not possible on most devices, so we set the left and right button again. +left=7 +right=8 ; Button mappings for the simulated six-speed shifter. shiftDn=5 shiftUp=6 diff --git a/idacio/config.c b/idacio/config.c index 934caf4..48410c5 100644 --- a/idacio/config.c +++ b/idacio/config.c @@ -50,6 +50,8 @@ void idac_di_config_load(struct idac_di_config *cfg, const wchar_t *filename) cfg->start = GetPrivateProfileIntW(L"dinput", L"start", 0, filename); cfg->view_chg = GetPrivateProfileIntW(L"dinput", L"viewChg", 0, filename); + cfg->left = GetPrivateProfileIntW(L"dinput", L"left", 0, filename); + cfg->right = GetPrivateProfileIntW(L"dinput", L"right", 0, filename); cfg->shift_dn = GetPrivateProfileIntW(L"dinput", L"shiftDn", 0, filename); cfg->shift_up = GetPrivateProfileIntW(L"dinput", L"shiftUp", 0, filename); diff --git a/idacio/config.h b/idacio/config.h index 4b8a3eb..8f6517a 100644 --- a/idacio/config.h +++ b/idacio/config.h @@ -15,6 +15,8 @@ struct idac_di_config { wchar_t accel_axis[16]; uint8_t start; uint8_t view_chg; + uint8_t left; + uint8_t right; uint8_t shift_dn; uint8_t shift_up; uint8_t gear[6]; diff --git a/idacio/di.c b/idacio/di.c index 2494082..1edaf9b 100644 --- a/idacio/di.c +++ b/idacio/di.c @@ -65,6 +65,8 @@ static uint8_t idac_di_shift_dn; static uint8_t idac_di_shift_up; static uint8_t idac_di_view_chg; static uint8_t idac_di_start; +static uint8_t idac_di_left; +static uint8_t idac_di_right; static uint8_t idac_di_gear[6]; static bool idac_di_reverse_brake_axis; static bool idac_di_reverse_accel_axis; @@ -235,6 +237,18 @@ static HRESULT idac_di_config_apply(const struct idac_di_config *cfg) return E_INVALIDARG; } + if (cfg->left > 32) { + dprintf("Wheel: Invalid left button: %i\n", cfg->left); + + return E_INVALIDARG; + } + + if (cfg->right > 32) { + dprintf("Wheel: Invalid right button: %i\n", cfg->right); + + return E_INVALIDARG; + } + if (cfg->shift_dn > 32) { dprintf("Wheel: Invalid shift down button: %i\n", cfg->shift_dn); @@ -266,6 +280,8 @@ static HRESULT idac_di_config_apply(const struct idac_di_config *cfg) dprintf("Wheel: Accel axis . . . . : %S\n", accel_axis->name); dprintf("Wheel: Start button . . . : %i\n", cfg->start); dprintf("Wheel: View Change button : %i\n", cfg->view_chg); + dprintf("Wheel: Left button . . . . : %i\n", cfg->left); + dprintf("Wheel: Right button . . . : %i\n", cfg->right); dprintf("Wheel: Shift Down button . : %i\n", cfg->shift_dn); dprintf("Wheel: Shift Up button . . : %i\n", cfg->shift_up); dprintf("Wheel: Reverse Brake Axis : %i\n", cfg->reverse_brake_axis); @@ -290,6 +306,8 @@ static HRESULT idac_di_config_apply(const struct idac_di_config *cfg) idac_di_off_accel = accel_axis->off; idac_di_start = cfg->start; idac_di_view_chg = cfg->view_chg; + idac_di_left = cfg->left; + idac_di_right = cfg->right; idac_di_shift_dn = cfg->shift_dn; idac_di_shift_up = cfg->shift_up; idac_di_reverse_brake_axis = cfg->reverse_brake_axis; @@ -398,6 +416,14 @@ static void idac_di_get_buttons(uint8_t *gamebtn_out) gamebtn |= IDAC_IO_GAMEBTN_VIEW_CHANGE; } + if (idac_di_left && state.st.rgbButtons[idac_di_left - 1]) { + gamebtn |= IDAC_IO_GAMEBTN_LEFT; + } + + if (idac_di_right && state.st.rgbButtons[idac_di_right - 1]) { + gamebtn |= IDAC_IO_GAMEBTN_RIGHT; + } + *gamebtn_out = gamebtn; }