summaryrefslogtreecommitdiff
path: root/src/core/hid/emulated_controller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hid/emulated_controller.cpp')
-rw-r--r--src/core/hid/emulated_controller.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index bd2384515..8c3895937 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -126,10 +126,14 @@ void EmulatedController::LoadDevices() {
126 battery_params[LeftIndex].Set("battery", true); 126 battery_params[LeftIndex].Set("battery", true);
127 battery_params[RightIndex].Set("battery", true); 127 battery_params[RightIndex].Set("battery", true);
128 128
129 camera_params = Common::ParamPackage{"engine:camera,camera:1"};
130
129 output_params[LeftIndex] = left_joycon; 131 output_params[LeftIndex] = left_joycon;
130 output_params[RightIndex] = right_joycon; 132 output_params[RightIndex] = right_joycon;
133 output_params[2] = camera_params;
131 output_params[LeftIndex].Set("output", true); 134 output_params[LeftIndex].Set("output", true);
132 output_params[RightIndex].Set("output", true); 135 output_params[RightIndex].Set("output", true);
136 output_params[2].Set("output", true);
133 137
134 LoadTASParams(); 138 LoadTASParams();
135 139
@@ -146,6 +150,7 @@ void EmulatedController::LoadDevices() {
146 Common::Input::CreateDevice<Common::Input::InputDevice>); 150 Common::Input::CreateDevice<Common::Input::InputDevice>);
147 std::transform(battery_params.begin(), battery_params.end(), battery_devices.begin(), 151 std::transform(battery_params.begin(), battery_params.end(), battery_devices.begin(),
148 Common::Input::CreateDevice<Common::Input::InputDevice>); 152 Common::Input::CreateDevice<Common::Input::InputDevice>);
153 camera_devices = Common::Input::CreateDevice<Common::Input::InputDevice>(camera_params);
149 std::transform(output_params.begin(), output_params.end(), output_devices.begin(), 154 std::transform(output_params.begin(), output_params.end(), output_devices.begin(),
150 Common::Input::CreateDevice<Common::Input::OutputDevice>); 155 Common::Input::CreateDevice<Common::Input::OutputDevice>);
151 156
@@ -267,6 +272,14 @@ void EmulatedController::ReloadInput() {
267 motion_devices[index]->ForceUpdate(); 272 motion_devices[index]->ForceUpdate();
268 } 273 }
269 274
275 if (camera_devices) {
276 camera_devices->SetCallback({
277 .on_change =
278 [this](const Common::Input::CallbackStatus& callback) { SetCamera(callback); },
279 });
280 camera_devices->ForceUpdate();
281 }
282
270 // Use a common UUID for TAS 283 // Use a common UUID for TAS
271 static constexpr Common::UUID TAS_UUID = Common::UUID{ 284 static constexpr Common::UUID TAS_UUID = Common::UUID{
272 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; 285 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};
@@ -851,6 +864,25 @@ void EmulatedController::SetBattery(const Common::Input::CallbackStatus& callbac
851 TriggerOnChange(ControllerTriggerType::Battery, true); 864 TriggerOnChange(ControllerTriggerType::Battery, true);
852} 865}
853 866
867void EmulatedController::SetCamera(const Common::Input::CallbackStatus& callback) {
868 std::unique_lock lock{mutex};
869 controller.camera_values = TransformToCamera(callback);
870
871 if (is_configuring) {
872 lock.unlock();
873 TriggerOnChange(ControllerTriggerType::IrSensor, false);
874 return;
875 }
876
877 controller.camera_state.sample++;
878 controller.camera_state.format =
879 static_cast<Core::IrSensor::ImageTransferProcessorFormat>(controller.camera_values.format);
880 controller.camera_state.data = controller.camera_values.data;
881
882 lock.unlock();
883 TriggerOnChange(ControllerTriggerType::IrSensor, true);
884}
885
854bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { 886bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) {
855 if (device_index >= output_devices.size()) { 887 if (device_index >= output_devices.size()) {
856 return false; 888 return false;
@@ -928,6 +960,23 @@ bool EmulatedController::SetPollingMode(Common::Input::PollingMode polling_mode)
928 return output_device->SetPollingMode(polling_mode) == Common::Input::PollingError::None; 960 return output_device->SetPollingMode(polling_mode) == Common::Input::PollingError::None;
929} 961}
930 962
963bool EmulatedController::SetCameraFormat(
964 Core::IrSensor::ImageTransferProcessorFormat camera_format) {
965 LOG_INFO(Service_HID, "Set camera format {}", camera_format);
966
967 auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)];
968 auto& camera_output_device = output_devices[2];
969
970 if (right_output_device->SetCameraFormat(static_cast<Common::Input::CameraFormat>(
971 camera_format)) == Common::Input::CameraError::None) {
972 return true;
973 }
974
975 // Fallback to Qt camera if native device doesn't have support
976 return camera_output_device->SetCameraFormat(static_cast<Common::Input::CameraFormat>(
977 camera_format)) == Common::Input::CameraError::None;
978}
979
931void EmulatedController::SetLedPattern() { 980void EmulatedController::SetLedPattern() {
932 for (auto& device : output_devices) { 981 for (auto& device : output_devices) {
933 if (!device) { 982 if (!device) {
@@ -1163,6 +1212,11 @@ BatteryValues EmulatedController::GetBatteryValues() const {
1163 return controller.battery_values; 1212 return controller.battery_values;
1164} 1213}
1165 1214
1215CameraValues EmulatedController::GetCameraValues() const {
1216 std::scoped_lock lock{mutex};
1217 return controller.camera_values;
1218}
1219
1166HomeButtonState EmulatedController::GetHomeButtons() const { 1220HomeButtonState EmulatedController::GetHomeButtons() const {
1167 std::scoped_lock lock{mutex}; 1221 std::scoped_lock lock{mutex};
1168 if (is_configuring) { 1222 if (is_configuring) {
@@ -1251,6 +1305,11 @@ BatteryLevelState EmulatedController::GetBattery() const {
1251 return controller.battery_state; 1305 return controller.battery_state;
1252} 1306}
1253 1307
1308const CameraState& EmulatedController::GetCamera() const {
1309 std::scoped_lock lock{mutex};
1310 return controller.camera_state;
1311}
1312
1254void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npad_service_update) { 1313void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npad_service_update) {
1255 std::scoped_lock lock{callback_mutex}; 1314 std::scoped_lock lock{callback_mutex};
1256 for (const auto& poller_pair : callback_list) { 1315 for (const auto& poller_pair : callback_list) {