diff options
| author | 2018-10-07 20:17:04 +1100 | |
|---|---|---|
| committer | 2018-10-10 13:15:39 +1100 | |
| commit | f43815af5d59bb1b31696f317c2e2ce243445cb5 (patch) | |
| tree | ae555da5a47ef99ea03b9f51b56eecb5072a16c7 /src | |
| parent | Removed unneeded forward declarations (diff) | |
| download | yuzu-f43815af5d59bb1b31696f317c2e2ce243445cb5.tar.gz yuzu-f43815af5d59bb1b31696f317c2e2ce243445cb5.tar.xz yuzu-f43815af5d59bb1b31696f317c2e2ce243445cb5.zip | |
Added the ability to "disconnect" individual npads
Fixes arms
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 36 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 15 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 5 |
3 files changed, 40 insertions, 16 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 8a713a407..211b8bb60 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -33,7 +33,7 @@ enum class JoystickId : std::size_t { Joystick_Left, Joystick_Right }; | |||
| 33 | Controller_NPad::Controller_NPad() = default; | 33 | Controller_NPad::Controller_NPad() = default; |
| 34 | 34 | ||
| 35 | void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | 35 | void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { |
| 36 | const auto controller_type = CONNECTED_CONTROLLERS[controller_idx]; | 36 | const auto controller_type = connected_controllers[controller_idx].type; |
| 37 | auto& controller = shared_memory_entries[controller_idx]; | 37 | auto& controller = shared_memory_entries[controller_idx]; |
| 38 | if (controller_type == NPadControllerType::None) { | 38 | if (controller_type == NPadControllerType::None) { |
| 39 | return; | 39 | return; |
| @@ -92,7 +92,7 @@ void Controller_NPad::OnInit() { | |||
| 92 | if (!IsControllerActivated()) | 92 | if (!IsControllerActivated()) |
| 93 | return; | 93 | return; |
| 94 | std::size_t controller{}; | 94 | std::size_t controller{}; |
| 95 | supported_npad_id_types.resize(NPAD_ID_LIST.size()); | 95 | supported_npad_id_types.resize(npad_id_list.size()); |
| 96 | if (style.raw == 0) { | 96 | if (style.raw == 0) { |
| 97 | // We want to support all controllers | 97 | // We want to support all controllers |
| 98 | style.handheld.Assign(1); | 98 | style.handheld.Assign(1); |
| @@ -102,9 +102,9 @@ void Controller_NPad::OnInit() { | |||
| 102 | style.pro_controller.Assign(1); | 102 | style.pro_controller.Assign(1); |
| 103 | style.pokeball.Assign(1); | 103 | style.pokeball.Assign(1); |
| 104 | } | 104 | } |
| 105 | std::memcpy(supported_npad_id_types.data(), NPAD_ID_LIST.data(), | 105 | std::memcpy(supported_npad_id_types.data(), npad_id_list.data(), |
| 106 | NPAD_ID_LIST.size() * sizeof(u32)); | 106 | npad_id_list.size() * sizeof(u32)); |
| 107 | if (CONTROLLER_COUNT == 0) { | 107 | if (controller_count == 0) { |
| 108 | AddNewController(NPadControllerType::Handheld); | 108 | AddNewController(NPadControllerType::Handheld); |
| 109 | } | 109 | } |
| 110 | } | 110 | } |
| @@ -150,12 +150,12 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) { | |||
| 150 | cur_entry.timestamp2 = cur_entry.timestamp; | 150 | cur_entry.timestamp2 = cur_entry.timestamp; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | if (CONNECTED_CONTROLLERS[i] == NPadControllerType::None) { | 153 | const auto& controller_type = connected_controllers[i].type; |
| 154 | |||
| 155 | if (controller_type == NPadControllerType::None || !connected_controllers[i].is_connected) { | ||
| 154 | continue; | 156 | continue; |
| 155 | } | 157 | } |
| 156 | 158 | ||
| 157 | const auto& controller_type = CONNECTED_CONTROLLERS[i]; | ||
| 158 | |||
| 159 | // Pad states | 159 | // Pad states |
| 160 | ControllerPadState pad_state{}; | 160 | ControllerPadState pad_state{}; |
| 161 | using namespace Settings::NativeButton; | 161 | using namespace Settings::NativeButton; |
| @@ -312,7 +312,7 @@ void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode) | |||
| 312 | void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | 312 | void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, |
| 313 | const std::vector<Vibration>& vibrations) { | 313 | const std::vector<Vibration>& vibrations) { |
| 314 | for (std::size_t i = 0; i < controller_ids.size(); i++) { | 314 | for (std::size_t i = 0; i < controller_ids.size(); i++) { |
| 315 | if (i >= CONTROLLER_COUNT) { | 315 | if (i >= controller_count) { |
| 316 | continue; | 316 | continue; |
| 317 | } | 317 | } |
| 318 | // TODO(ogniK): Vibrate the physical controller | 318 | // TODO(ogniK): Vibrate the physical controller |
| @@ -329,11 +329,23 @@ Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { | |||
| 329 | return last_processed_vibration; | 329 | return last_processed_vibration; |
| 330 | } | 330 | } |
| 331 | void Controller_NPad::AddNewController(NPadControllerType controller) { | 331 | void Controller_NPad::AddNewController(NPadControllerType controller) { |
| 332 | if (CONTROLLER_COUNT >= CONNECTED_CONTROLLERS.size()) { | 332 | if (controller_count >= connected_controllers.size()) { |
| 333 | LOG_ERROR(Service_HID, "Cannot connect any more controllers!"); | 333 | LOG_ERROR(Service_HID, "Cannot connect any more controllers!"); |
| 334 | return; | 334 | return; |
| 335 | } | 335 | } |
| 336 | CONNECTED_CONTROLLERS[CONTROLLER_COUNT] = controller; | 336 | connected_controllers[controller_count] = {controller, true}; |
| 337 | InitNewlyAddedControler(CONTROLLER_COUNT++); | 337 | InitNewlyAddedControler(controller_count++); |
| 338 | } | ||
| 339 | |||
| 340 | void Controller_NPad::ConnectNPad(u32 npad_id) { | ||
| 341 | if (npad_id >= connected_controllers.size()) | ||
| 342 | return; | ||
| 343 | connected_controllers[npad_id].is_connected = true; | ||
| 344 | } | ||
| 345 | |||
| 346 | void Controller_NPad::DisconnectNPad(u32 npad_id) { | ||
| 347 | if (npad_id >= connected_controllers.size()) | ||
| 348 | return; | ||
| 349 | connected_controllers[npad_id].is_connected = false; | ||
| 338 | } | 350 | } |
| 339 | } // namespace Service::HID | 351 | } // namespace Service::HID |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 2d1614747..86ab0e429 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -91,6 +91,9 @@ public: | |||
| 91 | 91 | ||
| 92 | void AddNewController(NPadControllerType controller); | 92 | void AddNewController(NPadControllerType controller); |
| 93 | 93 | ||
| 94 | void ConnectNPad(u32 npad_id); | ||
| 95 | void DisconnectNPad(u32 npad_id); | ||
| 96 | |||
| 94 | private: | 97 | private: |
| 95 | struct CommonHeader { | 98 | struct CommonHeader { |
| 96 | s64_le timestamp; | 99 | s64_le timestamp; |
| @@ -235,6 +238,12 @@ private: | |||
| 235 | INSERT_PADDING_BYTES(0xdf8); | 238 | INSERT_PADDING_BYTES(0xdf8); |
| 236 | }; | 239 | }; |
| 237 | static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size"); | 240 | static_assert(sizeof(NPadEntry) == 0x5000, "NPadEntry is an invalid size"); |
| 241 | |||
| 242 | struct ControllerHolder { | ||
| 243 | Controller_NPad::NPadControllerType type; | ||
| 244 | bool is_connected; | ||
| 245 | }; | ||
| 246 | |||
| 238 | NPadType style{}; | 247 | NPadType style{}; |
| 239 | std::array<NPadEntry, 10> shared_memory_entries{}; | 248 | std::array<NPadEntry, 10> shared_memory_entries{}; |
| 240 | std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> | 249 | std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> |
| @@ -245,9 +254,9 @@ private: | |||
| 245 | Kernel::SharedPtr<Kernel::Event> styleset_changed_event; | 254 | Kernel::SharedPtr<Kernel::Event> styleset_changed_event; |
| 246 | std::size_t dump_idx{}; | 255 | std::size_t dump_idx{}; |
| 247 | Vibration last_processed_vibration{}; | 256 | Vibration last_processed_vibration{}; |
| 248 | std::size_t CONTROLLER_COUNT{}; | 257 | std::size_t controller_count{}; |
| 249 | const std::array<u32, 9> NPAD_ID_LIST{0, 1, 2, 3, 4, 5, 6, 7, 32}; | 258 | static constexpr std::array<u32, 9> npad_id_list{0, 1, 2, 3, 4, 5, 6, 7, 32}; |
| 250 | std::array<Controller_NPad::NPadControllerType, 9> CONNECTED_CONTROLLERS{}; | 259 | std::array<ControllerHolder, 9> connected_controllers{}; |
| 251 | 260 | ||
| 252 | void InitNewlyAddedControler(std::size_t controller_idx); | 261 | void InitNewlyAddedControler(std::size_t controller_idx); |
| 253 | }; | 262 | }; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index ba4aefa6c..dfee289d2 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -411,7 +411,10 @@ private: | |||
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | void DisconnectNpad(Kernel::HLERequestContext& ctx) { | 413 | void DisconnectNpad(Kernel::HLERequestContext& ctx) { |
| 414 | applet_resource->DeactivateController(HidController::NPad); | 414 | IPC::RequestParser rp{ctx}; |
| 415 | auto npad_id = rp.PopRaw<u32>(); | ||
| 416 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | ||
| 417 | .DisconnectNPad(npad_id); | ||
| 415 | IPC::ResponseBuilder rb{ctx, 2}; | 418 | IPC::ResponseBuilder rb{ctx, 2}; |
| 416 | rb.Push(RESULT_SUCCESS); | 419 | rb.Push(RESULT_SUCCESS); |
| 417 | LOG_DEBUG(Service_HID, "called"); | 420 | LOG_DEBUG(Service_HID, "called"); |