1
0
mirror of https://github.com/cathery/sys-con.git synced 2024-07-01 01:38:44 +00:00

Change controller config options

Allow unmapping keys
Allow mapping multiple keys to the same button
Allow changing the deadzone for each trigger
Remove dualshock4 global option from the config files

Update config files for new changes
This commit is contained in:
cathery 2020-04-22 03:54:49 +03:00
parent e1b3fcc3b0
commit fb578f6987
23 changed files with 161 additions and 127 deletions

View File

@ -1,7 +1,8 @@
; Config for the Dualshock 3 controller ; Config for the Dualshock 3 controller
left_stick_deadzone = 10 ; from 0 to 100 left_stick_deadzone = 10 ; from 0 to 100
right_stick_deadzone = 10 ; from 0 to 100 right_stick_deadzone = 10 ; from 0 to 100
trigger_deadzone = 0 ; from 0 to 100 left_trigger_deadzone = 0 ; from 0 to 100
right_trigger_deadzone = 0 ; from 0 to 100
color_body = 48,71,105 color_body = 48,71,105
color_buttons = 22,22,22 color_buttons = 22,22,22
@ -13,4 +14,4 @@ color_rightGrip = 22,33,49
swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick
; For information on input mapping, see "example.ini" ; For information on input mapping, see "example.ini"
;key_SYNC = LSTICK_CLICK ; Remove the semicolon at the start to take effect ;KEY_CAPTURE = LSTICK_CLICK ; Remove the semicolon at the start to take effect

View File

@ -1,7 +1,8 @@
; Config for the Dualshock 4 controller ; Config for the Dualshock 4 controller
left_stick_deadzone = 10 ; from 0 to 100 left_stick_deadzone = 10 ; from 0 to 100
right_stick_deadzone = 10 ; from 0 to 100 right_stick_deadzone = 10 ; from 0 to 100
trigger_deadzone = 0 ; from 0 to 100 left_trigger_deadzone = 0 ; from 0 to 100
right_trigger_deadzone = 0 ; from 0 to 100
color_led = 0,0,64 ; from 0 to 255 color_led = 0,0,64 ; from 0 to 255
@ -15,5 +16,5 @@ color_rightGrip = 33,33,33
swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick
; For information on input mapping, see "example.ini" ; For information on input mapping, see "example.ini"
;key_SYNC = LSTICK_CLICK ; Remove the semicolon at the start to take effect ;KEY_CAPTURE = LSTICK_CLICK ; Remove the semicolon at the start to take effect

View File

@ -1,2 +1 @@
[global] [global]
use_dualshock_2nd_generation = false

View File

@ -1,7 +1,8 @@
; Config for the Xbox 360 and Xbox 360 Wireless type controllers ; Config for the Xbox 360 and Xbox 360 Wireless type controllers
left_stick_deadzone = 21 ; from 0 to 100 left_stick_deadzone = 21 ; from 0 to 100
right_stick_deadzone = 25 ; from 0 to 100 right_stick_deadzone = 25 ; from 0 to 100
trigger_deadzone = 0 ; from 0 to 100 left_trigger_deadzone = 0 ; from 0 to 100
right_trigger_deadzone = 0 ; from 0 to 100
color_body = 77,77,77 color_body = 77,77,77
color_buttons = 69,121,22 color_buttons = 69,121,22
@ -13,4 +14,4 @@ color_rightGrip = 100,100,100
swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick
; For information on input mapping, see "example.ini" ; For information on input mapping, see "example.ini"
;key_SYNC = LSTICK_CLICK ; Remove the semicolon at the start to take effect ;KEY_CAPTURE = LSTICK_CLICK ; Remove the semicolon at the start to take effect

View File

@ -1,7 +1,8 @@
; Config for the Xbox One type controllers ; Config for the Xbox One type controllers
left_stick_deadzone = 10 ; from 0 to 100 left_stick_deadzone = 10 ; from 0 to 100
right_stick_deadzone = 17 ; from 0 to 100 right_stick_deadzone = 17 ; from 0 to 100
trigger_deadzone = 0 ; from 0 to 100 left_trigger_deadzone = 0 ; from 0 to 100
right_trigger_deadzone = 0 ; from 0 to 100
color_body = 107,107,107 color_body = 107,107,107
color_buttons = 0,0,0 color_buttons = 0,0,0
@ -14,5 +15,5 @@ swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick
; For information on input mapping, see "example.ini" ; For information on input mapping, see "example.ini"
; Remove the semicolons below to take effect ; Remove the semicolons below to take effect
;key_FACE_DOWN = FACE_RIGHT ;KEY_FACE_DOWN = FACE_RIGHT
;key_FACE_LEFT = FACE_UP ;KEY_FACE_LEFT = FACE_UP

View File

@ -1,7 +1,8 @@
; Config for the original XBOX type controllers ; Config for the original XBOX type controllers
left_stick_deadzone = 21 ; from 0 to 100 left_stick_deadzone = 21 ; from 0 to 100
right_stick_deadzone = 25 ; from 0 to 100 right_stick_deadzone = 25 ; from 0 to 100
trigger_deadzone = 0 ; from 0 to 100 left_trigger_deadzone = 0 ; from 0 to 100
right_trigger_deadzone = 0 ; from 0 to 100
color_body = 77,77,77 color_body = 77,77,77
color_buttons = 69,121,22 color_buttons = 69,121,22
@ -13,4 +14,4 @@ color_rightGrip = 100,100,100
swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick
; For information on input mapping, see "example.ini" ; For information on input mapping, see "example.ini"
;key_SYNC = GUIDE ; Remove the semicolon at the start to take effect ;KEY_CAPTURE = HOME ; Remove the semicolon at the start to take effect

View File

@ -5,39 +5,42 @@ right_stick_deadzone = 17 ; from 0 to 100
; trigger_deadzone is the percentage of how hard the trigger should be pressed before it is visible ; trigger_deadzone is the percentage of how hard the trigger should be pressed before it is visible
; 0 - always, 100 - not at all ; 0 - always, 100 - not at all
trigger_deadzone = 0 ; from 0 to 100 left_trigger_deadzone = 0 ; from 0 to 100
right_trigger_deadzone = 0 ; from 0 to 100
; Swap the button inputs for dpad and lstick, so that the dpad will be treated as analog input. ; Swap the button inputs for dpad and lstick, so that the dpad will be treated as analog input.
swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick swap_dpad_and_lstick = false ; set this to true to swap the d-pad and left stick
; to modify the key values, type "key_* = *" ; to modify the key values, type "KEY_* = *"
; where * is one of the values from this table ; where * is one of the values from this table
; FACE_UP X on joycons ; DEFAULT Use the default value (every key is mapped to this by default)
; NONE Unmap the button
; FACE_UP X on joycons
; FACE_RIGHT A on joycons ; FACE_RIGHT A on joycons
; FACE_DOWN B on joycons ; FACE_DOWN B on joycons
; FACE_LEFT Y on joycons ; FACE_LEFT Y on joycons
; LSTICK_CLICK Left stick press ; LSTICK_CLICK Left stick press
; RSTICK_CLICK Right stick press ; RSTICK_CLICK Right stick press
; LEFT_BUMPER Left bumper/ L ; LEFT_BUMPER Left bumper/ L
; RIGHT_BUMPER Right bumper/ R ; RIGHT_BUMPER Right bumper/ R
; LEFT_TRIGGER Left trigger/ ZL ; LEFT_TRIGGER Left trigger/ ZL
; RIGHT_TRIGGER Right trigger/ ZR ; RIGHT_TRIGGER Right trigger/ ZR
; BACK Minus on joycons ; BACK Minus on joycons
; START Plus on joycons ; START Plus on joycons
; DPAD_UP D-pad UP ; DPAD_UP D-pad UP
; DPAD_RIGHT D-pad RIGHT ; DPAD_RIGHT D-pad RIGHT
; DPAD_DOWN D-pad DOWN ; DPAD_DOWN D-pad DOWN
; DPAD_LEFT D-pad LEFT ; DPAD_LEFT D-pad LEFT
; SYNC Capture on joycons ; CAPTURE Capture on joycons, sync on Xbox One, Touchpad press on DS4
; GUIDE Home on joycons ; HOME Home on joycons, Xbox button on Xbox, PS button on DS4
; TOUCHPAD Simulate at least one finger on the touch screen (doesn't work?) ; TOUCHPAD One finger on the DS4 touchpad (unused)
; example: this will swap the X and Y, A and B buttons to match the names on Xbox controllers ; example: this will swap the X and Y, A and B buttons to match the names on Xbox controllers
key_FACE_DOWN = FACE_RIGHT KEY_FACE_DOWN = FACE_RIGHT
key_FACE_LEFT = FACE_UP KEY_FACE_LEFT = FACE_UP
; example: this will press the Capture button on Left stick press ; example: this will press the Capture button on Left stick press
key_LSTICK_CLICK = SYNC KEY_LSTICK_CLICK = CAPTURE
; these are RGB color values for the controller icon represented in the controller screens ; these are RGB color values for the controller icon represented in the controller screens
color_body = 107,107,107 color_body = 107,107,107

View File

@ -1,8 +1,14 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#define MAX_JOYSTICKS 2
#define MAX_TRIGGERS 2
#define MAX_CONTROLLER_BUTTONS 32
enum ControllerButton : uint8_t enum ControllerButton : uint8_t
{ {
NOT_SET = 0, DEFAULT = 0,
NONE,
FACE_UP, FACE_UP,
FACE_RIGHT, FACE_RIGHT,
FACE_DOWN, FACE_DOWN,
@ -19,10 +25,10 @@ enum ControllerButton : uint8_t
DPAD_RIGHT, DPAD_RIGHT,
DPAD_DOWN, DPAD_DOWN,
DPAD_LEFT, DPAD_LEFT,
CAPTURE,
HOME,
SYNC, SYNC,
GUIDE,
TOUCHPAD, TOUCHPAD,
NUM_CONTROLLERBUTTONS = TOUCHPAD,
}; };
struct NormalizedStick struct NormalizedStick
@ -45,14 +51,12 @@ union RGBAColor {
struct ControllerConfig struct ControllerConfig
{ {
uint8_t leftStickDeadzonePercent{10}; uint8_t stickDeadzonePercent[MAX_JOYSTICKS]{};
uint8_t rightStickDeadzonePercent{10}; uint16_t stickRotationDegrees[MAX_JOYSTICKS]{};
uint16_t leftStickRotationDegrees{}; uint8_t triggerDeadzonePercent[MAX_TRIGGERS]{};
uint16_t rightStickRotationDegrees{}; ControllerButton buttons[MAX_CONTROLLER_BUTTONS]{};
uint8_t triggerDeadzonePercent{}; float triggers[MAX_TRIGGERS]{};
ControllerButton buttons[NUM_CONTROLLERBUTTONS]{}; NormalizedStick sticks[MAX_JOYSTICKS]{};
float triggers[2]{};
NormalizedStick sticks[2]{};
bool swapDPADandLSTICK{false}; bool swapDPADandLSTICK{false};
RGBAColor bodyColor{107, 107, 107, 255}; RGBAColor bodyColor{107, 107, 107, 255};
RGBAColor buttonsColor{0, 0, 0, 255}; RGBAColor buttonsColor{0, 0, 0, 255};

View File

@ -123,9 +123,9 @@ Result Dualshock3Controller::GetInput()
return rc; return rc;
} }
float Dualshock3Controller::NormalizeTrigger(uint8_t value) float Dualshock3Controller::NormalizeTrigger(uint8_t deadzonePercent, uint8_t value)
{ {
uint8_t deadzone = (UINT8_MAX * _dualshock3ControllerConfig.triggerDeadzonePercent) / 100; uint8_t deadzone = (UINT8_MAX * deadzonePercent) / 100;
//If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone //If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone
return value < deadzone return value < deadzone
? 0 ? 0
@ -169,17 +169,17 @@ void Dualshock3Controller::NormalizeAxis(uint8_t x,
//Pass by value should hopefully be optimized away by RVO //Pass by value should hopefully be optimized away by RVO
NormalizedButtonData Dualshock3Controller::GetNormalizedButtonData() NormalizedButtonData Dualshock3Controller::GetNormalizedButtonData()
{ {
NormalizedButtonData normalData; NormalizedButtonData normalData{};
normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left_pressure); normalData.triggers[0] = NormalizeTrigger(_dualshock3ControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left_pressure);
normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right_pressure); normalData.triggers[1] = NormalizeTrigger(_dualshock3ControllerConfig.triggerDeadzonePercent[1], m_buttonData.trigger_right_pressure);
NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _dualshock3ControllerConfig.leftStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _dualshock3ControllerConfig.stickDeadzonePercent[0],
&normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y); &normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _dualshock3ControllerConfig.rightStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _dualshock3ControllerConfig.stickDeadzonePercent[1],
&normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y); &normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y);
bool buttons[NUM_CONTROLLERBUTTONS] = { bool buttons[MAX_CONTROLLER_BUTTONS] = {
m_buttonData.triangle, m_buttonData.triangle,
m_buttonData.circle, m_buttonData.circle,
m_buttonData.cross, m_buttonData.cross,
@ -200,10 +200,13 @@ NormalizedButtonData Dualshock3Controller::GetNormalizedButtonData()
m_buttonData.guide, m_buttonData.guide,
}; };
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) for (int i = 0; i != MAX_CONTROLLER_BUTTONS; ++i)
{ {
ControllerButton button = _dualshock3ControllerConfig.buttons[i]; ControllerButton button = _dualshock3ControllerConfig.buttons[i];
normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; if (button == NONE)
continue;
normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i];
} }
return normalData; return normalData;

View File

@ -146,7 +146,7 @@ public:
inline const Dualshock3ButtonData &GetButtonData() { return m_buttonData; }; inline const Dualshock3ButtonData &GetButtonData() { return m_buttonData; };
float NormalizeTrigger(uint8_t value); float NormalizeTrigger(uint8_t deadzonePercent, uint8_t value);
void NormalizeAxis(uint8_t x, uint8_t y, uint8_t deadzonePercent, float *x_out, float *y_out); void NormalizeAxis(uint8_t x, uint8_t y, uint8_t deadzonePercent, float *x_out, float *y_out);
Result SendInitBytes(); Result SendInitBytes();

View File

@ -129,9 +129,9 @@ Result Dualshock4Controller::GetInput()
return rc; return rc;
} }
float Dualshock4Controller::NormalizeTrigger(uint8_t value) float Dualshock4Controller::NormalizeTrigger(uint8_t deadzonePercent, uint8_t value)
{ {
uint8_t deadzone = (UINT8_MAX * _dualshock4ControllerConfig.triggerDeadzonePercent) / 100; uint8_t deadzone = (UINT8_MAX * deadzonePercent) / 100;
//If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone //If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone
return value < deadzone return value < deadzone
? 0 ? 0
@ -175,17 +175,17 @@ void Dualshock4Controller::NormalizeAxis(uint8_t x,
//Pass by value should hopefully be optimized away by RVO //Pass by value should hopefully be optimized away by RVO
NormalizedButtonData Dualshock4Controller::GetNormalizedButtonData() NormalizedButtonData Dualshock4Controller::GetNormalizedButtonData()
{ {
NormalizedButtonData normalData; NormalizedButtonData normalData{};
normalData.triggers[0] = NormalizeTrigger(m_buttonData.l2_pressure); normalData.triggers[0] = NormalizeTrigger(_dualshock4ControllerConfig.triggerDeadzonePercent[0], m_buttonData.l2_pressure);
normalData.triggers[1] = NormalizeTrigger(m_buttonData.r2_pressure); normalData.triggers[1] = NormalizeTrigger(_dualshock4ControllerConfig.triggerDeadzonePercent[1], m_buttonData.r2_pressure);
NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _dualshock4ControllerConfig.leftStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _dualshock4ControllerConfig.stickDeadzonePercent[0],
&normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y); &normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _dualshock4ControllerConfig.rightStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _dualshock4ControllerConfig.stickDeadzonePercent[1],
&normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y); &normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y);
bool buttons[NUM_CONTROLLERBUTTONS] = { bool buttons[MAX_CONTROLLER_BUTTONS] = {
m_buttonData.triangle, m_buttonData.triangle,
m_buttonData.circle, m_buttonData.circle,
m_buttonData.cross, m_buttonData.cross,
@ -204,13 +204,17 @@ NormalizedButtonData Dualshock4Controller::GetNormalizedButtonData()
(m_buttonData.dpad == DS4_LEFT) || (m_buttonData.dpad == DS4_UPLEFT) || (m_buttonData.dpad == DS4_DOWNLEFT), (m_buttonData.dpad == DS4_LEFT) || (m_buttonData.dpad == DS4_UPLEFT) || (m_buttonData.dpad == DS4_DOWNLEFT),
m_buttonData.touchpad_press, m_buttonData.touchpad_press,
m_buttonData.psbutton, m_buttonData.psbutton,
false,
m_buttonData.touchpad_finger1_unpressed == false, m_buttonData.touchpad_finger1_unpressed == false,
}; };
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) for (int i = 0; i != MAX_CONTROLLER_BUTTONS; ++i)
{ {
ControllerButton button = _dualshock4ControllerConfig.buttons[i]; ControllerButton button = _dualshock4ControllerConfig.buttons[i];
normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; if (button == NONE)
continue;
normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i];
} }
return normalData; return normalData;

View File

@ -162,7 +162,7 @@ public:
virtual ControllerType GetType() override { return CONTROLLER_DUALSHOCK4; } virtual ControllerType GetType() override { return CONTROLLER_DUALSHOCK4; }
float NormalizeTrigger(uint8_t value); float NormalizeTrigger(uint8_t deadzonePercent, uint8_t value);
void NormalizeAxis(uint8_t x, uint8_t y, uint8_t deadzonePercent, float *x_out, float *y_out); void NormalizeAxis(uint8_t x, uint8_t y, uint8_t deadzonePercent, float *x_out, float *y_out);
Result SendInitBytes(); Result SendInitBytes();

View File

@ -122,9 +122,9 @@ Result Xbox360Controller::SendInitBytes()
return rc; return rc;
} }
float Xbox360Controller::NormalizeTrigger(uint8_t value) float Xbox360Controller::NormalizeTrigger(uint8_t deadzonePercent, uint8_t value)
{ {
uint16_t deadzone = (UINT8_MAX * _xbox360ControllerConfig.triggerDeadzonePercent) / 100; uint16_t deadzone = (UINT8_MAX * deadzonePercent) / 100;
//If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone //If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone
return value < deadzone return value < deadzone
? 0 ? 0
@ -169,17 +169,17 @@ void Xbox360Controller::NormalizeAxis(int16_t x,
//Pass by value should hopefully be optimized away by RVO //Pass by value should hopefully be optimized away by RVO
NormalizedButtonData Xbox360Controller::GetNormalizedButtonData() NormalizedButtonData Xbox360Controller::GetNormalizedButtonData()
{ {
NormalizedButtonData normalData; NormalizedButtonData normalData{};
normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); normalData.triggers[0] = NormalizeTrigger(_xbox360ControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left);
normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); normalData.triggers[1] = NormalizeTrigger(_xbox360ControllerConfig.triggerDeadzonePercent[1], m_buttonData.trigger_right);
NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xbox360ControllerConfig.leftStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xbox360ControllerConfig.stickDeadzonePercent[0],
&normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y); &normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xbox360ControllerConfig.rightStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xbox360ControllerConfig.stickDeadzonePercent[1],
&normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y); &normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y);
bool buttons[NUM_CONTROLLERBUTTONS]{ bool buttons[MAX_CONTROLLER_BUTTONS]{
m_buttonData.y, m_buttonData.y,
m_buttonData.b, m_buttonData.b,
m_buttonData.a, m_buttonData.a,
@ -200,10 +200,13 @@ NormalizedButtonData Xbox360Controller::GetNormalizedButtonData()
m_buttonData.guide, m_buttonData.guide,
}; };
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) for (int i = 0; i != MAX_CONTROLLER_BUTTONS; ++i)
{ {
ControllerButton button = _xbox360ControllerConfig.buttons[i]; ControllerButton button = _xbox360ControllerConfig.buttons[i];
normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; if (button == NONE)
continue;
normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i];
} }
return normalData; return normalData;

View File

@ -106,7 +106,7 @@ public:
inline const Xbox360ButtonData &GetButtonData() { return m_buttonData; }; inline const Xbox360ButtonData &GetButtonData() { return m_buttonData; };
float NormalizeTrigger(uint8_t value); float NormalizeTrigger(uint8_t deadzonePercent, uint8_t value);
void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out); void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out);
Result SendInitBytes(); Result SendInitBytes();

View File

@ -143,9 +143,9 @@ Result Xbox360WirelessController::GetInput()
return rc; return rc;
} }
float Xbox360WirelessController::NormalizeTrigger(uint8_t value) float Xbox360WirelessController::NormalizeTrigger(uint8_t deadzonePercent, uint8_t value)
{ {
uint16_t deadzone = (UINT8_MAX * _xbox360WControllerConfig.triggerDeadzonePercent) / 100; uint16_t deadzone = (UINT8_MAX * deadzonePercent) / 100;
//If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone //If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone
return value < deadzone return value < deadzone
? 0 ? 0
@ -190,17 +190,17 @@ void Xbox360WirelessController::NormalizeAxis(int16_t x,
//Pass by value should hopefully be optimized away by RVO //Pass by value should hopefully be optimized away by RVO
NormalizedButtonData Xbox360WirelessController::GetNormalizedButtonData() NormalizedButtonData Xbox360WirelessController::GetNormalizedButtonData()
{ {
NormalizedButtonData normalData; NormalizedButtonData normalData{};
normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); normalData.triggers[0] = NormalizeTrigger(_xbox360WControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left);
normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); normalData.triggers[1] = NormalizeTrigger(_xbox360WControllerConfig.triggerDeadzonePercent[1], m_buttonData.trigger_right);
NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xbox360WControllerConfig.leftStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xbox360WControllerConfig.stickDeadzonePercent[0],
&normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y); &normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xbox360WControllerConfig.rightStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xbox360WControllerConfig.stickDeadzonePercent[1],
&normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y); &normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y);
bool buttons[NUM_CONTROLLERBUTTONS]{ bool buttons[MAX_CONTROLLER_BUTTONS]{
m_buttonData.y, m_buttonData.y,
m_buttonData.b, m_buttonData.b,
m_buttonData.a, m_buttonData.a,
@ -221,10 +221,13 @@ NormalizedButtonData Xbox360WirelessController::GetNormalizedButtonData()
m_buttonData.guide, m_buttonData.guide,
}; };
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) for (int i = 0; i != MAX_CONTROLLER_BUTTONS; ++i)
{ {
ControllerButton button = _xbox360WControllerConfig.buttons[i]; ControllerButton button = _xbox360WControllerConfig.buttons[i];
normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; if (button == NONE)
continue;
normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i];
} }
return normalData; return normalData;

View File

@ -42,7 +42,7 @@ public:
inline const Xbox360ButtonData &GetButtonData() { return m_buttonData; }; inline const Xbox360ButtonData &GetButtonData() { return m_buttonData; };
float NormalizeTrigger(uint8_t value); float NormalizeTrigger(uint8_t deadzonePercent, uint8_t value);
void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out); void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out);
Result SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude); Result SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude);

View File

@ -109,9 +109,9 @@ Result XboxController::GetInput()
return rc; return rc;
} }
float XboxController::NormalizeTrigger(uint8_t value) float XboxController::NormalizeTrigger(uint8_t deadzonePercent, uint8_t value)
{ {
uint8_t deadzone = (UINT8_MAX * _xboxControllerConfig.triggerDeadzonePercent) / 100; uint8_t deadzone = (UINT8_MAX * deadzonePercent) / 100;
//If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone //If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone
return value < deadzone return value < deadzone
? 0 ? 0
@ -156,17 +156,17 @@ void XboxController::NormalizeAxis(int16_t x,
//Pass by value should hopefully be optimized away by RVO //Pass by value should hopefully be optimized away by RVO
NormalizedButtonData XboxController::GetNormalizedButtonData() NormalizedButtonData XboxController::GetNormalizedButtonData()
{ {
NormalizedButtonData normalData; NormalizedButtonData normalData{};
normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); normalData.triggers[0] = NormalizeTrigger(_xboxControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left);
normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); normalData.triggers[1] = NormalizeTrigger(_xboxControllerConfig.triggerDeadzonePercent[1], m_buttonData.trigger_right);
NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xboxControllerConfig.leftStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xboxControllerConfig.stickDeadzonePercent[0],
&normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y); &normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xboxControllerConfig.rightStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xboxControllerConfig.stickDeadzonePercent[1],
&normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y); &normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y);
bool buttons[NUM_CONTROLLERBUTTONS]{ bool buttons[MAX_CONTROLLER_BUTTONS]{
m_buttonData.y != 0, m_buttonData.y != 0,
m_buttonData.b != 0, m_buttonData.b != 0,
m_buttonData.a != 0, m_buttonData.a != 0,
@ -187,10 +187,13 @@ NormalizedButtonData XboxController::GetNormalizedButtonData()
m_buttonData.black_buttton != 0, m_buttonData.black_buttton != 0,
}; };
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) for (int i = 0; i != MAX_CONTROLLER_BUTTONS; ++i)
{ {
ControllerButton button = _xboxControllerConfig.buttons[i]; ControllerButton button = _xboxControllerConfig.buttons[i];
normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; if (button == NONE)
continue;
normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i];
} }
return normalData; return normalData;

View File

@ -76,7 +76,7 @@ public:
inline const XboxButtonData &GetButtonData() { return m_buttonData; }; inline const XboxButtonData &GetButtonData() { return m_buttonData; };
float NormalizeTrigger(uint8_t value); float NormalizeTrigger(uint8_t deadzonePercent, uint8_t value);
void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out); void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out);
Result SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude); Result SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude);

View File

@ -206,9 +206,9 @@ Result XboxOneController::SendInitBytes()
return rc; return rc;
} }
float XboxOneController::NormalizeTrigger(uint16_t value) float XboxOneController::NormalizeTrigger(uint8_t deadzonePercent, uint16_t value)
{ {
uint16_t deadzone = (TRIGGER_MAXVALUE * _xboxoneControllerConfig.triggerDeadzonePercent) / 100; uint16_t deadzone = (TRIGGER_MAXVALUE * deadzonePercent) / 100;
//If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone //If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone
return value < deadzone return value < deadzone
? 0 ? 0
@ -253,17 +253,17 @@ void XboxOneController::NormalizeAxis(int16_t x,
//Pass by value should hopefully be optimized away by RVO //Pass by value should hopefully be optimized away by RVO
NormalizedButtonData XboxOneController::GetNormalizedButtonData() NormalizedButtonData XboxOneController::GetNormalizedButtonData()
{ {
NormalizedButtonData normalData; NormalizedButtonData normalData{};
normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); normalData.triggers[0] = NormalizeTrigger(_xboxoneControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left);
normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); normalData.triggers[1] = NormalizeTrigger(_xboxoneControllerConfig.triggerDeadzonePercent[1], m_buttonData.trigger_right);
NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xboxoneControllerConfig.leftStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _xboxoneControllerConfig.stickDeadzonePercent[0],
&normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y); &normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xboxoneControllerConfig.rightStickDeadzonePercent, NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _xboxoneControllerConfig.stickDeadzonePercent[1],
&normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y); &normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y);
bool buttons[NUM_CONTROLLERBUTTONS]{ bool buttons[MAX_CONTROLLER_BUTTONS]{
m_buttonData.y, m_buttonData.y,
m_buttonData.b, m_buttonData.b,
m_buttonData.a, m_buttonData.a,
@ -284,10 +284,13 @@ NormalizedButtonData XboxOneController::GetNormalizedButtonData()
m_GuidePressed, m_GuidePressed,
}; };
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) for (int i = 0; i != MAX_CONTROLLER_BUTTONS; ++i)
{ {
ControllerButton button = _xboxoneControllerConfig.buttons[i]; ControllerButton button = _xboxoneControllerConfig.buttons[i];
normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; if (button == NONE)
continue;
normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i];
} }
return normalData; return normalData;

View File

@ -99,7 +99,7 @@ public:
inline const XboxOneButtonData &GetButtonData() { return m_buttonData; }; inline const XboxOneButtonData &GetButtonData() { return m_buttonData; };
float NormalizeTrigger(uint16_t value); float NormalizeTrigger(uint8_t deadzonePercent, uint16_t value);
void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out); void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out);
Result SendInitBytes(); Result SendInitBytes();

View File

@ -6,7 +6,7 @@
struct NormalizedButtonData struct NormalizedButtonData
{ {
bool buttons[NUM_CONTROLLERBUTTONS]; bool buttons[MAX_CONTROLLER_BUTTONS];
float triggers[2]; float triggers[2];
NormalizedStick sticks[2]; NormalizedStick sticks[2];
}; };

View File

@ -162,7 +162,6 @@ void SwitchHDLHandler::FillHdlState(const NormalizedButtonData &data)
m_hdlState.buttons |= (data.buttons[16] ? KEY_CAPTURE : 0); m_hdlState.buttons |= (data.buttons[16] ? KEY_CAPTURE : 0);
m_hdlState.buttons |= (data.buttons[17] ? KEY_HOME : 0); m_hdlState.buttons |= (data.buttons[17] ? KEY_HOME : 0);
m_hdlState.buttons |= (data.buttons[18] ? KEY_TOUCH : 0);
} }
void SwitchHDLHandler::UpdateInput() void SwitchHDLHandler::UpdateInput()

View File

@ -26,8 +26,9 @@ namespace syscon::config
bool is_config_changed_check_thread_running = false; bool is_config_changed_check_thread_running = false;
constexpr const char *keyNames[NUM_CONTROLLERBUTTONS] constexpr std::array keyNames{
{ "DEFAULT",
"NONE",
"FACE_UP", "FACE_UP",
"FACE_RIGHT", "FACE_RIGHT",
"FACE_DOWN", "FACE_DOWN",
@ -44,21 +45,22 @@ namespace syscon::config
"DPAD_RIGHT", "DPAD_RIGHT",
"DPAD_DOWN", "DPAD_DOWN",
"DPAD_LEFT", "DPAD_LEFT",
"CAPTURE",
"HOME",
"SYNC", "SYNC",
"GUIDE",
"TOUCHPAD", "TOUCHPAD",
}; };
ControllerButton StringToKey(const char *text) ControllerButton StringToKey(const char *text)
{ {
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) for (int i = 0; i != keyNames.size(); ++i)
{ {
if (strcmp(keyNames[i], text) == 0) if (strcmp(keyNames[i], text) == 0)
{ {
return static_cast<ControllerButton>(i); return static_cast<ControllerButton>(i);
} }
} }
return NOT_SET; return NONE;
} }
RGBAColor DecodeColorValue(const char *value) RGBAColor DecodeColorValue(const char *value)
@ -82,37 +84,44 @@ namespace syscon::config
int ParseConfigLine(void *dummy, const char *section, const char *name, const char *value) int ParseConfigLine(void *dummy, const char *section, const char *name, const char *value)
{ {
if (strncmp(name, "key_", 4) == 0) if (strncmp(name, "KEY_", 4) == 0)
{ {
ControllerButton button = StringToKey(name + 4); ControllerButton button = StringToKey(name + 4);
ControllerButton buttonValue = StringToKey(value); ControllerButton buttonValue = StringToKey(value);
tempConfig.buttons[button] = buttonValue; if (button >= 2)
tempConfig.buttons[buttonValue] = button; {
return 1; tempConfig.buttons[button - 2] = buttonValue;
return 1;
}
} }
else if (strcmp(name, "left_stick_deadzone") == 0) else if (strcmp(name, "left_stick_deadzone") == 0)
{ {
tempConfig.leftStickDeadzonePercent = atoi(value); tempConfig.stickDeadzonePercent[0] = atoi(value);
return 1; return 1;
} }
else if (strcmp(name, "right_stick_deadzone") == 0) else if (strcmp(name, "right_stick_deadzone") == 0)
{ {
tempConfig.rightStickDeadzonePercent = atoi(value); tempConfig.stickDeadzonePercent[1] = atoi(value);
return 1; return 1;
} }
else if (strcmp(name, "left_stick_rotation") == 0) else if (strcmp(name, "left_stick_rotation") == 0)
{ {
tempConfig.leftStickRotationDegrees = atoi(value); tempConfig.stickRotationDegrees[0] = atoi(value);
return 1; return 1;
} }
else if (strcmp(name, "right_stick_rotation") == 0) else if (strcmp(name, "right_stick_rotation") == 0)
{ {
tempConfig.rightStickRotationDegrees = atoi(value); tempConfig.stickRotationDegrees[1] = atoi(value);
return 1; return 1;
} }
else if (strcmp(name, "trigger_deadzone") == 0) else if (strcmp(name, "left_trigger_deadzone") == 0)
{ {
tempConfig.triggerDeadzonePercent = atoi(value); tempConfig.triggerDeadzonePercent[0] = atoi(value);
return 1;
}
else if (strcmp(name, "right_trigger_deadzone") == 0)
{
tempConfig.triggerDeadzonePercent[1] = atoi(value);
return 1; return 1;
} }
else if (strcmp(name, "swap_dpad_and_lstick") == 0) else if (strcmp(name, "swap_dpad_and_lstick") == 0)
@ -160,10 +169,6 @@ namespace syscon::config
Result ReadFromConfig(const char *path) Result ReadFromConfig(const char *path)
{ {
tempConfig = ControllerConfig{}; tempConfig = ControllerConfig{};
for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i)
{
tempConfig.buttons[i] = NOT_SET;
}
return ini_parse(path, ParseConfigLine, NULL); return ini_parse(path, ParseConfigLine, NULL);
} }