diff options
| -rw-r--r-- | src/input_common/drivers/joycon.cpp | 125 |
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 | ||
| 56 | void Joycons::Setup() { | 56 | void 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 | ||
| 470 | ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& params) { | 491 | ButtonMapping 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 | } |