diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 56c415e4e..205e4fd14 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -40,6 +40,29 @@ enum class JoystickId : std::size_t { | |||
| 40 | Joystick_Right, | 40 | Joystick_Right, |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | static std::size_t NPadIdToIndex(u32 npad_id) { | ||
| 44 | switch (npad_id) { | ||
| 45 | case 0: | ||
| 46 | case 1: | ||
| 47 | case 2: | ||
| 48 | case 3: | ||
| 49 | case 4: | ||
| 50 | case 5: | ||
| 51 | case 6: | ||
| 52 | case 7: | ||
| 53 | return npad_id; | ||
| 54 | case 8: | ||
| 55 | case NPAD_HANDHELD: | ||
| 56 | return 8; | ||
| 57 | case 9: | ||
| 58 | case NPAD_UNKNOWN: | ||
| 59 | return 9; | ||
| 60 | default: | ||
| 61 | UNIMPLEMENTED_MSG("Unknown npad id {}", npad_id); | ||
| 62 | return 0; | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 43 | Controller_NPad::Controller_NPad() = default; | 66 | Controller_NPad::Controller_NPad() = default; |
| 44 | Controller_NPad::~Controller_NPad() = default; | 67 | Controller_NPad::~Controller_NPad() = default; |
| 45 | 68 | ||
| @@ -288,10 +311,11 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) { | |||
| 288 | switch (controller_type) { | 311 | switch (controller_type) { |
| 289 | case NPadControllerType::Handheld: | 312 | case NPadControllerType::Handheld: |
| 290 | handheld_entry.connection_status.raw = 0; | 313 | handheld_entry.connection_status.raw = 0; |
| 291 | handheld_entry.connection_status.IsConnected.Assign(1); | 314 | handheld_entry.connection_status.IsWired.Assign(1); |
| 292 | if (!Settings::values.use_docked_mode) { | 315 | handheld_entry.connection_status.IsLeftJoyConnected.Assign(1); |
| 293 | handheld_entry.connection_status.IsWired.Assign(1); | 316 | handheld_entry.connection_status.IsRightJoyConnected.Assign(1); |
| 294 | } | 317 | handheld_entry.connection_status.IsLeftJoyWired.Assign(1); |
| 318 | handheld_entry.connection_status.IsRightJoyWired.Assign(1); | ||
| 295 | handheld_entry.pad_states.raw = pad_state.raw; | 319 | handheld_entry.pad_states.raw = pad_state.raw; |
| 296 | handheld_entry.l_stick = lstick_entry; | 320 | handheld_entry.l_stick = lstick_entry; |
| 297 | handheld_entry.r_stick = rstick_entry; | 321 | handheld_entry.r_stick = rstick_entry; |
| @@ -371,16 +395,30 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) { | |||
| 371 | supported_npad_id_types.clear(); | 395 | supported_npad_id_types.clear(); |
| 372 | supported_npad_id_types.resize(length / sizeof(u32)); | 396 | supported_npad_id_types.resize(length / sizeof(u32)); |
| 373 | std::memcpy(supported_npad_id_types.data(), data, length); | 397 | std::memcpy(supported_npad_id_types.data(), data, length); |
| 398 | bool had_controller_update = false; | ||
| 374 | for (std::size_t i = 0; i < connected_controllers.size(); i++) { | 399 | for (std::size_t i = 0; i < connected_controllers.size(); i++) { |
| 375 | auto& controller = connected_controllers[i]; | 400 | auto& controller = connected_controllers[i]; |
| 376 | if (!controller.is_connected) { | 401 | if (!controller.is_connected) { |
| 377 | continue; | 402 | continue; |
| 378 | } | 403 | } |
| 379 | if (!IsControllerSupported(PREFERRED_CONTROLLER)) { | 404 | if (!IsControllerSupported(PREFERRED_CONTROLLER)) { |
| 380 | controller.type = DecideBestController(PREFERRED_CONTROLLER); | 405 | const auto best_type = DecideBestController(PREFERRED_CONTROLLER); |
| 381 | InitNewlyAddedControler(i); | 406 | const bool is_handheld = (best_type == NPadControllerType::Handheld || |
| 407 | PREFERRED_CONTROLLER == NPadControllerType::Handheld); | ||
| 408 | if (is_handheld) { | ||
| 409 | controller.type = NPadControllerType::None; | ||
| 410 | controller.is_connected = false; | ||
| 411 | AddNewController(best_type); | ||
| 412 | } else { | ||
| 413 | controller.type = best_type; | ||
| 414 | InitNewlyAddedControler(i); | ||
| 415 | } | ||
| 416 | had_controller_update = true; | ||
| 382 | } | 417 | } |
| 383 | } | 418 | } |
| 419 | if (had_controller_update) { | ||
| 420 | styleset_changed_event->Signal(); | ||
| 421 | } | ||
| 384 | } | 422 | } |
| 385 | 423 | ||
| 386 | void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { | 424 | void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { |
| @@ -458,15 +496,11 @@ void Controller_NPad::AddNewController(NPadControllerType controller) { | |||
| 458 | } | 496 | } |
| 459 | 497 | ||
| 460 | void Controller_NPad::ConnectNPad(u32 npad_id) { | 498 | void Controller_NPad::ConnectNPad(u32 npad_id) { |
| 461 | if (npad_id >= connected_controllers.size()) | 499 | connected_controllers[NPadIdToIndex(npad_id)].is_connected = true; |
| 462 | return; | ||
| 463 | connected_controllers[npad_id].is_connected = true; | ||
| 464 | } | 500 | } |
| 465 | 501 | ||
| 466 | void Controller_NPad::DisconnectNPad(u32 npad_id) { | 502 | void Controller_NPad::DisconnectNPad(u32 npad_id) { |
| 467 | if (npad_id >= connected_controllers.size()) | 503 | connected_controllers[NPadIdToIndex(npad_id)].is_connected = false; |
| 468 | return; | ||
| 469 | connected_controllers[npad_id].is_connected = false; | ||
| 470 | } | 504 | } |
| 471 | 505 | ||
| 472 | Controller_NPad::LedPattern Controller_NPad::GetLedPattern(u32 npad_id) { | 506 | Controller_NPad::LedPattern Controller_NPad::GetLedPattern(u32 npad_id) { |