14 changed files with 385 additions and 437 deletions
-
4src/core/CMakeLists.txt
-
34src/core/hle/service/am/am_types.h
-
4src/core/hle/service/am/applet_manager.cpp
-
2src/core/hle/service/am/applet_message_queue.cpp
-
35src/core/hle/service/am/applet_message_queue.h
-
314src/core/hle/service/am/common_state_getter.cpp
-
77src/core/hle/service/am/common_state_getter.h
-
4src/core/hle/service/am/library_applet_creator.cpp
-
2src/core/hle/service/am/service/application_proxy.cpp
-
277src/core/hle/service/am/service/common_state_getter.cpp
-
61src/core/hle/service/am/service/common_state_getter.h
-
2src/core/hle/service/am/service/library_applet_proxy.cpp
-
2src/core/hle/service/am/service/system_applet_proxy.cpp
-
4src/core/hle/service/am/window_controller.cpp
@ -1,314 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||
|
|
||||
#include "common/settings.h"
|
|
||||
#include "core/hle/service/am/am_results.h"
|
|
||||
#include "core/hle/service/am/applet.h"
|
|
||||
#include "core/hle/service/am/common_state_getter.h"
|
|
||||
#include "core/hle/service/am/lock_accessor.h"
|
|
||||
#include "core/hle/service/apm/apm_controller.h"
|
|
||||
#include "core/hle/service/apm/apm_interface.h"
|
|
||||
#include "core/hle/service/ipc_helpers.h"
|
|
||||
#include "core/hle/service/pm/pm.h"
|
|
||||
#include "core/hle/service/sm/sm.h"
|
|
||||
#include "core/hle/service/vi/vi.h"
|
|
||||
|
|
||||
namespace Service::AM { |
|
||||
|
|
||||
ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Applet> applet_) |
|
||||
: ServiceFramework{system_, "ICommonStateGetter"}, applet{std::move(applet_)} { |
|
||||
// clang-format off
|
|
||||
static const FunctionInfo functions[] = { |
|
||||
{0, &ICommonStateGetter::GetEventHandle, "GetEventHandle"}, |
|
||||
{1, &ICommonStateGetter::ReceiveMessage, "ReceiveMessage"}, |
|
||||
{2, nullptr, "GetThisAppletKind"}, |
|
||||
{3, nullptr, "AllowToEnterSleep"}, |
|
||||
{4, nullptr, "DisallowToEnterSleep"}, |
|
||||
{5, &ICommonStateGetter::GetOperationMode, "GetOperationMode"}, |
|
||||
{6, &ICommonStateGetter::GetPerformanceMode, "GetPerformanceMode"}, |
|
||||
{7, nullptr, "GetCradleStatus"}, |
|
||||
{8, &ICommonStateGetter::GetBootMode, "GetBootMode"}, |
|
||||
{9, &ICommonStateGetter::GetCurrentFocusState, "GetCurrentFocusState"}, |
|
||||
{10, &ICommonStateGetter::RequestToAcquireSleepLock, "RequestToAcquireSleepLock"}, |
|
||||
{11, nullptr, "ReleaseSleepLock"}, |
|
||||
{12, nullptr, "ReleaseSleepLockTransiently"}, |
|
||||
{13, &ICommonStateGetter::GetAcquiredSleepLockEvent, "GetAcquiredSleepLockEvent"}, |
|
||||
{14, nullptr, "GetWakeupCount"}, |
|
||||
{20, nullptr, "PushToGeneralChannel"}, |
|
||||
{30, nullptr, "GetHomeButtonReaderLockAccessor"}, |
|
||||
{31, &ICommonStateGetter::GetReaderLockAccessorEx, "GetReaderLockAccessorEx"}, |
|
||||
{32, nullptr, "GetWriterLockAccessorEx"}, |
|
||||
{40, nullptr, "GetCradleFwVersion"}, |
|
||||
{50, &ICommonStateGetter::IsVrModeEnabled, "IsVrModeEnabled"}, |
|
||||
{51, &ICommonStateGetter::SetVrModeEnabled, "SetVrModeEnabled"}, |
|
||||
{52, &ICommonStateGetter::SetLcdBacklighOffEnabled, "SetLcdBacklighOffEnabled"}, |
|
||||
{53, &ICommonStateGetter::BeginVrModeEx, "BeginVrModeEx"}, |
|
||||
{54, &ICommonStateGetter::EndVrModeEx, "EndVrModeEx"}, |
|
||||
{55, nullptr, "IsInControllerFirmwareUpdateSection"}, |
|
||||
{59, nullptr, "SetVrPositionForDebug"}, |
|
||||
{60, &ICommonStateGetter::GetDefaultDisplayResolution, "GetDefaultDisplayResolution"}, |
|
||||
{61, &ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent, "GetDefaultDisplayResolutionChangeEvent"}, |
|
||||
{62, nullptr, "GetHdcpAuthenticationState"}, |
|
||||
{63, nullptr, "GetHdcpAuthenticationStateChangeEvent"}, |
|
||||
{64, nullptr, "SetTvPowerStateMatchingMode"}, |
|
||||
{65, nullptr, "GetApplicationIdByContentActionName"}, |
|
||||
{66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"}, |
|
||||
{67, nullptr, "CancelCpuBoostMode"}, |
|
||||
{68, &ICommonStateGetter::GetBuiltInDisplayType, "GetBuiltInDisplayType"}, |
|
||||
{80, &ICommonStateGetter::PerformSystemButtonPressingIfInFocus, "PerformSystemButtonPressingIfInFocus"}, |
|
||||
{90, nullptr, "SetPerformanceConfigurationChangedNotification"}, |
|
||||
{91, nullptr, "GetCurrentPerformanceConfiguration"}, |
|
||||
{100, nullptr, "SetHandlingHomeButtonShortPressedEnabled"}, |
|
||||
{110, nullptr, "OpenMyGpuErrorHandler"}, |
|
||||
{120, &ICommonStateGetter::GetAppletLaunchedHistory, "GetAppletLaunchedHistory"}, |
|
||||
{200, nullptr, "GetOperationModeSystemInfo"}, |
|
||||
{300, &ICommonStateGetter::GetSettingsPlatformRegion, "GetSettingsPlatformRegion"}, |
|
||||
{400, nullptr, "ActivateMigrationService"}, |
|
||||
{401, nullptr, "DeactivateMigrationService"}, |
|
||||
{500, nullptr, "DisableSleepTillShutdown"}, |
|
||||
{501, nullptr, "SuppressDisablingSleepTemporarily"}, |
|
||||
{502, nullptr, "IsSleepEnabled"}, |
|
||||
{503, nullptr, "IsDisablingSleepSuppressed"}, |
|
||||
{900, &ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, |
|
||||
}; |
|
||||
// clang-format on
|
|
||||
|
|
||||
RegisterHandlers(functions); |
|
||||
} |
|
||||
|
|
||||
ICommonStateGetter::~ICommonStateGetter() = default; |
|
||||
|
|
||||
void ICommonStateGetter::GetBootMode(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push<u8>(static_cast<u8>(Service::PM::SystemBootMode::Normal)); // Normal boot mode
|
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetEventHandle(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushCopyObjects(applet->message_queue.GetMessageReceiveEvent()); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::ReceiveMessage(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
const auto message = applet->message_queue.PopMessage(); |
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
|
|
||||
if (message == AppletMessageQueue::AppletMessage::None) { |
|
||||
LOG_ERROR(Service_AM, "Message queue is empty"); |
|
||||
rb.Push(AM::ResultNoMessages); |
|
||||
rb.PushEnum<AppletMessageQueue::AppletMessage>(message); |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushEnum<AppletMessageQueue::AppletMessage>(message); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetCurrentFocusState(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
std::scoped_lock lk{applet->lock}; |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push(static_cast<u8>(applet->focus_state)); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetOperationMode(HLERequestContext& ctx) { |
|
||||
const bool use_docked_mode{Settings::IsDockedMode()}; |
|
||||
LOG_DEBUG(Service_AM, "called, use_docked_mode={}", use_docked_mode); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push(static_cast<u8>(use_docked_mode ? OperationMode::Docked : OperationMode::Handheld)); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetPerformanceMode(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushEnum(system.GetAPMController().GetCurrentPerformanceMode()); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::RequestToAcquireSleepLock(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
// Sleep lock is acquired immediately.
|
|
||||
applet->sleep_lock_event.Signal(); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetReaderLockAccessorEx(HLERequestContext& ctx) { |
|
||||
IPC::RequestParser rp{ctx}; |
|
||||
const auto unknown = rp.Pop<u32>(); |
|
||||
|
|
||||
LOG_INFO(Service_AM, "called, unknown={}", unknown); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
||||
|
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushIpcInterface<ILockAccessor>(system); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetAcquiredSleepLockEvent(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushCopyObjects(applet->sleep_lock_event.GetHandle()); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::IsVrModeEnabled(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
std::scoped_lock lk{applet->lock}; |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push(applet->vr_mode_enabled); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::SetVrModeEnabled(HLERequestContext& ctx) { |
|
||||
IPC::RequestParser rp{ctx}; |
|
||||
|
|
||||
std::scoped_lock lk{applet->lock}; |
|
||||
applet->vr_mode_enabled = rp.Pop<bool>(); |
|
||||
LOG_WARNING(Service_AM, "VR Mode is {}", applet->vr_mode_enabled ? "on" : "off"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::SetLcdBacklighOffEnabled(HLERequestContext& ctx) { |
|
||||
IPC::RequestParser rp{ctx}; |
|
||||
const auto is_lcd_backlight_off_enabled = rp.Pop<bool>(); |
|
||||
|
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called. is_lcd_backlight_off_enabled={}", |
|
||||
is_lcd_backlight_off_enabled); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::BeginVrModeEx(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
std::scoped_lock lk{applet->lock}; |
|
||||
applet->vr_mode_enabled = true; |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::EndVrModeEx(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
std::scoped_lock lk{applet->lock}; |
|
||||
applet->vr_mode_enabled = false; |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushCopyObjects(applet->message_queue.GetOperationModeChangedEvent()); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetDefaultDisplayResolution(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 4}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
|
|
||||
if (Settings::IsDockedMode()) { |
|
||||
rb.Push(static_cast<u32>(Service::VI::DisplayResolution::DockedWidth)); |
|
||||
rb.Push(static_cast<u32>(Service::VI::DisplayResolution::DockedHeight)); |
|
||||
} else { |
|
||||
rb.Push(static_cast<u32>(Service::VI::DisplayResolution::UndockedWidth)); |
|
||||
rb.Push(static_cast<u32>(Service::VI::DisplayResolution::UndockedHeight)); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::SetCpuBoostMode(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called, forwarding to APM:SYS"); |
|
||||
|
|
||||
const auto& sm = system.ServiceManager(); |
|
||||
const auto apm_sys = sm.GetService<APM::APM_Sys>("apm:sys"); |
|
||||
ASSERT(apm_sys != nullptr); |
|
||||
|
|
||||
apm_sys->SetCpuBoostMode(ctx); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetBuiltInDisplayType(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push(0); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::PerformSystemButtonPressingIfInFocus(HLERequestContext& ctx) { |
|
||||
IPC::RequestParser rp{ctx}; |
|
||||
const auto system_button{rp.PopEnum<SystemButtonType>()}; |
|
||||
|
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called, system_button={}", system_button); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetAppletLaunchedHistory(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
std::shared_ptr<Applet> current_applet = applet; |
|
||||
std::vector<AppletId> result; |
|
||||
|
|
||||
const size_t count = ctx.GetWriteBufferNumElements<AppletId>(); |
|
||||
size_t i; |
|
||||
|
|
||||
for (i = 0; i < count && current_applet != nullptr; i++) { |
|
||||
result.push_back(current_applet->applet_id); |
|
||||
current_applet = current_applet->caller_applet.lock(); |
|
||||
} |
|
||||
|
|
||||
ctx.WriteBuffer(result); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.Push(static_cast<u32>(i)); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::GetSettingsPlatformRegion(HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 3}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushEnum(SysPlatformRegion::Global); |
|
||||
} |
|
||||
|
|
||||
void ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled( |
|
||||
HLERequestContext& ctx) { |
|
||||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
||||
|
|
||||
std::scoped_lock lk{applet->lock}; |
|
||||
applet->request_exit_to_library_applet_at_execute_next_program_enabled = true; |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
} |
|
||||
|
|
||||
} // namespace Service::AM
|
|
||||
@ -1,77 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project |
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
|
||||
#pragma once |
|
||||
|
|
||||
#include "core/hle/service/kernel_helpers.h" |
|
||||
#include "core/hle/service/service.h" |
|
||||
|
|
||||
#include "core/hle/service/am/applet_message_queue.h" |
|
||||
|
|
||||
namespace Service::AM { |
|
||||
|
|
||||
struct Applet; |
|
||||
|
|
||||
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> { |
|
||||
public: |
|
||||
explicit ICommonStateGetter(Core::System& system_, std::shared_ptr<Applet> applet_); |
|
||||
~ICommonStateGetter() override; |
|
||||
|
|
||||
private: |
|
||||
// This is nn::oe::FocusState |
|
||||
enum class FocusState : u8 { |
|
||||
InFocus = 1, |
|
||||
NotInFocus = 2, |
|
||||
Background = 3, |
|
||||
}; |
|
||||
|
|
||||
// This is nn::oe::OperationMode |
|
||||
enum class OperationMode : u8 { |
|
||||
Handheld = 0, |
|
||||
Docked = 1, |
|
||||
}; |
|
||||
|
|
||||
// This is nn::am::service::SystemButtonType |
|
||||
enum class SystemButtonType { |
|
||||
None, |
|
||||
HomeButtonShortPressing, |
|
||||
HomeButtonLongPressing, |
|
||||
PowerButtonShortPressing, |
|
||||
PowerButtonLongPressing, |
|
||||
ShutdownSystem, |
|
||||
CaptureButtonShortPressing, |
|
||||
CaptureButtonLongPressing, |
|
||||
}; |
|
||||
|
|
||||
enum class SysPlatformRegion : s32 { |
|
||||
Global = 1, |
|
||||
Terra = 2, |
|
||||
}; |
|
||||
|
|
||||
void GetEventHandle(HLERequestContext& ctx); |
|
||||
void ReceiveMessage(HLERequestContext& ctx); |
|
||||
void GetCurrentFocusState(HLERequestContext& ctx); |
|
||||
void RequestToAcquireSleepLock(HLERequestContext& ctx); |
|
||||
void GetAcquiredSleepLockEvent(HLERequestContext& ctx); |
|
||||
void GetReaderLockAccessorEx(HLERequestContext& ctx); |
|
||||
void GetDefaultDisplayResolutionChangeEvent(HLERequestContext& ctx); |
|
||||
void GetOperationMode(HLERequestContext& ctx); |
|
||||
void GetPerformanceMode(HLERequestContext& ctx); |
|
||||
void GetBootMode(HLERequestContext& ctx); |
|
||||
void IsVrModeEnabled(HLERequestContext& ctx); |
|
||||
void SetVrModeEnabled(HLERequestContext& ctx); |
|
||||
void SetLcdBacklighOffEnabled(HLERequestContext& ctx); |
|
||||
void BeginVrModeEx(HLERequestContext& ctx); |
|
||||
void EndVrModeEx(HLERequestContext& ctx); |
|
||||
void GetDefaultDisplayResolution(HLERequestContext& ctx); |
|
||||
void SetCpuBoostMode(HLERequestContext& ctx); |
|
||||
void GetBuiltInDisplayType(HLERequestContext& ctx); |
|
||||
void PerformSystemButtonPressingIfInFocus(HLERequestContext& ctx); |
|
||||
void GetAppletLaunchedHistory(HLERequestContext& ctx); |
|
||||
void GetSettingsPlatformRegion(HLERequestContext& ctx); |
|
||||
void SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(HLERequestContext& ctx); |
|
||||
|
|
||||
const std::shared_ptr<Applet> applet; |
|
||||
}; |
|
||||
|
|
||||
} // namespace Service::AM |
|
||||
@ -0,0 +1,277 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
|
#include "common/settings.h"
|
||||
|
#include "core/hle/service/am/am_results.h"
|
||||
|
#include "core/hle/service/am/applet.h"
|
||||
|
#include "core/hle/service/am/lock_accessor.h"
|
||||
|
#include "core/hle/service/am/service/common_state_getter.h"
|
||||
|
#include "core/hle/service/apm/apm_interface.h"
|
||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||
|
#include "core/hle/service/pm/pm.h"
|
||||
|
#include "core/hle/service/sm/sm.h"
|
||||
|
#include "core/hle/service/vi/vi.h"
|
||||
|
|
||||
|
namespace Service::AM { |
||||
|
|
||||
|
ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Applet> applet) |
||||
|
: ServiceFramework{system_, "ICommonStateGetter"}, m_applet{std::move(applet)} { |
||||
|
// clang-format off
|
||||
|
static const FunctionInfo functions[] = { |
||||
|
{0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"}, |
||||
|
{1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"}, |
||||
|
{2, nullptr, "GetThisAppletKind"}, |
||||
|
{3, nullptr, "AllowToEnterSleep"}, |
||||
|
{4, nullptr, "DisallowToEnterSleep"}, |
||||
|
{5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"}, |
||||
|
{6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"}, |
||||
|
{7, nullptr, "GetCradleStatus"}, |
||||
|
{8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"}, |
||||
|
{9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"}, |
||||
|
{10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"}, |
||||
|
{11, nullptr, "ReleaseSleepLock"}, |
||||
|
{12, nullptr, "ReleaseSleepLockTransiently"}, |
||||
|
{13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"}, |
||||
|
{14, nullptr, "GetWakeupCount"}, |
||||
|
{20, nullptr, "PushToGeneralChannel"}, |
||||
|
{30, nullptr, "GetHomeButtonReaderLockAccessor"}, |
||||
|
{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"}, |
||||
|
{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, |
||||
|
{40, nullptr, "GetCradleFwVersion"}, |
||||
|
{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"}, |
||||
|
{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"}, |
||||
|
{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"}, |
||||
|
{53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx"}, |
||||
|
{54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx"}, |
||||
|
{55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection"}, |
||||
|
{59, nullptr, "SetVrPositionForDebug"}, |
||||
|
{60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"}, |
||||
|
{61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"}, |
||||
|
{62, nullptr, "GetHdcpAuthenticationState"}, |
||||
|
{63, nullptr, "GetHdcpAuthenticationStateChangeEvent"}, |
||||
|
{64, nullptr, "SetTvPowerStateMatchingMode"}, |
||||
|
{65, nullptr, "GetApplicationIdByContentActionName"}, |
||||
|
{66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"}, |
||||
|
{67, nullptr, "CancelCpuBoostMode"}, |
||||
|
{68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"}, |
||||
|
{80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"}, |
||||
|
{90, nullptr, "SetPerformanceConfigurationChangedNotification"}, |
||||
|
{91, nullptr, "GetCurrentPerformanceConfiguration"}, |
||||
|
{100, nullptr, "SetHandlingHomeButtonShortPressedEnabled"}, |
||||
|
{110, nullptr, "OpenMyGpuErrorHandler"}, |
||||
|
{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"}, |
||||
|
{200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"}, |
||||
|
{300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"}, |
||||
|
{400, nullptr, "ActivateMigrationService"}, |
||||
|
{401, nullptr, "DeactivateMigrationService"}, |
||||
|
{500, nullptr, "DisableSleepTillShutdown"}, |
||||
|
{501, nullptr, "SuppressDisablingSleepTemporarily"}, |
||||
|
{502, nullptr, "IsSleepEnabled"}, |
||||
|
{503, nullptr, "IsDisablingSleepSuppressed"}, |
||||
|
{900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, |
||||
|
}; |
||||
|
// clang-format on
|
||||
|
|
||||
|
RegisterHandlers(functions); |
||||
|
} |
||||
|
|
||||
|
ICommonStateGetter::~ICommonStateGetter() = default; |
||||
|
|
||||
|
Result ICommonStateGetter::GetEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
*out_event = &m_applet->message_queue.GetMessageReceiveEvent(); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::ReceiveMessage(Out<AppletMessage> out_applet_message) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
*out_applet_message = m_applet->message_queue.PopMessage(); |
||||
|
if (*out_applet_message == AppletMessage::None) { |
||||
|
LOG_ERROR(Service_AM, "Tried to pop message but none was available!"); |
||||
|
R_THROW(AM::ResultNoMessages); |
||||
|
} |
||||
|
|
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetCurrentFocusState(Out<FocusState> out_focus_state) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
std::scoped_lock lk{m_applet->lock}; |
||||
|
*out_focus_state = m_applet->focus_state; |
||||
|
|
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::RequestToAcquireSleepLock() { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
||||
|
|
||||
|
// Sleep lock is acquired immediately.
|
||||
|
m_applet->sleep_lock_event.Signal(); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetAcquiredSleepLockEvent( |
||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) { |
||||
|
LOG_WARNING(Service_AM, "called"); |
||||
|
*out_event = m_applet->sleep_lock_event.GetHandle(); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetReaderLockAccessorEx( |
||||
|
Out<SharedPointer<ILockAccessor>> out_lock_accessor, u32 button_type) { |
||||
|
LOG_INFO(Service_AM, "called, button_type={}", button_type); |
||||
|
*out_lock_accessor = std::make_shared<ILockAccessor>(system); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetWriterLockAccessorEx( |
||||
|
Out<SharedPointer<ILockAccessor>> out_lock_accessor, u32 button_type) { |
||||
|
LOG_INFO(Service_AM, "called, button_type={}", button_type); |
||||
|
*out_lock_accessor = std::make_shared<ILockAccessor>(system); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent( |
||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
*out_event = &m_applet->message_queue.GetOperationModeChangedEvent(); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetOperationMode(Out<OperationMode> out_operation_mode) { |
||||
|
const bool use_docked_mode{Settings::IsDockedMode()}; |
||||
|
LOG_DEBUG(Service_AM, "called, use_docked_mode={}", use_docked_mode); |
||||
|
*out_operation_mode = use_docked_mode ? OperationMode::Docked : OperationMode::Handheld; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetPerformanceMode(Out<APM::PerformanceMode> out_performance_mode) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
*out_performance_mode = system.GetAPMController().GetCurrentPerformanceMode(); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetBootMode(Out<PM::SystemBootMode> out_boot_mode) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
*out_boot_mode = Service::PM::SystemBootMode::Normal; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
std::scoped_lock lk{m_applet->lock}; |
||||
|
*out_is_vr_mode_enabled = m_applet->vr_mode_enabled; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::SetVrModeEnabled(bool is_vr_mode_enabled) { |
||||
|
std::scoped_lock lk{m_applet->lock}; |
||||
|
m_applet->vr_mode_enabled = is_vr_mode_enabled; |
||||
|
LOG_WARNING(Service_AM, "VR Mode is {}", m_applet->vr_mode_enabled ? "on" : "off"); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::SetLcdBacklighOffEnabled(bool is_lcd_backlight_off_enabled) { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called. is_lcd_backlight_off_enabled={}", |
||||
|
is_lcd_backlight_off_enabled); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::BeginVrModeEx() { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
||||
|
std::scoped_lock lk{m_applet->lock}; |
||||
|
m_applet->vr_mode_enabled = true; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::EndVrModeEx() { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
||||
|
std::scoped_lock lk{m_applet->lock}; |
||||
|
m_applet->vr_mode_enabled = false; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::IsInControllerFirmwareUpdateSection( |
||||
|
Out<bool> out_is_in_controller_firmware_update_section) { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
*out_is_in_controller_firmware_update_section = false; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetDefaultDisplayResolution(Out<s32> out_width, Out<s32> out_height) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
if (Settings::IsDockedMode()) { |
||||
|
*out_width = static_cast<u32>(Service::VI::DisplayResolution::DockedWidth); |
||||
|
*out_height = static_cast<u32>(Service::VI::DisplayResolution::DockedHeight); |
||||
|
} else { |
||||
|
*out_width = static_cast<u32>(Service::VI::DisplayResolution::UndockedWidth); |
||||
|
*out_height = static_cast<u32>(Service::VI::DisplayResolution::UndockedHeight); |
||||
|
} |
||||
|
|
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
void ICommonStateGetter::SetCpuBoostMode(HLERequestContext& ctx) { |
||||
|
LOG_DEBUG(Service_AM, "called, forwarding to APM:SYS"); |
||||
|
|
||||
|
const auto& sm = system.ServiceManager(); |
||||
|
const auto apm_sys = sm.GetService<APM::APM_Sys>("apm:sys"); |
||||
|
ASSERT(apm_sys != nullptr); |
||||
|
|
||||
|
apm_sys->SetCpuBoostMode(ctx); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetBuiltInDisplayType(Out<s32> out_display_type) { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
||||
|
*out_display_type = 0; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::PerformSystemButtonPressingIfInFocus(SystemButtonType type) { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called, type={}", type); |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetOperationModeSystemInfo(Out<u32> out_operation_mode_system_info) { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
||||
|
*out_operation_mode_system_info = 0; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetAppletLaunchedHistory( |
||||
|
Out<s32> out_count, OutArray<AppletId, BufferAttr_HipcMapAlias> out_applet_ids) { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
|
||||
|
std::shared_ptr<Applet> current_applet = m_applet; |
||||
|
|
||||
|
for (*out_count = 0; |
||||
|
*out_count < static_cast<s32>(out_applet_ids.size()) && current_applet != nullptr; |
||||
|
/* ... */) { |
||||
|
out_applet_ids[(*out_count)++] = current_applet->applet_id; |
||||
|
current_applet = current_applet->caller_applet.lock(); |
||||
|
} |
||||
|
|
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::GetSettingsPlatformRegion( |
||||
|
Out<SysPlatformRegion> out_settings_platform_region) { |
||||
|
LOG_INFO(Service_AM, "called"); |
||||
|
*out_settings_platform_region = SysPlatformRegion::Global; |
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
Result ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled() { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
||||
|
|
||||
|
std::scoped_lock lk{m_applet->lock}; |
||||
|
m_applet->request_exit_to_library_applet_at_execute_next_program_enabled = true; |
||||
|
|
||||
|
R_SUCCEED(); |
||||
|
} |
||||
|
|
||||
|
} // namespace Service::AM
|
||||
@ -0,0 +1,61 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "core/hle/service/am/am_types.h" |
||||
|
#include "core/hle/service/apm/apm_controller.h" |
||||
|
#include "core/hle/service/cmif_types.h" |
||||
|
#include "core/hle/service/pm/pm.h" |
||||
|
#include "core/hle/service/service.h" |
||||
|
|
||||
|
namespace Kernel { |
||||
|
class KReadableEvent; |
||||
|
} |
||||
|
|
||||
|
namespace Service::AM { |
||||
|
|
||||
|
struct Applet; |
||||
|
class ILockAccessor; |
||||
|
|
||||
|
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> { |
||||
|
public: |
||||
|
explicit ICommonStateGetter(Core::System& system_, std::shared_ptr<Applet> applet_); |
||||
|
~ICommonStateGetter() override; |
||||
|
|
||||
|
private: |
||||
|
Result GetEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event); |
||||
|
Result ReceiveMessage(Out<AppletMessage> out_applet_message); |
||||
|
Result GetCurrentFocusState(Out<FocusState> out_focus_state); |
||||
|
Result RequestToAcquireSleepLock(); |
||||
|
Result GetAcquiredSleepLockEvent(OutCopyHandle<Kernel::KReadableEvent> out_event); |
||||
|
Result GetReaderLockAccessorEx(Out<SharedPointer<ILockAccessor>> out_lock_accessor, |
||||
|
u32 button_type); |
||||
|
Result GetWriterLockAccessorEx(Out<SharedPointer<ILockAccessor>> out_lock_accessor, |
||||
|
u32 button_type); |
||||
|
Result GetDefaultDisplayResolutionChangeEvent(OutCopyHandle<Kernel::KReadableEvent> out_event); |
||||
|
Result GetOperationMode(Out<OperationMode> out_operation_mode); |
||||
|
Result GetPerformanceMode(Out<APM::PerformanceMode> out_performance_mode); |
||||
|
Result GetBootMode(Out<PM::SystemBootMode> out_boot_mode); |
||||
|
Result IsVrModeEnabled(Out<bool> out_is_vr_mode_enabled); |
||||
|
Result SetVrModeEnabled(bool is_vr_mode_enabled); |
||||
|
Result SetLcdBacklighOffEnabled(bool is_lcd_backlight_off_enabled); |
||||
|
Result BeginVrModeEx(); |
||||
|
Result EndVrModeEx(); |
||||
|
Result IsInControllerFirmwareUpdateSection( |
||||
|
Out<bool> out_is_in_controller_firmware_update_section); |
||||
|
Result GetDefaultDisplayResolution(Out<s32> out_width, Out<s32> out_height); |
||||
|
Result GetBuiltInDisplayType(Out<s32> out_display_type); |
||||
|
Result PerformSystemButtonPressingIfInFocus(SystemButtonType type); |
||||
|
Result GetOperationModeSystemInfo(Out<u32> out_operation_mode_system_info); |
||||
|
Result GetAppletLaunchedHistory(Out<s32> out_count, |
||||
|
OutArray<AppletId, BufferAttr_HipcMapAlias> out_applet_ids); |
||||
|
Result GetSettingsPlatformRegion(Out<SysPlatformRegion> out_settings_platform_region); |
||||
|
Result SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(); |
||||
|
|
||||
|
void SetCpuBoostMode(HLERequestContext& ctx); |
||||
|
|
||||
|
const std::shared_ptr<Applet> m_applet; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Service::AM |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue