Merge pull request #8566 from german77/galaxy

core: hid: Add fallback for dualjoycon and pro controllers
This commit is contained in:
bunnei 2022-08-26 16:23:41 -07:00 committed by GitHub
commit d1ef4b2b86
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 1 deletions

View file

@ -101,8 +101,10 @@ void EmulatedController::ReloadFromSettings() {
// Other or debug controller should always be a pro controller // Other or debug controller should always be a pro controller
if (npad_id_type != NpadIdType::Other) { if (npad_id_type != NpadIdType::Other) {
SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type)); SetNpadStyleIndex(MapSettingsTypeToNPad(player.controller_type));
original_npad_type = npad_type;
} else { } else {
SetNpadStyleIndex(NpadStyleIndex::ProController); SetNpadStyleIndex(NpadStyleIndex::ProController);
original_npad_type = npad_type;
} }
if (player.connected) { if (player.connected) {
@ -354,6 +356,7 @@ void EmulatedController::DisableConfiguration() {
Disconnect(); Disconnect();
} }
SetNpadStyleIndex(tmp_npad_type); SetNpadStyleIndex(tmp_npad_type);
original_npad_type = tmp_npad_type;
} }
// Apply temporary connected status to the real controller // Apply temporary connected status to the real controller
@ -1004,13 +1007,27 @@ void EmulatedController::SetSupportedNpadStyleTag(NpadStyleTag supported_styles)
if (!is_connected) { if (!is_connected) {
return; return;
} }
// Attempt to reconnect with the original type
if (npad_type != original_npad_type) {
Disconnect();
const auto current_npad_type = npad_type;
SetNpadStyleIndex(original_npad_type);
if (IsControllerSupported()) {
Connect();
return;
}
SetNpadStyleIndex(current_npad_type);
Connect();
}
if (IsControllerSupported()) { if (IsControllerSupported()) {
return; return;
} }
Disconnect(); Disconnect();
// Fallback fullkey controllers to Pro controllers // Fallback Fullkey controllers to Pro controllers
if (IsControllerFullkey() && supported_style_tag.fullkey) { if (IsControllerFullkey() && supported_style_tag.fullkey) {
LOG_WARNING(Service_HID, "Reconnecting controller type {} as Pro controller", npad_type); LOG_WARNING(Service_HID, "Reconnecting controller type {} as Pro controller", npad_type);
SetNpadStyleIndex(NpadStyleIndex::ProController); SetNpadStyleIndex(NpadStyleIndex::ProController);
@ -1018,6 +1035,22 @@ void EmulatedController::SetSupportedNpadStyleTag(NpadStyleTag supported_styles)
return; return;
} }
// Fallback Dual joycon controllers to Pro controllers
if (npad_type == NpadStyleIndex::JoyconDual && supported_style_tag.fullkey) {
LOG_WARNING(Service_HID, "Reconnecting controller type {} as Pro controller", npad_type);
SetNpadStyleIndex(NpadStyleIndex::ProController);
Connect();
return;
}
// Fallback Pro controllers to Dual joycon
if (npad_type == NpadStyleIndex::ProController && supported_style_tag.joycon_dual) {
LOG_WARNING(Service_HID, "Reconnecting controller type {} as Dual Joycons", npad_type);
SetNpadStyleIndex(NpadStyleIndex::JoyconDual);
Connect();
return;
}
LOG_ERROR(Service_HID, "Controller type {} is not supported. Disconnecting controller", LOG_ERROR(Service_HID, "Controller type {} is not supported. Disconnecting controller",
npad_type); npad_type);
} }

View file

@ -440,6 +440,7 @@ private:
const NpadIdType npad_id_type; const NpadIdType npad_id_type;
NpadStyleIndex npad_type{NpadStyleIndex::None}; NpadStyleIndex npad_type{NpadStyleIndex::None};
NpadStyleIndex original_npad_type{NpadStyleIndex::None};
NpadStyleTag supported_style_tag{NpadStyleSet::All}; NpadStyleTag supported_style_tag{NpadStyleSet::All};
bool is_connected{false}; bool is_connected{false};
bool is_configuring{false}; bool is_configuring{false};