service: hid: Introduce firmware settings and update activate controller calls
This commit is contained in:
parent
b9c7e5c2c8
commit
862e66202c
|
@ -523,6 +523,8 @@ add_library(core STATIC
|
||||||
hle/service/hid/hid.h
|
hle/service/hid/hid.h
|
||||||
hle/service/hid/hid_debug_server.cpp
|
hle/service/hid/hid_debug_server.cpp
|
||||||
hle/service/hid/hid_debug_server.h
|
hle/service/hid/hid_debug_server.h
|
||||||
|
hle/service/hid/hid_firmware_settings.cpp
|
||||||
|
hle/service/hid/hid_firmware_settings.h
|
||||||
hle/service/hid/hid_server.cpp
|
hle/service/hid/hid_server.cpp
|
||||||
hle/service/hid/hid_server.h
|
hle/service/hid/hid_server.h
|
||||||
hle/service/hid/hid_system_server.cpp
|
hle/service/hid/hid_system_server.cpp
|
||||||
|
|
|
@ -8,12 +8,17 @@ namespace Service::HID {
|
||||||
ControllerBase::ControllerBase(Core::HID::HIDCore& hid_core_) : hid_core(hid_core_) {}
|
ControllerBase::ControllerBase(Core::HID::HIDCore& hid_core_) : hid_core(hid_core_) {}
|
||||||
ControllerBase::~ControllerBase() = default;
|
ControllerBase::~ControllerBase() = default;
|
||||||
|
|
||||||
void ControllerBase::ActivateController() {
|
Result ControllerBase::Activate() {
|
||||||
if (is_activated) {
|
if (is_activated) {
|
||||||
return;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
is_activated = true;
|
is_activated = true;
|
||||||
OnInit();
|
OnInit();
|
||||||
|
return ResultSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result ControllerBase::Activate(u64 aruid) {
|
||||||
|
return Activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControllerBase::DeactivateController() {
|
void ControllerBase::DeactivateController() {
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
#include "core/hle/result.h"
|
||||||
|
|
||||||
namespace Core::Timing {
|
namespace Core::Timing {
|
||||||
class CoreTiming;
|
class CoreTiming;
|
||||||
|
@ -31,7 +32,8 @@ public:
|
||||||
// When the controller is requesting a motion update for the shared memory
|
// When the controller is requesting a motion update for the shared memory
|
||||||
virtual void OnMotionUpdate(const Core::Timing::CoreTiming& core_timing) {}
|
virtual void OnMotionUpdate(const Core::Timing::CoreTiming& core_timing) {}
|
||||||
|
|
||||||
void ActivateController();
|
Result Activate();
|
||||||
|
Result Activate(u64 aruid);
|
||||||
|
|
||||||
void DeactivateController();
|
void DeactivateController();
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,13 @@ public:
|
||||||
Default = 3,
|
Default = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class NpadRevision : u32 {
|
||||||
|
Revision0 = 0,
|
||||||
|
Revision1 = 1,
|
||||||
|
Revision2 = 2,
|
||||||
|
Revision3 = 3,
|
||||||
|
};
|
||||||
|
|
||||||
void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set);
|
void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set);
|
||||||
Core::HID::NpadStyleTag GetSupportedStyleSet() const;
|
Core::HID::NpadStyleTag GetSupportedStyleSet() const;
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ Result Controller_Palma::InitializePalma(const PalmaConnectionHandle& handle) {
|
||||||
if (handle.npad_id != active_handle.npad_id) {
|
if (handle.npad_id != active_handle.npad_id) {
|
||||||
return InvalidPalmaHandle;
|
return InvalidPalmaHandle;
|
||||||
}
|
}
|
||||||
ActivateController();
|
Activate();
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "core/hle/service/hid/hid.h"
|
#include "core/hle/service/hid/hid.h"
|
||||||
#include "core/hle/service/hid/hid_debug_server.h"
|
#include "core/hle/service/hid/hid_debug_server.h"
|
||||||
|
#include "core/hle/service/hid/hid_firmware_settings.h"
|
||||||
#include "core/hle/service/hid/hid_server.h"
|
#include "core/hle/service/hid/hid_server.h"
|
||||||
#include "core/hle/service/hid/hid_system_server.h"
|
#include "core/hle/service/hid/hid_system_server.h"
|
||||||
#include "core/hle/service/hid/hidbus.h"
|
#include "core/hle/service/hid/hidbus.h"
|
||||||
|
@ -16,9 +17,11 @@ namespace Service::HID {
|
||||||
void LoopProcess(Core::System& system) {
|
void LoopProcess(Core::System& system) {
|
||||||
auto server_manager = std::make_unique<ServerManager>(system);
|
auto server_manager = std::make_unique<ServerManager>(system);
|
||||||
std::shared_ptr<ResourceManager> resouce_manager = std::make_shared<ResourceManager>(system);
|
std::shared_ptr<ResourceManager> resouce_manager = std::make_shared<ResourceManager>(system);
|
||||||
|
std::shared_ptr<HidFirmwareSettings> firmware_settings =
|
||||||
|
std::make_shared<HidFirmwareSettings>();
|
||||||
|
|
||||||
server_manager->RegisterNamedService("hid",
|
server_manager->RegisterNamedService(
|
||||||
std::make_shared<IHidServer>(system, resouce_manager));
|
"hid", std::make_shared<IHidServer>(system, resouce_manager, firmware_settings));
|
||||||
server_manager->RegisterNamedService(
|
server_manager->RegisterNamedService(
|
||||||
"hid:dbg", std::make_shared<IHidDebugServer>(system, resouce_manager));
|
"hid:dbg", std::make_shared<IHidDebugServer>(system, resouce_manager));
|
||||||
server_manager->RegisterNamedService(
|
server_manager->RegisterNamedService(
|
||||||
|
|
99
src/core/hle/service/hid/hid_firmware_settings.cpp
Normal file
99
src/core/hle/service/hid/hid_firmware_settings.cpp
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include "core/hle/service/hid/hid_firmware_settings.h"
|
||||||
|
|
||||||
|
namespace Service::HID {
|
||||||
|
|
||||||
|
HidFirmwareSettings::HidFirmwareSettings() {
|
||||||
|
LoadSettings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HidFirmwareSettings::Reload() {
|
||||||
|
LoadSettings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HidFirmwareSettings::LoadSettings(bool reload_config) {
|
||||||
|
if (is_initalized && !reload_config) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Use nn::settings::fwdbg::GetSettingsItemValue to load config values
|
||||||
|
|
||||||
|
is_debug_pad_enabled = true;
|
||||||
|
is_device_managed = true;
|
||||||
|
is_touch_i2c_managed = is_device_managed;
|
||||||
|
is_future_devices_emulated = false;
|
||||||
|
is_mcu_hardware_error_emulated = false;
|
||||||
|
is_rail_enabled = true;
|
||||||
|
is_firmware_update_failure_emulated = false;
|
||||||
|
is_firmware_update_failure = {};
|
||||||
|
is_ble_disabled = false;
|
||||||
|
is_dscale_disabled = false;
|
||||||
|
is_handheld_forced = true;
|
||||||
|
features_per_id_disabled = {};
|
||||||
|
is_touch_firmware_auto_update_disabled = false;
|
||||||
|
is_initalized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsDebugPadEnabled() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_debug_pad_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsDeviceManaged() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_device_managed;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsEmulateFutureDevice() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_future_devices_emulated;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsTouchI2cManaged() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_touch_i2c_managed;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsHandheldForced() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_handheld_forced;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsRailEnabled() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_rail_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsHardwareErrorEmulated() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_mcu_hardware_error_emulated;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsBleDisabled() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_ble_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsDscaleDisabled() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_dscale_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HidFirmwareSettings::IsTouchAutoUpdateDisabled() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_touch_firmware_auto_update_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
HidFirmwareSettings::FirmwareSetting HidFirmwareSettings::GetFirmwareUpdateFailure() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return is_firmware_update_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
HidFirmwareSettings::FeaturesPerId HidFirmwareSettings::FeaturesDisabledPerId() {
|
||||||
|
LoadSettings(false);
|
||||||
|
return features_per_id_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Service::HID
|
54
src/core/hle/service/hid/hid_firmware_settings.h
Normal file
54
src/core/hle/service/hid/hid_firmware_settings.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
|
||||||
|
namespace Service::HID {
|
||||||
|
|
||||||
|
/// Loads firmware config from nn::settings::fwdbg
|
||||||
|
class HidFirmwareSettings {
|
||||||
|
public:
|
||||||
|
using FirmwareSetting = std::array<u8, 4>;
|
||||||
|
using FeaturesPerId = std::array<bool, 0xA8>;
|
||||||
|
|
||||||
|
HidFirmwareSettings();
|
||||||
|
|
||||||
|
void Reload();
|
||||||
|
void LoadSettings(bool reload_config);
|
||||||
|
|
||||||
|
bool IsDebugPadEnabled();
|
||||||
|
bool IsDeviceManaged();
|
||||||
|
bool IsEmulateFutureDevice();
|
||||||
|
bool IsTouchI2cManaged();
|
||||||
|
bool IsHandheldForced();
|
||||||
|
bool IsRailEnabled();
|
||||||
|
bool IsHardwareErrorEmulated();
|
||||||
|
bool IsBleDisabled();
|
||||||
|
bool IsDscaleDisabled();
|
||||||
|
bool IsTouchAutoUpdateDisabled();
|
||||||
|
|
||||||
|
FirmwareSetting GetFirmwareUpdateFailure();
|
||||||
|
FeaturesPerId FeaturesDisabledPerId();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool is_initalized{};
|
||||||
|
|
||||||
|
// Debug settings
|
||||||
|
bool is_debug_pad_enabled{};
|
||||||
|
bool is_device_managed{};
|
||||||
|
bool is_touch_i2c_managed{};
|
||||||
|
bool is_future_devices_emulated{};
|
||||||
|
bool is_mcu_hardware_error_emulated{};
|
||||||
|
bool is_rail_enabled{};
|
||||||
|
bool is_firmware_update_failure_emulated{};
|
||||||
|
bool is_ble_disabled{};
|
||||||
|
bool is_dscale_disabled{};
|
||||||
|
bool is_handheld_forced{};
|
||||||
|
bool is_touch_firmware_auto_update_disabled{};
|
||||||
|
FirmwareSetting is_firmware_update_failure{};
|
||||||
|
FeaturesPerId features_per_id_disabled{};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::HID
|
|
@ -10,6 +10,7 @@
|
||||||
#include "core/hle/kernel/k_transfer_memory.h"
|
#include "core/hle/kernel/k_transfer_memory.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/service/hid/errors.h"
|
#include "core/hle/service/hid/errors.h"
|
||||||
|
#include "core/hle/service/hid/hid_firmware_settings.h"
|
||||||
#include "core/hle/service/hid/hid_server.h"
|
#include "core/hle/service/hid/hid_server.h"
|
||||||
#include "core/hle/service/hid/resource_manager.h"
|
#include "core/hle/service/hid/resource_manager.h"
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
@ -64,8 +65,9 @@ private:
|
||||||
std::shared_ptr<ResourceManager> resource_manager;
|
std::shared_ptr<ResourceManager> resource_manager;
|
||||||
};
|
};
|
||||||
|
|
||||||
IHidServer::IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource)
|
IHidServer::IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
|
||||||
: ServiceFramework{system_, "hid"}, resource_manager{resource} {
|
std::shared_ptr<HidFirmwareSettings> settings)
|
||||||
|
: ServiceFramework{system_, "hid"}, resource_manager{resource}, firmware_settings{settings} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, &IHidServer::CreateAppletResource, "CreateAppletResource"},
|
{0, &IHidServer::CreateAppletResource, "CreateAppletResource"},
|
||||||
|
@ -230,48 +232,87 @@ void IHidServer::ActivateDebugPad(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::DebugPad);
|
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
Result result = ResultSuccess;
|
||||||
|
auto& debug_pad =
|
||||||
|
GetResourceManager()->GetController<Controller_DebugPad>(HidController::DebugPad);
|
||||||
|
|
||||||
|
if (!firmware_settings->IsDeviceManaged()) {
|
||||||
|
result = debug_pad.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
result = debug_pad.Activate(applet_resource_user_id);
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::ActivateTouchScreen(HLERequestContext& ctx) {
|
void IHidServer::ActivateTouchScreen(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::Touchscreen);
|
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
Result result = ResultSuccess;
|
||||||
|
auto& touch_screen =
|
||||||
|
GetResourceManager()->GetController<Controller_Touchscreen>(HidController::Touchscreen);
|
||||||
|
|
||||||
|
if (!firmware_settings->IsDeviceManaged()) {
|
||||||
|
result = touch_screen.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
result = touch_screen.Activate(applet_resource_user_id);
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::ActivateMouse(HLERequestContext& ctx) {
|
void IHidServer::ActivateMouse(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::Mouse);
|
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
Result result = ResultSuccess;
|
||||||
|
auto& mouse = GetResourceManager()->GetController<Controller_Mouse>(HidController::Mouse);
|
||||||
|
|
||||||
|
if (!firmware_settings->IsDeviceManaged()) {
|
||||||
|
result = mouse.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
result = mouse.Activate(applet_resource_user_id);
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::ActivateKeyboard(HLERequestContext& ctx) {
|
void IHidServer::ActivateKeyboard(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::Keyboard);
|
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
Result result = ResultSuccess;
|
||||||
|
auto& keyboard =
|
||||||
|
GetResourceManager()->GetController<Controller_Keyboard>(HidController::Keyboard);
|
||||||
|
|
||||||
|
if (!firmware_settings->IsDeviceManaged()) {
|
||||||
|
result = keyboard.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
result = keyboard.Activate(applet_resource_user_id);
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::SendKeyboardLockKeyEvent(HLERequestContext& ctx) {
|
void IHidServer::SendKeyboardLockKeyEvent(HLERequestContext& ctx) {
|
||||||
|
@ -898,7 +939,7 @@ void IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned(HLERequestContext& ctx)
|
||||||
void IHidServer::ActivateGesture(HLERequestContext& ctx) {
|
void IHidServer::ActivateGesture(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
struct Parameters {
|
struct Parameters {
|
||||||
u32 unknown;
|
u32 basic_gesture_id;
|
||||||
INSERT_PADDING_WORDS_NOINIT(1);
|
INSERT_PADDING_WORDS_NOINIT(1);
|
||||||
u64 applet_resource_user_id;
|
u64 applet_resource_user_id;
|
||||||
};
|
};
|
||||||
|
@ -906,13 +947,23 @@ void IHidServer::ActivateGesture(HLERequestContext& ctx) {
|
||||||
|
|
||||||
const auto parameters{rp.PopRaw<Parameters>()};
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::Gesture);
|
LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}",
|
||||||
|
parameters.basic_gesture_id, parameters.applet_resource_user_id);
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}, applet_resource_user_id={}",
|
Result result = ResultSuccess;
|
||||||
parameters.unknown, parameters.applet_resource_user_id);
|
auto& gesture = GetResourceManager()->GetController<Controller_Gesture>(HidController::Gesture);
|
||||||
|
|
||||||
|
if (!firmware_settings->IsDeviceManaged()) {
|
||||||
|
result = gesture.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
// TODO: Use gesture id here
|
||||||
|
result = gesture.Activate(parameters.applet_resource_user_id);
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::SetSupportedNpadStyleSet(HLERequestContext& ctx) {
|
void IHidServer::SetSupportedNpadStyleSet(HLERequestContext& ctx) {
|
||||||
|
@ -969,22 +1020,25 @@ void IHidServer::ActivateNpad(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::NPad);
|
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
auto& npad = GetResourceManager()->GetController<Controller_NPad>(HidController::NPad);
|
||||||
|
|
||||||
|
// TODO: npad->SetRevision(applet_resource_user_id, NpadRevision::Revision0);
|
||||||
|
const Result result = npad.Activate(applet_resource_user_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::DeactivateNpad(HLERequestContext& ctx) {
|
void IHidServer::DeactivateNpad(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->DeactivateController(HidController::NPad);
|
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
|
// This function does nothing since 10.0.0+
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
}
|
}
|
||||||
|
@ -1053,10 +1107,9 @@ void IHidServer::GetPlayerLedPattern(HLERequestContext& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::ActivateNpadWithRevision(HLERequestContext& ctx) {
|
void IHidServer::ActivateNpadWithRevision(HLERequestContext& ctx) {
|
||||||
// Should have no effect with how our npad sets up the data
|
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
struct Parameters {
|
struct Parameters {
|
||||||
s32 revision;
|
Controller_NPad::NpadRevision revision;
|
||||||
INSERT_PADDING_WORDS_NOINIT(1);
|
INSERT_PADDING_WORDS_NOINIT(1);
|
||||||
u64 applet_resource_user_id;
|
u64 applet_resource_user_id;
|
||||||
};
|
};
|
||||||
|
@ -1064,13 +1117,16 @@ void IHidServer::ActivateNpadWithRevision(HLERequestContext& ctx) {
|
||||||
|
|
||||||
const auto parameters{rp.PopRaw<Parameters>()};
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::NPad);
|
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID, "called, revision={}, applet_resource_user_id={}", parameters.revision,
|
LOG_DEBUG(Service_HID, "called, revision={}, applet_resource_user_id={}", parameters.revision,
|
||||||
parameters.applet_resource_user_id);
|
parameters.applet_resource_user_id);
|
||||||
|
|
||||||
|
auto& npad = GetResourceManager()->GetController<Controller_NPad>(HidController::NPad);
|
||||||
|
|
||||||
|
// TODO: npad->SetRevision(applet_resource_user_id, revision);
|
||||||
|
const auto result = npad.Activate(parameters.applet_resource_user_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::SetNpadJoyHoldType(HLERequestContext& ctx) {
|
void IHidServer::SetNpadJoyHoldType(HLERequestContext& ctx) {
|
||||||
|
@ -1718,12 +1774,22 @@ void IHidServer::ActivateConsoleSixAxisSensor(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::ConsoleSixAxisSensor);
|
LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
Result result = ResultSuccess;
|
||||||
|
auto console_sixaxis = GetResourceManager()->GetController<Controller_ConsoleSixAxis>(
|
||||||
|
HidController::ConsoleSixAxisSensor);
|
||||||
|
|
||||||
|
if (!firmware_settings->IsDeviceManaged()) {
|
||||||
|
result = console_sixaxis.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
result = console_sixaxis.Activate(applet_resource_user_id);
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IHidServer::StartConsoleSixAxisSensor(HLERequestContext& ctx) {
|
void IHidServer::StartConsoleSixAxisSensor(HLERequestContext& ctx) {
|
||||||
|
@ -1770,9 +1836,19 @@ void IHidServer::ActivateSevenSixAxisSensor(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
|
|
||||||
GetResourceManager()->ActivateController(HidController::ConsoleSixAxisSensor);
|
LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
Result result = ResultSuccess;
|
||||||
|
auto console_sixaxis = GetResourceManager()->GetController<Controller_ConsoleSixAxis>(
|
||||||
|
HidController::ConsoleSixAxisSensor);
|
||||||
|
|
||||||
|
if (!firmware_settings->IsDeviceManaged()) {
|
||||||
|
result = console_sixaxis.Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsSuccess()) {
|
||||||
|
console_sixaxis.Activate(applet_resource_user_id);
|
||||||
|
}
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
|
@ -1837,7 +1913,7 @@ void IHidServer::InitializeSevenSixAxisSensor(HLERequestContext& ctx) {
|
||||||
// Activate console six axis controller
|
// Activate console six axis controller
|
||||||
GetResourceManager()
|
GetResourceManager()
|
||||||
->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor)
|
->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor)
|
||||||
.ActivateController();
|
.Activate();
|
||||||
|
|
||||||
GetResourceManager()
|
GetResourceManager()
|
||||||
->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor)
|
->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor)
|
||||||
|
|
|
@ -11,10 +11,12 @@ class System;
|
||||||
|
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
class ResourceManager;
|
class ResourceManager;
|
||||||
|
class HidFirmwareSettings;
|
||||||
|
|
||||||
class IHidServer final : public ServiceFramework<IHidServer> {
|
class IHidServer final : public ServiceFramework<IHidServer> {
|
||||||
public:
|
public:
|
||||||
explicit IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource);
|
explicit IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
|
||||||
|
std::shared_ptr<HidFirmwareSettings> settings);
|
||||||
~IHidServer() override;
|
~IHidServer() override;
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> GetResourceManager();
|
std::shared_ptr<ResourceManager> GetResourceManager();
|
||||||
|
@ -141,6 +143,7 @@ private:
|
||||||
void IsFirmwareUpdateNeededForNotification(HLERequestContext& ctx);
|
void IsFirmwareUpdateNeededForNotification(HLERequestContext& ctx);
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> resource_manager;
|
std::shared_ptr<ResourceManager> resource_manager;
|
||||||
|
std::shared_ptr<HidFirmwareSettings> firmware_settings;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Service::HID
|
} // namespace Service::HID
|
||||||
|
|
|
@ -59,8 +59,8 @@ void ResourceManager::Initialize() {
|
||||||
MakeControllerWithServiceContext<Controller_Palma>(HidController::Palma, shared_memory);
|
MakeControllerWithServiceContext<Controller_Palma>(HidController::Palma, shared_memory);
|
||||||
|
|
||||||
// Homebrew doesn't try to activate some controllers, so we activate them by default
|
// Homebrew doesn't try to activate some controllers, so we activate them by default
|
||||||
GetController<Controller_NPad>(HidController::NPad).ActivateController();
|
GetController<Controller_NPad>(HidController::NPad).Activate();
|
||||||
GetController<Controller_Touchscreen>(HidController::Touchscreen).ActivateController();
|
GetController<Controller_Touchscreen>(HidController::Touchscreen).Activate();
|
||||||
|
|
||||||
GetController<Controller_Stubbed>(HidController::HomeButton).SetCommonHeaderOffset(0x4C00);
|
GetController<Controller_Stubbed>(HidController::HomeButton).SetCommonHeaderOffset(0x4C00);
|
||||||
GetController<Controller_Stubbed>(HidController::SleepButton).SetCommonHeaderOffset(0x4E00);
|
GetController<Controller_Stubbed>(HidController::SleepButton).SetCommonHeaderOffset(0x4E00);
|
||||||
|
@ -73,14 +73,6 @@ void ResourceManager::Initialize() {
|
||||||
is_initialized = true;
|
is_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceManager::ActivateController(HidController controller) {
|
|
||||||
controllers[static_cast<size_t>(controller)]->ActivateController();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::DeactivateController(HidController controller) {
|
|
||||||
controllers[static_cast<size_t>(controller)]->DeactivateController();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::UpdateControllers(std::uintptr_t user_data,
|
void ResourceManager::UpdateControllers(std::uintptr_t user_data,
|
||||||
std::chrono::nanoseconds ns_late) {
|
std::chrono::nanoseconds ns_late) {
|
||||||
auto& core_timing = system.CoreTiming();
|
auto& core_timing = system.CoreTiming();
|
||||||
|
|
|
@ -55,8 +55,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize();
|
void Initialize();
|
||||||
void ActivateController(HidController controller);
|
|
||||||
void DeactivateController(HidController controller);
|
|
||||||
|
|
||||||
void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
||||||
void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
||||||
|
|
Loading…
Reference in a new issue