mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-11 23:10:31 +00:00
service: hid: Fully implement abstract vibration
This commit is contained in:
@@ -115,7 +115,7 @@ Result NpadAbstractIrSensorHandler::GetXcdHandleForNpadWithIrSensor(u64& handle)
|
||||
if (sensor_state < NpadIrSensorState::Available) {
|
||||
return ResultIrSensorIsNotReady;
|
||||
}
|
||||
handle = xcd_handle;
|
||||
// handle = xcd_handle;
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
#include "core/hle/result.h"
|
||||
#include "hid_core/hid_types.h"
|
||||
|
||||
namespace Core::HID {
|
||||
class EmulatedController;
|
||||
}
|
||||
|
||||
namespace Kernel {
|
||||
class KEvent;
|
||||
class KReadableEvent;
|
||||
@@ -50,7 +54,7 @@ private:
|
||||
|
||||
s32 ref_counter{};
|
||||
Kernel::KEvent* ir_sensor_event{nullptr};
|
||||
u64 xcd_handle{};
|
||||
Core::HID::EmulatedController* xcd_handle{};
|
||||
NpadIrSensorState sensor_state{};
|
||||
};
|
||||
} // namespace Service::HID
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "hid_core/hid_core.h"
|
||||
#include "hid_core/hid_result.h"
|
||||
#include "hid_core/resources/abstracted_pad/abstract_pad.h"
|
||||
#include "hid_core/resources/applet_resource.h"
|
||||
@@ -16,7 +17,7 @@ void AbstractPad::SetExternals(AppletResourceHolder* applet_resource,
|
||||
CaptureButtonResource* capture_button_resource,
|
||||
HomeButtonResource* home_button_resource,
|
||||
SixAxisResource* sixaxis_resource, PalmaResource* palma_resource,
|
||||
VibrationHandler* vibration) {
|
||||
NpadVibration* vibration, Core::HID::HIDCore* core) {
|
||||
applet_resource_holder = applet_resource;
|
||||
|
||||
properties_handler.SetAppletResource(applet_resource_holder);
|
||||
@@ -35,13 +36,14 @@ void AbstractPad::SetExternals(AppletResourceHolder* applet_resource,
|
||||
mcu_handler.SetAbstractPadHolder(&abstract_pad_holder);
|
||||
mcu_handler.SetPropertiesHandler(&properties_handler);
|
||||
|
||||
std::array<NpadVibrationDevice*, 2> vibration_devices{&vibration_left, &vibration_right};
|
||||
vibration_handler.SetAppletResource(applet_resource_holder);
|
||||
vibration_handler.SetAbstractPadHolder(&abstract_pad_holder);
|
||||
vibration_handler.SetPropertiesHandler(&properties_handler);
|
||||
vibration_handler.SetN64Vibration(&vibration_n64);
|
||||
vibration_handler.SetVibration(vibration_devices);
|
||||
vibration_handler.SetVibration(&vibration_left, &vibration_right);
|
||||
vibration_handler.SetGcVibration(&vibration_gc);
|
||||
vibration_handler.SetVibrationHandler(vibration);
|
||||
vibration_handler.SetHidCore(core);
|
||||
|
||||
sixaxis_handler.SetAppletResource(applet_resource_holder);
|
||||
sixaxis_handler.SetAbstractPadHolder(&abstract_pad_holder);
|
||||
@@ -239,11 +241,6 @@ NpadVibrationDevice* AbstractPad::GetVibrationDevice(Core::HID::DeviceIndex devi
|
||||
return &vibration_left;
|
||||
}
|
||||
|
||||
void AbstractPad::GetLeftRightVibrationDevice(std::vector<NpadVibrationDevice*> list) {
|
||||
list.emplace_back(&vibration_left);
|
||||
list.emplace_back(&vibration_right);
|
||||
}
|
||||
|
||||
NpadGcVibrationDevice* AbstractPad::GetGCVibrationDevice() {
|
||||
return &vibration_gc;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ class AppletResource;
|
||||
class SixAxisResource;
|
||||
class PalmaResource;
|
||||
class NPadResource;
|
||||
class AbstractPad;
|
||||
class NpadLastActiveHandler;
|
||||
class NpadIrNfcHandler;
|
||||
class UniquePads;
|
||||
@@ -44,7 +43,6 @@ class NpadGcVibration;
|
||||
|
||||
class CaptureButtonResource;
|
||||
class HomeButtonResource;
|
||||
class VibrationHandler;
|
||||
|
||||
struct HandheldConfig;
|
||||
|
||||
@@ -57,7 +55,8 @@ public:
|
||||
void SetExternals(AppletResourceHolder* applet_resource,
|
||||
CaptureButtonResource* capture_button_resource,
|
||||
HomeButtonResource* home_button_resource, SixAxisResource* sixaxis_resource,
|
||||
PalmaResource* palma_resource, VibrationHandler* vibration);
|
||||
PalmaResource* palma_resource, NpadVibration* vibration,
|
||||
Core::HID::HIDCore* core);
|
||||
void SetNpadId(Core::HID::NpadIdType npad_id);
|
||||
|
||||
Result Activate();
|
||||
@@ -78,7 +77,6 @@ public:
|
||||
|
||||
NpadN64VibrationDevice* GetN64VibrationDevice();
|
||||
NpadVibrationDevice* GetVibrationDevice(Core::HID::DeviceIndex device_index);
|
||||
void GetLeftRightVibrationDevice(std::vector<NpadVibrationDevice*> list);
|
||||
NpadGcVibrationDevice* GetGCVibrationDevice();
|
||||
|
||||
Core::HID::NpadIdType GetLastActiveNpad();
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "hid_core/frontend/emulated_controller.h"
|
||||
#include "hid_core/hid_core.h"
|
||||
#include "hid_core/hid_result.h"
|
||||
#include "hid_core/hid_util.h"
|
||||
#include "hid_core/resources/abstracted_pad/abstract_pad_holder.h"
|
||||
@@ -30,14 +32,22 @@ void NpadAbstractVibrationHandler::SetPropertiesHandler(NpadAbstractPropertiesHa
|
||||
properties_handler = handler;
|
||||
}
|
||||
|
||||
void NpadAbstractVibrationHandler::SetVibrationHandler(NpadVibration* handler) {
|
||||
vibration_handler = handler;
|
||||
}
|
||||
|
||||
void NpadAbstractVibrationHandler::SetHidCore(Core::HID::HIDCore* core) {
|
||||
hid_core = core;
|
||||
}
|
||||
|
||||
void NpadAbstractVibrationHandler::SetN64Vibration(NpadN64VibrationDevice* n64_device) {
|
||||
n64_vibration_device = n64_device;
|
||||
}
|
||||
|
||||
void NpadAbstractVibrationHandler::SetVibration(std::span<NpadVibrationDevice*> device) {
|
||||
for (std::size_t i = 0; i < device.size() && i < vibration_device.size(); i++) {
|
||||
vibration_device[i] = device[i];
|
||||
}
|
||||
void NpadAbstractVibrationHandler::SetVibration(NpadVibrationDevice* left_device,
|
||||
NpadVibrationDevice* right_device) {
|
||||
left_vibration_device = left_device;
|
||||
right_vibration_device = right_device;
|
||||
}
|
||||
|
||||
void NpadAbstractVibrationHandler::SetGcVibration(NpadGcVibrationDevice* gc_device) {
|
||||
@@ -69,5 +79,29 @@ void NpadAbstractVibrationHandler::UpdateVibrationState() {
|
||||
if (!is_handheld_hid_enabled && is_force_handheld_style_vibration) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
// TODO: This function isn't accurate. It's supposed to get 5 abstracted pads from the
|
||||
// NpadAbstractPropertiesHandler but this handler isn't fully implemented yet
|
||||
IAbstractedPad abstracted_pad{};
|
||||
const auto npad_id = properties_handler->GetNpadId();
|
||||
abstracted_pad.xcd_handle = hid_core->GetEmulatedController(npad_id);
|
||||
abstracted_pad.internal_flags.is_connected.Assign(abstracted_pad.xcd_handle->IsConnected());
|
||||
|
||||
if (abstracted_pad.internal_flags.is_connected) {
|
||||
left_vibration_device->Mount(abstracted_pad, Core::HID::DeviceIndex::Left,
|
||||
vibration_handler);
|
||||
right_vibration_device->Mount(abstracted_pad, Core::HID::DeviceIndex::Right,
|
||||
vibration_handler);
|
||||
gc_vibration_device->Mount(abstracted_pad, 0, vibration_handler);
|
||||
gc_vibration_device->Mount(abstracted_pad, 0, vibration_handler);
|
||||
n64_vibration_device->Mount(abstracted_pad, vibration_handler);
|
||||
return;
|
||||
}
|
||||
|
||||
left_vibration_device->Unmount();
|
||||
right_vibration_device->Unmount();
|
||||
gc_vibration_device->Unmount();
|
||||
gc_vibration_device->Unmount();
|
||||
n64_vibration_device->Unmount();
|
||||
}
|
||||
} // namespace Service::HID
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
#include "core/hle/result.h"
|
||||
#include "hid_core/hid_types.h"
|
||||
|
||||
namespace Core::HID {
|
||||
class HIDCore;
|
||||
}
|
||||
|
||||
namespace Service::HID {
|
||||
struct AppletResourceHolder;
|
||||
class NpadAbstractedPadHolder;
|
||||
@@ -27,9 +31,11 @@ public:
|
||||
void SetAbstractPadHolder(NpadAbstractedPadHolder* holder);
|
||||
void SetAppletResource(AppletResourceHolder* applet_resource);
|
||||
void SetPropertiesHandler(NpadAbstractPropertiesHandler* handler);
|
||||
void SetVibrationHandler(NpadVibration* handler);
|
||||
void SetHidCore(Core::HID::HIDCore* core);
|
||||
|
||||
void SetN64Vibration(NpadN64VibrationDevice* n64_device);
|
||||
void SetVibration(std::span<NpadVibrationDevice*> device);
|
||||
void SetVibration(NpadVibrationDevice* left_device, NpadVibrationDevice* right_device);
|
||||
void SetGcVibration(NpadGcVibrationDevice* gc_device);
|
||||
|
||||
Result IncrementRefCounter();
|
||||
@@ -41,9 +47,11 @@ private:
|
||||
AppletResourceHolder* applet_resource_holder{nullptr};
|
||||
NpadAbstractedPadHolder* abstract_pad_holder{nullptr};
|
||||
NpadAbstractPropertiesHandler* properties_handler{nullptr};
|
||||
Core::HID::HIDCore* hid_core{nullptr};
|
||||
|
||||
NpadN64VibrationDevice* n64_vibration_device{nullptr};
|
||||
std::array<NpadVibrationDevice*, 2> vibration_device{};
|
||||
NpadVibrationDevice* left_vibration_device{};
|
||||
NpadVibrationDevice* right_vibration_device{};
|
||||
NpadGcVibrationDevice* gc_vibration_device{nullptr};
|
||||
NpadVibration* vibration_handler{nullptr};
|
||||
s32 ref_counter{};
|
||||
|
||||
Reference in New Issue
Block a user