|
|
|
@ -52,9 +52,42 @@ 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() { |
|
|
|
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(); |
|
|
|
}; |
|
|
|
@ -201,6 +234,7 @@ 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 = |
|
|
|
@ -214,6 +248,14 @@ 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() { |
|
|
|
@ -465,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); |
|
|
|
} |
|
|
|
|
|
|
|
|