summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/hid/controllers/npad.cpp
diff options
context:
space:
mode:
authorDavid Marcec <dmarcecguzman@gmail.com>2018-10-06 05:14:42 +0200
committerDavid Marcec <dmarcecguzman@gmail.com>2018-10-10 04:15:37 +0200
commit5857aea94ef52186f64a6794adf418ba92329329 (patch)
tree24223b61b3165725a07bbf421817c1ec34b02abe /src/core/hle/service/hid/controllers/npad.cpp
parent"Better Hid" rework part 1 (diff)
downloadyuzu-5857aea94ef52186f64a6794adf418ba92329329.tar
yuzu-5857aea94ef52186f64a6794adf418ba92329329.tar.gz
yuzu-5857aea94ef52186f64a6794adf418ba92329329.tar.bz2
yuzu-5857aea94ef52186f64a6794adf418ba92329329.tar.lz
yuzu-5857aea94ef52186f64a6794adf418ba92329329.tar.xz
yuzu-5857aea94ef52186f64a6794adf418ba92329329.tar.zst
yuzu-5857aea94ef52186f64a6794adf418ba92329329.zip
Diffstat (limited to 'src/core/hle/service/hid/controllers/npad.cpp')
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp101
1 files changed, 52 insertions, 49 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index a53687b91..8a713a407 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -3,10 +3,14 @@
// Refer to the license.txt file included.
#pragma once
+
+#include <algorithm>
#include <array>
+#include <cstring>
#include "common/assert.h"
#include "common/bit_field.h"
#include "common/common_types.h"
+#include "common/logging/log.h"
#include "common/swap.h"
#include "core/core.h"
#include "core/core_timing.h"
@@ -22,15 +26,13 @@ constexpr u32 JOYCON_BODY_NEON_BLUE = 0x0AB9E6;
constexpr u32 JOYCON_BUTTONS_NEON_BLUE = 0x001E1E;
constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
constexpr s32 HID_JOYSTICK_MIN = -0x7fff;
-constexpr size_t NPAD_OFFSET = 0x9A00;
-constexpr size_t MAX_CONTROLLER_COUNT = 9;
+constexpr std::size_t NPAD_OFFSET = 0x9A00;
+
+enum class JoystickId : std::size_t { Joystick_Left, Joystick_Right };
-enum class JoystickId : size_t { Joystick_Left, Joystick_Right };
-constexpr std::array<u32, MAX_CONTROLLER_COUNT> NPAD_ID_LIST{0, 1, 2, 3, 4, 5, 6, 7, 32};
-size_t CONTROLLER_COUNT{};
-std::array<Controller_NPad::NPadControllerType, MAX_CONTROLLER_COUNT> CONNECTED_CONTROLLERS{};
+Controller_NPad::Controller_NPad() = default;
-void Controller_NPad::InitNewlyAddedControler(size_t controller_idx) {
+void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
const auto controller_type = CONNECTED_CONTROLLERS[controller_idx];
auto& controller = shared_memory_entries[controller_idx];
if (controller_type == NPadControllerType::None) {
@@ -79,7 +81,7 @@ void Controller_NPad::InitNewlyAddedControler(size_t controller_idx) {
controller.right_color.body_color = JOYCON_BODY_NEON_RED;
controller.right_color.button_color = JOYCON_BUTTONS_NEON_RED;
- controller.properties.is_verticle.Assign(1); // TODO(ogniK): Swap joycons orientations
+ controller.properties.is_vertical.Assign(1); // TODO(ogniK): Swap joycons orientations
}
void Controller_NPad::OnInit() {
@@ -89,7 +91,7 @@ void Controller_NPad::OnInit() {
if (!IsControllerActivated())
return;
- size_t controller{};
+ std::size_t controller{};
supported_npad_id_types.resize(NPAD_ID_LIST.size());
if (style.raw == 0) {
// We want to support all controllers
@@ -118,10 +120,10 @@ void Controller_NPad::OnLoadInputDevices() {
void Controller_NPad::OnRelease() {}
-void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
+void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
if (!IsControllerActivated())
return;
- for (size_t i = 0; i < shared_memory_entries.size(); i++) {
+ for (std::size_t i = 0; i < shared_memory_entries.size(); i++) {
auto& npad = shared_memory_entries[i];
const std::array<NPadGeneric*, 7> controller_npads{&npad.main_controller_states,
&npad.handheld_states,
@@ -131,11 +133,12 @@ void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
&npad.pokeball_states,
&npad.libnx};
- for (auto main_controller : controller_npads) {
+ for (auto* main_controller : controller_npads) {
main_controller->common.entry_count = 16;
main_controller->common.total_entry_count = 17;
- auto& last_entry = main_controller->npad[main_controller->common.last_entry_index];
+ const auto& last_entry =
+ main_controller->npad[main_controller->common.last_entry_index];
main_controller->common.timestamp = CoreTiming::GetTicks();
main_controller->common.last_entry_index =
@@ -154,7 +157,7 @@ void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
const auto& controller_type = CONNECTED_CONTROLLERS[i];
// Pad states
- auto pad_state = ControllerPadState{};
+ ControllerPadState pad_state{};
using namespace Settings::NativeButton;
pad_state.a.Assign(buttons[A - BUTTON_HID_BEGIN]->GetStatus());
pad_state.b.Assign(buttons[B - BUTTON_HID_BEGIN]->GetStatus());
@@ -169,20 +172,20 @@ void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
pad_state.plus.Assign(buttons[Plus - BUTTON_HID_BEGIN]->GetStatus());
pad_state.minus.Assign(buttons[Minus - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.dleft.Assign(buttons[DLeft - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.dup.Assign(buttons[DUp - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.dright.Assign(buttons[DRight - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.ddown.Assign(buttons[DDown - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.d_left.Assign(buttons[DLeft - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.d_up.Assign(buttons[DUp - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.d_right.Assign(buttons[DRight - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.d_down.Assign(buttons[DDown - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.lstickleft.Assign(buttons[LStick_Left - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.lstickup.Assign(buttons[LStick_Up - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.lstickright.Assign(buttons[LStick_Right - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.lstickdown.Assign(buttons[LStick_Down - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.l_stick_left.Assign(buttons[LStick_Left - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.l_stick_up.Assign(buttons[LStick_Up - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.l_stick_right.Assign(buttons[LStick_Right - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.l_stick_down.Assign(buttons[LStick_Down - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.rstickleft.Assign(buttons[RStick_Left - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.rstickup.Assign(buttons[RStick_Up - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.rstickright.Assign(buttons[RStick_Right - BUTTON_HID_BEGIN]->GetStatus());
- pad_state.rstickdown.Assign(buttons[RStick_Down - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.r_stick_left.Assign(buttons[RStick_Left - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.r_stick_up.Assign(buttons[RStick_Up - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.r_stick_right.Assign(buttons[RStick_Right - BUTTON_HID_BEGIN]->GetStatus());
+ pad_state.r_stick_down.Assign(buttons[RStick_Down - BUTTON_HID_BEGIN]->GetStatus());
pad_state.sl.Assign(buttons[SL - BUTTON_HID_BEGIN]->GetStatus());
pad_state.sr.Assign(buttons[SR - BUTTON_HID_BEGIN]->GetStatus());
@@ -191,9 +194,9 @@ void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
AnalogPosition rstick_entry{};
const auto [stick_l_x_f, stick_l_y_f] =
- sticks[static_cast<size_t>(JoystickId::Joystick_Left)]->GetStatus();
+ sticks[static_cast<std::size_t>(JoystickId::Joystick_Left)]->GetStatus();
const auto [stick_r_x_f, stick_r_y_f] =
- sticks[static_cast<size_t>(JoystickId::Joystick_Right)]->GetStatus();
+ sticks[static_cast<std::size_t>(JoystickId::Joystick_Right)]->GetStatus();
lstick_entry.x = static_cast<s32>(stick_l_x_f * HID_JOYSTICK_MAX);
lstick_entry.y = static_cast<s32>(stick_l_y_f * HID_JOYSTICK_MAX);
rstick_entry.x = static_cast<s32>(stick_r_x_f * HID_JOYSTICK_MAX);
@@ -220,26 +223,26 @@ void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
handheld_entry.connection_status.IsConnected.Assign(1);
handheld_entry.connection_status.IsWired.Assign(1);
handheld_entry.pad_states.raw = pad_state.raw;
- handheld_entry.lstick = lstick_entry;
- handheld_entry.rstick = rstick_entry;
+ handheld_entry.l_stick = lstick_entry;
+ handheld_entry.r_stick = rstick_entry;
break;
case NPadControllerType::JoyLeft:
left_entry.connection_status.IsConnected.Assign(1);
left_entry.pad_states.raw = pad_state.raw;
- left_entry.lstick = lstick_entry;
- left_entry.rstick = rstick_entry;
+ left_entry.l_stick = lstick_entry;
+ left_entry.r_stick = rstick_entry;
break;
case NPadControllerType::JoyRight:
right_entry.connection_status.IsConnected.Assign(1);
right_entry.pad_states.raw = pad_state.raw;
- right_entry.lstick = lstick_entry;
- right_entry.rstick = rstick_entry;
+ right_entry.l_stick = lstick_entry;
+ right_entry.r_stick = rstick_entry;
break;
case NPadControllerType::Tabletop:
// TODO(ogniK): Figure out how to add proper tabletop support
dual_entry.pad_states.raw = pad_state.raw;
- dual_entry.lstick = lstick_entry;
- dual_entry.rstick = rstick_entry;
+ dual_entry.l_stick = lstick_entry;
+ dual_entry.r_stick = rstick_entry;
dual_entry.connection_status.IsConnected.Assign(1);
break;
case NPadControllerType::Pokeball:
@@ -247,13 +250,13 @@ void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
pokeball_entry.connection_status.IsWired.Assign(1);
pokeball_entry.pad_states.raw = pad_state.raw;
- pokeball_entry.lstick = lstick_entry;
- pokeball_entry.rstick = rstick_entry;
+ pokeball_entry.l_stick = lstick_entry;
+ pokeball_entry.r_stick = rstick_entry;
break;
case NPadControllerType::ProController:
main_controller.pad_states.raw = pad_state.raw;
- main_controller.lstick = lstick_entry;
- main_controller.rstick = rstick_entry;
+ main_controller.l_stick = lstick_entry;
+ main_controller.r_stick = rstick_entry;
main_controller.connection_status.IsConnected.Assign(1);
main_controller.connection_status.IsWired.Assign(1);
break;
@@ -264,8 +267,8 @@ void Controller_NPad::OnUpdate(u8* data, size_t data_len) {
libnx_entry.connection_status.IsConnected.Assign(1);
libnx_entry.connection_status.IsWired.Assign(1);
libnx_entry.pad_states.raw = pad_state.raw;
- libnx_entry.lstick = lstick_entry;
- libnx_entry.rstick = rstick_entry;
+ libnx_entry.l_stick = lstick_entry;
+ libnx_entry.r_stick = rstick_entry;
}
std::memcpy(data + NPAD_OFFSET, shared_memory_entries.data(),
shared_memory_entries.size() * sizeof(NPadEntry));
@@ -279,18 +282,18 @@ Controller_NPad::NPadType Controller_NPad::GetSupportedStyleSet() const {
return style;
}
-void Controller_NPad::SetSupportedNPadIdTypes(u8* data, size_t length) {
+void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) {
ASSERT(length > 0 && (length % sizeof(u32)) == 0);
- supported_npad_id_types.resize(length / 4);
+ supported_npad_id_types.resize(length / sizeof(u32));
std::memcpy(supported_npad_id_types.data(), data, length);
}
-void Controller_NPad::GetSupportedNpadIdTypes(u32* data, size_t max_length) {
+const void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) {
ASSERT(max_length < supported_npad_id_types.size());
std::memcpy(data, supported_npad_id_types.data(), supported_npad_id_types.size());
}
-size_t Controller_NPad::GetSupportedNPadIdTypesSize() const {
+std::size_t Controller_NPad::GetSupportedNPadIdTypesSize() const {
return supported_npad_id_types.size();
}
@@ -308,7 +311,7 @@ void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode)
void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids,
const std::vector<Vibration>& vibrations) {
- for (size_t i = 0; i < controller_ids.size(); i++) {
+ for (std::size_t i = 0; i < controller_ids.size(); i++) {
if (i >= CONTROLLER_COUNT) {
continue;
}
@@ -326,11 +329,11 @@ Controller_NPad::Vibration Controller_NPad::GetLastVibration() const {
return last_processed_vibration;
}
void Controller_NPad::AddNewController(NPadControllerType controller) {
- if (CONTROLLER_COUNT >= MAX_CONTROLLER_COUNT) {
+ if (CONTROLLER_COUNT >= CONNECTED_CONTROLLERS.size()) {
LOG_ERROR(Service_HID, "Cannot connect any more controllers!");
return;
}
CONNECTED_CONTROLLERS[CONTROLLER_COUNT] = controller;
InitNewlyAddedControler(CONTROLLER_COUNT++);
}
-}; // namespace Service::HID
+} // namespace Service::HID