summaryrefslogtreecommitdiff
path: root/src/input_common/drivers/joycon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/drivers/joycon.cpp')
-rw-r--r--src/input_common/drivers/joycon.cpp105
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
413PadIdentifier Joycons::GetIdentifier(std::size_t port, Joycon::ControllerType type) const { 413PadIdentifier 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
423Common::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
421std::vector<Common::ParamPackage> Joycons::GetInputDevices() const { 433std::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;