|
|
|
@ -6,13 +6,118 @@ |
|
|
|
|
|
|
|
#include "common/logging/log.h"
|
|
|
|
#include "core/hle/ipc_helpers.h"
|
|
|
|
#include "core/hle/kernel/event.h"
|
|
|
|
#include "core/hle/kernel/hle_ipc.h"
|
|
|
|
#include "core/hle/service/btm/btm.h"
|
|
|
|
#include "core/hle/service/service.h"
|
|
|
|
#include "core/hle/service/sm/sm.h"
|
|
|
|
|
|
|
|
namespace Service::BTM { |
|
|
|
|
|
|
|
class IBtmUserCore final : public ServiceFramework<IBtmUserCore> { |
|
|
|
public: |
|
|
|
explicit IBtmUserCore() : ServiceFramework{"IBtmUserCore"} { |
|
|
|
// clang-format off
|
|
|
|
static const FunctionInfo functions[] = { |
|
|
|
{0, &IBtmUserCore::GetScanEvent, "GetScanEvent"}, |
|
|
|
{1, nullptr, "Unknown1"}, |
|
|
|
{2, nullptr, "Unknown2"}, |
|
|
|
{3, nullptr, "Unknown3"}, |
|
|
|
{4, nullptr, "Unknown4"}, |
|
|
|
{5, nullptr, "Unknown5"}, |
|
|
|
{6, nullptr, "Unknown6"}, |
|
|
|
{7, nullptr, "Unknown7"}, |
|
|
|
{8, nullptr, "Unknown8"}, |
|
|
|
{9, nullptr, "Unknown9"}, |
|
|
|
{10, nullptr, "Unknown10"}, |
|
|
|
{17, &IBtmUserCore::GetConnectionEvent, "GetConnectionEvent"}, |
|
|
|
{18, nullptr, "Unknown18"}, |
|
|
|
{19, nullptr, "Unknown19"}, |
|
|
|
{20, nullptr, "Unknown20"}, |
|
|
|
{21, nullptr, "Unknown21"}, |
|
|
|
{22, nullptr, "Unknown22"}, |
|
|
|
{23, nullptr, "Unknown23"}, |
|
|
|
{24, nullptr, "Unknown24"}, |
|
|
|
{25, nullptr, "Unknown25"}, |
|
|
|
{26, &IBtmUserCore::GetDiscoveryEvent, "AcquireBleServiceDiscoveryEventImpl"}, |
|
|
|
{27, nullptr, "Unknown27"}, |
|
|
|
{28, nullptr, "Unknown28"}, |
|
|
|
{29, nullptr, "Unknown29"}, |
|
|
|
{30, nullptr, "Unknown30"}, |
|
|
|
{31, nullptr, "Unknown31"}, |
|
|
|
{32, nullptr, "Unknown32"}, |
|
|
|
{33, &IBtmUserCore::GetConfigEvent, "GetConfigEvent"}, |
|
|
|
{34, nullptr, "Unknown34"}, |
|
|
|
{35, nullptr, "Unknown35"}, |
|
|
|
{36, nullptr, "Unknown36"}, |
|
|
|
{37, nullptr, "Unknown37"}, |
|
|
|
}; |
|
|
|
// clang-format on
|
|
|
|
RegisterHandlers(functions); |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
void GetScanEvent(Kernel::HLERequestContext& ctx) { |
|
|
|
auto& kernel = Core::System::GetInstance().Kernel(); |
|
|
|
scan_event = |
|
|
|
Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ScanEvent"); |
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushCopyObjects(scan_event); |
|
|
|
LOG_WARNING(Service_BTM, "(STUBBED) called"); |
|
|
|
} |
|
|
|
void GetConnectionEvent(Kernel::HLERequestContext& ctx) { |
|
|
|
auto& kernel = Core::System::GetInstance().Kernel(); |
|
|
|
connection_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, |
|
|
|
"IBtmUserCore:ConnectionEvent"); |
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushCopyObjects(connection_event); |
|
|
|
LOG_WARNING(Service_BTM, "(STUBBED) called"); |
|
|
|
} |
|
|
|
void GetDiscoveryEvent(Kernel::HLERequestContext& ctx) { |
|
|
|
auto& kernel = Core::System::GetInstance().Kernel(); |
|
|
|
service_discovery = |
|
|
|
Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:Discovery"); |
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushCopyObjects(service_discovery); |
|
|
|
LOG_WARNING(Service_BTM, "(STUBBED) called"); |
|
|
|
} |
|
|
|
void GetConfigEvent(Kernel::HLERequestContext& ctx) { |
|
|
|
auto& kernel = Core::System::GetInstance().Kernel(); |
|
|
|
config_event = |
|
|
|
Kernel::Event::Create(kernel, Kernel::ResetType::OneShot, "IBtmUserCore:ConfigEvent"); |
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushCopyObjects(config_event); |
|
|
|
LOG_WARNING(Service_BTM, "(STUBBED) called"); |
|
|
|
} |
|
|
|
Kernel::SharedPtr<Kernel::Event> scan_event; |
|
|
|
Kernel::SharedPtr<Kernel::Event> connection_event; |
|
|
|
Kernel::SharedPtr<Kernel::Event> service_discovery; |
|
|
|
Kernel::SharedPtr<Kernel::Event> config_event; |
|
|
|
}; |
|
|
|
|
|
|
|
class BTM_USR final : public ServiceFramework<BTM_USR> { |
|
|
|
public: |
|
|
|
explicit BTM_USR() : ServiceFramework{"btm:u"} { |
|
|
|
// clang-format off
|
|
|
|
static const FunctionInfo functions[] = { |
|
|
|
{0, &BTM_USR::GetCoreImpl, "GetCoreImpl"}, |
|
|
|
}; |
|
|
|
// clang-format on
|
|
|
|
RegisterHandlers(functions); |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
void GetCoreImpl(Kernel::HLERequestContext& ctx) { |
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
|
|
rb.Push(RESULT_SUCCESS); |
|
|
|
rb.PushIpcInterface<IBtmUserCore>(); |
|
|
|
LOG_DEBUG(Service_BTM, "called"); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
class BTM final : public ServiceFramework<BTM> { |
|
|
|
public: |
|
|
|
explicit BTM() : ServiceFramework{"btm"} { |
|
|
|
@ -116,6 +221,7 @@ void InstallInterfaces(SM::ServiceManager& sm) { |
|
|
|
std::make_shared<BTM>()->InstallAsService(sm); |
|
|
|
std::make_shared<BTM_DBG>()->InstallAsService(sm); |
|
|
|
std::make_shared<BTM_SYS>()->InstallAsService(sm); |
|
|
|
std::make_shared<BTM_USR>()->InstallAsService(sm); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace Service::BTM
|