diff options
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 5 | ||||
| -rw-r--r-- | src/input_common/helpers/joycon_driver.cpp | 42 | ||||
| -rw-r--r-- | src/input_common/helpers/joycon_driver.h | 1 | ||||
| -rw-r--r-- | src/input_common/helpers/joycon_protocol/common_protocol.cpp | 8 |
4 files changed, 42 insertions, 14 deletions
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index c937495f9..190f7c906 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp | |||
| @@ -1250,6 +1250,11 @@ Common::Input::DriverResult EmulatedController::SetPollingMode( | |||
| 1250 | const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode); | 1250 | const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode); |
| 1251 | const auto mapped_nfc_result = right_output_device->SetPollingMode(polling_mode); | 1251 | const auto mapped_nfc_result = right_output_device->SetPollingMode(polling_mode); |
| 1252 | 1252 | ||
| 1253 | // Restore previous state | ||
| 1254 | if (mapped_nfc_result != Common::Input::DriverResult::Success) { | ||
| 1255 | right_output_device->SetPollingMode(Common::Input::PollingMode::Active); | ||
| 1256 | } | ||
| 1257 | |||
| 1253 | if (virtual_nfc_result == Common::Input::DriverResult::Success) { | 1258 | if (virtual_nfc_result == Common::Input::DriverResult::Success) { |
| 1254 | return virtual_nfc_result; | 1259 | return virtual_nfc_result; |
| 1255 | } | 1260 | } |
diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index 2c8c66951..ec984a647 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp | |||
| @@ -72,6 +72,7 @@ DriverResult JoyconDriver::InitializeDevice() { | |||
| 72 | nfc_enabled = false; | 72 | nfc_enabled = false; |
| 73 | passive_enabled = false; | 73 | passive_enabled = false; |
| 74 | irs_enabled = false; | 74 | irs_enabled = false; |
| 75 | input_only_device = false; | ||
| 75 | gyro_sensitivity = Joycon::GyroSensitivity::DPS2000; | 76 | gyro_sensitivity = Joycon::GyroSensitivity::DPS2000; |
| 76 | gyro_performance = Joycon::GyroPerformance::HZ833; | 77 | gyro_performance = Joycon::GyroPerformance::HZ833; |
| 77 | accelerometer_sensitivity = Joycon::AccelerometerSensitivity::G8; | 78 | accelerometer_sensitivity = Joycon::AccelerometerSensitivity::G8; |
| @@ -86,16 +87,23 @@ DriverResult JoyconDriver::InitializeDevice() { | |||
| 86 | rumble_protocol = std::make_unique<RumbleProtocol>(hidapi_handle); | 87 | rumble_protocol = std::make_unique<RumbleProtocol>(hidapi_handle); |
| 87 | 88 | ||
| 88 | // Get fixed joycon info | 89 | // Get fixed joycon info |
| 89 | generic_protocol->GetVersionNumber(version); | 90 | if (generic_protocol->GetVersionNumber(version) != DriverResult::Success) { |
| 90 | generic_protocol->SetLowPowerMode(false); | 91 | // If this command fails the device doesn't accept configuration commands |
| 91 | generic_protocol->GetColor(color); | 92 | input_only_device = true; |
| 92 | if (handle_device_type == ControllerType::Pro) { | ||
| 93 | // Some 3rd party controllers aren't pro controllers | ||
| 94 | generic_protocol->GetControllerType(device_type); | ||
| 95 | } else { | ||
| 96 | device_type = handle_device_type; | ||
| 97 | } | 93 | } |
| 98 | generic_protocol->GetSerialNumber(serial_number); | 94 | |
| 95 | if (!input_only_device) { | ||
| 96 | generic_protocol->SetLowPowerMode(false); | ||
| 97 | generic_protocol->GetColor(color); | ||
| 98 | if (handle_device_type == ControllerType::Pro) { | ||
| 99 | // Some 3rd party controllers aren't pro controllers | ||
| 100 | generic_protocol->GetControllerType(device_type); | ||
| 101 | } else { | ||
| 102 | device_type = handle_device_type; | ||
| 103 | } | ||
| 104 | generic_protocol->GetSerialNumber(serial_number); | ||
| 105 | } | ||
| 106 | |||
| 99 | supported_features = GetSupportedFeatures(); | 107 | supported_features = GetSupportedFeatures(); |
| 100 | 108 | ||
| 101 | // Get Calibration data | 109 | // Get Calibration data |
| @@ -261,6 +269,10 @@ DriverResult JoyconDriver::SetPollingMode() { | |||
| 261 | generic_protocol->EnableImu(false); | 269 | generic_protocol->EnableImu(false); |
| 262 | } | 270 | } |
| 263 | 271 | ||
| 272 | if (input_only_device) { | ||
| 273 | return DriverResult::NotSupported; | ||
| 274 | } | ||
| 275 | |||
| 264 | if (irs_protocol->IsEnabled()) { | 276 | if (irs_protocol->IsEnabled()) { |
| 265 | irs_protocol->DisableIrs(); | 277 | irs_protocol->DisableIrs(); |
| 266 | } | 278 | } |
| @@ -282,6 +294,7 @@ DriverResult JoyconDriver::SetPollingMode() { | |||
| 282 | } | 294 | } |
| 283 | irs_protocol->DisableIrs(); | 295 | irs_protocol->DisableIrs(); |
| 284 | LOG_ERROR(Input, "Error enabling IRS"); | 296 | LOG_ERROR(Input, "Error enabling IRS"); |
| 297 | return result; | ||
| 285 | } | 298 | } |
| 286 | 299 | ||
| 287 | if (nfc_enabled && supported_features.nfc) { | 300 | if (nfc_enabled && supported_features.nfc) { |
| @@ -291,6 +304,7 @@ DriverResult JoyconDriver::SetPollingMode() { | |||
| 291 | } | 304 | } |
| 292 | nfc_protocol->DisableNfc(); | 305 | nfc_protocol->DisableNfc(); |
| 293 | LOG_ERROR(Input, "Error enabling NFC"); | 306 | LOG_ERROR(Input, "Error enabling NFC"); |
| 307 | return result; | ||
| 294 | } | 308 | } |
| 295 | 309 | ||
| 296 | if (hidbus_enabled && supported_features.hidbus) { | 310 | if (hidbus_enabled && supported_features.hidbus) { |
| @@ -305,6 +319,7 @@ DriverResult JoyconDriver::SetPollingMode() { | |||
| 305 | ring_connected = false; | 319 | ring_connected = false; |
| 306 | ring_protocol->DisableRingCon(); | 320 | ring_protocol->DisableRingCon(); |
| 307 | LOG_ERROR(Input, "Error enabling Ringcon"); | 321 | LOG_ERROR(Input, "Error enabling Ringcon"); |
| 322 | return result; | ||
| 308 | } | 323 | } |
| 309 | 324 | ||
| 310 | if (passive_enabled && supported_features.passive) { | 325 | if (passive_enabled && supported_features.passive) { |
| @@ -333,6 +348,10 @@ JoyconDriver::SupportedFeatures JoyconDriver::GetSupportedFeatures() { | |||
| 333 | .vibration = true, | 348 | .vibration = true, |
| 334 | }; | 349 | }; |
| 335 | 350 | ||
| 351 | if (input_only_device) { | ||
| 352 | return features; | ||
| 353 | } | ||
| 354 | |||
| 336 | if (device_type == ControllerType::Right) { | 355 | if (device_type == ControllerType::Right) { |
| 337 | features.nfc = true; | 356 | features.nfc = true; |
| 338 | features.irs = true; | 357 | features.irs = true; |
| @@ -517,6 +536,11 @@ DriverResult JoyconDriver::StopNfcPolling() { | |||
| 517 | const auto result = nfc_protocol->StopNFCPollingMode(); | 536 | const auto result = nfc_protocol->StopNFCPollingMode(); |
| 518 | disable_input_thread = false; | 537 | disable_input_thread = false; |
| 519 | 538 | ||
| 539 | if (amiibo_detected) { | ||
| 540 | amiibo_detected = false; | ||
| 541 | joycon_poller->UpdateAmiibo({}); | ||
| 542 | } | ||
| 543 | |||
| 520 | return result; | 544 | return result; |
| 521 | } | 545 | } |
| 522 | 546 | ||
diff --git a/src/input_common/helpers/joycon_driver.h b/src/input_common/helpers/joycon_driver.h index bc7025a21..45b32d2f8 100644 --- a/src/input_common/helpers/joycon_driver.h +++ b/src/input_common/helpers/joycon_driver.h | |||
| @@ -120,6 +120,7 @@ private: | |||
| 120 | // Hardware configuration | 120 | // Hardware configuration |
| 121 | u8 leds{}; | 121 | u8 leds{}; |
| 122 | ReportMode mode{}; | 122 | ReportMode mode{}; |
| 123 | bool input_only_device{}; | ||
| 123 | bool passive_enabled{}; // Low power mode, Ideal for multiple controllers at the same time | 124 | bool passive_enabled{}; // Low power mode, Ideal for multiple controllers at the same time |
| 124 | bool hidbus_enabled{}; // External device support | 125 | bool hidbus_enabled{}; // External device support |
| 125 | bool irs_enabled{}; // Infrared camera input | 126 | bool irs_enabled{}; // Infrared camera input |
diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index 51669261a..88f4cec1c 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp | |||
| @@ -73,7 +73,7 @@ DriverResult JoyconCommonProtocol::SendRawData(std::span<const u8> buffer) { | |||
| 73 | DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubCommand sc, | 73 | DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubCommand sc, |
| 74 | SubCommandResponse& output) { | 74 | SubCommandResponse& output) { |
| 75 | constexpr int timeout_mili = 66; | 75 | constexpr int timeout_mili = 66; |
| 76 | constexpr int MaxTries = 15; | 76 | constexpr int MaxTries = 3; |
| 77 | int tries = 0; | 77 | int tries = 0; |
| 78 | 78 | ||
| 79 | do { | 79 | do { |
| @@ -113,9 +113,7 @@ DriverResult JoyconCommonProtocol::SendSubCommand(SubCommand sc, std::span<const | |||
| 113 | return result; | 113 | return result; |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | result = GetSubCommandResponse(sc, output); | 116 | return GetSubCommandResponse(sc, output); |
| 117 | |||
| 118 | return DriverResult::Success; | ||
| 119 | } | 117 | } |
| 120 | 118 | ||
| 121 | DriverResult JoyconCommonProtocol::SendSubCommand(SubCommand sc, std::span<const u8> buffer) { | 119 | DriverResult JoyconCommonProtocol::SendSubCommand(SubCommand sc, std::span<const u8> buffer) { |
| @@ -158,7 +156,7 @@ DriverResult JoyconCommonProtocol::SendVibrationReport(std::span<const u8> buffe | |||
| 158 | 156 | ||
| 159 | DriverResult JoyconCommonProtocol::ReadRawSPI(SpiAddress addr, std::span<u8> output) { | 157 | DriverResult JoyconCommonProtocol::ReadRawSPI(SpiAddress addr, std::span<u8> output) { |
| 160 | constexpr std::size_t HeaderSize = 5; | 158 | constexpr std::size_t HeaderSize = 5; |
| 161 | constexpr std::size_t MaxTries = 10; | 159 | constexpr std::size_t MaxTries = 5; |
| 162 | std::size_t tries = 0; | 160 | std::size_t tries = 0; |
| 163 | SubCommandResponse response{}; | 161 | SubCommandResponse response{}; |
| 164 | std::array<u8, sizeof(ReadSpiPacket)> buffer{}; | 162 | std::array<u8, sizeof(ReadSpiPacket)> buffer{}; |