summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar David Marcec2018-10-07 20:17:04 +1100
committerGravatar David Marcec2018-10-10 13:15:39 +1100
commitf43815af5d59bb1b31696f317c2e2ce243445cb5 (patch)
treeae555da5a47ef99ea03b9f51b56eecb5072a16c7 /src
parentRemoved unneeded forward declarations (diff)
downloadyuzu-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.cpp36
-rw-r--r--src/core/hle/service/hid/controllers/npad.h15
-rw-r--r--src/core/hle/service/hid/hid.cpp5
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 };
33Controller_NPad::Controller_NPad() = default; 33Controller_NPad::Controller_NPad() = default;
34 34
35void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { 35void 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)
312void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, 312void 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}
331void Controller_NPad::AddNewController(NPadControllerType controller) { 331void 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
340void 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
346void 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
94private: 97private:
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");