Refactor HID services

Use the new service naming convention.
Tidy up some unused includes.
Move constants to service namespace.
This commit is contained in:
Billy Laws 2020-02-16 19:42:32 +00:00 committed by ◱ PixelyIon
parent f4620dd992
commit 524cd26649
8 changed files with 112 additions and 102 deletions

View File

@ -61,7 +61,8 @@ add_library(skyline SHARED
${source_DIR}/skyline/services/apm/apm.cpp
${source_DIR}/skyline/services/am/applet.cpp
${source_DIR}/skyline/services/am/appletController.cpp
${source_DIR}/skyline/services/hid/hid.cpp
${source_DIR}/skyline/services/hid/IHidServer.cpp
${source_DIR}/skyline/services/hid/IAppletResource.cpp
${source_DIR}/skyline/services/timesrv/IStaticService.cpp
${source_DIR}/skyline/services/timesrv/ISystemClock.cpp
${source_DIR}/skyline/services/timesrv/ITimeZoneService.cpp

View File

@ -42,7 +42,7 @@ namespace skyline::service {
audout_IAudioOut,
IAudioRendererManager,
IAudioRenderer,
hid,
hid_IHidServer,
hid_IAppletResource,
timesrv_IStaticService,
timesrv_ISystemClock,
@ -68,7 +68,7 @@ namespace skyline::service {
{"appletAE", Service::am_appletAE},
{"audout:u", Service::audout_u},
{"audren:u", Service::IAudioRendererManager},
{"hid", Service::hid},
{"hid", Service::hid_IHidServer},
{"time:s", Service::timesrv_IStaticService},
{"time:a", Service::timesrv_IStaticService},
{"time:u", Service::timesrv_IStaticService},

View File

@ -0,0 +1,14 @@
#include "IAppletResource.h"
namespace skyline::service::hid {
IAppletResource::IAppletResource(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hid_IAppletResource, "hid:IAppletResource", {
{0x0, SFUNC(IAppletResource::GetSharedMemoryHandle)}
}) {}
void IAppletResource::GetSharedMemoryHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
hidSharedMemory = std::make_shared<kernel::type::KSharedMemory>(state, NULL, constant::hidSharedMemSize, memory::Permission{true, false, false});
auto handle = state.process->InsertItem<type::KSharedMemory>(hidSharedMemory);
state.logger->Debug("HID Shared Memory Handle: 0x{:X}", handle);
response.copyHandles.push_back(handle);
}
}

View File

@ -0,0 +1,26 @@
#pragma once
#include <kernel/types/KProcess.h>
#include <services/base_service.h>
#include <services/serviceman.h>
namespace skyline::service::hid {
namespace constant {
constexpr size_t hidSharedMemSize = 0x40000; //!< The size of HID Shared Memory (https://switchbrew.org/wiki/HID_Shared_Memory)
}
/**
* @brief IAppletResource is used to get a handle to the HID shared memory (https://switchbrew.org/wiki/HID_services#IAppletResource)
*/
class IAppletResource : public BaseService {
public:
std::shared_ptr <type::KSharedMemory> hidSharedMemory; //!< A pointer to HID shared memory
IAppletResource(const DeviceState &state, ServiceManager &manager);
/**
* @brief This opens a handle to HID shared memory (https://switchbrew.org/wiki/HID_services#GetSharedMemoryHandle)
*/
void GetSharedMemoryHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
}

View File

@ -0,0 +1,57 @@
#include "IHidServer.h"
namespace skyline::service::hid {
IHidServer::IHidServer(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hid_IHidServer, "hid:IHidServer", {
{0x0, SFUNC(IHidServer::CreateAppletResource)},
{0x64, SFUNC(IHidServer::SetSupportedNpadStyleSet)},
{0x66, SFUNC(IHidServer::SetSupportedNpadIdType)},
{0x67, SFUNC(IHidServer::ActivateNpad)},
{0x78, SFUNC(IHidServer::SetNpadJoyHoldType)},
{0x7A, SFUNC(IHidServer::SetNpadJoyAssignmentModeSingleByDefault)},
{0x7B, SFUNC(IHidServer::SetNpadJoyAssignmentModeSingle)},
{0x7C, SFUNC(IHidServer::SetNpadJoyAssignmentModeDual)}
}) {}
void IHidServer::CreateAppletResource(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
resource = std::make_shared<IAppletResource>(state, manager);
manager.RegisterService(resource, session, response);
}
void IHidServer::SetSupportedNpadStyleSet(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto styleSet = request.Pop<StyleSet>();
state.logger->Debug("Controller Support:\nPro-Controller: {}\nJoy-Con: Handheld: {}, Dual: {}, L: {}, R: {}\nGameCube: {}\nPokeBall: {}\nNES: {}, NES Handheld: {}, SNES: {}", static_cast<bool>(styleSet.proController), static_cast<bool>(styleSet.joyconHandheld), static_cast<bool>(styleSet.joyconDual), static_cast<bool>(styleSet.joyconLeft), static_cast<bool>
(styleSet.joyconRight), static_cast<bool>(styleSet.gamecube), static_cast<bool>(styleSet.pokeball), static_cast<bool>(styleSet.nes), static_cast<bool>(styleSet.nesHandheld), static_cast<bool>(styleSet.snes));
}
void IHidServer::SetSupportedNpadIdType(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
const auto &buffer = request.inputBuf.at(0);
size_t numId = buffer.size / sizeof(NpadId);
u64 address = buffer.address;
for (size_t i = 0; i < numId; i++) {
auto id = state.process->GetObject<NpadId>(address);
deviceMap[id] = JoyConDevice(id);
address += sizeof(NpadId);
}
}
void IHidServer::ActivateNpad(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {}
void IHidServer::SetNpadJoyHoldType(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
deviceMap[request.Pop<NpadId>()].assignment = JoyConAssignment::Single;
}
void IHidServer::SetNpadJoyAssignmentModeSingleByDefault(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
orientation = request.Pop<JoyConOrientation>();
}
void IHidServer::SetNpadJoyAssignmentModeSingle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto controllerId = request.Pop<NpadId>();
auto appletUserId = request.Pop<u64>();
deviceMap[controllerId].assignment = JoyConAssignment::Single;
deviceMap[controllerId].side = request.Pop<JoyConSide>();
}
void IHidServer::SetNpadJoyAssignmentModeDual(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
deviceMap[request.Pop<NpadId>()].assignment = JoyConAssignment::Dual;
}
}

View File

@ -2,32 +2,13 @@
#include <services/base_service.h>
#include <services/serviceman.h>
#include <kernel/types/KProcess.h>
namespace skyline::constant {
constexpr size_t hidSharedMemSize = 0x40000; //!< The size of HID Shared Memory (https://switchbrew.org/wiki/HID_Shared_Memory)
}
#include "IAppletResource.h"
namespace skyline::service::hid {
/**
* @brief IAppletResource is used to get the handle to the HID shared memory (https://switchbrew.org/wiki/HID_services#IAppletResource)
* @brief IHidServer or hid service is used to access input devices (https://switchbrew.org/wiki/HID_services#hid)
*/
class IAppletResource : public BaseService {
public:
IAppletResource(const DeviceState &state, ServiceManager &manager);
std::shared_ptr<type::KSharedMemory> hidSharedMemory;
/**
* @brief This opens a handle to HID shared memory (https://switchbrew.org/wiki/HID_services#GetSharedMemoryHandle)
*/
void GetSharedMemoryHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
};
/**
* @brief hid or Human Interface Device service is used to access input devices (https://switchbrew.org/wiki/HID_services#hid)
*/
class hid : public BaseService {
class IHidServer : public BaseService {
private:
/**
* @brief This holds the controller styles supported by an application
@ -43,7 +24,7 @@ namespace skyline::service::hid {
bool nes : 1; //!< NES controller
bool nesHandheld : 1; //!< NES controller in handheld mode
bool snes : 1; //!< SNES controller
u32 : 22;
u32 _pad0_ : 22;
};
static_assert(sizeof(StyleSet) == 4);
@ -105,13 +86,13 @@ namespace skyline::service::hid {
JoyConDevice(const NpadId &id) : id(id) {}
};
std::shared_ptr<IAppletResource> resource{}; //!< A shared pointer to the applet resource
std::optional<StyleSet> styleSet; //!< The controller styles supported by the application
std::unordered_map<NpadId, JoyConDevice> deviceMap; //!< Mapping from a controller's ID to it's corresponding JoyConDevice
std::shared_ptr <IAppletResource> resource{}; //!< A shared pointer to the applet resource
std::optional <StyleSet> styleSet; //!< The controller styles supported by the application
std::unordered_map <NpadId, JoyConDevice> deviceMap; //!< Mapping from a controller's ID to it's corresponding JoyConDevice
JoyConOrientation orientation{JoyConOrientation::Unset}; //!< The Orientation of the Joy-Con(s)
public:
hid(const DeviceState &state, ServiceManager &manager);
IHidServer(const DeviceState &state, ServiceManager &manager);
/**
* @brief This returns an IAppletResource (https://switchbrew.org/wiki/HID_services#CreateAppletResource)

View File

@ -1,69 +0,0 @@
#include "hid.h"
#include <os.h>
namespace skyline::service::hid {
IAppletResource::IAppletResource(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hid_IAppletResource, "hid:IAppletResource", {
{0x0, SFUNC(IAppletResource::GetSharedMemoryHandle)}
}) {}
void IAppletResource::GetSharedMemoryHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
hidSharedMemory = std::make_shared<kernel::type::KSharedMemory>(state, NULL, constant::hidSharedMemSize, memory::Permission{true, false, false});
auto handle = state.process->InsertItem<type::KSharedMemory>(hidSharedMemory);
state.logger->Debug("HID Shared Memory Handle: 0x{:X}", handle);
response.copyHandles.push_back(handle);
}
hid::hid(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, Service::hid, "hid", {
{0x0, SFUNC(hid::CreateAppletResource)},
{0x64, SFUNC(hid::SetSupportedNpadStyleSet)},
{0x66, SFUNC(hid::SetSupportedNpadIdType)},
{0x67, SFUNC(hid::ActivateNpad)},
{0x78, SFUNC(hid::SetNpadJoyHoldType)},
{0x7A, SFUNC(hid::SetNpadJoyAssignmentModeSingleByDefault)},
{0x7B, SFUNC(hid::SetNpadJoyAssignmentModeSingle)},
{0x7C, SFUNC(hid::SetNpadJoyAssignmentModeDual)}
}) {}
void hid::CreateAppletResource(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
resource = std::make_shared<IAppletResource>(state, manager);
manager.RegisterService(resource, session, response);
}
void hid::SetSupportedNpadStyleSet(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto styleSet = request.Pop<StyleSet>();
state.logger->Debug("Controller Support:\nPro-Controller: {}\nJoy-Con: Handheld: {}, Dual: {}, L: {}, R: {}\nGameCube: {}\nPokeBall: {}\nNES: {}, NES Handheld: {}, SNES: {}", static_cast<bool>(styleSet.proController), static_cast<bool>(styleSet.joyconHandheld), static_cast<bool>(styleSet.joyconDual), static_cast<bool>(styleSet.joyconLeft), static_cast<bool>
(styleSet.joyconRight), static_cast<bool>(styleSet.gamecube), static_cast<bool>(styleSet.pokeball), static_cast<bool>(styleSet.nes), static_cast<bool>(styleSet.nesHandheld), static_cast<bool>(styleSet.snes));
}
void hid::SetSupportedNpadIdType(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
const auto &buffer = request.inputBuf.at(0);
size_t numId = buffer.size / sizeof(NpadId);
u64 address = buffer.address;
for (size_t i = 0; i < numId; i++) {
auto id = state.process->GetObject<NpadId>(address);
deviceMap[id] = JoyConDevice(id);
address += sizeof(NpadId);
}
}
void hid::ActivateNpad(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {}
void hid::SetNpadJoyHoldType(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
deviceMap[request.Pop<NpadId>()].assignment = JoyConAssignment::Single;
}
void hid::SetNpadJoyAssignmentModeSingleByDefault(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
orientation = request.Pop<JoyConOrientation>();
}
void hid::SetNpadJoyAssignmentModeSingle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto controllerId = request.Pop<NpadId>();
auto appletUserId = request.Pop<u64>();
deviceMap[controllerId].assignment = JoyConAssignment::Single;
deviceMap[controllerId].side = request.Pop<JoyConSide>();
}
void hid::SetNpadJoyAssignmentModeDual(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
deviceMap[request.Pop<NpadId>()].assignment = JoyConAssignment::Dual;
}
}

View File

@ -7,7 +7,7 @@
#include "am/appletController.h"
#include "audout/audout.h"
#include "fatal/fatal.h"
#include "hid/hid.h"
#include "hid/IHidServer.h"
#include "timesrv/IStaticService.h"
#include "fs/fs.h"
#include "nvdrv/nvdrv.h"
@ -47,8 +47,8 @@ namespace skyline::service {
case Service::IAudioRendererManager:
serviceObj = std::make_shared<audren::IAudioRendererManager>(state, *this);
break;
case Service::hid:
serviceObj = std::make_shared<hid::hid>(state, *this);
case Service::hid_IHidServer:
serviceObj = std::make_shared<hid::IHidServer>(state, *this);
break;
case Service::timesrv_IStaticService:
serviceObj = std::make_shared<timesrv::IStaticService>(state, *this);