From fb578f6987e6767579fbf8679f395963d516b266 Mon Sep 17 00:00:00 2001 From: cathery Date: Wed, 22 Apr 2020 03:54:49 +0300 Subject: [PATCH] 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 --- common/config/sys-con/config_dualshock3.ini | 5 ++- common/config/sys-con/config_dualshock4.ini | 5 ++- common/config/sys-con/config_global.ini | 1 - common/config/sys-con/config_xbox360.ini | 5 ++- common/config/sys-con/config_xboxone.ini | 7 +-- common/config/sys-con/config_xboxorig.ini | 5 ++- common/config/sys-con/example.ini | 35 ++++++++------- source/ControllerLib/ControllerConfig.h | 26 ++++++----- .../Controllers/Dualshock3Controller.cpp | 23 +++++----- .../Controllers/Dualshock3Controller.h | 2 +- .../Controllers/Dualshock4Controller.cpp | 24 ++++++----- .../Controllers/Dualshock4Controller.h | 2 +- .../Controllers/Xbox360Controller.cpp | 23 +++++----- .../Controllers/Xbox360Controller.h | 2 +- .../Controllers/Xbox360WirelessController.cpp | 23 +++++----- .../Controllers/Xbox360WirelessController.h | 2 +- .../Controllers/XboxController.cpp | 23 +++++----- .../Controllers/XboxController.h | 2 +- .../Controllers/XboxOneController.cpp | 23 +++++----- .../Controllers/XboxOneController.h | 2 +- source/ControllerLib/IController.h | 2 +- source/ControllerSwitch/SwitchHDLHandler.cpp | 3 +- source/Sysmodule/source/config_handler.cpp | 43 +++++++++++-------- 23 files changed, 161 insertions(+), 127 deletions(-) diff --git a/common/config/sys-con/config_dualshock3.ini b/common/config/sys-con/config_dualshock3.ini index 6afb431..57e6fe6 100644 --- a/common/config/sys-con/config_dualshock3.ini +++ b/common/config/sys-con/config_dualshock3.ini @@ -1,7 +1,8 @@ ; Config for the Dualshock 3 controller left_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_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 ; For information on input mapping, see "example.ini" -;key_SYNC = LSTICK_CLICK ; Remove the semicolon at the start to take effect \ No newline at end of file +;KEY_CAPTURE = LSTICK_CLICK ; Remove the semicolon at the start to take effect \ No newline at end of file diff --git a/common/config/sys-con/config_dualshock4.ini b/common/config/sys-con/config_dualshock4.ini index 58d68b8..092c6f1 100644 --- a/common/config/sys-con/config_dualshock4.ini +++ b/common/config/sys-con/config_dualshock4.ini @@ -1,7 +1,8 @@ ; Config for the Dualshock 4 controller left_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 @@ -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 ; 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 diff --git a/common/config/sys-con/config_global.ini b/common/config/sys-con/config_global.ini index f94dcc7..488f610 100644 --- a/common/config/sys-con/config_global.ini +++ b/common/config/sys-con/config_global.ini @@ -1,2 +1 @@ [global] -use_dualshock_2nd_generation = false \ No newline at end of file diff --git a/common/config/sys-con/config_xbox360.ini b/common/config/sys-con/config_xbox360.ini index 25e8cd0..3c422ea 100644 --- a/common/config/sys-con/config_xbox360.ini +++ b/common/config/sys-con/config_xbox360.ini @@ -1,7 +1,8 @@ ; Config for the Xbox 360 and Xbox 360 Wireless type controllers left_stick_deadzone = 21 ; 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_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 ; For information on input mapping, see "example.ini" -;key_SYNC = LSTICK_CLICK ; Remove the semicolon at the start to take effect \ No newline at end of file +;KEY_CAPTURE = LSTICK_CLICK ; Remove the semicolon at the start to take effect \ No newline at end of file diff --git a/common/config/sys-con/config_xboxone.ini b/common/config/sys-con/config_xboxone.ini index 3d20016..96b6d40 100644 --- a/common/config/sys-con/config_xboxone.ini +++ b/common/config/sys-con/config_xboxone.ini @@ -1,7 +1,8 @@ ; Config for the Xbox One type controllers left_stick_deadzone = 10 ; 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_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" ; Remove the semicolons below to take effect -;key_FACE_DOWN = FACE_RIGHT -;key_FACE_LEFT = FACE_UP \ No newline at end of file +;KEY_FACE_DOWN = FACE_RIGHT +;KEY_FACE_LEFT = FACE_UP \ No newline at end of file diff --git a/common/config/sys-con/config_xboxorig.ini b/common/config/sys-con/config_xboxorig.ini index 55ae912..b7f9d69 100644 --- a/common/config/sys-con/config_xboxorig.ini +++ b/common/config/sys-con/config_xboxorig.ini @@ -1,7 +1,8 @@ ; Config for the original XBOX type controllers left_stick_deadzone = 21 ; 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_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 ; For information on input mapping, see "example.ini" -;key_SYNC = GUIDE ; Remove the semicolon at the start to take effect \ No newline at end of file +;KEY_CAPTURE = HOME ; Remove the semicolon at the start to take effect \ No newline at end of file diff --git a/common/config/sys-con/example.ini b/common/config/sys-con/example.ini index 238170b..ada6dba 100644 --- a/common/config/sys-con/example.ini +++ b/common/config/sys-con/example.ini @@ -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 ; 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_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 -; 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_DOWN B on joycons -; FACE_LEFT Y on joycons +; FACE_DOWN B on joycons +; FACE_LEFT Y on joycons ; LSTICK_CLICK Left stick press ; RSTICK_CLICK Right stick press ; LEFT_BUMPER Left bumper/ L ; RIGHT_BUMPER Right bumper/ R ; LEFT_TRIGGER Left trigger/ ZL ; RIGHT_TRIGGER Right trigger/ ZR -; BACK Minus on joycons -; START Plus on joycons -; DPAD_UP D-pad UP +; BACK Minus on joycons +; START Plus on joycons +; DPAD_UP D-pad UP ; DPAD_RIGHT D-pad RIGHT -; DPAD_DOWN D-pad DOWN -; DPAD_LEFT D-pad LEFT -; SYNC Capture on joycons -; GUIDE Home on joycons -; TOUCHPAD Simulate at least one finger on the touch screen (doesn't work?) +; DPAD_DOWN D-pad DOWN +; DPAD_LEFT D-pad LEFT +; CAPTURE Capture on joycons, sync on Xbox One, Touchpad press on DS4 +; HOME Home on joycons, Xbox button on Xbox, PS button on DS4 +; 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 -key_FACE_DOWN = FACE_RIGHT -key_FACE_LEFT = FACE_UP +KEY_FACE_DOWN = FACE_RIGHT +KEY_FACE_LEFT = FACE_UP ; 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 color_body = 107,107,107 diff --git a/source/ControllerLib/ControllerConfig.h b/source/ControllerLib/ControllerConfig.h index 1c507ae..00746d5 100644 --- a/source/ControllerLib/ControllerConfig.h +++ b/source/ControllerLib/ControllerConfig.h @@ -1,8 +1,14 @@ #pragma once #include + +#define MAX_JOYSTICKS 2 +#define MAX_TRIGGERS 2 +#define MAX_CONTROLLER_BUTTONS 32 + enum ControllerButton : uint8_t { - NOT_SET = 0, + DEFAULT = 0, + NONE, FACE_UP, FACE_RIGHT, FACE_DOWN, @@ -19,10 +25,10 @@ enum ControllerButton : uint8_t DPAD_RIGHT, DPAD_DOWN, DPAD_LEFT, + CAPTURE, + HOME, SYNC, - GUIDE, TOUCHPAD, - NUM_CONTROLLERBUTTONS = TOUCHPAD, }; struct NormalizedStick @@ -45,14 +51,12 @@ union RGBAColor { struct ControllerConfig { - uint8_t leftStickDeadzonePercent{10}; - uint8_t rightStickDeadzonePercent{10}; - uint16_t leftStickRotationDegrees{}; - uint16_t rightStickRotationDegrees{}; - uint8_t triggerDeadzonePercent{}; - ControllerButton buttons[NUM_CONTROLLERBUTTONS]{}; - float triggers[2]{}; - NormalizedStick sticks[2]{}; + uint8_t stickDeadzonePercent[MAX_JOYSTICKS]{}; + uint16_t stickRotationDegrees[MAX_JOYSTICKS]{}; + uint8_t triggerDeadzonePercent[MAX_TRIGGERS]{}; + ControllerButton buttons[MAX_CONTROLLER_BUTTONS]{}; + float triggers[MAX_TRIGGERS]{}; + NormalizedStick sticks[MAX_JOYSTICKS]{}; bool swapDPADandLSTICK{false}; RGBAColor bodyColor{107, 107, 107, 255}; RGBAColor buttonsColor{0, 0, 0, 255}; diff --git a/source/ControllerLib/Controllers/Dualshock3Controller.cpp b/source/ControllerLib/Controllers/Dualshock3Controller.cpp index 9bcffef..8c63b64 100644 --- a/source/ControllerLib/Controllers/Dualshock3Controller.cpp +++ b/source/ControllerLib/Controllers/Dualshock3Controller.cpp @@ -123,9 +123,9 @@ Result Dualshock3Controller::GetInput() 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 return value < deadzone ? 0 @@ -169,17 +169,17 @@ void Dualshock3Controller::NormalizeAxis(uint8_t x, //Pass by value should hopefully be optimized away by RVO NormalizedButtonData Dualshock3Controller::GetNormalizedButtonData() { - NormalizedButtonData normalData; + NormalizedButtonData normalData{}; - normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left_pressure); - normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right_pressure); + normalData.triggers[0] = NormalizeTrigger(_dualshock3ControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left_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); - 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); - bool buttons[NUM_CONTROLLERBUTTONS] = { + bool buttons[MAX_CONTROLLER_BUTTONS] = { m_buttonData.triangle, m_buttonData.circle, m_buttonData.cross, @@ -200,10 +200,13 @@ NormalizedButtonData Dualshock3Controller::GetNormalizedButtonData() 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]; - normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; + if (button == NONE) + continue; + + normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i]; } return normalData; diff --git a/source/ControllerLib/Controllers/Dualshock3Controller.h b/source/ControllerLib/Controllers/Dualshock3Controller.h index 2adf567..36fa8b4 100644 --- a/source/ControllerLib/Controllers/Dualshock3Controller.h +++ b/source/ControllerLib/Controllers/Dualshock3Controller.h @@ -146,7 +146,7 @@ public: 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); Result SendInitBytes(); diff --git a/source/ControllerLib/Controllers/Dualshock4Controller.cpp b/source/ControllerLib/Controllers/Dualshock4Controller.cpp index 27b5468..787bb3a 100644 --- a/source/ControllerLib/Controllers/Dualshock4Controller.cpp +++ b/source/ControllerLib/Controllers/Dualshock4Controller.cpp @@ -129,9 +129,9 @@ Result Dualshock4Controller::GetInput() 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 return value < deadzone ? 0 @@ -175,17 +175,17 @@ void Dualshock4Controller::NormalizeAxis(uint8_t x, //Pass by value should hopefully be optimized away by RVO NormalizedButtonData Dualshock4Controller::GetNormalizedButtonData() { - NormalizedButtonData normalData; + NormalizedButtonData normalData{}; - normalData.triggers[0] = NormalizeTrigger(m_buttonData.l2_pressure); - normalData.triggers[1] = NormalizeTrigger(m_buttonData.r2_pressure); + normalData.triggers[0] = NormalizeTrigger(_dualshock4ControllerConfig.triggerDeadzonePercent[0], m_buttonData.l2_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); - 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); - bool buttons[NUM_CONTROLLERBUTTONS] = { + bool buttons[MAX_CONTROLLER_BUTTONS] = { m_buttonData.triangle, m_buttonData.circle, 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.touchpad_press, m_buttonData.psbutton, + 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]; - normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; + if (button == NONE) + continue; + + normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i]; } return normalData; diff --git a/source/ControllerLib/Controllers/Dualshock4Controller.h b/source/ControllerLib/Controllers/Dualshock4Controller.h index dfb2691..c7ccf5d 100644 --- a/source/ControllerLib/Controllers/Dualshock4Controller.h +++ b/source/ControllerLib/Controllers/Dualshock4Controller.h @@ -162,7 +162,7 @@ public: 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); Result SendInitBytes(); diff --git a/source/ControllerLib/Controllers/Xbox360Controller.cpp b/source/ControllerLib/Controllers/Xbox360Controller.cpp index c5b0405..55e30c7 100644 --- a/source/ControllerLib/Controllers/Xbox360Controller.cpp +++ b/source/ControllerLib/Controllers/Xbox360Controller.cpp @@ -122,9 +122,9 @@ Result Xbox360Controller::SendInitBytes() 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 return value < deadzone ? 0 @@ -169,17 +169,17 @@ void Xbox360Controller::NormalizeAxis(int16_t x, //Pass by value should hopefully be optimized away by RVO NormalizedButtonData Xbox360Controller::GetNormalizedButtonData() { - NormalizedButtonData normalData; + NormalizedButtonData normalData{}; - normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); - normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); + normalData.triggers[0] = NormalizeTrigger(_xbox360ControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left); + 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); - 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); - bool buttons[NUM_CONTROLLERBUTTONS]{ + bool buttons[MAX_CONTROLLER_BUTTONS]{ m_buttonData.y, m_buttonData.b, m_buttonData.a, @@ -200,10 +200,13 @@ NormalizedButtonData Xbox360Controller::GetNormalizedButtonData() 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]; - normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; + if (button == NONE) + continue; + + normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i]; } return normalData; diff --git a/source/ControllerLib/Controllers/Xbox360Controller.h b/source/ControllerLib/Controllers/Xbox360Controller.h index bfcb56f..19d8492 100644 --- a/source/ControllerLib/Controllers/Xbox360Controller.h +++ b/source/ControllerLib/Controllers/Xbox360Controller.h @@ -106,7 +106,7 @@ public: 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); Result SendInitBytes(); diff --git a/source/ControllerLib/Controllers/Xbox360WirelessController.cpp b/source/ControllerLib/Controllers/Xbox360WirelessController.cpp index b417c2b..99f9eac 100644 --- a/source/ControllerLib/Controllers/Xbox360WirelessController.cpp +++ b/source/ControllerLib/Controllers/Xbox360WirelessController.cpp @@ -143,9 +143,9 @@ Result Xbox360WirelessController::GetInput() 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 return value < deadzone ? 0 @@ -190,17 +190,17 @@ void Xbox360WirelessController::NormalizeAxis(int16_t x, //Pass by value should hopefully be optimized away by RVO NormalizedButtonData Xbox360WirelessController::GetNormalizedButtonData() { - NormalizedButtonData normalData; + NormalizedButtonData normalData{}; - normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); - normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); + normalData.triggers[0] = NormalizeTrigger(_xbox360WControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left); + 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); - 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); - bool buttons[NUM_CONTROLLERBUTTONS]{ + bool buttons[MAX_CONTROLLER_BUTTONS]{ m_buttonData.y, m_buttonData.b, m_buttonData.a, @@ -221,10 +221,13 @@ NormalizedButtonData Xbox360WirelessController::GetNormalizedButtonData() 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]; - normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; + if (button == NONE) + continue; + + normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i]; } return normalData; diff --git a/source/ControllerLib/Controllers/Xbox360WirelessController.h b/source/ControllerLib/Controllers/Xbox360WirelessController.h index d7325d9..1e264bd 100644 --- a/source/ControllerLib/Controllers/Xbox360WirelessController.h +++ b/source/ControllerLib/Controllers/Xbox360WirelessController.h @@ -42,7 +42,7 @@ public: 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); Result SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude); diff --git a/source/ControllerLib/Controllers/XboxController.cpp b/source/ControllerLib/Controllers/XboxController.cpp index 6df3d90..3194416 100644 --- a/source/ControllerLib/Controllers/XboxController.cpp +++ b/source/ControllerLib/Controllers/XboxController.cpp @@ -109,9 +109,9 @@ Result XboxController::GetInput() 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 return value < deadzone ? 0 @@ -156,17 +156,17 @@ void XboxController::NormalizeAxis(int16_t x, //Pass by value should hopefully be optimized away by RVO NormalizedButtonData XboxController::GetNormalizedButtonData() { - NormalizedButtonData normalData; + NormalizedButtonData normalData{}; - normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); - normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); + normalData.triggers[0] = NormalizeTrigger(_xboxControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left); + 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); - 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); - bool buttons[NUM_CONTROLLERBUTTONS]{ + bool buttons[MAX_CONTROLLER_BUTTONS]{ m_buttonData.y != 0, m_buttonData.b != 0, m_buttonData.a != 0, @@ -187,10 +187,13 @@ NormalizedButtonData XboxController::GetNormalizedButtonData() 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]; - normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i]; + if (button == NONE) + continue; + + normalData.buttons[(button != DEFAULT ? button - 2 : i)] += buttons[i]; } return normalData; diff --git a/source/ControllerLib/Controllers/XboxController.h b/source/ControllerLib/Controllers/XboxController.h index 2beae26..709b368 100644 --- a/source/ControllerLib/Controllers/XboxController.h +++ b/source/ControllerLib/Controllers/XboxController.h @@ -76,7 +76,7 @@ public: 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); Result SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude); diff --git a/source/ControllerLib/Controllers/XboxOneController.cpp b/source/ControllerLib/Controllers/XboxOneController.cpp index 7ea84d7..74af474 100644 --- a/source/ControllerLib/Controllers/XboxOneController.cpp +++ b/source/ControllerLib/Controllers/XboxOneController.cpp @@ -206,9 +206,9 @@ Result XboxOneController::SendInitBytes() 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 return value < deadzone ? 0 @@ -253,17 +253,17 @@ void XboxOneController::NormalizeAxis(int16_t x, //Pass by value should hopefully be optimized away by RVO NormalizedButtonData XboxOneController::GetNormalizedButtonData() { - NormalizedButtonData normalData; + NormalizedButtonData normalData{}; - normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left); - normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right); + normalData.triggers[0] = NormalizeTrigger(_xboxoneControllerConfig.triggerDeadzonePercent[0], m_buttonData.trigger_left); + 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); - 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); - bool buttons[NUM_CONTROLLERBUTTONS]{ + bool buttons[MAX_CONTROLLER_BUTTONS]{ m_buttonData.y, m_buttonData.b, m_buttonData.a, @@ -284,10 +284,13 @@ NormalizedButtonData XboxOneController::GetNormalizedButtonData() m_GuidePressed, }; - for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) + for (int i = 0; i != MAX_CONTROLLER_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; diff --git a/source/ControllerLib/Controllers/XboxOneController.h b/source/ControllerLib/Controllers/XboxOneController.h index 9a279f4..03af68f 100644 --- a/source/ControllerLib/Controllers/XboxOneController.h +++ b/source/ControllerLib/Controllers/XboxOneController.h @@ -99,7 +99,7 @@ public: 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); Result SendInitBytes(); diff --git a/source/ControllerLib/IController.h b/source/ControllerLib/IController.h index 6a47ed3..48e36ed 100644 --- a/source/ControllerLib/IController.h +++ b/source/ControllerLib/IController.h @@ -6,7 +6,7 @@ struct NormalizedButtonData { - bool buttons[NUM_CONTROLLERBUTTONS]; + bool buttons[MAX_CONTROLLER_BUTTONS]; float triggers[2]; NormalizedStick sticks[2]; }; diff --git a/source/ControllerSwitch/SwitchHDLHandler.cpp b/source/ControllerSwitch/SwitchHDLHandler.cpp index 6a8dd4c..8b91026 100644 --- a/source/ControllerSwitch/SwitchHDLHandler.cpp +++ b/source/ControllerSwitch/SwitchHDLHandler.cpp @@ -162,7 +162,6 @@ void SwitchHDLHandler::FillHdlState(const NormalizedButtonData &data) m_hdlState.buttons |= (data.buttons[16] ? KEY_CAPTURE : 0); m_hdlState.buttons |= (data.buttons[17] ? KEY_HOME : 0); - m_hdlState.buttons |= (data.buttons[18] ? KEY_TOUCH : 0); } void SwitchHDLHandler::UpdateInput() @@ -189,7 +188,7 @@ void SwitchHDLHandler::UpdateInput() void SwitchHDLHandler::UpdateOutput() { - // Process a single output packet from a buffer + // Process a single output packet from a buffer if (R_SUCCEEDED(GetController()->OutputBuffer())) return; diff --git a/source/Sysmodule/source/config_handler.cpp b/source/Sysmodule/source/config_handler.cpp index 798f914..f5575cd 100644 --- a/source/Sysmodule/source/config_handler.cpp +++ b/source/Sysmodule/source/config_handler.cpp @@ -26,8 +26,9 @@ namespace syscon::config bool is_config_changed_check_thread_running = false; - constexpr const char *keyNames[NUM_CONTROLLERBUTTONS] - { + constexpr std::array keyNames{ + "DEFAULT", + "NONE", "FACE_UP", "FACE_RIGHT", "FACE_DOWN", @@ -44,21 +45,22 @@ namespace syscon::config "DPAD_RIGHT", "DPAD_DOWN", "DPAD_LEFT", + "CAPTURE", + "HOME", "SYNC", - "GUIDE", "TOUCHPAD", }; 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) { return static_cast(i); } } - return NOT_SET; + return NONE; } 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) { - if (strncmp(name, "key_", 4) == 0) + if (strncmp(name, "KEY_", 4) == 0) { ControllerButton button = StringToKey(name + 4); ControllerButton buttonValue = StringToKey(value); - tempConfig.buttons[button] = buttonValue; - tempConfig.buttons[buttonValue] = button; - return 1; + if (button >= 2) + { + tempConfig.buttons[button - 2] = buttonValue; + return 1; + } } else if (strcmp(name, "left_stick_deadzone") == 0) { - tempConfig.leftStickDeadzonePercent = atoi(value); + tempConfig.stickDeadzonePercent[0] = atoi(value); return 1; } else if (strcmp(name, "right_stick_deadzone") == 0) { - tempConfig.rightStickDeadzonePercent = atoi(value); + tempConfig.stickDeadzonePercent[1] = atoi(value); return 1; } else if (strcmp(name, "left_stick_rotation") == 0) { - tempConfig.leftStickRotationDegrees = atoi(value); + tempConfig.stickRotationDegrees[0] = atoi(value); return 1; } else if (strcmp(name, "right_stick_rotation") == 0) { - tempConfig.rightStickRotationDegrees = atoi(value); + tempConfig.stickRotationDegrees[1] = atoi(value); 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; } else if (strcmp(name, "swap_dpad_and_lstick") == 0) @@ -160,10 +169,6 @@ namespace syscon::config Result ReadFromConfig(const char *path) { tempConfig = ControllerConfig{}; - for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i) - { - tempConfig.buttons[i] = NOT_SET; - } return ini_parse(path, ParseConfigLine, NULL); }