From 191e6b0496685422f469891cf25cb2fa08d3bf59 Mon Sep 17 00:00:00 2001 From: Albert Liu <45282415+ggrtk@users.noreply.github.com> Date: Wed, 9 Dec 2020 23:39:11 -0800 Subject: [PATCH] DigitalController: Add option to force as Pop'n Controller --- src/core/controller.cpp | 3 +++ src/core/digital_controller.cpp | 25 ++++++++++++++++++++++++- src/core/digital_controller.h | 7 +++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/core/controller.cpp b/src/core/controller.cpp index f3ff50e37..c2be54bb6 100644 --- a/src/core/controller.cpp +++ b/src/core/controller.cpp @@ -234,6 +234,9 @@ Controller::SettingList Controller::GetSettings(ControllerType type) { switch (type) { + case ControllerType::DigitalController: + return DigitalController::StaticGetSettings(); + case ControllerType::AnalogController: return AnalogController::StaticGetSettings(); diff --git a/src/core/digital_controller.cpp b/src/core/digital_controller.cpp index eb7c53b3c..dee9b92fa 100644 --- a/src/core/digital_controller.cpp +++ b/src/core/digital_controller.cpp @@ -96,7 +96,7 @@ bool DigitalController::Transfer(const u8 data_in, u8* data_out) case TransferState::ButtonsLSB: { - *data_out = Truncate8(m_button_state); + *data_out = Truncate8(m_button_state) & GetButtonsLSBMask(); m_transfer_state = TransferState::ButtonsMSB; return true; } @@ -181,3 +181,26 @@ u32 DigitalController::StaticGetVibrationMotorCount() { return 0; } + +Controller::SettingList DigitalController::StaticGetSettings() +{ + static constexpr std::array settings = { + {{SettingInfo::Type::Boolean, "ForcePopnControllerMode", + TRANSLATABLE("DigitalController", "Force Pop'n Controller Mode"), + TRANSLATABLE("DigitalController", "Forces the Digital Controller to act as a Pop'n Controller."), "false"}}}; + return SettingList(settings.begin(), settings.end()); +} + +void DigitalController::LoadSettings(const char* section) +{ + Controller::LoadSettings(section); + m_popn_controller_mode = g_host_interface->GetBoolSettingValue(section, "ForcePopnControllerMode", false); +} + +u8 DigitalController::GetButtonsLSBMask() const +{ + constexpr u8 popn_controller_mask = + ~(u8(1) << static_cast(Button::Right) | u8(1) << static_cast(Button::Down) | + u8(1) << static_cast(Button::Left)); + return m_popn_controller_mode ? popn_controller_mask : 0xFF; +} diff --git a/src/core/digital_controller.h b/src/core/digital_controller.h index 6b7489567..2e45a702d 100644 --- a/src/core/digital_controller.h +++ b/src/core/digital_controller.h @@ -37,6 +37,7 @@ public: static AxisList StaticGetAxisNames(); static ButtonList StaticGetButtonNames(); static u32 StaticGetVibrationMotorCount(); + static SettingList StaticGetSettings(); ControllerType GetType() const override; std::optional GetAxisCodeByName(std::string_view axis_name) const override; @@ -54,6 +55,8 @@ public: void SetButtonState(Button button, bool pressed); + void LoadSettings(const char* section) override; + private: enum class TransferState : u8 { @@ -67,4 +70,8 @@ private: u16 m_button_state = UINT16_C(0xFFFF); TransferState m_transfer_state = TransferState::Idle; + + bool m_popn_controller_mode = false; + + u8 GetButtonsLSBMask() const; };