summaryrefslogtreecommitdiffstats
path: root/src/core/hid
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hid')
-rw-r--r--src/core/hid/emulated_console.cpp21
-rw-r--r--src/core/hid/emulated_console.h32
-rw-r--r--src/core/hid/emulated_controller.cpp144
-rw-r--r--src/core/hid/emulated_controller.h85
-rw-r--r--src/core/hid/emulated_devices.cpp66
-rw-r--r--src/core/hid/emulated_devices.h49
-rw-r--r--src/core/hid/hid_core.cpp46
-rw-r--r--src/core/hid/hid_core.h11
-rw-r--r--src/core/hid/hid_types.h4
-rw-r--r--src/core/hid/input_converter.h23
-rw-r--r--src/core/hid/input_interpreter.cpp16
-rw-r--r--src/core/hid/input_interpreter.h2
12 files changed, 325 insertions, 174 deletions
diff --git a/src/core/hid/emulated_console.cpp b/src/core/hid/emulated_console.cpp
index 80db8e9c6..685ec080c 100644
--- a/src/core/hid/emulated_console.cpp
+++ b/src/core/hid/emulated_console.cpp
@@ -66,9 +66,10 @@ void EmulatedConsole::ReloadInput() {
motion_devices = Common::Input::CreateDevice<Common::Input::InputDevice>(motion_params);
if (motion_devices) {
- Common::Input::InputCallback motion_callback{
- [this](Common::Input::CallbackStatus callback) { SetMotion(callback); }};
- motion_devices->SetCallback(motion_callback);
+ motion_devices->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback) { SetMotion(callback); },
+ });
}
// Unique index for identifying touch device source
@@ -78,9 +79,12 @@ void EmulatedConsole::ReloadInput() {
if (!touch_device) {
continue;
}
- Common::Input::InputCallback touch_callback{
- [this, index](Common::Input::CallbackStatus callback) { SetTouch(callback, index); }};
- touch_device->SetCallback(touch_callback);
+ touch_device->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetTouch(callback, index);
+ },
+ });
index++;
}
}
@@ -127,7 +131,7 @@ void EmulatedConsole::SetMotionParam(Common::ParamPackage param) {
ReloadInput();
}
-void EmulatedConsole::SetMotion(Common::Input::CallbackStatus callback) {
+void EmulatedConsole::SetMotion(const Common::Input::CallbackStatus& callback) {
std::lock_guard lock{mutex};
auto& raw_status = console.motion_values.raw_status;
auto& emulated = console.motion_values.emulated;
@@ -162,8 +166,7 @@ void EmulatedConsole::SetMotion(Common::Input::CallbackStatus callback) {
TriggerOnChange(ConsoleTriggerType::Motion);
}
-void EmulatedConsole::SetTouch(Common::Input::CallbackStatus callback,
- [[maybe_unused]] std::size_t index) {
+void EmulatedConsole::SetTouch(const Common::Input::CallbackStatus& callback, std::size_t index) {
if (index >= console.touch_values.size()) {
return;
}
diff --git a/src/core/hid/emulated_console.h b/src/core/hid/emulated_console.h
index 25c183eee..3afd284d5 100644
--- a/src/core/hid/emulated_console.h
+++ b/src/core/hid/emulated_console.h
@@ -78,9 +78,9 @@ struct ConsoleUpdateCallback {
class EmulatedConsole {
public:
/**
- * Contains all input data related to the console like motion and touch input
+ * Contains all input data within the emulated switch console tablet such as touch and motion
*/
- EmulatedConsole();
+ explicit EmulatedConsole();
~EmulatedConsole();
YUZU_NON_COPYABLE(EmulatedConsole);
@@ -89,14 +89,16 @@ public:
/// Removes all callbacks created from input devices
void UnloadInput();
- /// Sets the emulated console into configuring mode. Locking all HID service events from being
- /// moddified
+ /**
+ * Sets the emulated console into configuring mode
+ * This prevents the modification of the HID state of the emulated console by input commands
+ */
void EnableConfiguration();
- /// Returns the emulated console to the normal behaivour
+ /// Returns the emulated console into normal mode, allowing the modification of the HID state
void DisableConfiguration();
- /// Returns true if the emulated console is on configuring mode
+ /// Returns true if the emulated console is in configuring mode
bool IsConfiguring() const;
/// Reload all input devices
@@ -116,7 +118,7 @@ public:
/**
* Updates the current mapped motion device
- * @param ParamPackage with controller data to be mapped
+ * @param param ParamPackage with controller data to be mapped
*/
void SetMotionParam(Common::ParamPackage param);
@@ -134,14 +136,14 @@ public:
/**
* Adds a callback to the list of events
- * @param ConsoleUpdateCallback that will be triggered
+ * @param update_callback A ConsoleUpdateCallback that will be triggered
* @return an unique key corresponding to the callback index in the list
*/
int SetCallback(ConsoleUpdateCallback update_callback);
/**
* Removes a callback from the list stopping any future events to this object
- * @param Key corresponding to the callback index in the list
+ * @param key Key corresponding to the callback index in the list
*/
void DeleteCallback(int key);
@@ -151,20 +153,20 @@ private:
/**
* Updates the motion status of the console
- * @param A CallbackStatus containing gyro and accelerometer data
+ * @param callback A CallbackStatus containing gyro and accelerometer data
*/
- void SetMotion(Common::Input::CallbackStatus callback);
+ void SetMotion(const Common::Input::CallbackStatus& callback);
/**
* Updates the touch status of the console
- * @param callback: A CallbackStatus containing the touch position
- * @param index: Finger ID to be updated
+ * @param callback A CallbackStatus containing the touch position
+ * @param index Finger ID to be updated
*/
- void SetTouch(Common::Input::CallbackStatus callback, std::size_t index);
+ void SetTouch(const Common::Input::CallbackStatus& callback, std::size_t index);
/**
* Triggers a callback that something has changed on the console status
- * @param Input type of the event to trigger
+ * @param type Input type of the event to trigger
*/
void TriggerOnChange(ConsoleTriggerType type);
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 466ff5542..93372445b 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -205,11 +205,12 @@ void EmulatedController::ReloadInput() {
continue;
}
const auto uuid = Common::UUID{button_params[index].Get("guid", "")};
- Common::Input::InputCallback button_callback{
- [this, index, uuid](Common::Input::CallbackStatus callback) {
- SetButton(callback, index, uuid);
- }};
- button_devices[index]->SetCallback(button_callback);
+ button_devices[index]->SetCallback({
+ .on_change =
+ [this, index, uuid](const Common::Input::CallbackStatus& callback) {
+ SetButton(callback, index, uuid);
+ },
+ });
button_devices[index]->ForceUpdate();
}
@@ -218,11 +219,12 @@ void EmulatedController::ReloadInput() {
continue;
}
const auto uuid = Common::UUID{stick_params[index].Get("guid", "")};
- Common::Input::InputCallback stick_callback{
- [this, index, uuid](Common::Input::CallbackStatus callback) {
- SetStick(callback, index, uuid);
- }};
- stick_devices[index]->SetCallback(stick_callback);
+ stick_devices[index]->SetCallback({
+ .on_change =
+ [this, index, uuid](const Common::Input::CallbackStatus& callback) {
+ SetStick(callback, index, uuid);
+ },
+ });
stick_devices[index]->ForceUpdate();
}
@@ -231,11 +233,12 @@ void EmulatedController::ReloadInput() {
continue;
}
const auto uuid = Common::UUID{trigger_params[index].Get("guid", "")};
- Common::Input::InputCallback trigger_callback{
- [this, index, uuid](Common::Input::CallbackStatus callback) {
- SetTrigger(callback, index, uuid);
- }};
- trigger_devices[index]->SetCallback(trigger_callback);
+ trigger_devices[index]->SetCallback({
+ .on_change =
+ [this, index, uuid](const Common::Input::CallbackStatus& callback) {
+ SetTrigger(callback, index, uuid);
+ },
+ });
trigger_devices[index]->ForceUpdate();
}
@@ -243,9 +246,12 @@ void EmulatedController::ReloadInput() {
if (!battery_devices[index]) {
continue;
}
- Common::Input::InputCallback battery_callback{
- [this, index](Common::Input::CallbackStatus callback) { SetBattery(callback, index); }};
- battery_devices[index]->SetCallback(battery_callback);
+ battery_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetBattery(callback, index);
+ },
+ });
battery_devices[index]->ForceUpdate();
}
@@ -253,9 +259,12 @@ void EmulatedController::ReloadInput() {
if (!motion_devices[index]) {
continue;
}
- Common::Input::InputCallback motion_callback{
- [this, index](Common::Input::CallbackStatus callback) { SetMotion(callback, index); }};
- motion_devices[index]->SetCallback(motion_callback);
+ motion_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetMotion(callback, index);
+ },
+ });
motion_devices[index]->ForceUpdate();
}
@@ -267,22 +276,24 @@ void EmulatedController::ReloadInput() {
if (!tas_button_devices[index]) {
continue;
}
- Common::Input::InputCallback button_callback{
- [this, index, tas_uuid](Common::Input::CallbackStatus callback) {
- SetButton(callback, index, tas_uuid);
- }};
- tas_button_devices[index]->SetCallback(button_callback);
+ tas_button_devices[index]->SetCallback({
+ .on_change =
+ [this, index, tas_uuid](const Common::Input::CallbackStatus& callback) {
+ SetButton(callback, index, tas_uuid);
+ },
+ });
}
for (std::size_t index = 0; index < tas_stick_devices.size(); ++index) {
if (!tas_stick_devices[index]) {
continue;
}
- Common::Input::InputCallback stick_callback{
- [this, index, tas_uuid](Common::Input::CallbackStatus callback) {
- SetStick(callback, index, tas_uuid);
- }};
- tas_stick_devices[index]->SetCallback(stick_callback);
+ tas_stick_devices[index]->SetCallback({
+ .on_change =
+ [this, index, tas_uuid](const Common::Input::CallbackStatus& callback) {
+ SetStick(callback, index, tas_uuid);
+ },
+ });
}
}
@@ -440,7 +451,7 @@ void EmulatedController::SetButtonParam(std::size_t index, Common::ParamPackage
if (index >= button_params.size()) {
return;
}
- button_params[index] = param;
+ button_params[index] = std::move(param);
ReloadInput();
}
@@ -448,7 +459,7 @@ void EmulatedController::SetStickParam(std::size_t index, Common::ParamPackage p
if (index >= stick_params.size()) {
return;
}
- stick_params[index] = param;
+ stick_params[index] = std::move(param);
ReloadInput();
}
@@ -456,11 +467,11 @@ void EmulatedController::SetMotionParam(std::size_t index, Common::ParamPackage
if (index >= motion_params.size()) {
return;
}
- motion_params[index] = param;
+ motion_params[index] = std::move(param);
ReloadInput();
}
-void EmulatedController::SetButton(Common::Input::CallbackStatus callback, std::size_t index,
+void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback, std::size_t index,
Common::UUID uuid) {
if (index >= controller.button_values.size()) {
return;
@@ -600,7 +611,7 @@ void EmulatedController::SetButton(Common::Input::CallbackStatus callback, std::
TriggerOnChange(ControllerTriggerType::Button, true);
}
-void EmulatedController::SetStick(Common::Input::CallbackStatus callback, std::size_t index,
+void EmulatedController::SetStick(const Common::Input::CallbackStatus& callback, std::size_t index,
Common::UUID uuid) {
if (index >= controller.stick_values.size()) {
return;
@@ -650,8 +661,8 @@ void EmulatedController::SetStick(Common::Input::CallbackStatus callback, std::s
TriggerOnChange(ControllerTriggerType::Stick, true);
}
-void EmulatedController::SetTrigger(Common::Input::CallbackStatus callback, std::size_t index,
- Common::UUID uuid) {
+void EmulatedController::SetTrigger(const Common::Input::CallbackStatus& callback,
+ std::size_t index, Common::UUID uuid) {
if (index >= controller.trigger_values.size()) {
return;
}
@@ -659,7 +670,7 @@ void EmulatedController::SetTrigger(Common::Input::CallbackStatus callback, std:
const auto trigger_value = TransformToTrigger(callback);
// Only read trigger values that have the same uuid or are pressed once
- if (controller.stick_values[index].uuid != uuid) {
+ if (controller.trigger_values[index].uuid != uuid) {
if (!trigger_value.pressed.value) {
return;
}
@@ -675,7 +686,7 @@ void EmulatedController::SetTrigger(Common::Input::CallbackStatus callback, std:
return;
}
- const auto trigger = controller.trigger_values[index];
+ const auto& trigger = controller.trigger_values[index];
switch (index) {
case Settings::NativeTrigger::LTrigger:
@@ -692,7 +703,8 @@ void EmulatedController::SetTrigger(Common::Input::CallbackStatus callback, std:
TriggerOnChange(ControllerTriggerType::Trigger, true);
}
-void EmulatedController::SetMotion(Common::Input::CallbackStatus callback, std::size_t index) {
+void EmulatedController::SetMotion(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
if (index >= controller.motion_values.size()) {
return;
}
@@ -730,7 +742,8 @@ void EmulatedController::SetMotion(Common::Input::CallbackStatus callback, std::
TriggerOnChange(ControllerTriggerType::Motion, true);
}
-void EmulatedController::SetBattery(Common::Input::CallbackStatus callback, std::size_t index) {
+void EmulatedController::SetBattery(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
if (index >= controller.battery_values.size()) {
return;
}
@@ -866,7 +879,52 @@ void EmulatedController::SetLedPattern() {
}
}
+void EmulatedController::SetSupportedNpadStyleTag(NpadStyleTag supported_styles) {
+ supported_style_tag = supported_styles;
+ if (!is_connected) {
+ return;
+ }
+ if (!IsControllerSupported()) {
+ LOG_ERROR(Service_HID, "Controller type {} is not supported. Disconnecting controller",
+ npad_type);
+ Disconnect();
+ }
+}
+
+bool EmulatedController::IsControllerSupported() const {
+ switch (npad_type) {
+ case NpadStyleIndex::ProController:
+ return supported_style_tag.fullkey;
+ case NpadStyleIndex::Handheld:
+ return supported_style_tag.handheld;
+ case NpadStyleIndex::JoyconDual:
+ return supported_style_tag.joycon_dual;
+ case NpadStyleIndex::JoyconLeft:
+ return supported_style_tag.joycon_left;
+ case NpadStyleIndex::JoyconRight:
+ return supported_style_tag.joycon_right;
+ case NpadStyleIndex::GameCube:
+ return supported_style_tag.gamecube;
+ case NpadStyleIndex::Pokeball:
+ return supported_style_tag.palma;
+ case NpadStyleIndex::NES:
+ return supported_style_tag.lark;
+ case NpadStyleIndex::SNES:
+ return supported_style_tag.lucia;
+ case NpadStyleIndex::N64:
+ return supported_style_tag.lagoon;
+ case NpadStyleIndex::SegaGenesis:
+ return supported_style_tag.lager;
+ default:
+ return false;
+ }
+}
+
void EmulatedController::Connect() {
+ if (!IsControllerSupported()) {
+ LOG_ERROR(Service_HID, "Controller type {} is not supported", npad_type);
+ return;
+ }
{
std::lock_guard lock{mutex};
if (is_configuring) {
@@ -1065,7 +1123,7 @@ void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npa
int EmulatedController::SetCallback(ControllerUpdateCallback update_callback) {
std::lock_guard lock{mutex};
- callback_list.insert_or_assign(last_callback_key, update_callback);
+ callback_list.insert_or_assign(last_callback_key, std::move(update_callback));
return last_callback_key++;
}
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h
index 2c5d51bc8..e42aafebc 100644
--- a/src/core/hid/emulated_controller.h
+++ b/src/core/hid/emulated_controller.h
@@ -132,8 +132,8 @@ struct ControllerUpdateCallback {
class EmulatedController {
public:
/**
- * Contains all input data related to this controller. Like buttons, joysticks, motion.
- * @param Npad id type for this specific controller
+ * Contains all input data (buttons, joysticks, vibration, and motion) within this controller.
+ * @param npad_id_type npad id type for this specific controller
*/
explicit EmulatedController(NpadIdType npad_id_type_);
~EmulatedController();
@@ -155,11 +155,18 @@ public:
/**
* Gets the NpadStyleIndex for this controller
- * @param If true tmp_npad_type will be returned
+ * @param get_temporary_value If true tmp_npad_type will be returned
* @return NpadStyleIndex set on the controller
*/
NpadStyleIndex GetNpadStyleIndex(bool get_temporary_value = false) const;
+ /**
+ * Sets the supported controller types. Disconnects the controller if current type is not
+ * supported
+ * @param supported_styles bitflag with supported types
+ */
+ void SetSupportedNpadStyleTag(NpadStyleTag supported_styles);
+
/// Sets the connected status to true
void Connect();
@@ -168,7 +175,7 @@ public:
/**
* Is the emulated connected
- * @param If true tmp_is_connected will be returned
+ * @param get_temporary_value If true tmp_is_connected will be returned
* @return true if the controller has the connected status
*/
bool IsConnected(bool get_temporary_value = false) const;
@@ -179,14 +186,16 @@ public:
/// Removes all callbacks created from input devices
void UnloadInput();
- /// Sets the emulated console into configuring mode. Locking all HID service events from being
- /// moddified
+ /**
+ * Sets the emulated controller into configuring mode
+ * This prevents the modification of the HID state of the emulated controller by input commands
+ */
void EnableConfiguration();
- /// Returns the emulated console to the normal behaivour
+ /// Returns the emulated controller into normal mode, allowing the modification of the HID state
void DisableConfiguration();
- /// Returns true if the emulated device is on configuring mode
+ /// Returns true if the emulated controller is in configuring mode
bool IsConfiguring() const;
/// Reload all input devices
@@ -215,19 +224,19 @@ public:
/**
* Updates the current mapped button device
- * @param ParamPackage with controller data to be mapped
+ * @param param ParamPackage with controller data to be mapped
*/
void SetButtonParam(std::size_t index, Common::ParamPackage param);
/**
* Updates the current mapped stick device
- * @param ParamPackage with controller data to be mapped
+ * @param param ParamPackage with controller data to be mapped
*/
void SetStickParam(std::size_t index, Common::ParamPackage param);
/**
* Updates the current mapped motion device
- * @param ParamPackage with controller data to be mapped
+ * @param param ParamPackage with controller data to be mapped
*/
void SetMotionParam(std::size_t index, Common::ParamPackage param);
@@ -270,13 +279,13 @@ public:
/// Returns the latest battery status from the controller
BatteryLevelState GetBattery() const;
- /*
+ /**
* Sends a specific vibration to the output device
* @return returns true if vibration had no errors
*/
bool SetVibration(std::size_t device_index, VibrationValue vibration);
- /*
+ /**
* Sends a small vibration to the output device
* @return returns true if SetVibration was successfull
*/
@@ -290,14 +299,14 @@ public:
/**
* Adds a callback to the list of events
- * @param ConsoleUpdateCallback that will be triggered
+ * @param update_callback A ConsoleUpdateCallback that will be triggered
* @return an unique key corresponding to the callback index in the list
*/
int SetCallback(ControllerUpdateCallback update_callback);
/**
* Removes a callback from the list stopping any future events to this object
- * @param Key corresponding to the callback index in the list
+ * @param key Key corresponding to the callback index in the list
*/
void DeleteCallback(int key);
@@ -309,55 +318,65 @@ private:
void LoadTASParams();
/**
+ * Checks the current controller type against the supported_style_tag
+ * @return true if the controller is supported
+ */
+ bool IsControllerSupported() const;
+
+ /**
* Updates the button status of the controller
- * @param callback: A CallbackStatus containing the button status
- * @param index: Button ID of the to be updated
+ * @param callback A CallbackStatus containing the button status
+ * @param index Button ID of the to be updated
*/
- void SetButton(Common::Input::CallbackStatus callback, std::size_t index, Common::UUID uuid);
+ void SetButton(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid);
/**
* Updates the analog stick status of the controller
- * @param callback: A CallbackStatus containing the analog stick status
- * @param index: stick ID of the to be updated
+ * @param callback A CallbackStatus containing the analog stick status
+ * @param index stick ID of the to be updated
*/
- void SetStick(Common::Input::CallbackStatus callback, std::size_t index, Common::UUID uuid);
+ void SetStick(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid);
/**
* Updates the trigger status of the controller
- * @param callback: A CallbackStatus containing the trigger status
- * @param index: trigger ID of the to be updated
+ * @param callback A CallbackStatus containing the trigger status
+ * @param index trigger ID of the to be updated
*/
- void SetTrigger(Common::Input::CallbackStatus callback, std::size_t index, Common::UUID uuid);
+ void SetTrigger(const Common::Input::CallbackStatus& callback, std::size_t index,
+ Common::UUID uuid);
/**
* Updates the motion status of the controller
- * @param callback: A CallbackStatus containing gyro and accelerometer data
- * @param index: motion ID of the to be updated
+ * @param callback A CallbackStatus containing gyro and accelerometer data
+ * @param index motion ID of the to be updated
*/
- void SetMotion(Common::Input::CallbackStatus callback, std::size_t index);
+ void SetMotion(const Common::Input::CallbackStatus& callback, std::size_t index);
/**
* Updates the battery status of the controller
- * @param callback: A CallbackStatus containing the battery status
- * @param index: Button ID of the to be updated
+ * @param callback A CallbackStatus containing the battery status
+ * @param index Button ID of the to be updated
*/
- void SetBattery(Common::Input::CallbackStatus callback, std::size_t index);
+ void SetBattery(const Common::Input::CallbackStatus& callback, std::size_t index);
/**
* Triggers a callback that something has changed on the controller status
- * @param type: Input type of the event to trigger
- * @param is_service_update: indicates if this event should be sended to only services
+ * @param type Input type of the event to trigger
+ * @param is_service_update indicates if this event should only be sent to HID services
*/
void TriggerOnChange(ControllerTriggerType type, bool is_service_update);
NpadIdType npad_id_type;
NpadStyleIndex npad_type{NpadStyleIndex::None};
+ NpadStyleTag supported_style_tag{NpadStyleSet::All};
bool is_connected{false};
bool is_configuring{false};
f32 motion_sensitivity{0.01f};
bool force_update_motion{false};
- // Temporary values to avoid doing changes while the controller is on configuration mode
+ // Temporary values to avoid doing changes while the controller is in configuring mode
NpadStyleIndex tmp_npad_type{NpadStyleIndex::None};
bool tmp_is_connected{false};
diff --git a/src/core/hid/emulated_devices.cpp b/src/core/hid/emulated_devices.cpp
index 874780ec2..708480f2d 100644
--- a/src/core/hid/emulated_devices.cpp
+++ b/src/core/hid/emulated_devices.cpp
@@ -70,50 +70,55 @@ void EmulatedDevices::ReloadInput() {
if (!mouse_button_devices[index]) {
continue;
}
- Common::Input::InputCallback button_callback{
- [this, index](Common::Input::CallbackStatus callback) {
- SetMouseButton(callback, index);
- }};
- mouse_button_devices[index]->SetCallback(button_callback);
+ mouse_button_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetMouseButton(callback, index);
+ },
+ });
}
for (std::size_t index = 0; index < mouse_analog_devices.size(); ++index) {
if (!mouse_analog_devices[index]) {
continue;
}
- Common::Input::InputCallback button_callback{
- [this, index](Common::Input::CallbackStatus callback) {
- SetMouseAnalog(callback, index);
- }};
- mouse_analog_devices[index]->SetCallback(button_callback);
+ mouse_analog_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetMouseAnalog(callback, index);
+ },
+ });
}
if (mouse_stick_device) {
- Common::Input::InputCallback button_callback{
- [this](Common::Input::CallbackStatus callback) { SetMouseStick(callback); }};
- mouse_stick_device->SetCallback(button_callback);
+ mouse_stick_device->SetCallback({
+ .on_change =
+ [this](const Common::Input::CallbackStatus& callback) { SetMouseStick(callback); },
+ });
}
for (std::size_t index = 0; index < keyboard_devices.size(); ++index) {
if (!keyboard_devices[index]) {
continue;
}
- Common::Input::InputCallback button_callback{
- [this, index](Common::Input::CallbackStatus callback) {
- SetKeyboardButton(callback, index);
- }};
- keyboard_devices[index]->SetCallback(button_callback);
+ keyboard_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetKeyboardButton(callback, index);
+ },
+ });
}
for (std::size_t index = 0; index < keyboard_modifier_devices.size(); ++index) {
if (!keyboard_modifier_devices[index]) {
continue;
}
- Common::Input::InputCallback button_callback{
- [this, index](Common::Input::CallbackStatus callback) {
- SetKeyboardModifier(callback, index);
- }};
- keyboard_modifier_devices[index]->SetCallback(button_callback);
+ keyboard_modifier_devices[index]->SetCallback({
+ .on_change =
+ [this, index](const Common::Input::CallbackStatus& callback) {
+ SetKeyboardModifier(callback, index);
+ },
+ });
}
}
@@ -159,7 +164,8 @@ void EmulatedDevices::RestoreConfig() {
ReloadFromSettings();
}
-void EmulatedDevices::SetKeyboardButton(Common::Input::CallbackStatus callback, std::size_t index) {
+void EmulatedDevices::SetKeyboardButton(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
if (index >= device_status.keyboard_values.size()) {
return;
}
@@ -216,7 +222,7 @@ void EmulatedDevices::UpdateKey(std::size_t key_index, bool status) {
}
}
-void EmulatedDevices::SetKeyboardModifier(Common::Input::CallbackStatus callback,
+void EmulatedDevices::SetKeyboardModifier(const Common::Input::CallbackStatus& callback,
std::size_t index) {
if (index >= device_status.keyboard_moddifier_values.size()) {
return;
@@ -286,7 +292,8 @@ void EmulatedDevices::SetKeyboardModifier(Common::Input::CallbackStatus callback
TriggerOnChange(DeviceTriggerType::KeyboardModdifier);
}
-void EmulatedDevices::SetMouseButton(Common::Input::CallbackStatus callback, std::size_t index) {
+void EmulatedDevices::SetMouseButton(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
if (index >= device_status.mouse_button_values.size()) {
return;
}
@@ -347,7 +354,8 @@ void EmulatedDevices::SetMouseButton(Common::Input::CallbackStatus callback, std
TriggerOnChange(DeviceTriggerType::Mouse);
}
-void EmulatedDevices::SetMouseAnalog(Common::Input::CallbackStatus callback, std::size_t index) {
+void EmulatedDevices::SetMouseAnalog(const Common::Input::CallbackStatus& callback,
+ std::size_t index) {
if (index >= device_status.mouse_analog_values.size()) {
return;
}
@@ -374,7 +382,7 @@ void EmulatedDevices::SetMouseAnalog(Common::Input::CallbackStatus callback, std
TriggerOnChange(DeviceTriggerType::Mouse);
}
-void EmulatedDevices::SetMouseStick(Common::Input::CallbackStatus callback) {
+void EmulatedDevices::SetMouseStick(const Common::Input::CallbackStatus& callback) {
std::lock_guard lock{mutex};
const auto touch_value = TransformToTouch(callback);
@@ -435,7 +443,7 @@ void EmulatedDevices::TriggerOnChange(DeviceTriggerType type) {
int EmulatedDevices::SetCallback(InterfaceUpdateCallback update_callback) {
std::lock_guard lock{mutex};
- callback_list.insert_or_assign(last_callback_key, update_callback);
+ callback_list.insert_or_assign(last_callback_key, std::move(update_callback));
return last_callback_key++;
}
diff --git a/src/core/hid/emulated_devices.h b/src/core/hid/emulated_devices.h
index 05a945d08..790d3b411 100644
--- a/src/core/hid/emulated_devices.h
+++ b/src/core/hid/emulated_devices.h
@@ -75,9 +75,9 @@ class EmulatedDevices {
public:
/**
* Contains all input data related to external devices that aren't necesarily a controller
- * like keyboard and mouse
+ * This includes devices such as the keyboard or mouse
*/
- EmulatedDevices();
+ explicit EmulatedDevices();
~EmulatedDevices();
YUZU_NON_COPYABLE(EmulatedDevices);
@@ -86,14 +86,16 @@ public:
/// Removes all callbacks created from input devices
void UnloadInput();
- /// Sets the emulated console into configuring mode. Locking all HID service events from being
- /// moddified
+ /**
+ * Sets the emulated devices into configuring mode
+ * This prevents the modification of the HID state of the emulated devices by input commands
+ */
void EnableConfiguration();
- /// Returns the emulated console to the normal behaivour
+ /// Returns the emulated devices into normal mode, allowing the modification of the HID state
void DisableConfiguration();
- /// Returns true if the emulated device is on configuring mode
+ /// Returns true if the emulated device is in configuring mode
bool IsConfiguring() const;
/// Reload all input devices
@@ -134,14 +136,14 @@ public:
/**
* Adds a callback to the list of events
- * @param InterfaceUpdateCallback that will be triggered
+ * @param update_callback InterfaceUpdateCallback that will be triggered
* @return an unique key corresponding to the callback index in the list
*/
int SetCallback(InterfaceUpdateCallback update_callback);
/**
* Removes a callback from the list stopping any future events to this object
- * @param Key corresponding to the callback index in the list
+ * @param key Key corresponding to the callback index in the list
*/
void DeleteCallback(int key);
@@ -151,42 +153,41 @@ private:
/**
* Updates the touch status of the keyboard device
- * @param callback: A CallbackStatus containing the key status
- * @param index: key ID to be updated
+ * @param callback A CallbackStatus containing the key status
+ * @param index key ID to be updated
*/
- void SetKeyboardButton(Common::Input::CallbackStatus callback, std::size_t index);
+ void SetKeyboardButton(const Common::Input::CallbackStatus& callback, std::size_t index);
/**
* Updates the keyboard status of the keyboard device
- * @param callback: A CallbackStatus containing the modifier key status
- * @param index: modifier key ID to be updated
+ * @param callback A CallbackStatus containing the modifier key status
+ * @param index modifier key ID to be updated
*/
- void SetKeyboardModifier(Common::Input::CallbackStatus callback, std::size_t index);
+ void SetKeyboardModifier(const Common::Input::CallbackStatus& callback, std::size_t index);
/**
* Updates the mouse button status of the mouse device
- * @param callback: A CallbackStatus containing the button status
- * @param index: Button ID to be updated
+ * @param callback A CallbackStatus containing the button status
+ * @param index Button ID to be updated
*/
- void SetMouseButton(Common::Input::CallbackStatus callback, std::size_t index);
+ void SetMouseButton(const Common::Input::CallbackStatus& callback, std::size_t index);
/**
* Updates the mouse wheel status of the mouse device
- * @param callback: A CallbackStatus containing the wheel status
- * @param index: wheel ID to be updated
+ * @param callback A CallbackStatus containing the wheel status
+ * @param index wheel ID to be updated
*/
- void SetMouseAnalog(Common::Input::CallbackStatus callback, std::size_t index);
+ void SetMouseAnalog(const Common::Input::CallbackStatus& callback, std::size_t index);
/**
* Updates the mouse position status of the mouse device
- * @param callback: A CallbackStatus containing the position status
- * @param index: stick ID to be updated
+ * @param callback A CallbackStatus containing the position status
*/
- void SetMouseStick(Common::Input::CallbackStatus callback);
+ void SetMouseStick(const Common::Input::CallbackStatus& callback);
/**
* Triggers a callback that something has changed on the device status
- * @param Input type of the event to trigger
+ * @param type Input type of the event to trigger
*/
void TriggerOnChange(DeviceTriggerType type);
diff --git a/src/core/hid/hid_core.cpp b/src/core/hid/hid_core.cpp
index 741a69c3c..a1c3bbb57 100644
--- a/src/core/hid/hid_core.cpp
+++ b/src/core/hid/hid_core.cpp
@@ -108,6 +108,16 @@ const EmulatedController* HIDCore::GetEmulatedControllerByIndex(std::size_t inde
void HIDCore::SetSupportedStyleTag(NpadStyleTag style_tag) {
supported_style_tag.raw = style_tag.raw;
+ player_1->SetSupportedNpadStyleTag(supported_style_tag);
+ player_2->SetSupportedNpadStyleTag(supported_style_tag);
+ player_3->SetSupportedNpadStyleTag(supported_style_tag);
+ player_4->SetSupportedNpadStyleTag(supported_style_tag);
+ player_5->SetSupportedNpadStyleTag(supported_style_tag);
+ player_6->SetSupportedNpadStyleTag(supported_style_tag);
+ player_7->SetSupportedNpadStyleTag(supported_style_tag);
+ player_8->SetSupportedNpadStyleTag(supported_style_tag);
+ other->SetSupportedNpadStyleTag(supported_style_tag);
+ handheld->SetSupportedNpadStyleTag(supported_style_tag);
}
NpadStyleTag HIDCore::GetSupportedStyleTag() const {
@@ -135,6 +145,42 @@ NpadIdType HIDCore::GetFirstNpadId() const {
return NpadIdType::Player1;
}
+NpadIdType HIDCore::GetFirstDisconnectedNpadId() const {
+ for (std::size_t player_index = 0; player_index < available_controllers; ++player_index) {
+ const auto* const controller = GetEmulatedControllerByIndex(player_index);
+ if (!controller->IsConnected()) {
+ return controller->GetNpadIdType();
+ }
+ }
+ return NpadIdType::Player1;
+}
+
+void HIDCore::EnableAllControllerConfiguration() {
+ player_1->EnableConfiguration();
+ player_2->EnableConfiguration();
+ player_3->EnableConfiguration();
+ player_4->EnableConfiguration();
+ player_5->EnableConfiguration();
+ player_6->EnableConfiguration();
+ player_7->EnableConfiguration();
+ player_8->EnableConfiguration();
+ other->EnableConfiguration();
+ handheld->EnableConfiguration();
+}
+
+void HIDCore::DisableAllControllerConfiguration() {
+ player_1->DisableConfiguration();
+ player_2->DisableConfiguration();
+ player_3->DisableConfiguration();
+ player_4->DisableConfiguration();
+ player_5->DisableConfiguration();
+ player_6->DisableConfiguration();
+ player_7->DisableConfiguration();
+ player_8->DisableConfiguration();
+ other->DisableConfiguration();
+ handheld->DisableConfiguration();
+}
+
void HIDCore::ReloadInputDevices() {
player_1->ReloadFromSettings();
player_2->ReloadFromSettings();
diff --git a/src/core/hid/hid_core.h b/src/core/hid/hid_core.h
index 609f40f3b..837f7de49 100644
--- a/src/core/hid/hid_core.h
+++ b/src/core/hid/hid_core.h
@@ -45,6 +45,15 @@ public:
/// Returns the first connected npad id
NpadIdType GetFirstNpadId() const;
+ /// Returns the first disconnected npad id
+ NpadIdType GetFirstDisconnectedNpadId() const;
+
+ /// Sets all emulated controllers into configuring mode.
+ void EnableAllControllerConfiguration();
+
+ /// Sets all emulated controllers into normal mode.
+ void DisableAllControllerConfiguration();
+
/// Reloads all input devices from settings
void ReloadInputDevices();
@@ -67,7 +76,7 @@ private:
std::unique_ptr<EmulatedController> handheld;
std::unique_ptr<EmulatedConsole> console;
std::unique_ptr<EmulatedDevices> devices;
- NpadStyleTag supported_style_tag;
+ NpadStyleTag supported_style_tag{NpadStyleSet::All};
};
} // namespace Core::HID
diff --git a/src/core/hid/hid_types.h b/src/core/hid/hid_types.h
index acf54e233..7c12f01fc 100644
--- a/src/core/hid/hid_types.h
+++ b/src/core/hid/hid_types.h
@@ -63,6 +63,8 @@ enum class NpadButton : u64 {
LagonCUp = 1ULL << 32,
LagonCRight = 1ULL << 33,
LagonCDown = 1ULL << 34,
+
+ All = 0xFFFFFFFFFFFFFFFFULL,
};
DECLARE_ENUM_FLAG_OPERATORS(NpadButton);
@@ -254,6 +256,8 @@ enum class NpadStyleSet : u32 {
Lager = 1U << 11,
SystemExt = 1U << 29,
System = 1U << 30,
+
+ All = 0xFFFFFFFFU,
};
static_assert(sizeof(NpadStyleSet) == 4, "NpadStyleSet is an invalid size");
diff --git a/src/core/hid/input_converter.h b/src/core/hid/input_converter.h
index 1492489d7..d24582226 100644
--- a/src/core/hid/input_converter.h
+++ b/src/core/hid/input_converter.h
@@ -21,7 +21,7 @@ namespace Core::HID {
/**
* Converts raw input data into a valid battery status.
*
- * @param Supported callbacks: Analog, Battery, Trigger.
+ * @param callback Supported callbacks: Analog, Battery, Trigger.
* @return A valid BatteryStatus object.
*/
Common::Input::BatteryStatus TransformToBattery(const Common::Input::CallbackStatus& callback);
@@ -29,7 +29,7 @@ Common::Input::BatteryStatus TransformToBattery(const Common::Input::CallbackSta
/**
* Converts raw input data into a valid button status. Applies invert properties to the output.
*
- * @param Supported callbacks: Analog, Button, Trigger.
+ * @param callback Supported callbacks: Analog, Button, Trigger.
* @return A valid TouchStatus object.
*/
Common::Input::ButtonStatus TransformToButton(const Common::Input::CallbackStatus& callback);
@@ -37,7 +37,7 @@ Common::Input::ButtonStatus TransformToButton(const Common::Input::CallbackStatu
/**
* Converts raw input data into a valid motion status.
*
- * @param Supported callbacks: Motion.
+ * @param callback Supported callbacks: Motion.
* @return A valid TouchStatus object.
*/
Common::Input::MotionStatus TransformToMotion(const Common::Input::CallbackStatus& callback);
@@ -46,7 +46,7 @@ Common::Input::MotionStatus TransformToMotion(const Common::Input::CallbackStatu
* Converts raw input data into a valid stick status. Applies offset, deadzone, range and invert
* properties to the output.
*
- * @param Supported callbacks: Stick.
+ * @param callback Supported callbacks: Stick.
* @return A valid StickStatus object.
*/
Common::Input::StickStatus TransformToStick(const Common::Input::CallbackStatus& callback);
@@ -54,7 +54,7 @@ Common::Input::StickStatus TransformToStick(const Common::Input::CallbackStatus&
/**
* Converts raw input data into a valid touch status.
*
- * @param Supported callbacks: Touch.
+ * @param callback Supported callbacks: Touch.
* @return A valid TouchStatus object.
*/
Common::Input::TouchStatus TransformToTouch(const Common::Input::CallbackStatus& callback);
@@ -63,7 +63,7 @@ Common::Input::TouchStatus TransformToTouch(const Common::Input::CallbackStatus&
* Converts raw input data into a valid trigger status. Applies offset, deadzone, range and
* invert properties to the output. Button status uses the threshold property if necessary.
*
- * @param Supported callbacks: Analog, Button, Trigger.
+ * @param callback Supported callbacks: Analog, Button, Trigger.
* @return A valid TriggerStatus object.
*/
Common::Input::TriggerStatus TransformToTrigger(const Common::Input::CallbackStatus& callback);
@@ -72,22 +72,23 @@ Common::Input::TriggerStatus TransformToTrigger(const Common::Input::CallbackSta
* Converts raw input data into a valid analog status. Applies offset, deadzone, range and
* invert properties to the output.
*
- * @param Supported callbacks: Analog.
+ * @param callback Supported callbacks: Analog.
* @return A valid AnalogStatus object.
*/
Common::Input::AnalogStatus TransformToAnalog(const Common::Input::CallbackStatus& callback);
/**
* Converts raw analog data into a valid analog value
- * @param An analog object containing raw data and properties, bool that determines if the value
- * needs to be clamped between -1.0f and 1.0f.
+ * @param analog An analog object containing raw data and properties
+ * @param clamp_value determines if the value needs to be clamped between -1.0f and 1.0f.
*/
void SanitizeAnalog(Common::Input::AnalogStatus& analog, bool clamp_value);
/**
* Converts raw stick data into a valid stick value
- * @param Two analog objects containing raw data and properties, bool that determines if the value
- * needs to be clamped into the unit circle.
+ * @param analog_x raw analog data and properties for the x-axis
+ * @param analog_y raw analog data and properties for the y-axis
+ * @param clamp_value bool that determines if the value needs to be clamped into the unit circle.
*/
void SanitizeStick(Common::Input::AnalogStatus& analog_x, Common::Input::AnalogStatus& analog_y,
bool clamp_value);
diff --git a/src/core/hid/input_interpreter.cpp b/src/core/hid/input_interpreter.cpp
index 870422d82..2dbda8814 100644
--- a/src/core/hid/input_interpreter.cpp
+++ b/src/core/hid/input_interpreter.cpp
@@ -20,7 +20,7 @@ InputInterpreter::InputInterpreter(Core::System& system)
InputInterpreter::~InputInterpreter() = default;
void InputInterpreter::PollInput() {
- const u64 button_state = npad.GetAndResetPressState();
+ const auto button_state = npad.GetAndResetPressState();
previous_index = current_index;
current_index = (current_index + 1) % button_states.size();
@@ -32,30 +32,30 @@ void InputInterpreter::ResetButtonStates() {
previous_index = 0;
current_index = 0;
- button_states[0] = 0xFFFFFFFFFFFFFFFF;
+ button_states[0] = Core::HID::NpadButton::All;
for (std::size_t i = 1; i < button_states.size(); ++i) {
- button_states[i] = 0;
+ button_states[i] = Core::HID::NpadButton::None;
}
}
bool InputInterpreter::IsButtonPressed(Core::HID::NpadButton button) const {
- return (button_states[current_index] & static_cast<u64>(button)) != 0;
+ return True(button_states[current_index] & button);
}
bool InputInterpreter::IsButtonPressedOnce(Core::HID::NpadButton button) const {
- const bool current_press = (button_states[current_index] & static_cast<u64>(button)) != 0;
- const bool previous_press = (button_states[previous_index] & static_cast<u64>(button)) != 0;
+ const bool current_press = True(button_states[current_index] & button);
+ const bool previous_press = True(button_states[previous_index] & button);
return current_press && !previous_press;
}
bool InputInterpreter::IsButtonHeld(Core::HID::NpadButton button) const {
- u64 held_buttons{button_states[0]};
+ Core::HID::NpadButton held_buttons{button_states[0]};
for (std::size_t i = 1; i < button_states.size(); ++i) {
held_buttons &= button_states[i];
}
- return (held_buttons & static_cast<u64>(button)) != 0;
+ return True(held_buttons & button);
}
diff --git a/src/core/hid/input_interpreter.h b/src/core/hid/input_interpreter.h
index 1c2e02142..70c34d474 100644
--- a/src/core/hid/input_interpreter.h
+++ b/src/core/hid/input_interpreter.h
@@ -105,7 +105,7 @@ private:
Service::HID::Controller_NPad& npad;
/// Stores 9 consecutive button states polled from HID.
- std::array<u64, 9> button_states{};
+ std::array<Core::HID::NpadButton, 9> button_states{};
std::size_t previous_index{};
std::size_t current_index{};