From ab4a9617688ab4425ee012c56cfb9eeae2805393 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Wed, 1 Feb 2023 10:34:16 -0600 Subject: [PATCH] add support for grip --- src/input_common/drivers/joycon.cpp | 41 ++++++++++++++++++- src/input_common/drivers/joycon.h | 1 + src/input_common/drivers/sdl_driver.cpp | 2 +- src/input_common/helpers/joycon_driver.cpp | 9 ++++ .../helpers/joycon_protocol/poller.cpp | 6 +-- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index 4fcfb4510..2be164442 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -46,6 +46,12 @@ void Joycons::Reset() { } device->Stop(); } + for (const auto& device : grip_joycons) { + if (!device) { + continue; + } + device->Stop(); + } SDL_hid_exit(); } @@ -61,6 +67,11 @@ void Joycons::Setup() { PreSetController(GetIdentifier(port, Joycon::ControllerType::Right)); device = std::make_shared(port++); } + port = 0; + for (auto& device : grip_joycons) { + PreSetController(GetIdentifier(port, Joycon::ControllerType::Grip)); + device = std::make_shared(port++); + } scan_thread = std::jthread([this](std::stop_token stop_token) { ScanThread(stop_token); }); } @@ -129,6 +140,13 @@ bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const { } } break; + case Joycon::ControllerType::Grip: + for (const auto& device : grip_joycons) { + if (is_handle_identical(device)) { + return false; + } + } + break; default: return false; } @@ -199,6 +217,14 @@ std::shared_ptr Joycons::GetNextFreeHandle( return *unconnected_device; } } + if (type == Joycon::ControllerType::Grip) { + const auto unconnected_device = std::ranges::find_if( + grip_joycons, [](auto& device) { return !device->IsConnected(); }); + + if (unconnected_device != grip_joycons.end()) { + return *unconnected_device; + } + } return nullptr; } @@ -408,6 +434,14 @@ std::shared_ptr Joycons::GetHandle(PadIdentifier identifie return *matching_device; } } + if (type == Joycon::ControllerType::Grip) { + const auto matching_device = std::ranges::find_if( + grip_joycons, [is_handle_active](auto& device) { return is_handle_active(device); }); + + if (matching_device != grip_joycons.end()) { + return *matching_device; + } + } return nullptr; } @@ -455,6 +489,9 @@ std::vector Joycons::GetInputDevices() const { for (const auto& controller : right_joycons) { add_entry(controller); } + for (const auto& controller : grip_joycons) { + add_entry(controller); + } // List dual joycon pairs for (std::size_t i = 0; i < MaxSupportedControllers; i++) { @@ -666,8 +703,8 @@ std::string Joycons::JoyconName(Joycon::ControllerType type) const { return "Left Joycon"; case Joycon::ControllerType::Right: return "Right Joycon"; - case Joycon::ControllerType::Pro: - return "Pro Controller"; + case Joycon::ControllerType::Grip: + return "Joycon grip <- custom driver"; case Joycon::ControllerType::Dual: return "Dual Joycon"; default: diff --git a/src/input_common/drivers/joycon.h b/src/input_common/drivers/joycon.h index 2149ab7fd..a1f3359f8 100644 --- a/src/input_common/drivers/joycon.h +++ b/src/input_common/drivers/joycon.h @@ -106,6 +106,7 @@ private: // Joycon types are split by type to ease supporting dualjoycon configurations std::array, MaxSupportedControllers> left_joycons{}; std::array, MaxSupportedControllers> right_joycons{}; + std::array, MaxSupportedControllers> grip_joycons{}; }; } // namespace InputCommon diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index d975eb815..b9ec7d756 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -336,7 +336,7 @@ void SDLDriver::InitJoystick(int joystick_index) { if (Settings::values.enable_joycon_driver) { if (guid.uuid[5] == 0x05 && guid.uuid[4] == 0x7e && - (guid.uuid[8] == 0x06 || guid.uuid[8] == 0x07)) { + (guid.uuid[8] == 0x06 || guid.uuid[8] == 0x07 || guid.uuid[8] == 0x0e)) { LOG_WARNING(Input, "Preferring joycon driver for device index {}", joystick_index); SDL_JoystickClose(sdl_joystick); return; diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index e50bb92a9..441a02a8e 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -164,6 +164,15 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { void JoyconDriver::OnNewData(std::span buffer) { const auto report_mode = static_cast(buffer[0]); + std::string out = ""; + + for (const u8& bb : buffer) { + out += fmt::format("{} ", bb); + } + + LOG_ERROR(Input, "{}", out); + + // Packages can be a litte bit inconsistent. Average the delta time to provide a smoother motion // experience switch (report_mode) { diff --git a/src/input_common/helpers/joycon_protocol/poller.cpp b/src/input_common/helpers/joycon_protocol/poller.cpp index 9bb15e935..468157161 100644 --- a/src/input_common/helpers/joycon_protocol/poller.cpp +++ b/src/input_common/helpers/joycon_protocol/poller.cpp @@ -29,9 +29,8 @@ void JoyconPoller::ReadActiveMode(std::span buffer, const MotionStatus& moti UpdateActiveRightPadInput(data, motion_status); break; case Joycon::ControllerType::Pro: - UpdateActiveProPadInput(data, motion_status); - break; default: + UpdateActiveProPadInput(data, motion_status); break; } @@ -54,9 +53,8 @@ void JoyconPoller::ReadPassiveMode(std::span buffer) { UpdatePasiveRightPadInput(data); break; case Joycon::ControllerType::Pro: - UpdatePasiveProPadInput(data); - break; default: + UpdatePasiveProPadInput(data); break; } }