Stub {Set,Get}NpadHandheldActivationMode in HID

This commit is contained in:
Billy Laws 2022-04-09 12:21:27 +01:00 committed by PixelyIon
parent 2e197cead5
commit 0182fabc50
4 changed files with 73 additions and 35 deletions

View File

@ -48,6 +48,7 @@ namespace skyline::input {
std::vector<NpadId> supportedIds; //!< The NPadId(s) that are supported by the application
NpadStyleSet styles; //!< The styles that are supported by the application
NpadJoyOrientation orientation{}; //!< The orientation all of Joy-Cons are in (This affects stick transformation for them)
NpadHandheldActivationMode handheldActivationMode{NpadHandheldActivationMode::Dual}; //!< By default two controllers are required to activate handheld mode
/**
* @param hid A pointer to HID Shared Memory on the host

View File

@ -7,6 +7,15 @@
#include "shared_mem.h"
namespace skyline::input {
/**
* @brief How many joycons must be attached for handheld mode to be triggered
*/
enum class NpadHandheldActivationMode : u64 {
Dual = 0,
Single = 1,
None = 2,
};
/**
* @brief The orientations the Joy-Con(s) can be held in
*/

View File

@ -25,6 +25,10 @@ namespace skyline::service::hid {
return {};
}
Result IHidServer::StartSixAxisSensor(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
return {};
}
Result IHidServer::SetSupportedNpadStyleSet(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto styleSet{request.Pop<NpadStyleSet>()};
std::lock_guard lock(state.input->npad.mutex);
@ -137,8 +141,45 @@ namespace skyline::service::hid {
return {};
}
Result IHidServer::CreateActiveVibrationDeviceList(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(SRVREG(IActiveVibrationDeviceList), session, response);
Result IHidServer::SetNpadHandheldActivationMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
request.Skip<u64>();
auto activationMode{request.Pop<NpadHandheldActivationMode>()};
std::scoped_lock lock{state.input->npad.mutex};
state.input->npad.handheldActivationMode = activationMode;
return {};
}
Result IHidServer::GetNpadHandheldActivationMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
std::scoped_lock lock{state.input->npad.mutex};
response.Push(state.input->npad.handheldActivationMode);
return {};
}
Result IHidServer::GetVibrationDeviceInfo(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto deviceHandle{request.Pop<NpadDeviceHandle>()};
auto id{deviceHandle.id};
if (id > NpadId::Player8 && id != NpadId::Handheld && id != NpadId::Unknown)
return result::InvalidNpadId;
auto vibrationDeviceType{NpadVibrationDeviceType::Unknown};
auto vibrationDevicePosition{NpadVibrationDevicePosition::None};
if (deviceHandle.GetType() == NpadControllerType::Gamecube)
vibrationDeviceType = NpadVibrationDeviceType::EccentricRotatingMass;
else
vibrationDeviceType = NpadVibrationDeviceType::LinearResonantActuator;
if (vibrationDeviceType == NpadVibrationDeviceType::LinearResonantActuator)
if (deviceHandle.isRight)
vibrationDevicePosition = NpadVibrationDevicePosition::Right;
else
vibrationDevicePosition = NpadVibrationDevicePosition::Left;
response.Push(NpadVibrationDeviceInfo{vibrationDeviceType, vibrationDevicePosition});
return {};
}
@ -154,6 +195,11 @@ namespace skyline::service::hid {
return {};
}
Result IHidServer::CreateActiveVibrationDeviceList(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
manager.RegisterService(SRVREG(IActiveVibrationDeviceList), session, response);
return {};
}
Result IHidServer::SendVibrationValues(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
request.Skip<u64>(); // appletResourceUserId
@ -179,34 +225,4 @@ namespace skyline::service::hid {
return {};
}
Result IHidServer::StartSixAxisSensor(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
return {};
}
Result IHidServer::GetVibrationDeviceInfo(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto deviceHandle{request.Pop<NpadDeviceHandle>()};
auto id{deviceHandle.id};
if (id > NpadId::Player8 && id != NpadId::Handheld && id != NpadId::Unknown)
return result::InvalidNpadId;
auto vibrationDeviceType{NpadVibrationDeviceType::Unknown};
auto vibrationDevicePosition{NpadVibrationDevicePosition::None};
if (deviceHandle.GetType() == NpadControllerType::Gamecube)
vibrationDeviceType = NpadVibrationDeviceType::EccentricRotatingMass;
else
vibrationDeviceType = NpadVibrationDeviceType::LinearResonantActuator;
if (vibrationDeviceType == NpadVibrationDeviceType::LinearResonantActuator)
if (deviceHandle.isRight)
vibrationDevicePosition = NpadVibrationDevicePosition::Right;
else
vibrationDevicePosition = NpadVibrationDevicePosition::Left;
response.Push(NpadVibrationDeviceInfo{vibrationDeviceType, vibrationDevicePosition});
return {};
}
}

View File

@ -119,10 +119,14 @@ namespace skyline::service::hid {
Result SetNpadJoyAssignmentModeDual(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief Returns an instance of #IActiveVibrationDeviceList
* @url https://switchbrew.org/wiki/HID_services#CreateActiveVibrationDeviceList
* @url https://switchbrew.org/wiki/HID_services#SetNpadHandheldActivationMode
*/
Result CreateActiveVibrationDeviceList(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
Result SetNpadHandheldActivationMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @url https://switchbrew.org/wiki/HID_services#GetNpadHandheldActivationMode
*/
Result GetNpadHandheldActivationMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief Returns the current vibration state of a device
@ -136,6 +140,12 @@ namespace skyline::service::hid {
*/
Result SendVibrationValue(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief Returns an instance of #IActiveVibrationDeviceList
* @url https://switchbrew.org/wiki/HID_services#CreateActiveVibrationDeviceList
*/
Result CreateActiveVibrationDeviceList(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response);
/**
* @brief Send vibration values to a HID device
* @url https://switchbrew.org/wiki/HID_services#SendVibrationValues
@ -160,6 +170,8 @@ namespace skyline::service::hid {
SFUNC(0x7A, IHidServer, SetNpadJoyAssignmentModeSingleByDefault),
SFUNC(0x7B, IHidServer, SetNpadJoyAssignmentModeSingle),
SFUNC(0x7C, IHidServer, SetNpadJoyAssignmentModeDual),
SFUNC(0x80, IHidServer, SetNpadHandheldActivationMode),
SFUNC(0x81, IHidServer, GetNpadHandheldActivationMode),
SFUNC(0xCB, IHidServer, CreateActiveVibrationDeviceList),
SFUNC(0xC8, IHidServer, GetVibrationDeviceInfo),
SFUNC(0xC9, IHidServer, SendVibrationValue),