input_common: Fix issue where ring and irs are enabled at the same time

This commit is contained in:
german77 2023-01-02 22:11:03 -06:00 committed by Narr the Reg
parent 459fb2b213
commit d05ea2f3eb
4 changed files with 24 additions and 15 deletions

View File

@ -74,8 +74,6 @@ void IRS::DeactivateIrsensor(Kernel::HLERequestContext& ctx) {
LOG_WARNING(Service_IRS, "(STUBBED) called, applet_resource_user_id={}", LOG_WARNING(Service_IRS, "(STUBBED) called, applet_resource_user_id={}",
applet_resource_user_id); applet_resource_user_id);
npad_device->SetPollingMode(Common::Input::PollingMode::Active);
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
} }
@ -514,7 +512,7 @@ void IRS::StopImageProcessorAsync(Kernel::HLERequestContext& ctx) {
auto result = IsIrCameraHandleValid(parameters.camera_handle); auto result = IsIrCameraHandleValid(parameters.camera_handle);
if (result.IsSuccess()) { if (result.IsSuccess()) {
// TODO: Stop image processor async // TODO: Stop image processor async
npad_device->SetPollingMode(Common::Input::PollingMode::IR); npad_device->SetPollingMode(Common::Input::PollingMode::Active);
result = ResultSuccess; result = ResultSuccess;
} }

View File

@ -262,6 +262,16 @@ DriverResult JoyconDriver::SetPollingMode() {
irs_protocol->DisableIrs(); irs_protocol->DisableIrs();
} }
if (nfc_protocol->IsEnabled()) {
amiibo_detected = false;
nfc_protocol->DisableNfc();
}
if (ring_protocol->IsEnabled()) {
ring_connected = false;
ring_protocol->DisableRingCon();
}
if (irs_enabled && supported_features.irs) { if (irs_enabled && supported_features.irs) {
auto result = irs_protocol->EnableIrs(); auto result = irs_protocol->EnableIrs();
if (result == DriverResult::Success) { if (result == DriverResult::Success) {
@ -272,11 +282,6 @@ DriverResult JoyconDriver::SetPollingMode() {
LOG_ERROR(Input, "Error enabling IRS"); LOG_ERROR(Input, "Error enabling IRS");
} }
if (nfc_protocol->IsEnabled()) {
amiibo_detected = false;
nfc_protocol->DisableNfc();
}
if (nfc_enabled && supported_features.nfc) { if (nfc_enabled && supported_features.nfc) {
auto result = nfc_protocol->EnableNfc(); auto result = nfc_protocol->EnableNfc();
if (result == DriverResult::Success) { if (result == DriverResult::Success) {
@ -290,11 +295,6 @@ DriverResult JoyconDriver::SetPollingMode() {
LOG_ERROR(Input, "Error enabling NFC"); LOG_ERROR(Input, "Error enabling NFC");
} }
if (ring_protocol->IsEnabled()) {
ring_connected = false;
ring_protocol->DisableRingCon();
}
if (hidbus_enabled && supported_features.hidbus) { if (hidbus_enabled && supported_features.hidbus) {
auto result = ring_protocol->EnableRingCon(); auto result = ring_protocol->EnableRingCon();
if (result == DriverResult::Success) { if (result == DriverResult::Success) {
@ -418,6 +418,12 @@ DriverResult JoyconDriver::SetPasiveMode() {
} }
DriverResult JoyconDriver::SetActiveMode() { DriverResult JoyconDriver::SetActiveMode() {
if (is_ring_disabled_by_irs) {
is_ring_disabled_by_irs = false;
SetActiveMode();
return SetRingConMode();
}
std::scoped_lock lock{mutex}; std::scoped_lock lock{mutex};
motion_enabled = true; motion_enabled = true;
hidbus_enabled = false; hidbus_enabled = false;
@ -434,6 +440,10 @@ DriverResult JoyconDriver::SetIrMode() {
return DriverResult::NotSupported; return DriverResult::NotSupported;
} }
if (ring_connected) {
is_ring_disabled_by_irs = true;
}
motion_enabled = false; motion_enabled = false;
hidbus_enabled = false; hidbus_enabled = false;
nfc_enabled = false; nfc_enabled = false;

View File

@ -107,6 +107,7 @@ private:
bool starlink_connected{}; bool starlink_connected{};
bool ring_connected{}; bool ring_connected{};
bool amiibo_detected{}; bool amiibo_detected{};
bool is_ring_disabled_by_irs{};
// Harware configuration // Harware configuration
u8 leds{}; u8 leds{};

View File

@ -74,8 +74,8 @@ DriverResult JoyconCommonProtocol::SendData(std::span<const u8> buffer) {
} }
DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubCommand sc, std::vector<u8>& output) { DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubCommand sc, std::vector<u8>& output) {
constexpr int timeout_mili = 100; constexpr int timeout_mili = 66;
constexpr int MaxTries = 10; constexpr int MaxTries = 15;
int tries = 0; int tries = 0;
output.resize(MaxSubCommandResponseSize); output.resize(MaxSubCommandResponseSize);