diff options
Diffstat (limited to 'src/input_common/drivers/joycon.cpp')
| -rw-r--r-- | src/input_common/drivers/joycon.cpp | 105 |
1 files changed, 49 insertions, 56 deletions
diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index 1582def13..7122093c6 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp | |||
| @@ -411,13 +411,25 @@ std::shared_ptr<Joycon::JoyconDriver> Joycons::GetHandle(PadIdentifier identifie | |||
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | PadIdentifier Joycons::GetIdentifier(std::size_t port, Joycon::ControllerType type) const { | 413 | PadIdentifier Joycons::GetIdentifier(std::size_t port, Joycon::ControllerType type) const { |
| 414 | const std::array<u8, 16> guid{0, 0, 0, 0, 0, 0, 0, 0, | ||
| 415 | 0, 0, 0, 0, 0, 0, 0, static_cast<u8>(type)}; | ||
| 414 | return { | 416 | return { |
| 415 | .guid = Common::UUID{Common::InvalidUUID}, | 417 | .guid = Common::UUID{guid}, |
| 416 | .port = port, | 418 | .port = port, |
| 417 | .pad = static_cast<std::size_t>(type), | 419 | .pad = static_cast<std::size_t>(type), |
| 418 | }; | 420 | }; |
| 419 | } | 421 | } |
| 420 | 422 | ||
| 423 | Common::ParamPackage Joycons::GetParamPackage(std::size_t port, Joycon::ControllerType type) const { | ||
| 424 | const auto identifier = GetIdentifier(port, type); | ||
| 425 | return { | ||
| 426 | {"engine", GetEngineName()}, | ||
| 427 | {"guid", identifier.guid.RawString()}, | ||
| 428 | {"port", std::to_string(identifier.port)}, | ||
| 429 | {"pad", std::to_string(identifier.pad)}, | ||
| 430 | }; | ||
| 431 | } | ||
| 432 | |||
| 421 | std::vector<Common::ParamPackage> Joycons::GetInputDevices() const { | 433 | std::vector<Common::ParamPackage> Joycons::GetInputDevices() const { |
| 422 | std::vector<Common::ParamPackage> devices{}; | 434 | std::vector<Common::ParamPackage> devices{}; |
| 423 | 435 | ||
| @@ -428,14 +440,11 @@ std::vector<Common::ParamPackage> Joycons::GetInputDevices() const { | |||
| 428 | if (!device->IsConnected()) { | 440 | if (!device->IsConnected()) { |
| 429 | return; | 441 | return; |
| 430 | } | 442 | } |
| 443 | auto param = GetParamPackage(device->GetDevicePort(), device->GetHandleDeviceType()); | ||
| 431 | std::string name = fmt::format("{} {}", JoyconName(device->GetHandleDeviceType()), | 444 | std::string name = fmt::format("{} {}", JoyconName(device->GetHandleDeviceType()), |
| 432 | device->GetDevicePort() + 1); | 445 | device->GetDevicePort() + 1); |
| 433 | devices.emplace_back(Common::ParamPackage{ | 446 | param.Set("display", std::move(name)); |
| 434 | {"engine", GetEngineName()}, | 447 | devices.emplace_back(param); |
| 435 | {"display", std::move(name)}, | ||
| 436 | {"port", std::to_string(device->GetDevicePort())}, | ||
| 437 | {"pad", std::to_string(static_cast<std::size_t>(device->GetHandleDeviceType()))}, | ||
| 438 | }); | ||
| 439 | }; | 448 | }; |
| 440 | 449 | ||
| 441 | for (const auto& controller : left_joycons) { | 450 | for (const auto& controller : left_joycons) { |
| @@ -453,14 +462,15 @@ std::vector<Common::ParamPackage> Joycons::GetInputDevices() const { | |||
| 453 | if (!left_joycons[i]->IsConnected() || !right_joycons[i]->IsConnected()) { | 462 | if (!left_joycons[i]->IsConnected() || !right_joycons[i]->IsConnected()) { |
| 454 | continue; | 463 | continue; |
| 455 | } | 464 | } |
| 456 | constexpr auto type = Joycon::ControllerType::Dual; | 465 | auto main_param = GetParamPackage(i, left_joycons[i]->GetHandleDeviceType()); |
| 466 | const auto second_param = GetParamPackage(i, right_joycons[i]->GetHandleDeviceType()); | ||
| 467 | const auto type = Joycon::ControllerType::Dual; | ||
| 457 | std::string name = fmt::format("{} {}", JoyconName(type), i + 1); | 468 | std::string name = fmt::format("{} {}", JoyconName(type), i + 1); |
| 458 | devices.emplace_back(Common::ParamPackage{ | 469 | |
| 459 | {"engine", GetEngineName()}, | 470 | main_param.Set("display", std::move(name)); |
| 460 | {"display", std::move(name)}, | 471 | main_param.Set("guid2", second_param.Get("guid", "")); |
| 461 | {"port", std::to_string(i)}, | 472 | main_param.Set("pad", std::to_string(static_cast<size_t>(type))); |
| 462 | {"pad", std::to_string(static_cast<std::size_t>(type))}, | 473 | devices.emplace_back(main_param); |
| 463 | }); | ||
| 464 | } | 474 | } |
| 465 | 475 | ||
| 466 | return devices; | 476 | return devices; |
| @@ -496,26 +506,21 @@ ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& par | |||
| 496 | 506 | ||
| 497 | ButtonMapping mapping{}; | 507 | ButtonMapping mapping{}; |
| 498 | for (const auto& [switch_button, joycon_button, side] : switch_to_joycon_button) { | 508 | for (const auto& [switch_button, joycon_button, side] : switch_to_joycon_button) { |
| 499 | int pad = params.Get("pad", 0); | 509 | const std::size_t port = static_cast<std::size_t>(params.Get("port", 0)); |
| 500 | if (pad == static_cast<int>(Joycon::ControllerType::Dual)) { | 510 | auto pad = static_cast<Joycon::ControllerType>(params.Get("pad", 0)); |
| 501 | pad = side ? static_cast<int>(Joycon::ControllerType::Right) | 511 | if (pad == Joycon::ControllerType::Dual) { |
| 502 | : static_cast<int>(Joycon::ControllerType::Left); | 512 | pad = side ? Joycon::ControllerType::Right : Joycon::ControllerType::Left; |
| 503 | } | 513 | } |
| 504 | 514 | ||
| 505 | Common::ParamPackage button_params{}; | 515 | Common::ParamPackage button_params = GetParamPackage(port, pad); |
| 506 | button_params.Set("engine", GetEngineName()); | ||
| 507 | button_params.Set("port", params.Get("port", 0)); | ||
| 508 | button_params.Set("pad", pad); | ||
| 509 | button_params.Set("button", static_cast<int>(joycon_button)); | 516 | button_params.Set("button", static_cast<int>(joycon_button)); |
| 510 | mapping.insert_or_assign(switch_button, std::move(button_params)); | 517 | mapping.insert_or_assign(switch_button, std::move(button_params)); |
| 511 | } | 518 | } |
| 512 | 519 | ||
| 513 | // Map SL and SR buttons for left joycons | 520 | // Map SL and SR buttons for left joycons |
| 514 | if (params.Get("pad", 0) == static_cast<int>(Joycon::ControllerType::Left)) { | 521 | if (params.Get("pad", 0) == static_cast<int>(Joycon::ControllerType::Left)) { |
| 515 | Common::ParamPackage button_params{}; | 522 | const std::size_t port = static_cast<std::size_t>(params.Get("port", 0)); |
| 516 | button_params.Set("engine", GetEngineName()); | 523 | Common::ParamPackage button_params = GetParamPackage(port, Joycon::ControllerType::Left); |
| 517 | button_params.Set("port", params.Get("port", 0)); | ||
| 518 | button_params.Set("pad", static_cast<int>(Joycon::ControllerType::Left)); | ||
| 519 | 524 | ||
| 520 | Common::ParamPackage sl_button_params = button_params; | 525 | Common::ParamPackage sl_button_params = button_params; |
| 521 | Common::ParamPackage sr_button_params = button_params; | 526 | Common::ParamPackage sr_button_params = button_params; |
| @@ -527,10 +532,8 @@ ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& par | |||
| 527 | 532 | ||
| 528 | // Map SL and SR buttons for right joycons | 533 | // Map SL and SR buttons for right joycons |
| 529 | if (params.Get("pad", 0) == static_cast<int>(Joycon::ControllerType::Right)) { | 534 | if (params.Get("pad", 0) == static_cast<int>(Joycon::ControllerType::Right)) { |
| 530 | Common::ParamPackage button_params{}; | 535 | const std::size_t port = static_cast<std::size_t>(params.Get("port", 0)); |
| 531 | button_params.Set("engine", GetEngineName()); | 536 | Common::ParamPackage button_params = GetParamPackage(port, Joycon::ControllerType::Right); |
| 532 | button_params.Set("port", params.Get("port", 0)); | ||
| 533 | button_params.Set("pad", static_cast<int>(Joycon::ControllerType::Right)); | ||
| 534 | 537 | ||
| 535 | Common::ParamPackage sl_button_params = button_params; | 538 | Common::ParamPackage sl_button_params = button_params; |
| 536 | Common::ParamPackage sr_button_params = button_params; | 539 | Common::ParamPackage sr_button_params = button_params; |
| @@ -548,25 +551,20 @@ AnalogMapping Joycons::GetAnalogMappingForDevice(const Common::ParamPackage& par | |||
| 548 | return {}; | 551 | return {}; |
| 549 | } | 552 | } |
| 550 | 553 | ||
| 551 | int pad_left = params.Get("pad", 0); | 554 | const std::size_t port = static_cast<std::size_t>(params.Get("port", 0)); |
| 552 | int pad_right = pad_left; | 555 | auto pad_left = static_cast<Joycon::ControllerType>(params.Get("pad", 0)); |
| 553 | if (pad_left == static_cast<int>(Joycon::ControllerType::Dual)) { | 556 | auto pad_right = pad_left; |
| 554 | pad_left = static_cast<int>(Joycon::ControllerType::Left); | 557 | if (pad_left == Joycon::ControllerType::Dual) { |
| 555 | pad_right = static_cast<int>(Joycon::ControllerType::Right); | 558 | pad_left = Joycon::ControllerType::Left; |
| 559 | pad_right = Joycon::ControllerType::Right; | ||
| 556 | } | 560 | } |
| 557 | 561 | ||
| 558 | AnalogMapping mapping = {}; | 562 | AnalogMapping mapping = {}; |
| 559 | Common::ParamPackage left_analog_params; | 563 | Common::ParamPackage left_analog_params = GetParamPackage(port, pad_left); |
| 560 | left_analog_params.Set("engine", GetEngineName()); | ||
| 561 | left_analog_params.Set("port", params.Get("port", 0)); | ||
| 562 | left_analog_params.Set("pad", pad_left); | ||
| 563 | left_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::LeftStickX)); | 564 | left_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::LeftStickX)); |
| 564 | left_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::LeftStickY)); | 565 | left_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::LeftStickY)); |
| 565 | mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params)); | 566 | mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params)); |
| 566 | Common::ParamPackage right_analog_params; | 567 | Common::ParamPackage right_analog_params = GetParamPackage(port, pad_right); |
| 567 | right_analog_params.Set("engine", GetEngineName()); | ||
| 568 | right_analog_params.Set("port", params.Get("port", 0)); | ||
| 569 | right_analog_params.Set("pad", pad_right); | ||
| 570 | right_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::RightStickX)); | 568 | right_analog_params.Set("axis_x", static_cast<int>(Joycon::PadAxes::RightStickX)); |
| 571 | right_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::RightStickY)); | 569 | right_analog_params.Set("axis_y", static_cast<int>(Joycon::PadAxes::RightStickY)); |
| 572 | mapping.insert_or_assign(Settings::NativeAnalog::RStick, std::move(right_analog_params)); | 570 | mapping.insert_or_assign(Settings::NativeAnalog::RStick, std::move(right_analog_params)); |
| @@ -578,24 +576,19 @@ MotionMapping Joycons::GetMotionMappingForDevice(const Common::ParamPackage& par | |||
| 578 | return {}; | 576 | return {}; |
| 579 | } | 577 | } |
| 580 | 578 | ||
| 581 | int pad_left = params.Get("pad", 0); | 579 | const std::size_t port = static_cast<std::size_t>(params.Get("port", 0)); |
| 582 | int pad_right = pad_left; | 580 | auto pad_left = static_cast<Joycon::ControllerType>(params.Get("pad", 0)); |
| 583 | if (pad_left == static_cast<int>(Joycon::ControllerType::Dual)) { | 581 | auto pad_right = pad_left; |
| 584 | pad_left = static_cast<int>(Joycon::ControllerType::Left); | 582 | if (pad_left == Joycon::ControllerType::Dual) { |
| 585 | pad_right = static_cast<int>(Joycon::ControllerType::Right); | 583 | pad_left = Joycon::ControllerType::Left; |
| 584 | pad_right = Joycon::ControllerType::Right; | ||
| 586 | } | 585 | } |
| 587 | 586 | ||
| 588 | MotionMapping mapping = {}; | 587 | MotionMapping mapping = {}; |
| 589 | Common::ParamPackage left_motion_params; | 588 | Common::ParamPackage left_motion_params = GetParamPackage(port, pad_left); |
| 590 | left_motion_params.Set("engine", GetEngineName()); | ||
| 591 | left_motion_params.Set("port", params.Get("port", 0)); | ||
| 592 | left_motion_params.Set("pad", pad_left); | ||
| 593 | left_motion_params.Set("motion", 0); | 589 | left_motion_params.Set("motion", 0); |
| 594 | mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, std::move(left_motion_params)); | 590 | mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, std::move(left_motion_params)); |
| 595 | Common::ParamPackage right_Motion_params; | 591 | Common::ParamPackage right_Motion_params = GetParamPackage(port, pad_right); |
| 596 | right_Motion_params.Set("engine", GetEngineName()); | ||
| 597 | right_Motion_params.Set("port", params.Get("port", 0)); | ||
| 598 | right_Motion_params.Set("pad", pad_right); | ||
| 599 | right_Motion_params.Set("motion", 1); | 592 | right_Motion_params.Set("motion", 1); |
| 600 | mapping.insert_or_assign(Settings::NativeMotion::MotionRight, std::move(right_Motion_params)); | 593 | mapping.insert_or_assign(Settings::NativeMotion::MotionRight, std::move(right_Motion_params)); |
| 601 | return mapping; | 594 | return mapping; |