summaryrefslogtreecommitdiff
path: root/src/core/hid
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hid')
-rw-r--r--src/core/hid/emulated_console.h8
-rw-r--r--src/core/hid/emulated_controller.cpp144
-rw-r--r--src/core/hid/emulated_controller.h4
-rw-r--r--src/core/hid/hid_core.cpp5
-rw-r--r--src/core/hid/hid_types.h110
-rw-r--r--src/core/hid/input_interpreter.cpp11
-rw-r--r--src/core/hid/input_interpreter.h4
7 files changed, 174 insertions, 112 deletions
diff --git a/src/core/hid/emulated_console.h b/src/core/hid/emulated_console.h
index 79114bb6d..fae15a556 100644
--- a/src/core/hid/emulated_console.h
+++ b/src/core/hid/emulated_console.h
@@ -38,14 +38,6 @@ using TouchParams = std::array<Common::ParamPackage, MaxTouchDevices>;
38using ConsoleMotionValues = ConsoleMotionInfo; 38using ConsoleMotionValues = ConsoleMotionInfo;
39using TouchValues = std::array<Common::Input::TouchStatus, MaxTouchDevices>; 39using TouchValues = std::array<Common::Input::TouchStatus, MaxTouchDevices>;
40 40
41struct TouchFinger {
42 u64 last_touch{};
43 Common::Point<float> position{};
44 u32 id{};
45 TouchAttribute attribute{};
46 bool pressed{};
47};
48
49// Contains all motion related data that is used on the services 41// Contains all motion related data that is used on the services
50struct ConsoleMotion { 42struct ConsoleMotion {
51 Common::Vec3f accel{}; 43 Common::Vec3f accel{};
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 2af3f06fc..a6e681e15 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -8,6 +8,7 @@
8#include "common/thread.h" 8#include "common/thread.h"
9#include "core/hid/emulated_controller.h" 9#include "core/hid/emulated_controller.h"
10#include "core/hid/input_converter.h" 10#include "core/hid/input_converter.h"
11#include "core/hle/service/hid/hid_util.h"
11 12
12namespace Core::HID { 13namespace Core::HID {
13constexpr s32 HID_JOYSTICK_MAX = 0x7fff; 14constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
@@ -82,7 +83,7 @@ Settings::ControllerType EmulatedController::MapNPadToSettingsType(NpadStyleInde
82} 83}
83 84
84void EmulatedController::ReloadFromSettings() { 85void EmulatedController::ReloadFromSettings() {
85 const auto player_index = NpadIdTypeToIndex(npad_id_type); 86 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
86 const auto& player = Settings::values.players.GetValue()[player_index]; 87 const auto& player = Settings::values.players.GetValue()[player_index];
87 88
88 for (std::size_t index = 0; index < player.buttons.size(); ++index) { 89 for (std::size_t index = 0; index < player.buttons.size(); ++index) {
@@ -96,18 +97,7 @@ void EmulatedController::ReloadFromSettings() {
96 } 97 }
97 98
98 controller.color_values = {}; 99 controller.color_values = {};
99 controller.colors_state.fullkey = { 100 ReloadColorsFromSettings();
100 .body = GetNpadColor(player.body_color_left),
101 .button = GetNpadColor(player.button_color_left),
102 };
103 controller.colors_state.left = {
104 .body = GetNpadColor(player.body_color_left),
105 .button = GetNpadColor(player.button_color_left),
106 };
107 controller.colors_state.right = {
108 .body = GetNpadColor(player.body_color_right),
109 .button = GetNpadColor(player.button_color_right),
110 };
111 101
112 ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs); 102 ring_params[0] = Common::ParamPackage(Settings::values.ringcon_analogs);
113 103
@@ -128,6 +118,30 @@ void EmulatedController::ReloadFromSettings() {
128 ReloadInput(); 118 ReloadInput();
129} 119}
130 120
121void EmulatedController::ReloadColorsFromSettings() {
122 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
123 const auto& player = Settings::values.players.GetValue()[player_index];
124
125 // Avoid updating colors if overridden by physical controller
126 if (controller.color_values[LeftIndex].body != 0 &&
127 controller.color_values[RightIndex].body != 0) {
128 return;
129 }
130
131 controller.colors_state.fullkey = {
132 .body = GetNpadColor(player.body_color_left),
133 .button = GetNpadColor(player.button_color_left),
134 };
135 controller.colors_state.left = {
136 .body = GetNpadColor(player.body_color_left),
137 .button = GetNpadColor(player.button_color_left),
138 };
139 controller.colors_state.right = {
140 .body = GetNpadColor(player.body_color_right),
141 .button = GetNpadColor(player.button_color_right),
142 };
143}
144
131void EmulatedController::LoadDevices() { 145void EmulatedController::LoadDevices() {
132 // TODO(german77): Use more buttons to detect the correct device 146 // TODO(german77): Use more buttons to detect the correct device
133 const auto left_joycon = button_params[Settings::NativeButton::DRight]; 147 const auto left_joycon = button_params[Settings::NativeButton::DRight];
@@ -202,7 +216,7 @@ void EmulatedController::LoadDevices() {
202} 216}
203 217
204void EmulatedController::LoadTASParams() { 218void EmulatedController::LoadTASParams() {
205 const auto player_index = NpadIdTypeToIndex(npad_id_type); 219 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
206 Common::ParamPackage common_params{}; 220 Common::ParamPackage common_params{};
207 common_params.Set("engine", "tas"); 221 common_params.Set("engine", "tas");
208 common_params.Set("port", static_cast<int>(player_index)); 222 common_params.Set("port", static_cast<int>(player_index));
@@ -230,10 +244,12 @@ void EmulatedController::LoadTASParams() {
230 tas_button_params[Settings::NativeButton::DUp].Set("button", 13); 244 tas_button_params[Settings::NativeButton::DUp].Set("button", 13);
231 tas_button_params[Settings::NativeButton::DRight].Set("button", 14); 245 tas_button_params[Settings::NativeButton::DRight].Set("button", 14);
232 tas_button_params[Settings::NativeButton::DDown].Set("button", 15); 246 tas_button_params[Settings::NativeButton::DDown].Set("button", 15);
233 tas_button_params[Settings::NativeButton::SL].Set("button", 16); 247 tas_button_params[Settings::NativeButton::SLLeft].Set("button", 16);
234 tas_button_params[Settings::NativeButton::SR].Set("button", 17); 248 tas_button_params[Settings::NativeButton::SRLeft].Set("button", 17);
235 tas_button_params[Settings::NativeButton::Home].Set("button", 18); 249 tas_button_params[Settings::NativeButton::Home].Set("button", 18);
236 tas_button_params[Settings::NativeButton::Screenshot].Set("button", 19); 250 tas_button_params[Settings::NativeButton::Screenshot].Set("button", 19);
251 tas_button_params[Settings::NativeButton::SLRight].Set("button", 20);
252 tas_button_params[Settings::NativeButton::SRRight].Set("button", 21);
237 253
238 tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0); 254 tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
239 tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1); 255 tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
@@ -249,7 +265,7 @@ void EmulatedController::LoadTASParams() {
249} 265}
250 266
251void EmulatedController::LoadVirtualGamepadParams() { 267void EmulatedController::LoadVirtualGamepadParams() {
252 const auto player_index = NpadIdTypeToIndex(npad_id_type); 268 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
253 Common::ParamPackage common_params{}; 269 Common::ParamPackage common_params{};
254 common_params.Set("engine", "virtual_gamepad"); 270 common_params.Set("engine", "virtual_gamepad");
255 common_params.Set("port", static_cast<int>(player_index)); 271 common_params.Set("port", static_cast<int>(player_index));
@@ -283,10 +299,12 @@ void EmulatedController::LoadVirtualGamepadParams() {
283 virtual_button_params[Settings::NativeButton::DUp].Set("button", 13); 299 virtual_button_params[Settings::NativeButton::DUp].Set("button", 13);
284 virtual_button_params[Settings::NativeButton::DRight].Set("button", 14); 300 virtual_button_params[Settings::NativeButton::DRight].Set("button", 14);
285 virtual_button_params[Settings::NativeButton::DDown].Set("button", 15); 301 virtual_button_params[Settings::NativeButton::DDown].Set("button", 15);
286 virtual_button_params[Settings::NativeButton::SL].Set("button", 16); 302 virtual_button_params[Settings::NativeButton::SLLeft].Set("button", 16);
287 virtual_button_params[Settings::NativeButton::SR].Set("button", 17); 303 virtual_button_params[Settings::NativeButton::SRLeft].Set("button", 17);
288 virtual_button_params[Settings::NativeButton::Home].Set("button", 18); 304 virtual_button_params[Settings::NativeButton::Home].Set("button", 18);
289 virtual_button_params[Settings::NativeButton::Screenshot].Set("button", 19); 305 virtual_button_params[Settings::NativeButton::Screenshot].Set("button", 19);
306 virtual_button_params[Settings::NativeButton::SLRight].Set("button", 20);
307 virtual_button_params[Settings::NativeButton::SRRight].Set("button", 21);
290 308
291 virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0); 309 virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
292 virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1); 310 virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
@@ -491,9 +509,11 @@ void EmulatedController::ReloadInput() {
491 }); 509 });
492 } 510 }
493 turbo_button_state = 0; 511 turbo_button_state = 0;
512 is_initalized = true;
494} 513}
495 514
496void EmulatedController::UnloadInput() { 515void EmulatedController::UnloadInput() {
516 is_initalized = false;
497 for (auto& button : button_devices) { 517 for (auto& button : button_devices) {
498 button.reset(); 518 button.reset();
499 } 519 }
@@ -598,7 +618,7 @@ bool EmulatedController::IsConfiguring() const {
598} 618}
599 619
600void EmulatedController::SaveCurrentConfig() { 620void EmulatedController::SaveCurrentConfig() {
601 const auto player_index = NpadIdTypeToIndex(npad_id_type); 621 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
602 auto& player = Settings::values.players.GetValue()[player_index]; 622 auto& player = Settings::values.players.GetValue()[player_index];
603 player.connected = is_connected; 623 player.connected = is_connected;
604 player.controller_type = MapNPadToSettingsType(npad_type); 624 player.controller_type = MapNPadToSettingsType(npad_type);
@@ -854,12 +874,16 @@ void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback
854 controller.npad_button_state.down.Assign(current_status.value); 874 controller.npad_button_state.down.Assign(current_status.value);
855 controller.debug_pad_button_state.d_down.Assign(current_status.value); 875 controller.debug_pad_button_state.d_down.Assign(current_status.value);
856 break; 876 break;
857 case Settings::NativeButton::SL: 877 case Settings::NativeButton::SLLeft:
858 controller.npad_button_state.left_sl.Assign(current_status.value); 878 controller.npad_button_state.left_sl.Assign(current_status.value);
879 break;
880 case Settings::NativeButton::SLRight:
859 controller.npad_button_state.right_sl.Assign(current_status.value); 881 controller.npad_button_state.right_sl.Assign(current_status.value);
860 break; 882 break;
861 case Settings::NativeButton::SR: 883 case Settings::NativeButton::SRLeft:
862 controller.npad_button_state.left_sr.Assign(current_status.value); 884 controller.npad_button_state.left_sr.Assign(current_status.value);
885 break;
886 case Settings::NativeButton::SRRight:
863 controller.npad_button_state.right_sr.Assign(current_status.value); 887 controller.npad_button_state.right_sr.Assign(current_status.value);
864 break; 888 break;
865 case Settings::NativeButton::Home: 889 case Settings::NativeButton::Home:
@@ -1091,30 +1115,30 @@ void EmulatedController::SetBattery(const Common::Input::CallbackStatus& callbac
1091 1115
1092 bool is_charging = false; 1116 bool is_charging = false;
1093 bool is_powered = false; 1117 bool is_powered = false;
1094 NpadBatteryLevel battery_level = 0; 1118 NpadBatteryLevel battery_level = NpadBatteryLevel::Empty;
1095 switch (controller.battery_values[index]) { 1119 switch (controller.battery_values[index]) {
1096 case Common::Input::BatteryLevel::Charging: 1120 case Common::Input::BatteryLevel::Charging:
1097 is_charging = true; 1121 is_charging = true;
1098 is_powered = true; 1122 is_powered = true;
1099 battery_level = 6; 1123 battery_level = NpadBatteryLevel::Full;
1100 break; 1124 break;
1101 case Common::Input::BatteryLevel::Medium: 1125 case Common::Input::BatteryLevel::Medium:
1102 battery_level = 6; 1126 battery_level = NpadBatteryLevel::High;
1103 break; 1127 break;
1104 case Common::Input::BatteryLevel::Low: 1128 case Common::Input::BatteryLevel::Low:
1105 battery_level = 4; 1129 battery_level = NpadBatteryLevel::Low;
1106 break; 1130 break;
1107 case Common::Input::BatteryLevel::Critical: 1131 case Common::Input::BatteryLevel::Critical:
1108 battery_level = 2; 1132 battery_level = NpadBatteryLevel::Critical;
1109 break; 1133 break;
1110 case Common::Input::BatteryLevel::Empty: 1134 case Common::Input::BatteryLevel::Empty:
1111 battery_level = 0; 1135 battery_level = NpadBatteryLevel::Empty;
1112 break; 1136 break;
1113 case Common::Input::BatteryLevel::None: 1137 case Common::Input::BatteryLevel::None:
1114 case Common::Input::BatteryLevel::Full: 1138 case Common::Input::BatteryLevel::Full:
1115 default: 1139 default:
1116 is_powered = true; 1140 is_powered = true;
1117 battery_level = 8; 1141 battery_level = NpadBatteryLevel::Full;
1118 break; 1142 break;
1119 } 1143 }
1120 1144
@@ -1185,13 +1209,16 @@ void EmulatedController::SetNfc(const Common::Input::CallbackStatus& callback) {
1185} 1209}
1186 1210
1187bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { 1211bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) {
1212 if (!is_initalized) {
1213 return false;
1214 }
1188 if (device_index >= output_devices.size()) { 1215 if (device_index >= output_devices.size()) {
1189 return false; 1216 return false;
1190 } 1217 }
1191 if (!output_devices[device_index]) { 1218 if (!output_devices[device_index]) {
1192 return false; 1219 return false;
1193 } 1220 }
1194 const auto player_index = NpadIdTypeToIndex(npad_id_type); 1221 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
1195 const auto& player = Settings::values.players.GetValue()[player_index]; 1222 const auto& player = Settings::values.players.GetValue()[player_index];
1196 const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f; 1223 const f32 strength = static_cast<f32>(player.vibration_strength) / 100.0f;
1197 1224
@@ -1217,9 +1244,13 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v
1217} 1244}
1218 1245
1219bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { 1246bool EmulatedController::IsVibrationEnabled(std::size_t device_index) {
1220 const auto player_index = NpadIdTypeToIndex(npad_id_type); 1247 const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type);
1221 const auto& player = Settings::values.players.GetValue()[player_index]; 1248 const auto& player = Settings::values.players.GetValue()[player_index];
1222 1249
1250 if (!is_initalized) {
1251 return false;
1252 }
1253
1223 if (!player.vibration_enabled) { 1254 if (!player.vibration_enabled) {
1224 return false; 1255 return false;
1225 } 1256 }
@@ -1239,6 +1270,10 @@ Common::Input::DriverResult EmulatedController::SetPollingMode(
1239 EmulatedDeviceIndex device_index, Common::Input::PollingMode polling_mode) { 1270 EmulatedDeviceIndex device_index, Common::Input::PollingMode polling_mode) {
1240 LOG_INFO(Service_HID, "Set polling mode {}, device_index={}", polling_mode, device_index); 1271 LOG_INFO(Service_HID, "Set polling mode {}, device_index={}", polling_mode, device_index);
1241 1272
1273 if (!is_initalized) {
1274 return Common::Input::DriverResult::InvalidHandle;
1275 }
1276
1242 auto& left_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Left)]; 1277 auto& left_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Left)];
1243 auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1278 auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1244 auto& nfc_output_device = output_devices[3]; 1279 auto& nfc_output_device = output_devices[3];
@@ -1284,6 +1319,10 @@ bool EmulatedController::SetCameraFormat(
1284 Core::IrSensor::ImageTransferProcessorFormat camera_format) { 1319 Core::IrSensor::ImageTransferProcessorFormat camera_format) {
1285 LOG_INFO(Service_HID, "Set camera format {}", camera_format); 1320 LOG_INFO(Service_HID, "Set camera format {}", camera_format);
1286 1321
1322 if (!is_initalized) {
1323 return false;
1324 }
1325
1287 auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1326 auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1288 auto& camera_output_device = output_devices[2]; 1327 auto& camera_output_device = output_devices[2];
1289 1328
@@ -1307,6 +1346,11 @@ void EmulatedController::SetRingParam(Common::ParamPackage param) {
1307} 1346}
1308 1347
1309bool EmulatedController::HasNfc() const { 1348bool EmulatedController::HasNfc() const {
1349
1350 if (!is_initalized) {
1351 return false;
1352 }
1353
1310 const auto& nfc_output_device = output_devices[3]; 1354 const auto& nfc_output_device = output_devices[3];
1311 1355
1312 switch (npad_type) { 1356 switch (npad_type) {
@@ -1344,6 +1388,10 @@ bool EmulatedController::RemoveNfcHandle() {
1344} 1388}
1345 1389
1346bool EmulatedController::StartNfcPolling() { 1390bool EmulatedController::StartNfcPolling() {
1391 if (!is_initalized) {
1392 return false;
1393 }
1394
1347 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1395 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1348 auto& nfc_virtual_output_device = output_devices[3]; 1396 auto& nfc_virtual_output_device = output_devices[3];
1349 1397
@@ -1355,6 +1403,10 @@ bool EmulatedController::StartNfcPolling() {
1355} 1403}
1356 1404
1357bool EmulatedController::StopNfcPolling() { 1405bool EmulatedController::StopNfcPolling() {
1406 if (!is_initalized) {
1407 return false;
1408 }
1409
1358 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1410 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1359 auto& nfc_virtual_output_device = output_devices[3]; 1411 auto& nfc_virtual_output_device = output_devices[3];
1360 1412
@@ -1366,6 +1418,10 @@ bool EmulatedController::StopNfcPolling() {
1366} 1418}
1367 1419
1368bool EmulatedController::ReadAmiiboData(std::vector<u8>& data) { 1420bool EmulatedController::ReadAmiiboData(std::vector<u8>& data) {
1421 if (!is_initalized) {
1422 return false;
1423 }
1424
1369 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1425 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1370 auto& nfc_virtual_output_device = output_devices[3]; 1426 auto& nfc_virtual_output_device = output_devices[3];
1371 1427
@@ -1378,6 +1434,10 @@ bool EmulatedController::ReadAmiiboData(std::vector<u8>& data) {
1378 1434
1379bool EmulatedController::ReadMifareData(const Common::Input::MifareRequest& request, 1435bool EmulatedController::ReadMifareData(const Common::Input::MifareRequest& request,
1380 Common::Input::MifareRequest& out_data) { 1436 Common::Input::MifareRequest& out_data) {
1437 if (!is_initalized) {
1438 return false;
1439 }
1440
1381 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1441 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1382 auto& nfc_virtual_output_device = output_devices[3]; 1442 auto& nfc_virtual_output_device = output_devices[3];
1383 1443
@@ -1390,6 +1450,10 @@ bool EmulatedController::ReadMifareData(const Common::Input::MifareRequest& requ
1390} 1450}
1391 1451
1392bool EmulatedController::WriteMifareData(const Common::Input::MifareRequest& request) { 1452bool EmulatedController::WriteMifareData(const Common::Input::MifareRequest& request) {
1453 if (!is_initalized) {
1454 return false;
1455 }
1456
1393 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1457 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1394 auto& nfc_virtual_output_device = output_devices[3]; 1458 auto& nfc_virtual_output_device = output_devices[3];
1395 1459
@@ -1401,6 +1465,10 @@ bool EmulatedController::WriteMifareData(const Common::Input::MifareRequest& req
1401} 1465}
1402 1466
1403bool EmulatedController::WriteNfc(const std::vector<u8>& data) { 1467bool EmulatedController::WriteNfc(const std::vector<u8>& data) {
1468 if (!is_initalized) {
1469 return false;
1470 }
1471
1404 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; 1472 auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
1405 auto& nfc_virtual_output_device = output_devices[3]; 1473 auto& nfc_virtual_output_device = output_devices[3];
1406 1474
@@ -1412,6 +1480,10 @@ bool EmulatedController::WriteNfc(const std::vector<u8>& data) {
1412} 1480}
1413 1481
1414void EmulatedController::SetLedPattern() { 1482void EmulatedController::SetLedPattern() {
1483 if (!is_initalized) {
1484 return;
1485 }
1486
1415 for (auto& device : output_devices) { 1487 for (auto& device : output_devices) {
1416 if (!device) { 1488 if (!device) {
1417 continue; 1489 continue;
@@ -1627,7 +1699,7 @@ void EmulatedController::SetNpadStyleIndex(NpadStyleIndex npad_type_) {
1627 } 1699 }
1628 if (is_connected) { 1700 if (is_connected) {
1629 LOG_WARNING(Service_HID, "Controller {} type changed while it's connected", 1701 LOG_WARNING(Service_HID, "Controller {} type changed while it's connected",
1630 NpadIdTypeToIndex(npad_id_type)); 1702 Service::HID::NpadIdTypeToIndex(npad_id_type));
1631 } 1703 }
1632 npad_type = npad_type_; 1704 npad_type = npad_type_;
1633} 1705}
@@ -1877,12 +1949,16 @@ NpadButton EmulatedController::GetTurboButtonMask() const {
1877 case Settings::NativeButton::DDown: 1949 case Settings::NativeButton::DDown:
1878 button_mask.down.Assign(1); 1950 button_mask.down.Assign(1);
1879 break; 1951 break;
1880 case Settings::NativeButton::SL: 1952 case Settings::NativeButton::SLLeft:
1881 button_mask.left_sl.Assign(1); 1953 button_mask.left_sl.Assign(1);
1954 break;
1955 case Settings::NativeButton::SLRight:
1882 button_mask.right_sl.Assign(1); 1956 button_mask.right_sl.Assign(1);
1883 break; 1957 break;
1884 case Settings::NativeButton::SR: 1958 case Settings::NativeButton::SRLeft:
1885 button_mask.left_sr.Assign(1); 1959 button_mask.left_sr.Assign(1);
1960 break;
1961 case Settings::NativeButton::SRRight:
1886 button_mask.right_sr.Assign(1); 1962 button_mask.right_sr.Assign(1);
1887 break; 1963 break;
1888 default: 1964 default:
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h
index d4500583e..d6e20ab66 100644
--- a/src/core/hid/emulated_controller.h
+++ b/src/core/hid/emulated_controller.h
@@ -253,6 +253,9 @@ public:
253 /// Overrides current mapped devices with the stored configuration and reloads all input devices 253 /// Overrides current mapped devices with the stored configuration and reloads all input devices
254 void ReloadFromSettings(); 254 void ReloadFromSettings();
255 255
256 /// Updates current colors with the ones stored in the configuration
257 void ReloadColorsFromSettings();
258
256 /// Saves the current mapped configuration 259 /// Saves the current mapped configuration
257 void SaveCurrentConfig(); 260 void SaveCurrentConfig();
258 261
@@ -556,6 +559,7 @@ private:
556 NpadStyleTag supported_style_tag{NpadStyleSet::All}; 559 NpadStyleTag supported_style_tag{NpadStyleSet::All};
557 bool is_connected{false}; 560 bool is_connected{false};
558 bool is_configuring{false}; 561 bool is_configuring{false};
562 bool is_initalized{false};
559 bool system_buttons_enabled{true}; 563 bool system_buttons_enabled{true};
560 f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard}; 564 f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard};
561 u32 turbo_button_state{0}; 565 u32 turbo_button_state{0};
diff --git a/src/core/hid/hid_core.cpp b/src/core/hid/hid_core.cpp
index cf53c04d9..2cf25a870 100644
--- a/src/core/hid/hid_core.cpp
+++ b/src/core/hid/hid_core.cpp
@@ -6,6 +6,7 @@
6#include "core/hid/emulated_controller.h" 6#include "core/hid/emulated_controller.h"
7#include "core/hid/emulated_devices.h" 7#include "core/hid/emulated_devices.h"
8#include "core/hid/hid_core.h" 8#include "core/hid/hid_core.h"
9#include "core/hle/service/hid/hid_util.h"
9 10
10namespace Core::HID { 11namespace Core::HID {
11 12
@@ -98,11 +99,11 @@ const EmulatedDevices* HIDCore::GetEmulatedDevices() const {
98} 99}
99 100
100EmulatedController* HIDCore::GetEmulatedControllerByIndex(std::size_t index) { 101EmulatedController* HIDCore::GetEmulatedControllerByIndex(std::size_t index) {
101 return GetEmulatedController(IndexToNpadIdType(index)); 102 return GetEmulatedController(Service::HID::IndexToNpadIdType(index));
102} 103}
103 104
104const EmulatedController* HIDCore::GetEmulatedControllerByIndex(std::size_t index) const { 105const EmulatedController* HIDCore::GetEmulatedControllerByIndex(std::size_t index) const {
105 return GetEmulatedController(IndexToNpadIdType(index)); 106 return GetEmulatedController(Service::HID::IndexToNpadIdType(index));
106} 107}
107 108
108void HIDCore::SetSupportedStyleTag(NpadStyleTag style_tag) { 109void HIDCore::SetSupportedStyleTag(NpadStyleTag style_tag) {
diff --git a/src/core/hid/hid_types.h b/src/core/hid/hid_types.h
index 00beb40dd..4bf285f36 100644
--- a/src/core/hid/hid_types.h
+++ b/src/core/hid/hid_types.h
@@ -8,6 +8,7 @@
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "common/point.h" 9#include "common/point.h"
10#include "common/uuid.h" 10#include "common/uuid.h"
11#include "common/vector_math.h"
11 12
12namespace Core::HID { 13namespace Core::HID {
13 14
@@ -218,6 +219,13 @@ enum class NpadIdType : u32 {
218 Invalid = 0xFFFFFFFF, 219 Invalid = 0xFFFFFFFF,
219}; 220};
220 221
222enum class NpadInterfaceType : u8 {
223 Bluetooth = 1,
224 Rail = 2,
225 Usb = 3,
226 Embedded = 4,
227};
228
221// This is nn::hid::NpadStyleIndex 229// This is nn::hid::NpadStyleIndex
222enum class NpadStyleIndex : u8 { 230enum class NpadStyleIndex : u8 {
223 None = 0, 231 None = 0,
@@ -302,6 +310,15 @@ enum class TouchScreenModeForNx : u8 {
302 Heat2, 310 Heat2,
303}; 311};
304 312
313// This is nn::hid::system::NpadBatteryLevel
314enum class NpadBatteryLevel : u32 {
315 Empty,
316 Critical,
317 Low,
318 High,
319 Full,
320};
321
305// This is nn::hid::NpadStyleTag 322// This is nn::hid::NpadStyleTag
306struct NpadStyleTag { 323struct NpadStyleTag {
307 union { 324 union {
@@ -347,6 +364,14 @@ struct TouchState {
347}; 364};
348static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size"); 365static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size");
349 366
367struct TouchFinger {
368 u64 last_touch{};
369 Common::Point<float> position{};
370 u32 id{};
371 TouchAttribute attribute{};
372 bool pressed{};
373};
374
350// This is nn::hid::TouchScreenConfigurationForNx 375// This is nn::hid::TouchScreenConfigurationForNx
351struct TouchScreenConfigurationForNx { 376struct TouchScreenConfigurationForNx {
352 TouchScreenModeForNx mode{TouchScreenModeForNx::UseSystemSetting}; 377 TouchScreenModeForNx mode{TouchScreenModeForNx::UseSystemSetting};
@@ -385,16 +410,12 @@ struct NpadGcTriggerState {
385}; 410};
386static_assert(sizeof(NpadGcTriggerState) == 0x10, "NpadGcTriggerState is an invalid size"); 411static_assert(sizeof(NpadGcTriggerState) == 0x10, "NpadGcTriggerState is an invalid size");
387 412
388// This is nn::hid::system::NpadBatteryLevel
389using NpadBatteryLevel = u32;
390static_assert(sizeof(NpadBatteryLevel) == 0x4, "NpadBatteryLevel is an invalid size");
391
392// This is nn::hid::system::NpadPowerInfo 413// This is nn::hid::system::NpadPowerInfo
393struct NpadPowerInfo { 414struct NpadPowerInfo {
394 bool is_powered{}; 415 bool is_powered{};
395 bool is_charging{}; 416 bool is_charging{};
396 INSERT_PADDING_BYTES(0x6); 417 INSERT_PADDING_BYTES(0x6);
397 NpadBatteryLevel battery_level{8}; 418 NpadBatteryLevel battery_level{NpadBatteryLevel::Full};
398}; 419};
399static_assert(sizeof(NpadPowerInfo) == 0xC, "NpadPowerInfo is an invalid size"); 420static_assert(sizeof(NpadPowerInfo) == 0xC, "NpadPowerInfo is an invalid size");
400 421
@@ -578,6 +599,29 @@ struct SixAxisSensorIcInformation {
578static_assert(sizeof(SixAxisSensorIcInformation) == 0xC8, 599static_assert(sizeof(SixAxisSensorIcInformation) == 0xC8,
579 "SixAxisSensorIcInformation is an invalid size"); 600 "SixAxisSensorIcInformation is an invalid size");
580 601
602// This is nn::hid::SixAxisSensorAttribute
603struct SixAxisSensorAttribute {
604 union {
605 u32 raw{};
606 BitField<0, 1, u32> is_connected;
607 BitField<1, 1, u32> is_interpolated;
608 };
609};
610static_assert(sizeof(SixAxisSensorAttribute) == 4, "SixAxisSensorAttribute is an invalid size");
611
612// This is nn::hid::SixAxisSensorState
613struct SixAxisSensorState {
614 s64 delta_time{};
615 s64 sampling_number{};
616 Common::Vec3f accel{};
617 Common::Vec3f gyro{};
618 Common::Vec3f rotation{};
619 std::array<Common::Vec3f, 3> orientation{};
620 SixAxisSensorAttribute attribute{};
621 INSERT_PADDING_BYTES(4); // Reserved
622};
623static_assert(sizeof(SixAxisSensorState) == 0x60, "SixAxisSensorState is an invalid size");
624
581// This is nn::hid::VibrationDeviceHandle 625// This is nn::hid::VibrationDeviceHandle
582struct VibrationDeviceHandle { 626struct VibrationDeviceHandle {
583 NpadStyleIndex npad_type{NpadStyleIndex::None}; 627 NpadStyleIndex npad_type{NpadStyleIndex::None};
@@ -688,60 +732,4 @@ struct UniquePadId {
688}; 732};
689static_assert(sizeof(UniquePadId) == 0x8, "UniquePadId is an invalid size"); 733static_assert(sizeof(UniquePadId) == 0x8, "UniquePadId is an invalid size");
690 734
691/// Converts a NpadIdType to an array index.
692constexpr size_t NpadIdTypeToIndex(NpadIdType npad_id_type) {
693 switch (npad_id_type) {
694 case NpadIdType::Player1:
695 return 0;
696 case NpadIdType::Player2:
697 return 1;
698 case NpadIdType::Player3:
699 return 2;
700 case NpadIdType::Player4:
701 return 3;
702 case NpadIdType::Player5:
703 return 4;
704 case NpadIdType::Player6:
705 return 5;
706 case NpadIdType::Player7:
707 return 6;
708 case NpadIdType::Player8:
709 return 7;
710 case NpadIdType::Handheld:
711 return 8;
712 case NpadIdType::Other:
713 return 9;
714 default:
715 return 0;
716 }
717}
718
719/// Converts an array index to a NpadIdType
720constexpr NpadIdType IndexToNpadIdType(size_t index) {
721 switch (index) {
722 case 0:
723 return NpadIdType::Player1;
724 case 1:
725 return NpadIdType::Player2;
726 case 2:
727 return NpadIdType::Player3;
728 case 3:
729 return NpadIdType::Player4;
730 case 4:
731 return NpadIdType::Player5;
732 case 5:
733 return NpadIdType::Player6;
734 case 6:
735 return NpadIdType::Player7;
736 case 7:
737 return NpadIdType::Player8;
738 case 8:
739 return NpadIdType::Handheld;
740 case 9:
741 return NpadIdType::Other;
742 default:
743 return NpadIdType::Invalid;
744 }
745}
746
747} // namespace Core::HID 735} // namespace Core::HID
diff --git a/src/core/hid/input_interpreter.cpp b/src/core/hid/input_interpreter.cpp
index 76d6b8ab0..a6bdd28f2 100644
--- a/src/core/hid/input_interpreter.cpp
+++ b/src/core/hid/input_interpreter.cpp
@@ -5,21 +5,22 @@
5#include "core/hid/hid_types.h" 5#include "core/hid/hid_types.h"
6#include "core/hid/input_interpreter.h" 6#include "core/hid/input_interpreter.h"
7#include "core/hle/service/hid/controllers/npad.h" 7#include "core/hle/service/hid/controllers/npad.h"
8#include "core/hle/service/hid/hid.h" 8#include "core/hle/service/hid/hid_server.h"
9#include "core/hle/service/hid/resource_manager.h"
9#include "core/hle/service/sm/sm.h" 10#include "core/hle/service/sm/sm.h"
10 11
11InputInterpreter::InputInterpreter(Core::System& system) 12InputInterpreter::InputInterpreter(Core::System& system)
12 : npad{system.ServiceManager() 13 : npad{system.ServiceManager()
13 .GetService<Service::HID::Hid>("hid") 14 .GetService<Service::HID::IHidServer>("hid")
14 ->GetAppletResource() 15 ->GetResourceManager()
15 ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)} { 16 ->GetNpad()} {
16 ResetButtonStates(); 17 ResetButtonStates();
17} 18}
18 19
19InputInterpreter::~InputInterpreter() = default; 20InputInterpreter::~InputInterpreter() = default;
20 21
21void InputInterpreter::PollInput() { 22void InputInterpreter::PollInput() {
22 const auto button_state = npad.GetAndResetPressState(); 23 const auto button_state = npad->GetAndResetPressState();
23 24
24 previous_index = current_index; 25 previous_index = current_index;
25 current_index = (current_index + 1) % button_states.size(); 26 current_index = (current_index + 1) % button_states.size();
diff --git a/src/core/hid/input_interpreter.h b/src/core/hid/input_interpreter.h
index 8c521b381..3569aac93 100644
--- a/src/core/hid/input_interpreter.h
+++ b/src/core/hid/input_interpreter.h
@@ -16,7 +16,7 @@ enum class NpadButton : u64;
16} 16}
17 17
18namespace Service::HID { 18namespace Service::HID {
19class Controller_NPad; 19class NPad;
20} 20}
21 21
22/** 22/**
@@ -101,7 +101,7 @@ public:
101 } 101 }
102 102
103private: 103private:
104 Service::HID::Controller_NPad& npad; 104 std::shared_ptr<Service::HID::NPad> npad;
105 105
106 /// Stores 9 consecutive button states polled from HID. 106 /// Stores 9 consecutive button states polled from HID.
107 std::array<Core::HID::NpadButton, 9> button_states{}; 107 std::array<Core::HID::NpadButton, 9> button_states{};