diff options
| author | 2018-11-01 22:03:17 -0400 | |
|---|---|---|
| committer | 2018-11-18 23:22:36 -0500 | |
| commit | 55ded706d67a6f2dd6e01d0abf7351e69588ac3a (patch) | |
| tree | ab495e8522cfcfa00ef54b46a43f12583b03466a /src | |
| parent | hid/touchscreen: Update Touchscreen to use advanced parameters (diff) | |
| download | yuzu-55ded706d67a6f2dd6e01d0abf7351e69588ac3a.tar.gz yuzu-55ded706d67a6f2dd6e01d0abf7351e69588ac3a.tar.xz yuzu-55ded706d67a6f2dd6e01d0abf7351e69588ac3a.zip | |
hid/npad: Update NPad to use player controller bindings and type
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 154 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 9 |
2 files changed, 108 insertions, 55 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 3eb59599f..911ba3574 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -17,11 +17,6 @@ | |||
| 17 | #include "core/settings.h" | 17 | #include "core/settings.h" |
| 18 | 18 | ||
| 19 | namespace Service::HID { | 19 | namespace Service::HID { |
| 20 | |||
| 21 | constexpr u32 JOYCON_BODY_NEON_RED = 0xFF3C28; | ||
| 22 | constexpr u32 JOYCON_BUTTONS_NEON_RED = 0x1E0A0A; | ||
| 23 | constexpr u32 JOYCON_BODY_NEON_BLUE = 0x0AB9E6; | ||
| 24 | constexpr u32 JOYCON_BUTTONS_NEON_BLUE = 0x001E1E; | ||
| 25 | constexpr s32 HID_JOYSTICK_MAX = 0x7fff; | 20 | constexpr s32 HID_JOYSTICK_MAX = 0x7fff; |
| 26 | constexpr s32 HID_JOYSTICK_MIN = -0x7fff; | 21 | constexpr s32 HID_JOYSTICK_MIN = -0x7fff; |
| 27 | constexpr std::size_t NPAD_OFFSET = 0x9A00; | 22 | constexpr std::size_t NPAD_OFFSET = 0x9A00; |
| @@ -40,6 +35,22 @@ enum class JoystickId : std::size_t { | |||
| 40 | Joystick_Right, | 35 | Joystick_Right, |
| 41 | }; | 36 | }; |
| 42 | 37 | ||
| 38 | static Controller_NPad::NPadControllerType MapSettingsTypeToNPad(Settings::ControllerType type) { | ||
| 39 | switch (type) { | ||
| 40 | case Settings::ControllerType::ProController: | ||
| 41 | return Controller_NPad::NPadControllerType::ProController; | ||
| 42 | case Settings::ControllerType::DualJoycon: | ||
| 43 | return Controller_NPad::NPadControllerType::JoyDual; | ||
| 44 | case Settings::ControllerType::LeftJoycon: | ||
| 45 | return Controller_NPad::NPadControllerType::JoyLeft; | ||
| 46 | case Settings::ControllerType::RightJoycon: | ||
| 47 | return Controller_NPad::NPadControllerType::JoyRight; | ||
| 48 | default: | ||
| 49 | UNREACHABLE(); | ||
| 50 | return Controller_NPad::NPadControllerType::JoyDual; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 43 | static std::size_t NPadIdToIndex(u32 npad_id) { | 54 | static std::size_t NPadIdToIndex(u32 npad_id) { |
| 44 | switch (npad_id) { | 55 | switch (npad_id) { |
| 45 | case 0: | 56 | case 0: |
| @@ -126,10 +137,11 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | |||
| 126 | controller.single_color.button_color = 0; | 137 | controller.single_color.button_color = 0; |
| 127 | 138 | ||
| 128 | controller.dual_color_error = ColorReadError::ReadOk; | 139 | controller.dual_color_error = ColorReadError::ReadOk; |
| 129 | controller.left_color.body_color = JOYCON_BODY_NEON_BLUE; | 140 | controller.left_color.body_color = Settings::values.players[controller_idx].body_color_left; |
| 130 | controller.left_color.button_color = JOYCON_BUTTONS_NEON_BLUE; | 141 | controller.left_color.button_color = Settings::values.players[controller_idx].button_color_left; |
| 131 | controller.right_color.body_color = JOYCON_BODY_NEON_RED; | 142 | controller.right_color.body_color = Settings::values.players[controller_idx].body_color_right; |
| 132 | controller.right_color.button_color = JOYCON_BUTTONS_NEON_RED; | 143 | controller.right_color.button_color = |
| 144 | Settings::values.players[controller_idx].button_color_right; | ||
| 133 | 145 | ||
| 134 | controller.battery_level[0] = BATTERY_FULL; | 146 | controller.battery_level[0] = BATTERY_FULL; |
| 135 | controller.battery_level[1] = BATTERY_FULL; | 147 | controller.battery_level[1] = BATTERY_FULL; |
| @@ -154,6 +166,25 @@ void Controller_NPad::OnInit() { | |||
| 154 | style.pro_controller.Assign(1); | 166 | style.pro_controller.Assign(1); |
| 155 | style.pokeball.Assign(1); | 167 | style.pokeball.Assign(1); |
| 156 | } | 168 | } |
| 169 | |||
| 170 | std::transform( | ||
| 171 | Settings::values.players.begin(), Settings::values.players.end(), | ||
| 172 | connected_controllers.begin(), [](const Settings::PlayerInput& player) { | ||
| 173 | return ControllerHolder{MapSettingsTypeToNPad(player.type), player.connected}; | ||
| 174 | }); | ||
| 175 | |||
| 176 | std::stable_partition(connected_controllers.begin(), connected_controllers.begin() + 8, | ||
| 177 | [](const ControllerHolder& holder) { return holder.is_connected; }); | ||
| 178 | |||
| 179 | // Account for handheld | ||
| 180 | if (connected_controllers[8].is_connected) | ||
| 181 | connected_controllers[8].type = NPadControllerType::Handheld; | ||
| 182 | |||
| 183 | supported_npad_id_types.resize(npad_id_list.size()); | ||
| 184 | std::memcpy(supported_npad_id_types.data(), npad_id_list.data(), | ||
| 185 | npad_id_list.size() * sizeof(u32)); | ||
| 186 | |||
| 187 | // Add a default dual joycon controller if none are present. | ||
| 157 | if (std::none_of(connected_controllers.begin(), connected_controllers.end(), | 188 | if (std::none_of(connected_controllers.begin(), connected_controllers.end(), |
| 158 | [](const ControllerHolder& controller) { return controller.is_connected; })) { | 189 | [](const ControllerHolder& controller) { return controller.is_connected; })) { |
| 159 | supported_npad_id_types.resize(npad_id_list.size()); | 190 | supported_npad_id_types.resize(npad_id_list.size()); |
| @@ -161,15 +192,25 @@ void Controller_NPad::OnInit() { | |||
| 161 | npad_id_list.size() * sizeof(u32)); | 192 | npad_id_list.size() * sizeof(u32)); |
| 162 | AddNewController(PREFERRED_CONTROLLER); | 193 | AddNewController(PREFERRED_CONTROLLER); |
| 163 | } | 194 | } |
| 195 | |||
| 196 | for (std::size_t i = 0; i < connected_controllers.size(); ++i) { | ||
| 197 | const auto& controller = connected_controllers[i]; | ||
| 198 | if (controller.is_connected) { | ||
| 199 | AddNewControllerAt(controller.type, IndexToNPad(i)); | ||
| 200 | } | ||
| 201 | } | ||
| 164 | } | 202 | } |
| 165 | 203 | ||
| 166 | void Controller_NPad::OnLoadInputDevices() { | 204 | void Controller_NPad::OnLoadInputDevices() { |
| 167 | std::transform(Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN, | 205 | const auto& players = Settings::values.players; |
| 168 | Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_END, | 206 | for (std::size_t i = 0; i < players.size(); ++i) { |
| 169 | buttons.begin(), Input::CreateDevice<Input::ButtonDevice>); | 207 | std::transform(players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN, |
| 170 | std::transform(Settings::values.analogs.begin() + Settings::NativeAnalog::STICK_HID_BEGIN, | 208 | players[i].buttons.begin() + Settings::NativeButton::BUTTON_HID_END, |
| 171 | Settings::values.analogs.begin() + Settings::NativeAnalog::STICK_HID_END, | 209 | buttons[i].begin(), Input::CreateDevice<Input::ButtonDevice>); |
| 172 | sticks.begin(), Input::CreateDevice<Input::AnalogDevice>); | 210 | std::transform(players[i].analogs.begin() + Settings::NativeAnalog::STICK_HID_BEGIN, |
| 211 | players[i].analogs.begin() + Settings::NativeAnalog::STICK_HID_END, | ||
| 212 | sticks[i].begin(), Input::CreateDevice<Input::AnalogDevice>); | ||
| 213 | } | ||
| 173 | } | 214 | } |
| 174 | 215 | ||
| 175 | void Controller_NPad::OnRelease() {} | 216 | void Controller_NPad::OnRelease() {} |
| @@ -183,42 +224,45 @@ void Controller_NPad::RequestPadStateUpdate(u32 npad_id) { | |||
| 183 | auto& pad_state = npad_pad_states[controller_idx].pad_states; | 224 | auto& pad_state = npad_pad_states[controller_idx].pad_states; |
| 184 | auto& lstick_entry = npad_pad_states[controller_idx].l_stick; | 225 | auto& lstick_entry = npad_pad_states[controller_idx].l_stick; |
| 185 | auto& rstick_entry = npad_pad_states[controller_idx].r_stick; | 226 | auto& rstick_entry = npad_pad_states[controller_idx].r_stick; |
| 227 | const auto& button_state = buttons[controller_idx]; | ||
| 228 | const auto& analog_state = sticks[controller_idx]; | ||
| 229 | |||
| 186 | using namespace Settings::NativeButton; | 230 | using namespace Settings::NativeButton; |
| 187 | pad_state.a.Assign(buttons[A - BUTTON_HID_BEGIN]->GetStatus()); | 231 | pad_state.a.Assign(button_state[A - BUTTON_HID_BEGIN]->GetStatus()); |
| 188 | pad_state.b.Assign(buttons[B - BUTTON_HID_BEGIN]->GetStatus()); | 232 | pad_state.b.Assign(button_state[B - BUTTON_HID_BEGIN]->GetStatus()); |
| 189 | pad_state.x.Assign(buttons[X - BUTTON_HID_BEGIN]->GetStatus()); | 233 | pad_state.x.Assign(button_state[X - BUTTON_HID_BEGIN]->GetStatus()); |
| 190 | pad_state.y.Assign(buttons[Y - BUTTON_HID_BEGIN]->GetStatus()); | 234 | pad_state.y.Assign(button_state[Y - BUTTON_HID_BEGIN]->GetStatus()); |
| 191 | pad_state.l_stick.Assign(buttons[LStick - BUTTON_HID_BEGIN]->GetStatus()); | 235 | pad_state.l_stick.Assign(button_state[LStick - BUTTON_HID_BEGIN]->GetStatus()); |
| 192 | pad_state.r_stick.Assign(buttons[RStick - BUTTON_HID_BEGIN]->GetStatus()); | 236 | pad_state.r_stick.Assign(button_state[RStick - BUTTON_HID_BEGIN]->GetStatus()); |
| 193 | pad_state.l.Assign(buttons[L - BUTTON_HID_BEGIN]->GetStatus()); | 237 | pad_state.l.Assign(button_state[L - BUTTON_HID_BEGIN]->GetStatus()); |
| 194 | pad_state.r.Assign(buttons[R - BUTTON_HID_BEGIN]->GetStatus()); | 238 | pad_state.r.Assign(button_state[R - BUTTON_HID_BEGIN]->GetStatus()); |
| 195 | pad_state.zl.Assign(buttons[ZL - BUTTON_HID_BEGIN]->GetStatus()); | 239 | pad_state.zl.Assign(button_state[ZL - BUTTON_HID_BEGIN]->GetStatus()); |
| 196 | pad_state.zr.Assign(buttons[ZR - BUTTON_HID_BEGIN]->GetStatus()); | 240 | pad_state.zr.Assign(button_state[ZR - BUTTON_HID_BEGIN]->GetStatus()); |
| 197 | pad_state.plus.Assign(buttons[Plus - BUTTON_HID_BEGIN]->GetStatus()); | 241 | pad_state.plus.Assign(button_state[Plus - BUTTON_HID_BEGIN]->GetStatus()); |
| 198 | pad_state.minus.Assign(buttons[Minus - BUTTON_HID_BEGIN]->GetStatus()); | 242 | pad_state.minus.Assign(button_state[Minus - BUTTON_HID_BEGIN]->GetStatus()); |
| 199 | 243 | ||
| 200 | pad_state.d_left.Assign(buttons[DLeft - BUTTON_HID_BEGIN]->GetStatus()); | 244 | pad_state.d_left.Assign(button_state[DLeft - BUTTON_HID_BEGIN]->GetStatus()); |
| 201 | pad_state.d_up.Assign(buttons[DUp - BUTTON_HID_BEGIN]->GetStatus()); | 245 | pad_state.d_up.Assign(button_state[DUp - BUTTON_HID_BEGIN]->GetStatus()); |
| 202 | pad_state.d_right.Assign(buttons[DRight - BUTTON_HID_BEGIN]->GetStatus()); | 246 | pad_state.d_right.Assign(button_state[DRight - BUTTON_HID_BEGIN]->GetStatus()); |
| 203 | pad_state.d_down.Assign(buttons[DDown - BUTTON_HID_BEGIN]->GetStatus()); | 247 | pad_state.d_down.Assign(button_state[DDown - BUTTON_HID_BEGIN]->GetStatus()); |
| 204 | 248 | ||
| 205 | pad_state.l_stick_left.Assign(buttons[LStick_Left - BUTTON_HID_BEGIN]->GetStatus()); | 249 | pad_state.l_stick_left.Assign(button_state[LStick_Left - BUTTON_HID_BEGIN]->GetStatus()); |
| 206 | pad_state.l_stick_up.Assign(buttons[LStick_Up - BUTTON_HID_BEGIN]->GetStatus()); | 250 | pad_state.l_stick_up.Assign(button_state[LStick_Up - BUTTON_HID_BEGIN]->GetStatus()); |
| 207 | pad_state.l_stick_right.Assign(buttons[LStick_Right - BUTTON_HID_BEGIN]->GetStatus()); | 251 | pad_state.l_stick_right.Assign(button_state[LStick_Right - BUTTON_HID_BEGIN]->GetStatus()); |
| 208 | pad_state.l_stick_down.Assign(buttons[LStick_Down - BUTTON_HID_BEGIN]->GetStatus()); | 252 | pad_state.l_stick_down.Assign(button_state[LStick_Down - BUTTON_HID_BEGIN]->GetStatus()); |
| 209 | 253 | ||
| 210 | pad_state.r_stick_left.Assign(buttons[RStick_Left - BUTTON_HID_BEGIN]->GetStatus()); | 254 | pad_state.r_stick_left.Assign(button_state[RStick_Left - BUTTON_HID_BEGIN]->GetStatus()); |
| 211 | pad_state.r_stick_up.Assign(buttons[RStick_Up - BUTTON_HID_BEGIN]->GetStatus()); | 255 | pad_state.r_stick_up.Assign(button_state[RStick_Up - BUTTON_HID_BEGIN]->GetStatus()); |
| 212 | pad_state.r_stick_right.Assign(buttons[RStick_Right - BUTTON_HID_BEGIN]->GetStatus()); | 256 | pad_state.r_stick_right.Assign(button_state[RStick_Right - BUTTON_HID_BEGIN]->GetStatus()); |
| 213 | pad_state.r_stick_down.Assign(buttons[RStick_Down - BUTTON_HID_BEGIN]->GetStatus()); | 257 | pad_state.r_stick_down.Assign(button_state[RStick_Down - BUTTON_HID_BEGIN]->GetStatus()); |
| 214 | 258 | ||
| 215 | pad_state.left_sl.Assign(buttons[SL - BUTTON_HID_BEGIN]->GetStatus()); | 259 | pad_state.left_sl.Assign(button_state[SL - BUTTON_HID_BEGIN]->GetStatus()); |
| 216 | pad_state.left_sr.Assign(buttons[SR - BUTTON_HID_BEGIN]->GetStatus()); | 260 | pad_state.left_sr.Assign(button_state[SR - BUTTON_HID_BEGIN]->GetStatus()); |
| 217 | 261 | ||
| 218 | const auto [stick_l_x_f, stick_l_y_f] = | 262 | const auto [stick_l_x_f, stick_l_y_f] = |
| 219 | sticks[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetStatus(); | 263 | analog_state[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetStatus(); |
| 220 | const auto [stick_r_x_f, stick_r_y_f] = | 264 | const auto [stick_r_x_f, stick_r_y_f] = |
| 221 | sticks[static_cast<std::size_t>(JoystickId::Joystick_Right)]->GetStatus(); | 265 | analog_state[static_cast<std::size_t>(JoystickId::Joystick_Right)]->GetStatus(); |
| 222 | lstick_entry.x = static_cast<s32>(stick_l_x_f * HID_JOYSTICK_MAX); | 266 | lstick_entry.x = static_cast<s32>(stick_l_x_f * HID_JOYSTICK_MAX); |
| 223 | lstick_entry.y = static_cast<s32>(stick_l_y_f * HID_JOYSTICK_MAX); | 267 | lstick_entry.y = static_cast<s32>(stick_l_y_f * HID_JOYSTICK_MAX); |
| 224 | rstick_entry.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX); | 268 | rstick_entry.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX); |
| @@ -285,8 +329,10 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) { | |||
| 285 | state.d_left.Assign(pad_state.pad_states.d_up.Value()); | 329 | state.d_left.Assign(pad_state.pad_states.d_up.Value()); |
| 286 | state.d_right.Assign(pad_state.pad_states.d_down.Value()); | 330 | state.d_right.Assign(pad_state.pad_states.d_down.Value()); |
| 287 | state.d_up.Assign(pad_state.pad_states.d_right.Value()); | 331 | state.d_up.Assign(pad_state.pad_states.d_right.Value()); |
| 288 | state.l.Assign(pad_state.pad_states.l.Value() | pad_state.pad_states.sl.Value()); | 332 | state.l.Assign(pad_state.pad_states.l.Value() | |
| 289 | state.r.Assign(pad_state.pad_states.r.Value() | pad_state.pad_states.sr.Value()); | 333 | pad_state.pad_states.left_sl.Value()); |
| 334 | state.r.Assign(pad_state.pad_states.r.Value() | | ||
| 335 | pad_state.pad_states.left_sr.Value()); | ||
| 290 | 336 | ||
| 291 | state.zl.Assign(pad_state.pad_states.zl.Value()); | 337 | state.zl.Assign(pad_state.pad_states.zl.Value()); |
| 292 | state.plus.Assign(pad_state.pad_states.minus.Value()); | 338 | state.plus.Assign(pad_state.pad_states.minus.Value()); |
| @@ -302,8 +348,10 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) { | |||
| 302 | state.b.Assign(pad_state.pad_states.y.Value()); | 348 | state.b.Assign(pad_state.pad_states.y.Value()); |
| 303 | state.y.Assign(pad_state.pad_states.b.Value()); | 349 | state.y.Assign(pad_state.pad_states.b.Value()); |
| 304 | 350 | ||
| 305 | state.l.Assign(pad_state.pad_states.l.Value() | pad_state.pad_states.sl.Value()); | 351 | state.l.Assign(pad_state.pad_states.l.Value() | |
| 306 | state.r.Assign(pad_state.pad_states.r.Value() | pad_state.pad_states.sr.Value()); | 352 | pad_state.pad_states.right_sl.Value()); |
| 353 | state.r.Assign(pad_state.pad_states.r.Value() | | ||
| 354 | pad_state.pad_states.right_sr.Value()); | ||
| 307 | state.zr.Assign(pad_state.pad_states.zr.Value()); | 355 | state.zr.Assign(pad_state.pad_states.zr.Value()); |
| 308 | state.plus.Assign(pad_state.pad_states.plus.Value()); | 356 | state.plus.Assign(pad_state.pad_states.plus.Value()); |
| 309 | 357 | ||
| @@ -570,7 +618,7 @@ Controller_NPad::NPadControllerType Controller_NPad::DecideBestController( | |||
| 570 | if (IsControllerSupported(priority)) { | 618 | if (IsControllerSupported(priority)) { |
| 571 | return priority; | 619 | return priority; |
| 572 | } | 620 | } |
| 573 | const auto is_docked = Settings::values->use_docked_mode; | 621 | const auto is_docked = Settings::values.use_docked_mode; |
| 574 | if (is_docked && priority == NPadControllerType::Handheld) { | 622 | if (is_docked && priority == NPadControllerType::Handheld) { |
| 575 | priority = NPadControllerType::JoyDual; | 623 | priority = NPadControllerType::JoyDual; |
| 576 | if (IsControllerSupported(priority)) { | 624 | if (IsControllerSupported(priority)) { |
| @@ -659,7 +707,7 @@ bool Controller_NPad::IsControllerSupported(NPadControllerType controller) { | |||
| 659 | return false; | 707 | return false; |
| 660 | } | 708 | } |
| 661 | // Handheld should not be supported in docked mode | 709 | // Handheld should not be supported in docked mode |
| 662 | if (Settings::values->use_docked_mode) { | 710 | if (Settings::values.use_docked_mode) { |
| 663 | return false; | 711 | return false; |
| 664 | } | 712 | } |
| 665 | } | 713 | } |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 7222bca72..52f92a4f1 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -285,9 +285,14 @@ private: | |||
| 285 | 285 | ||
| 286 | NPadType style{}; | 286 | NPadType style{}; |
| 287 | std::array<NPadEntry, 10> shared_memory_entries{}; | 287 | std::array<NPadEntry, 10> shared_memory_entries{}; |
| 288 | std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> | 288 | std::array< |
| 289 | std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>, | ||
| 290 | 10> | ||
| 289 | buttons; | 291 | buttons; |
| 290 | std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID> sticks; | 292 | std::array< |
| 293 | std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>, | ||
| 294 | 10> | ||
| 295 | sticks; | ||
| 291 | std::vector<u32> supported_npad_id_types{}; | 296 | std::vector<u32> supported_npad_id_types{}; |
| 292 | NpadHoldType hold_type{NpadHoldType::Vertical}; | 297 | NpadHoldType hold_type{NpadHoldType::Vertical}; |
| 293 | Kernel::SharedPtr<Kernel::Event> styleset_changed_event; | 298 | Kernel::SharedPtr<Kernel::Event> styleset_changed_event; |