summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/input_common/drivers/joycon.cpp125
1 files changed, 101 insertions, 24 deletions
diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp
index dbe730e1a..049ecc4f2 100644
--- a/src/input_common/drivers/joycon.cpp
+++ b/src/input_common/drivers/joycon.cpp
@@ -55,14 +55,17 @@ void Joycons::Reset() {
55 55
56void Joycons::Setup() { 56void Joycons::Setup() {
57 u32 port = 0; 57 u32 port = 0;
58 PreSetController(GetIdentifier(0, Joycon::ControllerType::None));
58 for (auto& device : left_joycons) { 59 for (auto& device : left_joycons) {
59 PreSetController(GetIdentifier(port, Joycon::ControllerType::Left)); 60 PreSetController(GetIdentifier(port, Joycon::ControllerType::Left));
60 device = std::make_shared<Joycon::JoyconDriver>(port++); 61 device = std::make_shared<Joycon::JoyconDriver>(port++);
61 } 62 }
63 port = 0;
62 for (auto& device : right_joycons) { 64 for (auto& device : right_joycons) {
63 PreSetController(GetIdentifier(port, Joycon::ControllerType::Right)); 65 PreSetController(GetIdentifier(port, Joycon::ControllerType::Right));
64 device = std::make_shared<Joycon::JoyconDriver>(port++); 66 device = std::make_shared<Joycon::JoyconDriver>(port++);
65 } 67 }
68 port = 0;
66 for (auto& device : pro_joycons) { 69 for (auto& device : pro_joycons) {
67 PreSetController(GetIdentifier(port, Joycon::ControllerType::Pro)); 70 PreSetController(GetIdentifier(port, Joycon::ControllerType::Pro));
68 device = std::make_shared<Joycon::JoyconDriver>(port++); 71 device = std::make_shared<Joycon::JoyconDriver>(port++);
@@ -109,7 +112,7 @@ bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const {
109 return false; 112 return false;
110 } 113 }
111 114
112 auto is_handle_identical = [&](std::shared_ptr<Joycon::JoyconDriver> device) { 115 auto is_handle_identical = [serial_number](std::shared_ptr<Joycon::JoyconDriver> device) {
113 if (!device) { 116 if (!device) {
114 return false; 117 return false;
115 } 118 }
@@ -445,7 +448,7 @@ std::vector<Common::ParamPackage> Joycons::GetInputDevices() const {
445 return; 448 return;
446 } 449 }
447 std::string name = fmt::format("{} {}", JoyconName(device->GetHandleDeviceType()), 450 std::string name = fmt::format("{} {}", JoyconName(device->GetHandleDeviceType()),
448 device->GetDevicePort()); 451 device->GetDevicePort() + 1);
449 devices.emplace_back(Common::ParamPackage{ 452 devices.emplace_back(Common::ParamPackage{
450 {"engine", GetEngineName()}, 453 {"engine", GetEngineName()},
451 {"display", std::move(name)}, 454 {"display", std::move(name)},
@@ -464,32 +467,49 @@ std::vector<Common::ParamPackage> Joycons::GetInputDevices() const {
464 add_entry(controller); 467 add_entry(controller);
465 } 468 }
466 469
470 // List dual joycon pairs
471 for (std::size_t i = 0; i < MaxSupportedControllers; i++) {
472 if (!left_joycons[i] || !right_joycons[i]) {
473 continue;
474 }
475 if (!left_joycons[i]->IsConnected() || !right_joycons[i]->IsConnected()) {
476 continue;
477 }
478 constexpr auto type = Joycon::ControllerType::Dual;
479 std::string name = fmt::format("{} {}", JoyconName(type), i + 1);
480 devices.emplace_back(Common::ParamPackage{
481 {"engine", GetEngineName()},
482 {"display", std::move(name)},
483 {"port", std::to_string(i)},
484 {"pad", std::to_string(static_cast<std::size_t>(type))},
485 });
486 }
487
467 return devices; 488 return devices;
468} 489}
469 490
470ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& params) { 491ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& params) {
471 static constexpr std::array<std::pair<Settings::NativeButton::Values, Joycon::PadButton>, 20> 492 static constexpr std::array<std::tuple<Settings::NativeButton::Values, Joycon::PadButton, bool>,
493 18>
472 switch_to_joycon_button = { 494 switch_to_joycon_button = {
473 std::pair{Settings::NativeButton::A, Joycon::PadButton::A}, 495 std::tuple{Settings::NativeButton::A, Joycon::PadButton::A, true},
474 {Settings::NativeButton::B, Joycon::PadButton::B}, 496 {Settings::NativeButton::B, Joycon::PadButton::B, true},
475 {Settings::NativeButton::X, Joycon::PadButton::X}, 497 {Settings::NativeButton::X, Joycon::PadButton::X, true},
476 {Settings::NativeButton::Y, Joycon::PadButton::Y}, 498 {Settings::NativeButton::Y, Joycon::PadButton::Y, true},
477 {Settings::NativeButton::DLeft, Joycon::PadButton::Left}, 499 {Settings::NativeButton::DLeft, Joycon::PadButton::Left, false},
478 {Settings::NativeButton::DUp, Joycon::PadButton::Up}, 500 {Settings::NativeButton::DUp, Joycon::PadButton::Up, false},
479 {Settings::NativeButton::DRight, Joycon::PadButton::Right}, 501 {Settings::NativeButton::DRight, Joycon::PadButton::Right, false},
480 {Settings::NativeButton::DDown, Joycon::PadButton::Down}, 502 {Settings::NativeButton::DDown, Joycon::PadButton::Down, false},
481 {Settings::NativeButton::SL, Joycon::PadButton::LeftSL}, 503 {Settings::NativeButton::L, Joycon::PadButton::L, false},
482 {Settings::NativeButton::SR, Joycon::PadButton::LeftSR}, 504 {Settings::NativeButton::R, Joycon::PadButton::R, true},
483 {Settings::NativeButton::L, Joycon::PadButton::L}, 505 {Settings::NativeButton::ZL, Joycon::PadButton::ZL, false},
484 {Settings::NativeButton::R, Joycon::PadButton::R}, 506 {Settings::NativeButton::ZR, Joycon::PadButton::ZR, true},
485 {Settings::NativeButton::ZL, Joycon::PadButton::ZL}, 507 {Settings::NativeButton::Plus, Joycon::PadButton::Plus, true},
486 {Settings::NativeButton::ZR, Joycon::PadButton::ZR}, 508 {Settings::NativeButton::Minus, Joycon::PadButton::Minus, false},
487 {Settings::NativeButton::Plus, Joycon::PadButton::Plus}, 509 {Settings::NativeButton::Home, Joycon::PadButton::Home, true},
488 {Settings::NativeButton::Minus, Joycon::PadButton::Minus}, 510 {Settings::NativeButton::Screenshot, Joycon::PadButton::Capture, false},
489 {Settings::NativeButton::Home, Joycon::PadButton::Home}, 511 {Settings::NativeButton::LStick, Joycon::PadButton::StickL, false},
490 {Settings::NativeButton::Screenshot, Joycon::PadButton::Capture}, 512 {Settings::NativeButton::RStick, Joycon::PadButton::StickR, true},
491 {Settings::NativeButton::LStick, Joycon::PadButton::StickL},
492 {Settings::NativeButton::RStick, Joycon::PadButton::StickR},
493 }; 513 };
494 514
495 if (!params.Has("port")) { 515 if (!params.Has("port")) {
@@ -497,14 +517,51 @@ ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& par
497 } 517 }
498 518
499 ButtonMapping mapping{}; 519 ButtonMapping mapping{};
500 for (const auto& [switch_button, joycon_button] : switch_to_joycon_button) { 520 for (const auto& [switch_button, joycon_button, side] : switch_to_joycon_button) {
521 int pad = params.Get("pad", 0);
522 if (pad == static_cast<int>(Joycon::ControllerType::Dual)) {
523 pad = side ? static_cast<int>(Joycon::ControllerType::Right)
524 : static_cast<int>(Joycon::ControllerType::Left);
525 }
526
501 Common::ParamPackage button_params{}; 527 Common::ParamPackage button_params{};
502 button_params.Set("engine", GetEngineName()); 528 button_params.Set("engine", GetEngineName());
503 button_params.Set("port", params.Get("port", 0)); 529 button_params.Set("port", params.Get("port", 0));
530 button_params.Set("pad", pad);
504 button_params.Set("button", static_cast<int>(joycon_button)); 531 button_params.Set("button", static_cast<int>(joycon_button));
505 mapping.insert_or_assign(switch_button, std::move(button_params)); 532 mapping.insert_or_assign(switch_button, std::move(button_params));
506 } 533 }
507 534
535 // Map SL and SR buttons for left joycons
536 if (params.Get("pad", 0) == static_cast<int>(Joycon::ControllerType::Left)) {
537 Common::ParamPackage button_params{};
538 button_params.Set("engine", GetEngineName());
539 button_params.Set("port", params.Get("port", 0));
540 button_params.Set("pad", static_cast<int>(Joycon::ControllerType::Left));
541
542 Common::ParamPackage sl_button_params = button_params;
543 Common::ParamPackage sr_button_params = button_params;
544 sl_button_params.Set("button", static_cast<int>(Joycon::PadButton::LeftSL));
545 sr_button_params.Set("button", static_cast<int>(Joycon::PadButton::LeftSR));
546 mapping.insert_or_assign(Settings::NativeButton::SL, std::move(sl_button_params));
547 mapping.insert_or_assign(Settings::NativeButton::SR, std::move(sr_button_params));
548 }
549
550 // Map SL and SR buttons for right joycons
551 if (params.Get("pad", 0) == static_cast<int>(Joycon::ControllerType::Right)) {
552 Common::ParamPackage button_params{};
553 button_params.Set("engine", GetEngineName());
554 button_params.Set("port", params.Get("port", 0));
555 button_params.Set("pad", static_cast<int>(Joycon::ControllerType::Right));
556
557 Common::ParamPackage sl_button_params = button_params;
558 Common::ParamPackage sr_button_params = button_params;
559 sl_button_params.Set("button", static_cast<int>(Joycon::PadButton::RightSL));
560 sr_button_params.Set("button", static_cast<int>(Joycon::PadButton::RightSR));
561 mapping.insert_or_assign(Settings::NativeButton::SL, std::move(sl_button_params));
562 mapping.insert_or_assign(Settings::NativeButton::SR, std::move(sr_button_params));
563 }
564
508 return mapping; 565 return mapping;
509} 566}
510 567
@@ -513,16 +570,25 @@ AnalogMapping Joycons::GetAnalogMappingForDevice(const Common::ParamPackage& par
513 return {}; 570 return {};
514 } 571 }
515 572
573 int pad_left = params.Get("pad", 0);
574 int pad_right = pad_left;
575 if (pad_left == static_cast<int>(Joycon::ControllerType::Dual)) {
576 pad_left = static_cast<int>(Joycon::ControllerType::Left);
577 pad_right = static_cast<int>(Joycon::ControllerType::Right);
578 }
579
516 AnalogMapping mapping = {}; 580 AnalogMapping mapping = {};
517 Common::ParamPackage left_analog_params; 581 Common::ParamPackage left_analog_params;
518 left_analog_params.Set("engine", GetEngineName()); 582 left_analog_params.Set("engine", GetEngineName());
519 left_analog_params.Set("port", params.Get("port", 0)); 583 left_analog_params.Set("port", params.Get("port", 0));
584 left_analog_params.Set("pad", pad_left);
520 left_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::LeftStickX)); 585 left_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::LeftStickX));
521 left_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::LeftStickY)); 586 left_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::LeftStickY));
522 mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params)); 587 mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params));
523 Common::ParamPackage right_analog_params; 588 Common::ParamPackage right_analog_params;
524 right_analog_params.Set("engine", GetEngineName()); 589 right_analog_params.Set("engine", GetEngineName());
525 right_analog_params.Set("port", params.Get("port", 0)); 590 right_analog_params.Set("port", params.Get("port", 0));
591 right_analog_params.Set("pad", pad_right);
526 right_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::RightStickX)); 592 right_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::RightStickX));
527 right_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::RightStickY)); 593 right_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::RightStickY));
528 mapping.insert_or_assign(Settings::NativeAnalog::RStick, std::move(right_analog_params)); 594 mapping.insert_or_assign(Settings::NativeAnalog::RStick, std::move(right_analog_params));
@@ -534,15 +600,24 @@ MotionMapping Joycons::GetMotionMappingForDevice(const Common::ParamPackage& par
534 return {}; 600 return {};
535 } 601 }
536 602
603 int pad_left = params.Get("pad", 0);
604 int pad_right = pad_left;
605 if (pad_left == static_cast<int>(Joycon::ControllerType::Dual)) {
606 pad_left = static_cast<int>(Joycon::ControllerType::Left);
607 pad_right = static_cast<int>(Joycon::ControllerType::Right);
608 }
609
537 MotionMapping mapping = {}; 610 MotionMapping mapping = {};
538 Common::ParamPackage left_motion_params; 611 Common::ParamPackage left_motion_params;
539 left_motion_params.Set("engine", GetEngineName()); 612 left_motion_params.Set("engine", GetEngineName());
540 left_motion_params.Set("port", params.Get("port", 0)); 613 left_motion_params.Set("port", params.Get("port", 0));
614 left_motion_params.Set("pad", pad_left);
541 left_motion_params.Set("motion", 0); 615 left_motion_params.Set("motion", 0);
542 mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, std::move(left_motion_params)); 616 mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, std::move(left_motion_params));
543 Common::ParamPackage right_Motion_params; 617 Common::ParamPackage right_Motion_params;
544 right_Motion_params.Set("engine", GetEngineName()); 618 right_Motion_params.Set("engine", GetEngineName());
545 right_Motion_params.Set("port", params.Get("port", 0)); 619 right_Motion_params.Set("port", params.Get("port", 0));
620 right_Motion_params.Set("pad", pad_right);
546 right_Motion_params.Set("motion", 1); 621 right_Motion_params.Set("motion", 1);
547 mapping.insert_or_assign(Settings::NativeMotion::MotionRight, std::move(right_Motion_params)); 622 mapping.insert_or_assign(Settings::NativeMotion::MotionRight, std::move(right_Motion_params));
548 return mapping; 623 return mapping;
@@ -622,6 +697,8 @@ std::string Joycons::JoyconName(Joycon::ControllerType type) const {
622 return "Pro Controller"; 697 return "Pro Controller";
623 case Joycon::ControllerType::Grip: 698 case Joycon::ControllerType::Grip:
624 return "Grip Controller"; 699 return "Grip Controller";
700 case Joycon::ControllerType::Dual:
701 return "Dual Joycon";
625 default: 702 default:
626 return "Unknow Joycon"; 703 return "Unknow Joycon";
627 } 704 }