|
|
@@ -89,12 +89,12 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
|
|
|
case NPadControllerType::JoyLeft:
|
|
|
controller.joy_styles.joycon_left.Assign(1);
|
|
|
controller.device_type.joycon_left.Assign(1);
|
|
|
- controller.pad_assignment = NPadAssignments::Dual;
|
|
|
+ controller.pad_assignment = NPadAssignments::Single;
|
|
|
break;
|
|
|
case NPadControllerType::JoyRight:
|
|
|
controller.joy_styles.joycon_right.Assign(1);
|
|
|
controller.device_type.joycon_right.Assign(1);
|
|
|
- controller.pad_assignment = NPadAssignments::Dual;
|
|
|
+ controller.pad_assignment = NPadAssignments::Single;
|
|
|
break;
|
|
|
case NPadControllerType::Pokeball:
|
|
|
controller.joy_styles.pokeball.Assign(1);
|
|
|
@@ -381,7 +381,7 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
|
|
|
}
|
|
|
std::memcpy(data + NPAD_OFFSET, shared_memory_entries.data(),
|
|
|
shared_memory_entries.size() * sizeof(NPadEntry));
|
|
|
-} // namespace Service::HID
|
|
|
+}
|
|
|
|
|
|
void Controller_NPad::SetSupportedStyleSet(NPadType style_set) {
|
|
|
style.raw = style_set.raw;
|
|
|
@@ -516,6 +516,7 @@ u32 Controller_NPad::IndexToNPad(std::size_t index) {
|
|
|
}
|
|
|
|
|
|
void Controller_NPad::AddNewController(NPadControllerType controller) {
|
|
|
+ controller = DecideBestController(controller);
|
|
|
if (controller == NPadControllerType::Handheld) {
|
|
|
connected_controllers[8] = {controller, true};
|
|
|
InitNewlyAddedControler(8);
|
|
|
@@ -534,6 +535,7 @@ void Controller_NPad::AddNewController(NPadControllerType controller) {
|
|
|
}
|
|
|
|
|
|
void Controller_NPad::AddNewControllerAt(NPadControllerType controller, u32 npad_id) {
|
|
|
+ controller = DecideBestController(controller);
|
|
|
if (controller == NPadControllerType::Handheld) {
|
|
|
connected_controllers[8] = {controller, true};
|
|
|
InitNewlyAddedControler(8);
|
|
|
@@ -552,6 +554,122 @@ void Controller_NPad::DisconnectNPad(u32 npad_id) {
|
|
|
connected_controllers[NPadIdToIndex(npad_id)].is_connected = false;
|
|
|
}
|
|
|
|
|
|
+Controller_NPad::NPadControllerType Controller_NPad::DecideBestController(
|
|
|
+ NPadControllerType priority) {
|
|
|
+ if (IsControllerSupported(priority)) {
|
|
|
+ return priority;
|
|
|
+ }
|
|
|
+ const auto is_docked = Settings::values->use_docked_mode;
|
|
|
+ if (is_docked && priority == NPadControllerType::Handheld) {
|
|
|
+ priority = NPadControllerType::JoyDual;
|
|
|
+ if (IsControllerSupported(priority)) {
|
|
|
+ return priority;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ std::vector<NPadControllerType> priority_list{};
|
|
|
+ switch (priority) {
|
|
|
+ case NPadControllerType::ProController:
|
|
|
+ priority_list.push_back(NPadControllerType::JoyDual);
|
|
|
+ if (!is_docked) {
|
|
|
+ priority_list.push_back(NPadControllerType::Handheld);
|
|
|
+ }
|
|
|
+ priority_list.push_back(NPadControllerType::JoyLeft);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyRight);
|
|
|
+ priority_list.push_back(NPadControllerType::Pokeball);
|
|
|
+ break;
|
|
|
+ case NPadControllerType::Handheld:
|
|
|
+ priority_list.push_back(NPadControllerType::JoyDual);
|
|
|
+ priority_list.push_back(NPadControllerType::ProController);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyLeft);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyRight);
|
|
|
+ priority_list.push_back(NPadControllerType::Pokeball);
|
|
|
+ break;
|
|
|
+ case NPadControllerType::JoyDual:
|
|
|
+ if (!is_docked) {
|
|
|
+ priority_list.push_back(NPadControllerType::Handheld);
|
|
|
+ }
|
|
|
+ priority_list.push_back(NPadControllerType::ProController);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyLeft);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyRight);
|
|
|
+ priority_list.push_back(NPadControllerType::Pokeball);
|
|
|
+ break;
|
|
|
+ case NPadControllerType::JoyLeft:
|
|
|
+ priority_list.push_back(NPadControllerType::JoyRight);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyDual);
|
|
|
+ if (!is_docked) {
|
|
|
+ priority_list.push_back(NPadControllerType::Handheld);
|
|
|
+ }
|
|
|
+ priority_list.push_back(NPadControllerType::ProController);
|
|
|
+ priority_list.push_back(NPadControllerType::Pokeball);
|
|
|
+ break;
|
|
|
+ case NPadControllerType::JoyRight:
|
|
|
+ priority_list.push_back(NPadControllerType::JoyLeft);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyDual);
|
|
|
+ if (!is_docked) {
|
|
|
+ priority_list.push_back(NPadControllerType::Handheld);
|
|
|
+ }
|
|
|
+ priority_list.push_back(NPadControllerType::ProController);
|
|
|
+ priority_list.push_back(NPadControllerType::Pokeball);
|
|
|
+ break;
|
|
|
+ case NPadControllerType::Pokeball:
|
|
|
+ priority_list.push_back(NPadControllerType::JoyLeft);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyRight);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyDual);
|
|
|
+ if (!is_docked) {
|
|
|
+ priority_list.push_back(NPadControllerType::Handheld);
|
|
|
+ }
|
|
|
+ priority_list.push_back(NPadControllerType::ProController);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ priority_list.push_back(NPadControllerType::JoyDual);
|
|
|
+ if (!is_docked) {
|
|
|
+ priority_list.push_back(NPadControllerType::Handheld);
|
|
|
+ }
|
|
|
+ priority_list.push_back(NPadControllerType::ProController);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyLeft);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyRight);
|
|
|
+ priority_list.push_back(NPadControllerType::JoyDual);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (const auto controller_type : priority_list) {
|
|
|
+ if (IsControllerSupported(controller_type)) {
|
|
|
+ return controller_type;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ UNIMPLEMENTED_MSG("Could not find supported controller!");
|
|
|
+ return priority;
|
|
|
+}
|
|
|
+
|
|
|
+bool Controller_NPad::IsControllerSupported(NPadControllerType controller) {
|
|
|
+ if (controller == NPadControllerType::Handheld) {
|
|
|
+ // Handheld is not even a supported type, lets stop here
|
|
|
+ if (std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), 32) ==
|
|
|
+ supported_npad_id_types.end()) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // Handheld should not be supported in docked mode
|
|
|
+ if (Settings::values->use_docked_mode) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ switch (controller) {
|
|
|
+ case NPadControllerType::ProController:
|
|
|
+ return style.pro_controller;
|
|
|
+ case NPadControllerType::Handheld:
|
|
|
+ return style.handheld;
|
|
|
+ case NPadControllerType::JoyDual:
|
|
|
+ return style.joycon_dual;
|
|
|
+ case NPadControllerType::JoyLeft:
|
|
|
+ return style.joycon_left;
|
|
|
+ case NPadControllerType::JoyRight:
|
|
|
+ return style.joycon_right;
|
|
|
+ case NPadControllerType::Pokeball:
|
|
|
+ return style.pokeball;
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
Controller_NPad::LedPattern Controller_NPad::GetLedPattern(u32 npad_id) {
|
|
|
if (npad_id == npad_id_list.back() || npad_id == npad_id_list[npad_id_list.size() - 2]) {
|
|
|
// These are controllers without led patterns
|