aboutsummaryrefslogtreecommitdiff
path: root/src/hid_core/resource_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hid_core/resource_manager.cpp')
-rw-r--r--src/hid_core/resource_manager.cpp149
1 files changed, 91 insertions, 58 deletions
diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp
index e78665d31..245da582e 100644
--- a/src/hid_core/resource_manager.cpp
+++ b/src/hid_core/resource_manager.cpp
@@ -15,6 +15,7 @@
#include "hid_core/resources/applet_resource.h"
#include "hid_core/resources/debug_pad/debug_pad.h"
#include "hid_core/resources/digitizer/digitizer.h"
+#include "hid_core/resources/hid_firmware_settings.h"
#include "hid_core/resources/keyboard/keyboard.h"
#include "hid_core/resources/mouse/debug_mouse.h"
#include "hid_core/resources/mouse/mouse.h"
@@ -29,6 +30,8 @@
#include "hid_core/resources/system_buttons/sleep_button.h"
#include "hid_core/resources/touch_screen/gesture.h"
#include "hid_core/resources/touch_screen/touch_screen.h"
+#include "hid_core/resources/touch_screen/touch_screen_driver.h"
+#include "hid_core/resources/touch_screen/touch_screen_resource.h"
#include "hid_core/resources/unique_pad/unique_pad.h"
#include "hid_core/resources/vibration/gc_vibration_device.h"
#include "hid_core/resources/vibration/n64_vibration_device.h"
@@ -45,12 +48,49 @@ constexpr auto default_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; //
constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz)
constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz)
-ResourceManager::ResourceManager(Core::System& system_)
- : system{system_}, service_context{system_, "hid"} {
+ResourceManager::ResourceManager(Core::System& system_,
+ std::shared_ptr<HidFirmwareSettings> settings)
+ : firmware_settings{settings}, system{system_}, service_context{system_, "hid"} {
applet_resource = std::make_shared<AppletResource>(system);
+
+ // Register update callbacks
+ npad_update_event = Core::Timing::CreateEvent("HID::UpdatePadCallback",
+ [this](s64 time, std::chrono::nanoseconds ns_late)
+ -> std::optional<std::chrono::nanoseconds> {
+ UpdateNpad(ns_late);
+ return std::nullopt;
+ });
+ default_update_event = Core::Timing::CreateEvent(
+ "HID::UpdateDefaultCallback",
+ [this](s64 time,
+ std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
+ UpdateControllers(ns_late);
+ return std::nullopt;
+ });
+ mouse_keyboard_update_event = Core::Timing::CreateEvent(
+ "HID::UpdateMouseKeyboardCallback",
+ [this](s64 time,
+ std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
+ UpdateMouseKeyboard(ns_late);
+ return std::nullopt;
+ });
+ motion_update_event = Core::Timing::CreateEvent(
+ "HID::UpdateMotionCallback",
+ [this](s64 time,
+ std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
+ UpdateMotion(ns_late);
+ return std::nullopt;
+ });
}
-ResourceManager::~ResourceManager() = default;
+ResourceManager::~ResourceManager() {
+ system.CoreTiming().UnscheduleEvent(npad_update_event);
+ system.CoreTiming().UnscheduleEvent(default_update_event);
+ system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event);
+ system.CoreTiming().UnscheduleEvent(motion_update_event);
+ system.CoreTiming().UnscheduleEvent(touch_update_event);
+ input_event->Finalize();
+};
void ResourceManager::Initialize() {
if (is_initialized) {
@@ -59,7 +99,9 @@ void ResourceManager::Initialize() {
system.HIDCore().ReloadInputDevices();
- handheld_config = std::make_shared<HandheldConfig>();
+ input_event = service_context.CreateEvent("ResourceManager:InputEvent");
+
+ InitializeHandheldConfig();
InitializeHidCommonSampler();
InitializeTouchScreenSampler();
InitializeConsoleSixAxisSampler();
@@ -154,6 +196,7 @@ Result ResourceManager::CreateAppletResource(u64 aruid) {
npad->Activate();
six_axis->Activate();
touch_screen->Activate();
+ gesture->Activate();
return GetNpad()->ActivateNpadResource(aruid);
}
@@ -163,6 +206,17 @@ Result ResourceManager::CreateAppletResourceImpl(u64 aruid) {
return applet_resource->CreateAppletResource(aruid);
}
+void ResourceManager::InitializeHandheldConfig() {
+ handheld_config = std::make_shared<HandheldConfig>();
+ handheld_config->is_handheld_hid_enabled = true;
+ handheld_config->is_joycon_rail_enabled = true;
+ handheld_config->is_force_handheld_style_vibration = false;
+ handheld_config->is_force_handheld = false;
+ if (firmware_settings->IsHandheldForced()) {
+ handheld_config->is_joycon_rail_enabled = false;
+ }
+}
+
void ResourceManager::InitializeHidCommonSampler() {
debug_pad = std::make_shared<DebugPad>(system.HIDCore());
mouse = std::make_shared<Mouse>(system.HIDCore());
@@ -170,7 +224,6 @@ void ResourceManager::InitializeHidCommonSampler() {
keyboard = std::make_shared<Keyboard>(system.HIDCore());
unique_pad = std::make_shared<UniquePad>(system.HIDCore());
npad = std::make_shared<NPad>(system.HIDCore(), service_context);
- gesture = std::make_shared<Gesture>(system.HIDCore());
home_button = std::make_shared<HomeButton>(system.HIDCore());
sleep_button = std::make_shared<SleepButton>(system.HIDCore());
capture_button = std::make_shared<CaptureButton>(system.HIDCore());
@@ -181,11 +234,13 @@ void ResourceManager::InitializeHidCommonSampler() {
debug_pad->SetAppletResource(applet_resource, &shared_mutex);
digitizer->SetAppletResource(applet_resource, &shared_mutex);
+ unique_pad->SetAppletResource(applet_resource, &shared_mutex);
keyboard->SetAppletResource(applet_resource, &shared_mutex);
const auto settings =
system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
- npad->SetNpadExternals(applet_resource, &shared_mutex, handheld_config, settings);
+ npad->SetNpadExternals(applet_resource, &shared_mutex, handheld_config, input_event,
+ &input_mutex, settings);
six_axis->SetAppletResource(applet_resource, &shared_mutex);
mouse->SetAppletResource(applet_resource, &shared_mutex);
@@ -193,14 +248,36 @@ void ResourceManager::InitializeHidCommonSampler() {
home_button->SetAppletResource(applet_resource, &shared_mutex);
sleep_button->SetAppletResource(applet_resource, &shared_mutex);
capture_button->SetAppletResource(applet_resource, &shared_mutex);
+
+ system.CoreTiming().ScheduleLoopingEvent(npad_update_ns, npad_update_ns, npad_update_event);
+ system.CoreTiming().ScheduleLoopingEvent(default_update_ns, default_update_ns,
+ default_update_event);
+ system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns,
+ mouse_keyboard_update_event);
+ system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns,
+ motion_update_event);
}
void ResourceManager::InitializeTouchScreenSampler() {
- gesture = std::make_shared<Gesture>(system.HIDCore());
- touch_screen = std::make_shared<TouchScreen>(system.HIDCore());
+ // This is nn.hid.TouchScreenSampler
+ touch_resource = std::make_shared<TouchResource>(system);
+ touch_driver = std::make_shared<TouchDriver>(system.HIDCore());
+ touch_screen = std::make_shared<TouchScreen>(touch_resource);
+ gesture = std::make_shared<Gesture>(touch_resource);
+
+ touch_update_event = Core::Timing::CreateEvent(
+ "HID::TouchUpdateCallback",
+ [this](s64 time,
+ std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
+ touch_resource->OnTouchUpdate(time);
+ return std::nullopt;
+ });
- touch_screen->SetAppletResource(applet_resource, &shared_mutex);
- gesture->SetAppletResource(applet_resource, &shared_mutex);
+ touch_resource->SetTouchDriver(touch_driver);
+ touch_resource->SetAppletResource(applet_resource, &shared_mutex);
+ touch_resource->SetInputEvent(input_event, &input_mutex);
+ touch_resource->SetHandheldConfig(handheld_config);
+ touch_resource->SetTimerEvent(touch_update_event);
}
void ResourceManager::InitializeConsoleSixAxisSampler() {
@@ -388,13 +465,15 @@ Result ResourceManager::SendVibrationValue(u64 aruid,
return result;
}
+Result ResourceManager::GetTouchScreenFirmwareVersion(Core::HID::FirmwareVersion& firmware) const {
+ return ResultSuccess;
+}
+
void ResourceManager::UpdateControllers(std::chrono::nanoseconds ns_late) {
auto& core_timing = system.CoreTiming();
debug_pad->OnUpdate(core_timing);
digitizer->OnUpdate(core_timing);
unique_pad->OnUpdate(core_timing);
- gesture->OnUpdate(core_timing);
- touch_screen->OnUpdate(core_timing);
palma->OnUpdate(core_timing);
home_button->OnUpdate(core_timing);
sleep_button->OnUpdate(core_timing);
@@ -428,55 +507,9 @@ IAppletResource::IAppletResource(Core::System& system_, std::shared_ptr<Resource
{0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
};
RegisterHandlers(functions);
-
- // Register update callbacks
- npad_update_event = Core::Timing::CreateEvent(
- "HID::UpdatePadCallback",
- [this, resource](
- s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
- const auto guard = LockService();
- resource->UpdateNpad(ns_late);
- return std::nullopt;
- });
- default_update_event = Core::Timing::CreateEvent(
- "HID::UpdateDefaultCallback",
- [this, resource](
- s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
- const auto guard = LockService();
- resource->UpdateControllers(ns_late);
- return std::nullopt;
- });
- mouse_keyboard_update_event = Core::Timing::CreateEvent(
- "HID::UpdateMouseKeyboardCallback",
- [this, resource](
- s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
- const auto guard = LockService();
- resource->UpdateMouseKeyboard(ns_late);
- return std::nullopt;
- });
- motion_update_event = Core::Timing::CreateEvent(
- "HID::UpdateMotionCallback",
- [this, resource](
- s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> {
- const auto guard = LockService();
- resource->UpdateMotion(ns_late);
- return std::nullopt;
- });
-
- system.CoreTiming().ScheduleLoopingEvent(npad_update_ns, npad_update_ns, npad_update_event);
- system.CoreTiming().ScheduleLoopingEvent(default_update_ns, default_update_ns,
- default_update_event);
- system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns,
- mouse_keyboard_update_event);
- system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns,
- motion_update_event);
}
IAppletResource::~IAppletResource() {
- system.CoreTiming().UnscheduleEvent(npad_update_event);
- system.CoreTiming().UnscheduleEvent(default_update_event);
- system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event);
- system.CoreTiming().UnscheduleEvent(motion_update_event);
resource_manager->FreeAppletResourceId(aruid);
}