summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/hid/active_vibration_device_list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/hid/active_vibration_device_list.cpp')
-rw-r--r--src/core/hle/service/hid/active_vibration_device_list.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/core/hle/service/hid/active_vibration_device_list.cpp b/src/core/hle/service/hid/active_vibration_device_list.cpp
new file mode 100644
index 000000000..c440f8382
--- /dev/null
+++ b/src/core/hle/service/hid/active_vibration_device_list.cpp
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/logging/log.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/hid/active_vibration_device_list.h"
+#include "hid_core/hid_result.h"
+#include "hid_core/hid_util.h"
+#include "hid_core/resource_manager.h"
+#include "hid_core/resources/vibration/vibration_device.h"
+
+namespace Service::HID {
+
+IActiveVibrationDeviceList::IActiveVibrationDeviceList(Core::System& system_,
+ std::shared_ptr<ResourceManager> resource)
+ : ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IActiveVibrationDeviceList::~IActiveVibrationDeviceList() = default;
+
+Result IActiveVibrationDeviceList::ActivateVibrationDevice(
+ Core::HID::VibrationDeviceHandle vibration_device_handle) {
+ LOG_DEBUG(Service_HID, "called, npad_type={}, npad_id={}, device_index={}",
+ vibration_device_handle.npad_type, vibration_device_handle.npad_id,
+ vibration_device_handle.device_index);
+
+ std::scoped_lock lock{mutex};
+
+ R_TRY(IsVibrationHandleValid(vibration_device_handle));
+
+ for (std::size_t i = 0; i < list_size; i++) {
+ if (vibration_device_handle.device_index == vibration_device_list[i].device_index &&
+ vibration_device_handle.npad_id == vibration_device_list[i].npad_id &&
+ vibration_device_handle.npad_type == vibration_device_list[i].npad_type) {
+ R_SUCCEED();
+ }
+ }
+
+ R_UNLESS(list_size < MaxVibrationDevicesHandles, ResultVibrationDeviceIndexOutOfRange);
+ R_TRY(resource_manager->GetVibrationDevice(vibration_device_handle)->Activate());
+
+ vibration_device_list[list_size++] = vibration_device_handle;
+ R_SUCCEED();
+}
+
+} // namespace Service::HID