diff options
Diffstat (limited to 'src/core/hid/emulated_controller.cpp')
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index 2cff279b1..e27d84734 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp | |||
| @@ -131,13 +131,16 @@ void EmulatedController::LoadDevices() { | |||
| 131 | battery_params[RightIndex].Set("battery", true); | 131 | battery_params[RightIndex].Set("battery", true); |
| 132 | 132 | ||
| 133 | camera_params = Common::ParamPackage{"engine:camera,camera:1"}; | 133 | camera_params = Common::ParamPackage{"engine:camera,camera:1"}; |
| 134 | nfc_params = Common::ParamPackage{"engine:virtual_amiibo,nfc:1"}; | ||
| 134 | 135 | ||
| 135 | output_params[LeftIndex] = left_joycon; | 136 | output_params[LeftIndex] = left_joycon; |
| 136 | output_params[RightIndex] = right_joycon; | 137 | output_params[RightIndex] = right_joycon; |
| 137 | output_params[2] = camera_params; | 138 | output_params[2] = camera_params; |
| 139 | output_params[3] = nfc_params; | ||
| 138 | output_params[LeftIndex].Set("output", true); | 140 | output_params[LeftIndex].Set("output", true); |
| 139 | output_params[RightIndex].Set("output", true); | 141 | output_params[RightIndex].Set("output", true); |
| 140 | output_params[2].Set("output", true); | 142 | output_params[2].Set("output", true); |
| 143 | output_params[3].Set("output", true); | ||
| 141 | 144 | ||
| 142 | LoadTASParams(); | 145 | LoadTASParams(); |
| 143 | 146 | ||
| @@ -155,6 +158,7 @@ void EmulatedController::LoadDevices() { | |||
| 155 | std::transform(battery_params.begin(), battery_params.end(), battery_devices.begin(), | 158 | std::transform(battery_params.begin(), battery_params.end(), battery_devices.begin(), |
| 156 | Common::Input::CreateDevice<Common::Input::InputDevice>); | 159 | Common::Input::CreateDevice<Common::Input::InputDevice>); |
| 157 | camera_devices = Common::Input::CreateDevice<Common::Input::InputDevice>(camera_params); | 160 | camera_devices = Common::Input::CreateDevice<Common::Input::InputDevice>(camera_params); |
| 161 | nfc_devices = Common::Input::CreateDevice<Common::Input::InputDevice>(nfc_params); | ||
| 158 | std::transform(output_params.begin(), output_params.end(), output_devices.begin(), | 162 | std::transform(output_params.begin(), output_params.end(), output_devices.begin(), |
| 159 | Common::Input::CreateDevice<Common::Input::OutputDevice>); | 163 | Common::Input::CreateDevice<Common::Input::OutputDevice>); |
| 160 | 164 | ||
| @@ -284,6 +288,16 @@ void EmulatedController::ReloadInput() { | |||
| 284 | camera_devices->ForceUpdate(); | 288 | camera_devices->ForceUpdate(); |
| 285 | } | 289 | } |
| 286 | 290 | ||
| 291 | if (nfc_devices) { | ||
| 292 | if (npad_id_type == NpadIdType::Handheld || npad_id_type == NpadIdType::Player1) { | ||
| 293 | nfc_devices->SetCallback({ | ||
| 294 | .on_change = | ||
| 295 | [this](const Common::Input::CallbackStatus& callback) { SetNfc(callback); }, | ||
| 296 | }); | ||
| 297 | nfc_devices->ForceUpdate(); | ||
| 298 | } | ||
| 299 | } | ||
| 300 | |||
| 287 | // Use a common UUID for TAS | 301 | // Use a common UUID for TAS |
| 288 | static constexpr Common::UUID TAS_UUID = Common::UUID{ | 302 | static constexpr Common::UUID TAS_UUID = Common::UUID{ |
| 289 | {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; | 303 | {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; |
| @@ -339,6 +353,8 @@ void EmulatedController::UnloadInput() { | |||
| 339 | for (auto& stick : tas_stick_devices) { | 353 | for (auto& stick : tas_stick_devices) { |
| 340 | stick.reset(); | 354 | stick.reset(); |
| 341 | } | 355 | } |
| 356 | camera_devices.reset(); | ||
| 357 | nfc_devices.reset(); | ||
| 342 | } | 358 | } |
| 343 | 359 | ||
| 344 | void EmulatedController::EnableConfiguration() { | 360 | void EmulatedController::EnableConfiguration() { |
| @@ -903,6 +919,25 @@ void EmulatedController::SetCamera(const Common::Input::CallbackStatus& callback | |||
| 903 | TriggerOnChange(ControllerTriggerType::IrSensor, true); | 919 | TriggerOnChange(ControllerTriggerType::IrSensor, true); |
| 904 | } | 920 | } |
| 905 | 921 | ||
| 922 | void EmulatedController::SetNfc(const Common::Input::CallbackStatus& callback) { | ||
| 923 | std::unique_lock lock{mutex}; | ||
| 924 | controller.nfc_values = TransformToNfc(callback); | ||
| 925 | |||
| 926 | if (is_configuring) { | ||
| 927 | lock.unlock(); | ||
| 928 | TriggerOnChange(ControllerTriggerType::Nfc, false); | ||
| 929 | return; | ||
| 930 | } | ||
| 931 | |||
| 932 | controller.nfc_state = { | ||
| 933 | controller.nfc_values.state, | ||
| 934 | controller.nfc_values.data, | ||
| 935 | }; | ||
| 936 | |||
| 937 | lock.unlock(); | ||
| 938 | TriggerOnChange(ControllerTriggerType::Nfc, true); | ||
| 939 | } | ||
| 940 | |||
| 906 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { | 941 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { |
| 907 | if (device_index >= output_devices.size()) { | 942 | if (device_index >= output_devices.size()) { |
| 908 | return false; | 943 | return false; |
| @@ -980,6 +1015,10 @@ bool EmulatedController::TestVibration(std::size_t device_index) { | |||
| 980 | bool EmulatedController::SetPollingMode(Common::Input::PollingMode polling_mode) { | 1015 | bool EmulatedController::SetPollingMode(Common::Input::PollingMode polling_mode) { |
| 981 | LOG_INFO(Service_HID, "Set polling mode {}", polling_mode); | 1016 | LOG_INFO(Service_HID, "Set polling mode {}", polling_mode); |
| 982 | auto& output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | 1017 | auto& output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; |
| 1018 | auto& nfc_output_device = output_devices[3]; | ||
| 1019 | |||
| 1020 | nfc_output_device->SetPollingMode(polling_mode); | ||
| 1021 | |||
| 983 | return output_device->SetPollingMode(polling_mode) == Common::Input::PollingError::None; | 1022 | return output_device->SetPollingMode(polling_mode) == Common::Input::PollingError::None; |
| 984 | } | 1023 | } |
| 985 | 1024 | ||
| @@ -1000,6 +1039,32 @@ bool EmulatedController::SetCameraFormat( | |||
| 1000 | camera_format)) == Common::Input::CameraError::None; | 1039 | camera_format)) == Common::Input::CameraError::None; |
| 1001 | } | 1040 | } |
| 1002 | 1041 | ||
| 1042 | bool EmulatedController::HasNfc() const { | ||
| 1043 | const auto& nfc_output_device = output_devices[3]; | ||
| 1044 | |||
| 1045 | switch (npad_type) { | ||
| 1046 | case NpadStyleIndex::JoyconRight: | ||
| 1047 | case NpadStyleIndex::JoyconDual: | ||
| 1048 | case NpadStyleIndex::ProController: | ||
| 1049 | break; | ||
| 1050 | default: | ||
| 1051 | return false; | ||
| 1052 | } | ||
| 1053 | |||
| 1054 | const bool has_virtual_nfc = | ||
| 1055 | npad_id_type == NpadIdType::Player1 || npad_id_type == NpadIdType::Handheld; | ||
| 1056 | const bool is_virtual_nfc_supported = | ||
| 1057 | nfc_output_device->SupportsNfc() != Common::Input::NfcState::NotSupported; | ||
| 1058 | |||
| 1059 | return is_connected && (has_virtual_nfc && is_virtual_nfc_supported); | ||
| 1060 | } | ||
| 1061 | |||
| 1062 | bool EmulatedController::WriteNfc(const std::vector<u8>& data) { | ||
| 1063 | auto& nfc_output_device = output_devices[3]; | ||
| 1064 | |||
| 1065 | return nfc_output_device->WriteNfcData(data) == Common::Input::NfcState::Success; | ||
| 1066 | } | ||
| 1067 | |||
| 1003 | void EmulatedController::SetLedPattern() { | 1068 | void EmulatedController::SetLedPattern() { |
| 1004 | for (auto& device : output_devices) { | 1069 | for (auto& device : output_devices) { |
| 1005 | if (!device) { | 1070 | if (!device) { |
| @@ -1363,6 +1428,11 @@ const CameraState& EmulatedController::GetCamera() const { | |||
| 1363 | return controller.camera_state; | 1428 | return controller.camera_state; |
| 1364 | } | 1429 | } |
| 1365 | 1430 | ||
| 1431 | const NfcState& EmulatedController::GetNfc() const { | ||
| 1432 | std::scoped_lock lock{mutex}; | ||
| 1433 | return controller.nfc_state; | ||
| 1434 | } | ||
| 1435 | |||
| 1366 | NpadColor EmulatedController::GetNpadColor(u32 color) { | 1436 | NpadColor EmulatedController::GetNpadColor(u32 color) { |
| 1367 | return { | 1437 | return { |
| 1368 | .r = static_cast<u8>((color >> 16) & 0xFF), | 1438 | .r = static_cast<u8>((color >> 16) & 0xFF), |