early-access version 4165
This commit is contained in:
		| @@ -1,7 +1,7 @@ | |||||||
| yuzu emulator early access | yuzu emulator early access | ||||||
| ============= | ============= | ||||||
|  |  | ||||||
| This is the source code for early-access 4164. | This is the source code for early-access 4165. | ||||||
|  |  | ||||||
| ## Legal Notice | ## Legal Notice | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ | |||||||
| #include <atomic> | #include <atomic> | ||||||
| #include <cstddef> | #include <cstddef> | ||||||
| #include <cstring> | #include <cstring> | ||||||
|  | #include <limits> | ||||||
| #include <new> | #include <new> | ||||||
| #include <span> | #include <span> | ||||||
| #include <type_traits> | #include <type_traits> | ||||||
|   | |||||||
| @@ -138,7 +138,7 @@ Result IAudioController::SetOutputModeSetting(Set::AudioOutputModeTarget target, | |||||||
| } | } | ||||||
|  |  | ||||||
| Result IAudioController::SetHeadphoneOutputLevelMode(HeadphoneOutputLevelMode output_level_mode) { | Result IAudioController::SetHeadphoneOutputLevelMode(HeadphoneOutputLevelMode output_level_mode) { | ||||||
|     LOG_WARNING(Audio, "(STUBBED) called"); |     LOG_WARNING(Audio, "(STUBBED) called, output_level_mode={}", output_level_mode); | ||||||
|     R_SUCCEED(); |     R_SUCCEED(); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ | |||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/hle/kernel/k_event.h" | #include "core/hle/kernel/k_event.h" | ||||||
| #include "core/hle/service/btdrv/btdrv.h" | #include "core/hle/service/btdrv/btdrv.h" | ||||||
|  | #include "core/hle/service/cmif_serialization.h" | ||||||
| #include "core/hle/service/ipc_helpers.h" | #include "core/hle/service/ipc_helpers.h" | ||||||
| #include "core/hle/service/kernel_helpers.h" | #include "core/hle/service/kernel_helpers.h" | ||||||
| #include "core/hle/service/server_manager.h" | #include "core/hle/service/server_manager.h" | ||||||
| @@ -13,9 +14,9 @@ | |||||||
|  |  | ||||||
| namespace Service::BtDrv { | namespace Service::BtDrv { | ||||||
|  |  | ||||||
| class Bt final : public ServiceFramework<Bt> { | class IBluetoothUser final : public ServiceFramework<IBluetoothUser> { | ||||||
| public: | public: | ||||||
|     explicit Bt(Core::System& system_) |     explicit IBluetoothUser(Core::System& system_) | ||||||
|         : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} { |         : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} { | ||||||
|         // clang-format off |         // clang-format off | ||||||
|         static const FunctionInfo functions[] = { |         static const FunctionInfo functions[] = { | ||||||
| @@ -28,7 +29,7 @@ public: | |||||||
|             {6, nullptr, "SetLeResponse"}, |             {6, nullptr, "SetLeResponse"}, | ||||||
|             {7, nullptr, "LeSendIndication"}, |             {7, nullptr, "LeSendIndication"}, | ||||||
|             {8, nullptr, "GetLeEventInfo"}, |             {8, nullptr, "GetLeEventInfo"}, | ||||||
|             {9, &Bt::RegisterBleEvent, "RegisterBleEvent"}, |             {9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"}, | ||||||
|         }; |         }; | ||||||
|         // clang-format on |         // clang-format on | ||||||
|         RegisterHandlers(functions); |         RegisterHandlers(functions); | ||||||
| @@ -36,17 +37,16 @@ public: | |||||||
|         register_event = service_context.CreateEvent("BT:RegisterEvent"); |         register_event = service_context.CreateEvent("BT:RegisterEvent"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ~Bt() override { |     ~IBluetoothUser() override { | ||||||
|         service_context.CloseEvent(register_event); |         service_context.CloseEvent(register_event); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     void RegisterBleEvent(HLERequestContext& ctx) { |     Result RegisterBleEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); |         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||||
|  |  | ||||||
|         IPC::ResponseBuilder rb{ctx, 2, 1}; |         *out_event = ®ister_event->GetReadableEvent(); | ||||||
|         rb.Push(ResultSuccess); |         R_SUCCEED(); | ||||||
|         rb.PushCopyObjects(register_event->GetReadableEvent()); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     KernelHelpers::ServiceContext service_context; |     KernelHelpers::ServiceContext service_context; | ||||||
| @@ -54,9 +54,9 @@ private: | |||||||
|     Kernel::KEvent* register_event; |     Kernel::KEvent* register_event; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class BtDrv final : public ServiceFramework<BtDrv> { | class IBluetoothDriver final : public ServiceFramework<IBluetoothDriver> { | ||||||
| public: | public: | ||||||
|     explicit BtDrv(Core::System& system_) : ServiceFramework{system_, "btdrv"} { |     explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} { | ||||||
|         // clang-format off |         // clang-format off | ||||||
|         static const FunctionInfo functions[] = { |         static const FunctionInfo functions[] = { | ||||||
|             {0, nullptr, "InitializeBluetoothDriver"}, |             {0, nullptr, "InitializeBluetoothDriver"}, | ||||||
| @@ -93,7 +93,7 @@ public: | |||||||
|             {31, nullptr, "EnableMcMode"}, |             {31, nullptr, "EnableMcMode"}, | ||||||
|             {32, nullptr, "EnableLlrScan"}, |             {32, nullptr, "EnableLlrScan"}, | ||||||
|             {33, nullptr, "DisableLlrScan"}, |             {33, nullptr, "DisableLlrScan"}, | ||||||
|             {34, nullptr, "EnableRadio"}, |             {34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"}, | ||||||
|             {35, nullptr, "SetVisibility"}, |             {35, nullptr, "SetVisibility"}, | ||||||
|             {36, nullptr, "EnableTbfcScan"}, |             {36, nullptr, "EnableTbfcScan"}, | ||||||
|             {37, nullptr, "RegisterHidReportEvent"}, |             {37, nullptr, "RegisterHidReportEvent"}, | ||||||
| @@ -195,13 +195,19 @@ public: | |||||||
|  |  | ||||||
|         RegisterHandlers(functions); |         RegisterHandlers(functions); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     Result EnableRadio() { | ||||||
|  |         LOG_WARNING(Service_BTDRV, "(STUBBED) called"); | ||||||
|  |         R_SUCCEED(); | ||||||
|  |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| 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); | ||||||
|  |  | ||||||
|     server_manager->RegisterNamedService("btdrv", std::make_shared<BtDrv>(system)); |     server_manager->RegisterNamedService("btdrv", std::make_shared<IBluetoothDriver>(system)); | ||||||
|     server_manager->RegisterNamedService("bt", std::make_shared<Bt>(system)); |     server_manager->RegisterNamedService("bt", std::make_shared<IBluetoothUser>(system)); | ||||||
|     ServerManager::RunServer(std::move(server_manager)); |     ServerManager::RunServer(std::move(server_manager)); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,13 +42,13 @@ public: | |||||||
|             {10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"}, |             {10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"}, | ||||||
|             {10702, nullptr, "AddPlayHistory"}, |             {10702, nullptr, "AddPlayHistory"}, | ||||||
|             {11000, nullptr, "GetProfileImageUrl"}, |             {11000, nullptr, "GetProfileImageUrl"}, | ||||||
|             {20100, nullptr, "GetFriendCount"}, |             {20100, &IFriendService::GetFriendCount, "GetFriendCount"}, | ||||||
|             {20101, nullptr, "GetNewlyFriendCount"}, |             {20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"}, | ||||||
|             {20102, nullptr, "GetFriendDetailedInfo"}, |             {20102, nullptr, "GetFriendDetailedInfo"}, | ||||||
|             {20103, nullptr, "SyncFriendList"}, |             {20103, nullptr, "SyncFriendList"}, | ||||||
|             {20104, nullptr, "RequestSyncFriendList"}, |             {20104, nullptr, "RequestSyncFriendList"}, | ||||||
|             {20110, nullptr, "LoadFriendSetting"}, |             {20110, nullptr, "LoadFriendSetting"}, | ||||||
|             {20200, nullptr, "GetReceivedFriendRequestCount"}, |             {20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"}, | ||||||
|             {20201, nullptr, "GetFriendRequestList"}, |             {20201, nullptr, "GetFriendRequestList"}, | ||||||
|             {20300, nullptr, "GetFriendCandidateList"}, |             {20300, nullptr, "GetFriendCandidateList"}, | ||||||
|             {20301, nullptr, "GetNintendoNetworkIdInfo"}, |             {20301, nullptr, "GetNintendoNetworkIdInfo"}, | ||||||
| @@ -61,14 +61,14 @@ public: | |||||||
|             {20501, nullptr, "GetRelationship"}, |             {20501, nullptr, "GetRelationship"}, | ||||||
|             {20600, nullptr, "GetUserPresenceView"}, |             {20600, nullptr, "GetUserPresenceView"}, | ||||||
|             {20700, nullptr, "GetPlayHistoryList"}, |             {20700, nullptr, "GetPlayHistoryList"}, | ||||||
|             {20701, nullptr, "GetPlayHistoryStatistics"}, |             {20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"}, | ||||||
|             {20800, nullptr, "LoadUserSetting"}, |             {20800, nullptr, "LoadUserSetting"}, | ||||||
|             {20801, nullptr, "SyncUserSetting"}, |             {20801, nullptr, "SyncUserSetting"}, | ||||||
|             {20900, nullptr, "RequestListSummaryOverlayNotification"}, |             {20900, nullptr, "RequestListSummaryOverlayNotification"}, | ||||||
|             {21000, nullptr, "GetExternalApplicationCatalog"}, |             {21000, nullptr, "GetExternalApplicationCatalog"}, | ||||||
|             {22000, nullptr, "GetReceivedFriendInvitationList"}, |             {22000, nullptr, "GetReceivedFriendInvitationList"}, | ||||||
|             {22001, nullptr, "GetReceivedFriendInvitationDetailedInfo"}, |             {22001, nullptr, "GetReceivedFriendInvitationDetailedInfo"}, | ||||||
|             {22010, nullptr, "GetReceivedFriendInvitationCountCache"}, |             {22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"}, | ||||||
|             {30100, nullptr, "DropFriendNewlyFlags"}, |             {30100, nullptr, "DropFriendNewlyFlags"}, | ||||||
|             {30101, nullptr, "DeleteFriend"}, |             {30101, nullptr, "DeleteFriend"}, | ||||||
|             {30110, nullptr, "DropFriendNewlyFlag"}, |             {30110, nullptr, "DropFriendNewlyFlag"}, | ||||||
| @@ -144,6 +144,33 @@ private: | |||||||
|         rb.PushCopyObjects(completion_event->GetReadableEvent()); |         rb.PushCopyObjects(completion_event->GetReadableEvent()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void GetFriendList(HLERequestContext& ctx) { | ||||||
|  |         IPC::RequestParser rp{ctx}; | ||||||
|  |         const auto friend_offset = rp.Pop<u32>(); | ||||||
|  |         const auto uuid = rp.PopRaw<Common::UUID>(); | ||||||
|  |         [[maybe_unused]] const auto filter = rp.PopRaw<SizedFriendFilter>(); | ||||||
|  |         const auto pid = rp.Pop<u64>(); | ||||||
|  |         LOG_WARNING(Service_Friend, "(STUBBED) called, offset={}, uuid=0x{}, pid={}", friend_offset, | ||||||
|  |                     uuid.RawString(), pid); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |  | ||||||
|  |         rb.Push<u32>(0); // Friend count | ||||||
|  |         // TODO(ogniK): Return a buffer of u64s which are the "NetworkServiceAccountId" | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void CheckFriendListAvailability(HLERequestContext& ctx) { | ||||||
|  |         IPC::RequestParser rp{ctx}; | ||||||
|  |         const auto uuid{rp.PopRaw<Common::UUID>()}; | ||||||
|  |  | ||||||
|  |         LOG_WARNING(Service_Friend, "(STUBBED) called, uuid=0x{}", uuid.RawString()); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |         rb.Push(true); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void GetBlockedUserListIds(HLERequestContext& ctx) { |     void GetBlockedUserListIds(HLERequestContext& ctx) { | ||||||
|         // This is safe to stub, as there should be no adverse consequences from reporting no |         // This is safe to stub, as there should be no adverse consequences from reporting no | ||||||
|         // blocked users. |         // blocked users. | ||||||
| @@ -153,6 +180,17 @@ private: | |||||||
|         rb.Push<u32>(0); // Indicates there are no blocked users |         rb.Push<u32>(0); // Indicates there are no blocked users | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void CheckBlockedUserListAvailability(HLERequestContext& ctx) { | ||||||
|  |         IPC::RequestParser rp{ctx}; | ||||||
|  |         const auto uuid{rp.PopRaw<Common::UUID>()}; | ||||||
|  |  | ||||||
|  |         LOG_WARNING(Service_Friend, "(STUBBED) called, uuid=0x{}", uuid.RawString()); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |         rb.Push(true); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void DeclareCloseOnlinePlaySession(HLERequestContext& ctx) { |     void DeclareCloseOnlinePlaySession(HLERequestContext& ctx) { | ||||||
|         // Stub used by Splatoon 2 |         // Stub used by Splatoon 2 | ||||||
|         LOG_WARNING(Service_Friend, "(STUBBED) called"); |         LOG_WARNING(Service_Friend, "(STUBBED) called"); | ||||||
| @@ -179,42 +217,43 @@ private: | |||||||
|         rb.Push(ResultSuccess); |         rb.Push(ResultSuccess); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void GetFriendList(HLERequestContext& ctx) { |     void GetFriendCount(HLERequestContext& ctx) { | ||||||
|         IPC::RequestParser rp{ctx}; |         LOG_DEBUG(Service_Friend, "(STUBBED) called"); | ||||||
|         const auto friend_offset = rp.Pop<u32>(); |  | ||||||
|         const auto uuid = rp.PopRaw<Common::UUID>(); |  | ||||||
|         [[maybe_unused]] const auto filter = rp.PopRaw<SizedFriendFilter>(); |  | ||||||
|         const auto pid = rp.Pop<u64>(); |  | ||||||
|         LOG_WARNING(Service_Friend, "(STUBBED) called, offset={}, uuid=0x{}, pid={}", friend_offset, |  | ||||||
|                     uuid.RawString(), pid); |  | ||||||
|  |  | ||||||
|         IPC::ResponseBuilder rb{ctx, 3}; |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|         rb.Push(ResultSuccess); |         rb.Push(ResultSuccess); | ||||||
|  |         rb.Push(0); | ||||||
|         rb.Push<u32>(0); // Friend count |  | ||||||
|         // TODO(ogniK): Return a buffer of u64s which are the "NetworkServiceAccountId" |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void CheckFriendListAvailability(HLERequestContext& ctx) { |     void GetNewlyFriendCount(HLERequestContext& ctx) { | ||||||
|         IPC::RequestParser rp{ctx}; |         LOG_DEBUG(Service_Friend, "(STUBBED) called"); | ||||||
|         const auto uuid{rp.PopRaw<Common::UUID>()}; |  | ||||||
|  |  | ||||||
|         LOG_WARNING(Service_Friend, "(STUBBED) called, uuid=0x{}", uuid.RawString()); |  | ||||||
|  |  | ||||||
|         IPC::ResponseBuilder rb{ctx, 3}; |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|         rb.Push(ResultSuccess); |         rb.Push(ResultSuccess); | ||||||
|         rb.Push(true); |         rb.Push(0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void CheckBlockedUserListAvailability(HLERequestContext& ctx) { |     void GetReceivedFriendRequestCount(HLERequestContext& ctx) { | ||||||
|         IPC::RequestParser rp{ctx}; |         LOG_DEBUG(Service_Friend, "(STUBBED) called"); | ||||||
|         const auto uuid{rp.PopRaw<Common::UUID>()}; |  | ||||||
|  |  | ||||||
|         LOG_WARNING(Service_Friend, "(STUBBED) called, uuid=0x{}", uuid.RawString()); |  | ||||||
|  |  | ||||||
|         IPC::ResponseBuilder rb{ctx, 3}; |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|         rb.Push(ResultSuccess); |         rb.Push(ResultSuccess); | ||||||
|         rb.Push(true); |         rb.Push(0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void GetPlayHistoryStatistics(HLERequestContext& ctx) { | ||||||
|  |         LOG_ERROR(Service_Friend, "(STUBBED) called, check in out"); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void GetReceivedFriendInvitationCountCache(HLERequestContext& ctx) { | ||||||
|  |         LOG_DEBUG(Service_Friend, "(STUBBED) called, check in out"); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |         rb.Push(0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     KernelHelpers::ServiceContext service_context; |     KernelHelpers::ServiceContext service_context; | ||||||
|   | |||||||
| @@ -201,7 +201,7 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour | |||||||
|         {1269, nullptr, "DeleteButtonConfigStorageLeft"}, |         {1269, nullptr, "DeleteButtonConfigStorageLeft"}, | ||||||
|         {1270, nullptr, "DeleteButtonConfigStorageRight"}, |         {1270, nullptr, "DeleteButtonConfigStorageRight"}, | ||||||
|         {1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"}, |         {1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"}, | ||||||
|         {1272, nullptr, "IsAnyCustomButtonConfigEnabled"}, |         {1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"}, | ||||||
|         {1273, nullptr, "SetAllCustomButtonConfigEnabled"}, |         {1273, nullptr, "SetAllCustomButtonConfigEnabled"}, | ||||||
|         {1274, nullptr, "SetDefaultButtonConfig"}, |         {1274, nullptr, "SetDefaultButtonConfig"}, | ||||||
|         {1275, nullptr, "SetAllDefaultButtonConfig"}, |         {1275, nullptr, "SetAllDefaultButtonConfig"}, | ||||||
| @@ -926,6 +926,16 @@ void IHidSystemServer::IsUsingCustomButtonConfig(HLERequestContext& ctx) { | |||||||
|     rb.Push(is_enabled); |     rb.Push(is_enabled); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void IHidSystemServer::IsAnyCustomButtonConfigEnabled(HLERequestContext& ctx) { | ||||||
|  |     const bool is_enabled = false; | ||||||
|  |  | ||||||
|  |     LOG_DEBUG(Service_HID, "(STUBBED) called, is_enabled={}", is_enabled); | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |     rb.Push(ResultSuccess); | ||||||
|  |     rb.Push(is_enabled); | ||||||
|  | } | ||||||
|  |  | ||||||
| std::shared_ptr<ResourceManager> IHidSystemServer::GetResourceManager() { | std::shared_ptr<ResourceManager> IHidSystemServer::GetResourceManager() { | ||||||
|     resource_manager->Initialize(); |     resource_manager->Initialize(); | ||||||
|     return resource_manager; |     return resource_manager; | ||||||
|   | |||||||
| @@ -77,6 +77,7 @@ private: | |||||||
|     void GetTouchScreenDefaultConfiguration(HLERequestContext& ctx); |     void GetTouchScreenDefaultConfiguration(HLERequestContext& ctx); | ||||||
|     void SetForceHandheldStyleVibration(HLERequestContext& ctx); |     void SetForceHandheldStyleVibration(HLERequestContext& ctx); | ||||||
|     void IsUsingCustomButtonConfig(HLERequestContext& ctx); |     void IsUsingCustomButtonConfig(HLERequestContext& ctx); | ||||||
|  |     void IsAnyCustomButtonConfigEnabled(HLERequestContext& ctx); | ||||||
|  |  | ||||||
|     std::shared_ptr<ResourceManager> GetResourceManager(); |     std::shared_ptr<ResourceManager> GetResourceManager(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,8 +18,8 @@ public: | |||||||
|     explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} { |     explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} { | ||||||
|         // clang-format off |         // clang-format off | ||||||
|         static const FunctionInfo functions[] = { |         static const FunctionInfo functions[] = { | ||||||
|             {0, nullptr, "SaveCurrentSetting"}, |             {0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"}, | ||||||
|             {1, nullptr, "LoadCurrentSetting"}, |             {1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"}, | ||||||
|             {2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"}, |             {2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"}, | ||||||
|             {3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"}, |             {3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"}, | ||||||
|             {4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"}, |             {4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"}, | ||||||
| @@ -47,7 +47,7 @@ public: | |||||||
|             {26, &LBL::EnableVrMode, "EnableVrMode"}, |             {26, &LBL::EnableVrMode, "EnableVrMode"}, | ||||||
|             {27, &LBL::DisableVrMode, "DisableVrMode"}, |             {27, &LBL::DisableVrMode, "DisableVrMode"}, | ||||||
|             {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, |             {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, | ||||||
|             {29, nullptr, "IsAutoBrightnessControlSupported"}, |             {29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"}, | ||||||
|         }; |         }; | ||||||
|         // clang-format on |         // clang-format on | ||||||
|  |  | ||||||
| @@ -60,6 +60,20 @@ private: | |||||||
|         On = 1, |         On = 1, | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     void SaveCurrentSetting(HLERequestContext& ctx) { | ||||||
|  |         LOG_WARNING(Service_LBL, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void LoadCurrentSetting(HLERequestContext& ctx) { | ||||||
|  |         LOG_WARNING(Service_LBL, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     void SetCurrentBrightnessSetting(HLERequestContext& ctx) { |     void SetCurrentBrightnessSetting(HLERequestContext& ctx) { | ||||||
|         IPC::RequestParser rp{ctx}; |         IPC::RequestParser rp{ctx}; | ||||||
|         auto brightness = rp.Pop<float>(); |         auto brightness = rp.Pop<float>(); | ||||||
| @@ -310,6 +324,14 @@ private: | |||||||
|         rb.Push(vr_mode_enabled); |         rb.Push(vr_mode_enabled); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     void IsAutoBrightnessControlSupported(HLERequestContext& ctx) { | ||||||
|  |         LOG_DEBUG(Service_LBL, "called"); | ||||||
|  |  | ||||||
|  |         IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|  |         rb.Push(ResultSuccess); | ||||||
|  |         rb.Push<u8>(auto_brightness_supported); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     bool vr_mode_enabled = false; |     bool vr_mode_enabled = false; | ||||||
|     float current_brightness = 1.0f; |     float current_brightness = 1.0f; | ||||||
|     float ambient_light_value = 0.0f; |     float ambient_light_value = 0.0f; | ||||||
| @@ -317,7 +339,8 @@ private: | |||||||
|     bool dimming = true; |     bool dimming = true; | ||||||
|     bool backlight_enabled = true; |     bool backlight_enabled = true; | ||||||
|     bool update_instantly = false; |     bool update_instantly = false; | ||||||
|     bool auto_brightness = false; // TODO(ogniK): Move to system settings |     bool auto_brightness = false; | ||||||
|  |     bool auto_brightness_supported = true; // TODO(ogniK): Move to system settings | ||||||
| }; | }; | ||||||
|  |  | ||||||
| void LoopProcess(Core::System& system) { | void LoopProcess(Core::System& system) { | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ | |||||||
| #include "core/hle/service/nfc/nfc_result.h" | #include "core/hle/service/nfc/nfc_result.h" | ||||||
| #include "core/hle/service/psc/time/steady_clock.h" | #include "core/hle/service/psc/time/steady_clock.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
|  | #include "core/hle/service/set/system_settings_server.h" | ||||||
| #include "core/hle/service/sm/sm.h" | #include "core/hle/service/sm/sm.h" | ||||||
| #include "hid_core/hid_types.h" | #include "hid_core/hid_types.h" | ||||||
| #include "hid_core/hid_util.h" | #include "hid_core/hid_util.h" | ||||||
| @@ -32,6 +33,9 @@ DeviceManager::DeviceManager(Core::System& system_, KernelHelpers::ServiceContex | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     is_initialized = false; |     is_initialized = false; | ||||||
|  |  | ||||||
|  |     m_set_sys = | ||||||
|  |         system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true); | ||||||
| } | } | ||||||
|  |  | ||||||
| DeviceManager ::~DeviceManager() { | DeviceManager ::~DeviceManager() { | ||||||
| @@ -774,8 +778,8 @@ Result DeviceManager::CheckDeviceState(std::shared_ptr<NfcDevice> device) const | |||||||
| } | } | ||||||
|  |  | ||||||
| Result DeviceManager::IsNfcEnabled() const { | Result DeviceManager::IsNfcEnabled() const { | ||||||
|     // TODO: This calls nn::settings::detail::GetNfcEnableFlag |     bool is_enabled{}; | ||||||
|     const bool is_enabled = true; |     R_TRY(m_set_sys->GetNfcEnableFlag(&is_enabled)); | ||||||
|     if (!is_enabled) { |     if (!is_enabled) { | ||||||
|         return ResultNfcDisabled; |         return ResultNfcDisabled; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -15,6 +15,10 @@ | |||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
| #include "hid_core/hid_types.h" | #include "hid_core/hid_types.h" | ||||||
|  |  | ||||||
|  | namespace Service::Set { | ||||||
|  | class ISystemSettingsServer; | ||||||
|  | } | ||||||
|  |  | ||||||
| namespace Service::NFC { | namespace Service::NFC { | ||||||
| class NfcDevice; | class NfcDevice; | ||||||
|  |  | ||||||
| @@ -98,6 +102,7 @@ private: | |||||||
|     Core::System& system; |     Core::System& system; | ||||||
|     KernelHelpers::ServiceContext service_context; |     KernelHelpers::ServiceContext service_context; | ||||||
|     Kernel::KEvent* availability_change_event; |     Kernel::KEvent* availability_change_event; | ||||||
|  |     std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } // namespace Service::NFC | } // namespace Service::NFC | ||||||
|   | |||||||
| @@ -57,7 +57,7 @@ public: | |||||||
|             {1, &NfcInterface::Finalize, "FinalizeOld"}, |             {1, &NfcInterface::Finalize, "FinalizeOld"}, | ||||||
|             {2, &NfcInterface::GetState, "GetStateOld"}, |             {2, &NfcInterface::GetState, "GetStateOld"}, | ||||||
|             {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, |             {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, | ||||||
|             {100, nullptr, "SetNfcEnabledOld"}, |             {100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"}, | ||||||
|             {400, &NfcInterface::Initialize, "Initialize"}, |             {400, &NfcInterface::Initialize, "Initialize"}, | ||||||
|             {401, &NfcInterface::Finalize, "Finalize"}, |             {401, &NfcInterface::Finalize, "Finalize"}, | ||||||
|             {402, &NfcInterface::GetState, "GetState"}, |             {402, &NfcInterface::GetState, "GetState"}, | ||||||
| @@ -71,7 +71,7 @@ public: | |||||||
|             {410, &NfcInterface::GetTagInfo, "GetTagInfo"}, |             {410, &NfcInterface::GetTagInfo, "GetTagInfo"}, | ||||||
|             {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, |             {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, | ||||||
|             {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, |             {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, | ||||||
|             {500, nullptr, "SetNfcEnabled"}, |             {500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"}, | ||||||
|             {510, nullptr, "OutputTestWave"}, |             {510, nullptr, "OutputTestWave"}, | ||||||
|             {1000, &NfcInterface::ReadMifare, "ReadMifare"}, |             {1000, &NfcInterface::ReadMifare, "ReadMifare"}, | ||||||
|             {1001, &NfcInterface::WriteMifare, "WriteMifare"}, |             {1001, &NfcInterface::WriteMifare, "WriteMifare"}, | ||||||
|   | |||||||
| @@ -13,13 +13,18 @@ | |||||||
| #include "core/hle/service/nfc/nfc_result.h" | #include "core/hle/service/nfc/nfc_result.h" | ||||||
| #include "core/hle/service/nfc/nfc_types.h" | #include "core/hle/service/nfc/nfc_types.h" | ||||||
| #include "core/hle/service/nfp/nfp_result.h" | #include "core/hle/service/nfp/nfp_result.h" | ||||||
|  | #include "core/hle/service/set/system_settings_server.h" | ||||||
|  | #include "core/hle/service/sm/sm.h" | ||||||
| #include "hid_core/hid_types.h" | #include "hid_core/hid_types.h" | ||||||
|  |  | ||||||
| namespace Service::NFC { | namespace Service::NFC { | ||||||
|  |  | ||||||
| NfcInterface::NfcInterface(Core::System& system_, const char* name, BackendType service_backend) | NfcInterface::NfcInterface(Core::System& system_, const char* name, BackendType service_backend) | ||||||
|     : ServiceFramework{system_, name}, service_context{system_, service_name}, |     : ServiceFramework{system_, name}, service_context{system_, service_name}, | ||||||
|       backend_type{service_backend} {} |       backend_type{service_backend} { | ||||||
|  |     m_set_sys = | ||||||
|  |         system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true); | ||||||
|  | } | ||||||
|  |  | ||||||
| NfcInterface ::~NfcInterface() = default; | NfcInterface ::~NfcInterface() = default; | ||||||
|  |  | ||||||
| @@ -65,11 +70,11 @@ void NfcInterface::GetState(HLERequestContext& ctx) { | |||||||
| void NfcInterface::IsNfcEnabled(HLERequestContext& ctx) { | void NfcInterface::IsNfcEnabled(HLERequestContext& ctx) { | ||||||
|     LOG_DEBUG(Service_NFC, "called"); |     LOG_DEBUG(Service_NFC, "called"); | ||||||
|  |  | ||||||
|     // TODO: This calls nn::settings::detail::GetNfcEnableFlag |     bool is_enabled{}; | ||||||
|     const bool is_enabled = true; |     const auto result = m_set_sys->GetNfcEnableFlag(&is_enabled); | ||||||
|  |  | ||||||
|     IPC::ResponseBuilder rb{ctx, 3}; |     IPC::ResponseBuilder rb{ctx, 3}; | ||||||
|     rb.Push(ResultSuccess); |     rb.Push(result); | ||||||
|     rb.Push(is_enabled); |     rb.Push(is_enabled); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -212,6 +217,17 @@ void NfcInterface::AttachDeactivateEvent(HLERequestContext& ctx) { | |||||||
|     rb.PushCopyObjects(out_event); |     rb.PushCopyObjects(out_event); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void NfcInterface::SetNfcEnabled(HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp{ctx}; | ||||||
|  |     const auto is_enabled{rp.Pop<bool>()}; | ||||||
|  |     LOG_DEBUG(Service_NFC, "called, is_enabled={}", is_enabled); | ||||||
|  |  | ||||||
|  |     const auto result = m_set_sys->SetNfcEnableFlag(is_enabled); | ||||||
|  |  | ||||||
|  |     IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|  |     rb.Push(result); | ||||||
|  | } | ||||||
|  |  | ||||||
| void NfcInterface::ReadMifare(HLERequestContext& ctx) { | void NfcInterface::ReadMifare(HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp{ctx}; |     IPC::RequestParser rp{ctx}; | ||||||
|     const auto device_handle{rp.Pop<u64>()}; |     const auto device_handle{rp.Pop<u64>()}; | ||||||
|   | |||||||
| @@ -7,6 +7,10 @@ | |||||||
| #include "core/hle/service/nfc/nfc_types.h" | #include "core/hle/service/nfc/nfc_types.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
|  |  | ||||||
|  | namespace Service::Set { | ||||||
|  | class ISystemSettingsServer; | ||||||
|  | } | ||||||
|  |  | ||||||
| namespace Service::NFC { | namespace Service::NFC { | ||||||
| class DeviceManager; | class DeviceManager; | ||||||
|  |  | ||||||
| @@ -29,6 +33,7 @@ public: | |||||||
|     void AttachActivateEvent(HLERequestContext& ctx); |     void AttachActivateEvent(HLERequestContext& ctx); | ||||||
|     void AttachDeactivateEvent(HLERequestContext& ctx); |     void AttachDeactivateEvent(HLERequestContext& ctx); | ||||||
|     void ReadMifare(HLERequestContext& ctx); |     void ReadMifare(HLERequestContext& ctx); | ||||||
|  |     void SetNfcEnabled(HLERequestContext& ctx); | ||||||
|     void WriteMifare(HLERequestContext& ctx); |     void WriteMifare(HLERequestContext& ctx); | ||||||
|     void SendCommandByPassThrough(HLERequestContext& ctx); |     void SendCommandByPassThrough(HLERequestContext& ctx); | ||||||
|  |  | ||||||
| @@ -44,6 +49,7 @@ protected: | |||||||
|     BackendType backend_type; |     BackendType backend_type; | ||||||
|     State state{State::NonInitialized}; |     State state{State::NonInitialized}; | ||||||
|     std::shared_ptr<DeviceManager> device_manager = nullptr; |     std::shared_ptr<DeviceManager> device_manager = nullptr; | ||||||
|  |     std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } // namespace Service::NFC | } // namespace Service::NFC | ||||||
|   | |||||||
| @@ -3,22 +3,26 @@ | |||||||
|  |  | ||||||
| #include <memory> | #include <memory> | ||||||
|  |  | ||||||
|  | #include "core/hle/kernel/k_event.h" | ||||||
|  | #include "core/hle/service/cmif_serialization.h" | ||||||
|  | #include "core/hle/service/kernel_helpers.h" | ||||||
| #include "core/hle/service/npns/npns.h" | #include "core/hle/service/npns/npns.h" | ||||||
| #include "core/hle/service/server_manager.h" | #include "core/hle/service/server_manager.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
|  |  | ||||||
| namespace Service::NPNS { | namespace Service::NPNS { | ||||||
|  |  | ||||||
| class NPNS_S final : public ServiceFramework<NPNS_S> { | class INpnsSystem final : public ServiceFramework<INpnsSystem> { | ||||||
| public: | public: | ||||||
|     explicit NPNS_S(Core::System& system_) : ServiceFramework{system_, "npns:s"} { |     explicit INpnsSystem(Core::System& system_) | ||||||
|  |         : ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"} { | ||||||
|         // clang-format off |         // clang-format off | ||||||
|         static const FunctionInfo functions[] = { |         static const FunctionInfo functions[] = { | ||||||
|             {1, nullptr, "ListenAll"}, |             {1, nullptr, "ListenAll"}, | ||||||
|             {2, nullptr, "ListenTo"}, |             {2, C<&INpnsSystem::ListenTo>, "ListenTo"}, | ||||||
|             {3, nullptr, "Receive"}, |             {3, nullptr, "Receive"}, | ||||||
|             {4, nullptr, "ReceiveRaw"}, |             {4, nullptr, "ReceiveRaw"}, | ||||||
|             {5, nullptr, "GetReceiveEvent"}, |             {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"}, | ||||||
|             {6, nullptr, "ListenUndelivered"}, |             {6, nullptr, "ListenUndelivered"}, | ||||||
|             {7, nullptr, "GetStateChangeEVent"}, |             {7, nullptr, "GetStateChangeEVent"}, | ||||||
|             {11, nullptr, "SubscribeTopic"}, |             {11, nullptr, "SubscribeTopic"}, | ||||||
| @@ -59,12 +63,34 @@ public: | |||||||
|         // clang-format on |         // clang-format on | ||||||
|  |  | ||||||
|         RegisterHandlers(functions); |         RegisterHandlers(functions); | ||||||
|  |  | ||||||
|  |         get_receive_event = service_context.CreateEvent("npns:s:GetReceiveEvent"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     ~INpnsSystem() override { | ||||||
|  |         service_context.CloseEvent(get_receive_event); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     Result ListenTo(u32 program_id) { | ||||||
|  |         LOG_WARNING(Service_AM, "(STUBBED) called, program_id={}", program_id); | ||||||
|  |         R_SUCCEED(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Result GetReceiveEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||||
|  |         LOG_WARNING(Service_AM, "(STUBBED) called"); | ||||||
|  |  | ||||||
|  |         *out_event = &get_receive_event->GetReadableEvent(); | ||||||
|  |         R_SUCCEED(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     KernelHelpers::ServiceContext service_context; | ||||||
|  |     Kernel::KEvent* get_receive_event; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| class NPNS_U final : public ServiceFramework<NPNS_U> { | class INpnsUser final : public ServiceFramework<INpnsUser> { | ||||||
| public: | public: | ||||||
|     explicit NPNS_U(Core::System& system_) : ServiceFramework{system_, "npns:u"} { |     explicit INpnsUser(Core::System& system_) : ServiceFramework{system_, "npns:u"} { | ||||||
|         // clang-format off |         // clang-format off | ||||||
|         static const FunctionInfo functions[] = { |         static const FunctionInfo functions[] = { | ||||||
|             {1, nullptr, "ListenAll"}, |             {1, nullptr, "ListenAll"}, | ||||||
| @@ -97,8 +123,8 @@ public: | |||||||
| 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); | ||||||
|  |  | ||||||
|     server_manager->RegisterNamedService("npns:s", std::make_shared<NPNS_S>(system)); |     server_manager->RegisterNamedService("npns:s", std::make_shared<INpnsSystem>(system)); | ||||||
|     server_manager->RegisterNamedService("npns:u", std::make_shared<NPNS_U>(system)); |     server_manager->RegisterNamedService("npns:u", std::make_shared<INpnsUser>(system)); | ||||||
|     ServerManager::RunServer(std::move(server_manager)); |     ServerManager::RunServer(std::move(server_manager)); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -405,8 +405,7 @@ struct EulaVersion { | |||||||
|     SystemRegionCode region_code; |     SystemRegionCode region_code; | ||||||
|     EulaVersionClockType clock_type; |     EulaVersionClockType clock_type; | ||||||
|     INSERT_PADDING_BYTES(0x4); |     INSERT_PADDING_BYTES(0x4); | ||||||
|     s64 posix_time; |     Service::PSC::Time::SystemClockContext system_clock_context; | ||||||
|     Service::PSC::Time::SteadyClockTimePoint timestamp; |  | ||||||
| }; | }; | ||||||
| static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size"); | static_assert(sizeof(EulaVersion) == 0x30, "EulaVersion is incorrect size"); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -306,6 +306,17 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) | |||||||
|     RegisterHandlers(functions); |     RegisterHandlers(functions); | ||||||
|  |  | ||||||
|     SetupSettings(); |     SetupSettings(); | ||||||
|  |  | ||||||
|  |     // TODO: Remove this when starter applet is fully functional | ||||||
|  |     EulaVersion eula_version{ | ||||||
|  |         .version = 0x10000, | ||||||
|  |         .region_code = m_system_settings.region_code, | ||||||
|  |         .clock_type = EulaVersionClockType::SteadyClock, | ||||||
|  |         .system_clock_context = m_system_settings.user_system_clock_context, | ||||||
|  |     }; | ||||||
|  |     m_system_settings.eula_versions[0] = eula_version; | ||||||
|  |     m_system_settings.eula_version_count = 1; | ||||||
|  |  | ||||||
|     m_save_thread = |     m_save_thread = | ||||||
|         std::jthread([this](std::stop_token stop_token) { StoreSettingsThreadFunc(stop_token); }); |         std::jthread([this](std::stop_token stop_token) { StoreSettingsThreadFunc(stop_token); }); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user