Merge pull request #13031 from german77/btm-interfcae
service: btm: Migrate service to new IPC
This commit is contained in:
		| @@ -543,6 +543,16 @@ add_library(core STATIC | ||||
|     hle/service/btdrv/btdrv.h | ||||
|     hle/service/btm/btm.cpp | ||||
|     hle/service/btm/btm.h | ||||
|     hle/service/btm/btm_debug.cpp | ||||
|     hle/service/btm/btm_debug.h | ||||
|     hle/service/btm/btm_system.cpp | ||||
|     hle/service/btm/btm_system.h | ||||
|     hle/service/btm/btm_system_core.cpp | ||||
|     hle/service/btm/btm_system_core.h | ||||
|     hle/service/btm/btm_user.cpp | ||||
|     hle/service/btm/btm_user.h | ||||
|     hle/service/btm/btm_user_core.cpp | ||||
|     hle/service/btm/btm_user_core.h | ||||
|     hle/service/caps/caps.cpp | ||||
|     hle/service/caps/caps.h | ||||
|     hle/service/caps/caps_a.cpp | ||||
|   | ||||
| @@ -3,141 +3,18 @@ | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/kernel/k_event.h" | ||||
| #include "core/hle/service/btm/btm.h" | ||||
| #include "core/hle/service/ipc_helpers.h" | ||||
| #include "core/hle/service/kernel_helpers.h" | ||||
| #include "core/hle/service/btm/btm_debug.h" | ||||
| #include "core/hle/service/btm/btm_system.h" | ||||
| #include "core/hle/service/btm/btm_user.h" | ||||
| #include "core/hle/service/server_manager.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| class IBtmUserCore final : public ServiceFramework<IBtmUserCore> { | ||||
| class IBtm final : public ServiceFramework<IBtm> { | ||||
| public: | ||||
|     explicit IBtmUserCore(Core::System& system_) | ||||
|         : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &IBtmUserCore::AcquireBleScanEvent, "AcquireBleScanEvent"}, | ||||
|             {1, nullptr, "GetBleScanFilterParameter"}, | ||||
|             {2, nullptr, "GetBleScanFilterParameter2"}, | ||||
|             {3, nullptr, "StartBleScanForGeneral"}, | ||||
|             {4, nullptr, "StopBleScanForGeneral"}, | ||||
|             {5, nullptr, "GetBleScanResultsForGeneral"}, | ||||
|             {6, nullptr, "StartBleScanForPaired"}, | ||||
|             {7, nullptr, "StopBleScanForPaired"}, | ||||
|             {8, nullptr, "StartBleScanForSmartDevice"}, | ||||
|             {9, nullptr, "StopBleScanForSmartDevice"}, | ||||
|             {10, nullptr, "GetBleScanResultsForSmartDevice"}, | ||||
|             {17, &IBtmUserCore::AcquireBleConnectionEvent, "AcquireBleConnectionEvent"}, | ||||
|             {18, nullptr, "BleConnect"}, | ||||
|             {19, nullptr, "BleDisconnect"}, | ||||
|             {20, nullptr, "BleGetConnectionState"}, | ||||
|             {21, nullptr, "AcquireBlePairingEvent"}, | ||||
|             {22, nullptr, "BlePairDevice"}, | ||||
|             {23, nullptr, "BleUnPairDevice"}, | ||||
|             {24, nullptr, "BleUnPairDevice2"}, | ||||
|             {25, nullptr, "BleGetPairedDevices"}, | ||||
|             {26, &IBtmUserCore::AcquireBleServiceDiscoveryEvent, "AcquireBleServiceDiscoveryEvent"}, | ||||
|             {27, nullptr, "GetGattServices"}, | ||||
|             {28, nullptr, "GetGattService"}, | ||||
|             {29, nullptr, "GetGattIncludedServices"}, | ||||
|             {30, nullptr, "GetBelongingGattService"}, | ||||
|             {31, nullptr, "GetGattCharacteristics"}, | ||||
|             {32, nullptr, "GetGattDescriptors"}, | ||||
|             {33, &IBtmUserCore::AcquireBleMtuConfigEvent, "AcquireBleMtuConfigEvent"}, | ||||
|             {34, nullptr, "ConfigureBleMtu"}, | ||||
|             {35, nullptr, "GetBleMtu"}, | ||||
|             {36, nullptr, "RegisterBleGattDataPath"}, | ||||
|             {37, nullptr, "UnregisterBleGattDataPath"}, | ||||
|         }; | ||||
|         // clang-format on | ||||
|         RegisterHandlers(functions); | ||||
|  | ||||
|         scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent"); | ||||
|         connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent"); | ||||
|         service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent"); | ||||
|         config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent"); | ||||
|     } | ||||
|  | ||||
|     ~IBtmUserCore() override { | ||||
|         service_context.CloseEvent(scan_event); | ||||
|         service_context.CloseEvent(connection_event); | ||||
|         service_context.CloseEvent(service_discovery_event); | ||||
|         service_context.CloseEvent(config_event); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void AcquireBleScanEvent(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 3, 1}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.Push(true); | ||||
|         rb.PushCopyObjects(scan_event->GetReadableEvent()); | ||||
|     } | ||||
|  | ||||
|     void AcquireBleConnectionEvent(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 3, 1}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.Push(true); | ||||
|         rb.PushCopyObjects(connection_event->GetReadableEvent()); | ||||
|     } | ||||
|  | ||||
|     void AcquireBleServiceDiscoveryEvent(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 3, 1}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.Push(true); | ||||
|         rb.PushCopyObjects(service_discovery_event->GetReadableEvent()); | ||||
|     } | ||||
|  | ||||
|     void AcquireBleMtuConfigEvent(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 3, 1}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.Push(true); | ||||
|         rb.PushCopyObjects(config_event->GetReadableEvent()); | ||||
|     } | ||||
|  | ||||
|     KernelHelpers::ServiceContext service_context; | ||||
|  | ||||
|     Kernel::KEvent* scan_event; | ||||
|     Kernel::KEvent* connection_event; | ||||
|     Kernel::KEvent* service_discovery_event; | ||||
|     Kernel::KEvent* config_event; | ||||
| }; | ||||
|  | ||||
| class BTM_USR final : public ServiceFramework<BTM_USR> { | ||||
| public: | ||||
|     explicit BTM_USR(Core::System& system_) : ServiceFramework{system_, "btm:u"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &BTM_USR::GetCore, "GetCore"}, | ||||
|         }; | ||||
|         // clang-format on | ||||
|         RegisterHandlers(functions); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void GetCore(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "called"); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.PushIpcInterface<IBtmUserCore>(system); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| class BTM final : public ServiceFramework<BTM> { | ||||
| public: | ||||
|     explicit BTM(Core::System& system_) : ServiceFramework{system_, "btm"} { | ||||
|     explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, nullptr, "GetState"}, | ||||
| @@ -232,144 +109,13 @@ public: | ||||
|     } | ||||
| }; | ||||
|  | ||||
| class BTM_DBG final : public ServiceFramework<BTM_DBG> { | ||||
| public: | ||||
|     explicit BTM_DBG(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, nullptr, "AcquireDiscoveryEvent"}, | ||||
|             {1, nullptr, "StartDiscovery"}, | ||||
|             {2, nullptr, "CancelDiscovery"}, | ||||
|             {3, nullptr, "GetDeviceProperty"}, | ||||
|             {4, nullptr, "CreateBond"}, | ||||
|             {5, nullptr, "CancelBond"}, | ||||
|             {6, nullptr, "SetTsiMode"}, | ||||
|             {7, nullptr, "GeneralTest"}, | ||||
|             {8, nullptr, "HidConnect"}, | ||||
|             {9, nullptr, "GeneralGet"}, | ||||
|             {10, nullptr, "GetGattClientDisconnectionReason"}, | ||||
|             {11, nullptr, "GetBleConnectionParameter"}, | ||||
|             {12, nullptr, "GetBleConnectionParameterRequest"}, | ||||
|             {13, nullptr, "Unknown13"}, | ||||
|         }; | ||||
|         // clang-format on | ||||
|  | ||||
|         RegisterHandlers(functions); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> { | ||||
| public: | ||||
|     explicit IBtmSystemCore(Core::System& system_) : ServiceFramework{system_, "IBtmSystemCore"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &IBtmSystemCore::StartGamepadPairing, "StartGamepadPairing"}, | ||||
|             {1, &IBtmSystemCore::CancelGamepadPairing, "CancelGamepadPairing"}, | ||||
|             {2, nullptr, "ClearGamepadPairingDatabase"}, | ||||
|             {3, nullptr, "GetPairedGamepadCount"}, | ||||
|             {4, nullptr, "EnableRadio"}, | ||||
|             {5, nullptr, "DisableRadio"}, | ||||
|             {6, &IBtmSystemCore::IsRadioEnabled, "IsRadioEnabled"}, | ||||
|             {7, nullptr, "AcquireRadioEvent"}, | ||||
|             {8, nullptr, "AcquireGamepadPairingEvent"}, | ||||
|             {9, nullptr, "IsGamepadPairingStarted"}, | ||||
|             {10, nullptr, "StartAudioDeviceDiscovery"}, | ||||
|             {11, nullptr, "StopAudioDeviceDiscovery"}, | ||||
|             {12, nullptr, "IsDiscoveryingAudioDevice"}, | ||||
|             {13, nullptr, "GetDiscoveredAudioDevice"}, | ||||
|             {14, nullptr, "AcquireAudioDeviceConnectionEvent"}, | ||||
|             {15, nullptr, "ConnectAudioDevice"}, | ||||
|             {16, nullptr, "IsConnectingAudioDevice"}, | ||||
|             {17, &IBtmSystemCore::GetConnectedAudioDevices, "GetConnectedAudioDevices"}, | ||||
|             {18, nullptr, "DisconnectAudioDevice"}, | ||||
|             {19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"}, | ||||
|             {20, &IBtmSystemCore::GetPairedAudioDevices, "GetPairedAudioDevices"}, | ||||
|             {21, nullptr, "RemoveAudioDevicePairing"}, | ||||
|             {22, &IBtmSystemCore::RequestAudioDeviceConnectionRejection, "RequestAudioDeviceConnectionRejection"}, | ||||
|             {23, &IBtmSystemCore::CancelAudioDeviceConnectionRejection, "CancelAudioDeviceConnectionRejection"} | ||||
|         }; | ||||
|         // clang-format on | ||||
|  | ||||
|         RegisterHandlers(functions); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void IsRadioEnabled(HLERequestContext& ctx) { | ||||
|         LOG_DEBUG(Service_BTM, "(STUBBED) called"); // Spams a lot when controller applet is running | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 3}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.Push(true); | ||||
|     } | ||||
|  | ||||
|     void StartGamepadPairing(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultSuccess); | ||||
|     } | ||||
|  | ||||
|     void CancelGamepadPairing(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultSuccess); | ||||
|     } | ||||
|  | ||||
|     void CancelAudioDeviceConnectionRejection(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultSuccess); | ||||
|     } | ||||
|  | ||||
|     void GetConnectedAudioDevices(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|         IPC::ResponseBuilder rb{ctx, 3}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.Push<u32>(0); | ||||
|     } | ||||
|  | ||||
|     void GetPairedAudioDevices(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|         IPC::ResponseBuilder rb{ctx, 3}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.Push<u32>(0); | ||||
|     } | ||||
|  | ||||
|     void RequestAudioDeviceConnectionRejection(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultSuccess); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| class BTM_SYS final : public ServiceFramework<BTM_SYS> { | ||||
| public: | ||||
|     explicit BTM_SYS(Core::System& system_) : ServiceFramework{system_, "btm:sys"} { | ||||
|         // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, &BTM_SYS::GetCore, "GetCore"}, | ||||
|         }; | ||||
|         // clang-format on | ||||
|  | ||||
|         RegisterHandlers(functions); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void GetCore(HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_BTM, "called"); | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(ResultSuccess); | ||||
|         rb.PushIpcInterface<IBtmSystemCore>(system); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void LoopProcess(Core::System& system) { | ||||
|     auto server_manager = std::make_unique<ServerManager>(system); | ||||
|  | ||||
|     server_manager->RegisterNamedService("btm", std::make_shared<BTM>(system)); | ||||
|     server_manager->RegisterNamedService("btm:dbg", std::make_shared<BTM_DBG>(system)); | ||||
|     server_manager->RegisterNamedService("btm:sys", std::make_shared<BTM_SYS>(system)); | ||||
|     server_manager->RegisterNamedService("btm:u", std::make_shared<BTM_USR>(system)); | ||||
|     server_manager->RegisterNamedService("btm", std::make_shared<IBtm>(system)); | ||||
|     server_manager->RegisterNamedService("btm:dbg", std::make_shared<IBtmDebug>(system)); | ||||
|     server_manager->RegisterNamedService("btm:sys", std::make_shared<IBtmSystem>(system)); | ||||
|     server_manager->RegisterNamedService("btm:u", std::make_shared<IBtmUser>(system)); | ||||
|     ServerManager::RunServer(std::move(server_manager)); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -3,10 +3,6 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| namespace Service::SM { | ||||
| class ServiceManager; | ||||
| } | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| }; | ||||
|   | ||||
							
								
								
									
										33
									
								
								src/core/hle/service/btm/btm_debug.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/core/hle/service/btm/btm_debug.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #include "core/hle/service/btm/btm_debug.h" | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| IBtmDebug::IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, nullptr, "AcquireDiscoveryEvent"}, | ||||
|         {1, nullptr, "StartDiscovery"}, | ||||
|         {2, nullptr, "CancelDiscovery"}, | ||||
|         {3, nullptr, "GetDeviceProperty"}, | ||||
|         {4, nullptr, "CreateBond"}, | ||||
|         {5, nullptr, "CancelBond"}, | ||||
|         {6, nullptr, "SetTsiMode"}, | ||||
|         {7, nullptr, "GeneralTest"}, | ||||
|         {8, nullptr, "HidConnect"}, | ||||
|         {9, nullptr, "GeneralGet"}, | ||||
|         {10, nullptr, "GetGattClientDisconnectionReason"}, | ||||
|         {11, nullptr, "GetBleConnectionParameter"}, | ||||
|         {12, nullptr, "GetBleConnectionParameterRequest"}, | ||||
|         {13, nullptr, "Unknown13"}, | ||||
|     }; | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
|  | ||||
| IBtmDebug::~IBtmDebug() = default; | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										21
									
								
								src/core/hle/service/btm/btm_debug.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/core/hle/service/btm/btm_debug.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| class IBtmDebug final : public ServiceFramework<IBtmDebug> { | ||||
| public: | ||||
|     explicit IBtmDebug(Core::System& system_); | ||||
|     ~IBtmDebug() override; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										31
									
								
								src/core/hle/service/btm/btm_system.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/core/hle/service/btm/btm_system.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/service/btm/btm_system.h" | ||||
| #include "core/hle/service/btm/btm_system_core.h" | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| IBtmSystem::IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, C<&IBtmSystem::GetCore>, "GetCore"}, | ||||
|     }; | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
|  | ||||
| IBtmSystem::~IBtmSystem() = default; | ||||
|  | ||||
| Result IBtmSystem::GetCore(OutInterface<IBtmSystemCore> out_interface) { | ||||
|     LOG_WARNING(Service_BTM, "called"); | ||||
|  | ||||
|     *out_interface = std::make_shared<IBtmSystemCore>(system); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										25
									
								
								src/core/hle/service/btm/btm_system.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/core/hle/service/btm/btm_system.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::BTM { | ||||
| class IBtmSystemCore; | ||||
|  | ||||
| class IBtmSystem final : public ServiceFramework<IBtmSystem> { | ||||
| public: | ||||
|     explicit IBtmSystem(Core::System& system_); | ||||
|     ~IBtmSystem() override; | ||||
|  | ||||
| private: | ||||
|     Result GetCore(OutInterface<IBtmSystemCore> out_interface); | ||||
| }; | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										127
									
								
								src/core/hle/service/btm/btm_system_core.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								src/core/hle/service/btm/btm_system_core.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/service/btm/btm_system_core.h" | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/set/system_settings_server.h" | ||||
| #include "core/hle/service/sm/sm.h" | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| IBtmSystemCore::IBtmSystemCore(Core::System& system_) | ||||
|     : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"}, | ||||
|         {1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"}, | ||||
|         {2, nullptr, "ClearGamepadPairingDatabase"}, | ||||
|         {3, nullptr, "GetPairedGamepadCount"}, | ||||
|         {4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"}, | ||||
|         {5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"}, | ||||
|         {6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"}, | ||||
|         {7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"}, | ||||
|         {8, nullptr, "AcquireGamepadPairingEvent"}, | ||||
|         {9, nullptr, "IsGamepadPairingStarted"}, | ||||
|         {10, nullptr, "StartAudioDeviceDiscovery"}, | ||||
|         {11, nullptr, "StopAudioDeviceDiscovery"}, | ||||
|         {12, nullptr, "IsDiscoveryingAudioDevice"}, | ||||
|         {13, nullptr, "GetDiscoveredAudioDevice"}, | ||||
|         {14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"}, | ||||
|         {15, nullptr, "ConnectAudioDevice"}, | ||||
|         {16, nullptr, "IsConnectingAudioDevice"}, | ||||
|         {17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"}, | ||||
|         {18, nullptr, "DisconnectAudioDevice"}, | ||||
|         {19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"}, | ||||
|         {20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"}, | ||||
|         {21, nullptr, "RemoveAudioDevicePairing"}, | ||||
|         {22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"}, | ||||
|         {23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"} | ||||
|     }; | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|     radio_event = service_context.CreateEvent("IBtmSystemCore::RadioEvent"); | ||||
|     audio_device_connection_event = | ||||
|         service_context.CreateEvent("IBtmSystemCore::AudioDeviceConnectionEvent"); | ||||
|  | ||||
|     m_set_sys = | ||||
|         system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true); | ||||
| } | ||||
|  | ||||
| IBtmSystemCore::~IBtmSystemCore() { | ||||
|     service_context.CloseEvent(radio_event); | ||||
|     service_context.CloseEvent(audio_device_connection_event); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::StartGamepadPairing() { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::CancelGamepadPairing() { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::EnableRadio() { | ||||
|     LOG_DEBUG(Service_BTM, "called"); | ||||
|  | ||||
|     R_RETURN(m_set_sys->SetBluetoothEnableFlag(true)); | ||||
| } | ||||
| Result IBtmSystemCore::DisableRadio() { | ||||
|     LOG_DEBUG(Service_BTM, "called"); | ||||
|  | ||||
|     R_RETURN(m_set_sys->SetBluetoothEnableFlag(false)); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::IsRadioEnabled(Out<bool> out_is_enabled) { | ||||
|     LOG_DEBUG(Service_BTM, "called"); | ||||
|  | ||||
|     R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled)); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::AcquireRadioEvent(Out<bool> out_is_valid, | ||||
|                                          OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_is_valid = true; | ||||
|     *out_event = &radio_event->GetReadableEvent(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::AcquireAudioDeviceConnectionEvent( | ||||
|     OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_event = &audio_device_connection_event->GetReadableEvent(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::GetConnectedAudioDevices( | ||||
|     Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_count = 0; | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::GetPairedAudioDevices( | ||||
|     Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_count = 0; | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmSystemCore::CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										60
									
								
								src/core/hle/service/btm/btm_system_core.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/core/hle/service/btm/btm_system_core.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/kernel_helpers.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Kernel { | ||||
| class KEvent; | ||||
| class KReadableEvent; | ||||
| } // namespace Kernel | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::Set { | ||||
| class ISystemSettingsServer; | ||||
| } | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> { | ||||
| public: | ||||
|     explicit IBtmSystemCore(Core::System& system_); | ||||
|     ~IBtmSystemCore() override; | ||||
|  | ||||
| private: | ||||
|     Result StartGamepadPairing(); | ||||
|     Result CancelGamepadPairing(); | ||||
|     Result EnableRadio(); | ||||
|     Result DisableRadio(); | ||||
|     Result IsRadioEnabled(Out<bool> out_is_enabled); | ||||
|  | ||||
|     Result AcquireRadioEvent(Out<bool> out_is_valid, | ||||
|                              OutCopyHandle<Kernel::KReadableEvent> out_event); | ||||
|  | ||||
|     Result AcquireAudioDeviceConnectionEvent(OutCopyHandle<Kernel::KReadableEvent> out_event); | ||||
|  | ||||
|     Result GetConnectedAudioDevices( | ||||
|         Out<s32> out_count, | ||||
|         OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices); | ||||
|  | ||||
|     Result GetPairedAudioDevices( | ||||
|         Out<s32> out_count, | ||||
|         OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices); | ||||
|  | ||||
|     Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid); | ||||
|     Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid); | ||||
|  | ||||
|     KernelHelpers::ServiceContext service_context; | ||||
|  | ||||
|     Kernel::KEvent* radio_event; | ||||
|     Kernel::KEvent* audio_device_connection_event; | ||||
|     std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										30
									
								
								src/core/hle/service/btm/btm_user.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/core/hle/service/btm/btm_user.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/service/btm/btm_user.h" | ||||
| #include "core/hle/service/btm/btm_user_core.h" | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| IBtmUser::IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, C<&IBtmUser::GetCore>, "GetCore"}, | ||||
|     }; | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
|  | ||||
| IBtmUser::~IBtmUser() = default; | ||||
|  | ||||
| Result IBtmUser::GetCore(OutInterface<IBtmUserCore> out_interface) { | ||||
|     LOG_WARNING(Service_BTM, "called"); | ||||
|  | ||||
|     *out_interface = std::make_shared<IBtmUserCore>(system); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										25
									
								
								src/core/hle/service/btm/btm_user.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/core/hle/service/btm/btm_user.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::BTM { | ||||
| class IBtmUserCore; | ||||
|  | ||||
| class IBtmUser final : public ServiceFramework<IBtmUser> { | ||||
| public: | ||||
|     explicit IBtmUser(Core::System& system_); | ||||
|     ~IBtmUser() override; | ||||
|  | ||||
| private: | ||||
|     Result GetCore(OutInterface<IBtmUserCore> out_interface); | ||||
| }; | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										103
									
								
								src/core/hle/service/btm/btm_user_core.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								src/core/hle/service/btm/btm_user_core.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/hle/kernel/k_event.h" | ||||
| #include "core/hle/service/btm/btm_user_core.h" | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| IBtmUserCore::IBtmUserCore(Core::System& system_) | ||||
|     : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"}, | ||||
|         {1, nullptr, "GetBleScanFilterParameter"}, | ||||
|         {2, nullptr, "GetBleScanFilterParameter2"}, | ||||
|         {3, nullptr, "StartBleScanForGeneral"}, | ||||
|         {4, nullptr, "StopBleScanForGeneral"}, | ||||
|         {5, nullptr, "GetBleScanResultsForGeneral"}, | ||||
|         {6, nullptr, "StartBleScanForPaired"}, | ||||
|         {7, nullptr, "StopBleScanForPaired"}, | ||||
|         {8, nullptr, "StartBleScanForSmartDevice"}, | ||||
|         {9, nullptr, "StopBleScanForSmartDevice"}, | ||||
|         {10, nullptr, "GetBleScanResultsForSmartDevice"}, | ||||
|         {17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"}, | ||||
|         {18, nullptr, "BleConnect"}, | ||||
|         {19, nullptr, "BleDisconnect"}, | ||||
|         {20, nullptr, "BleGetConnectionState"}, | ||||
|         {21, nullptr, "AcquireBlePairingEvent"}, | ||||
|         {22, nullptr, "BlePairDevice"}, | ||||
|         {23, nullptr, "BleUnPairDevice"}, | ||||
|         {24, nullptr, "BleUnPairDevice2"}, | ||||
|         {25, nullptr, "BleGetPairedDevices"}, | ||||
|         {26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"}, | ||||
|         {27, nullptr, "GetGattServices"}, | ||||
|         {28, nullptr, "GetGattService"}, | ||||
|         {29, nullptr, "GetGattIncludedServices"}, | ||||
|         {30, nullptr, "GetBelongingGattService"}, | ||||
|         {31, nullptr, "GetGattCharacteristics"}, | ||||
|         {32, nullptr, "GetGattDescriptors"}, | ||||
|         {33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"}, | ||||
|         {34, nullptr, "ConfigureBleMtu"}, | ||||
|         {35, nullptr, "GetBleMtu"}, | ||||
|         {36, nullptr, "RegisterBleGattDataPath"}, | ||||
|         {37, nullptr, "UnregisterBleGattDataPath"}, | ||||
|     }; | ||||
|     // clang-format on | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent"); | ||||
|     connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent"); | ||||
|     service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent"); | ||||
|     config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent"); | ||||
| } | ||||
|  | ||||
| IBtmUserCore::~IBtmUserCore() { | ||||
|     service_context.CloseEvent(scan_event); | ||||
|     service_context.CloseEvent(connection_event); | ||||
|     service_context.CloseEvent(service_discovery_event); | ||||
|     service_context.CloseEvent(config_event); | ||||
| } | ||||
|  | ||||
| Result IBtmUserCore::AcquireBleScanEvent(Out<bool> out_is_valid, | ||||
|                                          OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_is_valid = true; | ||||
|     *out_event = &scan_event->GetReadableEvent(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmUserCore::AcquireBleConnectionEvent(Out<bool> out_is_valid, | ||||
|                                                OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_is_valid = true; | ||||
|     *out_event = &connection_event->GetReadableEvent(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmUserCore::AcquireBleServiceDiscoveryEvent( | ||||
|     Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_is_valid = true; | ||||
|     *out_event = &service_discovery_event->GetReadableEvent(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| Result IBtmUserCore::AcquireBleMtuConfigEvent(Out<bool> out_is_valid, | ||||
|                                               OutCopyHandle<Kernel::KReadableEvent> out_event) { | ||||
|     LOG_WARNING(Service_BTM, "(STUBBED) called"); | ||||
|  | ||||
|     *out_is_valid = true; | ||||
|     *out_event = &config_event->GetReadableEvent(); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| } // namespace Service::BTM | ||||
							
								
								
									
										47
									
								
								src/core/hle/service/btm/btm_user_core.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/core/hle/service/btm/btm_user_core.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/kernel_helpers.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Kernel { | ||||
| class KEvent; | ||||
| class KReadableEvent; | ||||
| } // namespace Kernel | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::BTM { | ||||
|  | ||||
| class IBtmUserCore final : public ServiceFramework<IBtmUserCore> { | ||||
| public: | ||||
|     explicit IBtmUserCore(Core::System& system_); | ||||
|     ~IBtmUserCore() override; | ||||
|  | ||||
| private: | ||||
|     Result AcquireBleScanEvent(Out<bool> out_is_valid, | ||||
|                                OutCopyHandle<Kernel::KReadableEvent> out_event); | ||||
|  | ||||
|     Result AcquireBleConnectionEvent(Out<bool> out_is_valid, | ||||
|                                      OutCopyHandle<Kernel::KReadableEvent> out_event); | ||||
|  | ||||
|     Result AcquireBleServiceDiscoveryEvent(Out<bool> out_is_valid, | ||||
|                                            OutCopyHandle<Kernel::KReadableEvent> out_event); | ||||
|  | ||||
|     Result AcquireBleMtuConfigEvent(Out<bool> out_is_valid, | ||||
|                                     OutCopyHandle<Kernel::KReadableEvent> out_event); | ||||
|  | ||||
|     KernelHelpers::ServiceContext service_context; | ||||
|  | ||||
|     Kernel::KEvent* scan_event; | ||||
|     Kernel::KEvent* connection_event; | ||||
|     Kernel::KEvent* service_discovery_event; | ||||
|     Kernel::KEvent* config_event; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::BTM | ||||
		Reference in New Issue
	
	Block a user