service/hid: Use remove duplicated code, update names
This commit is contained in:
parent
db08721dcc
commit
dbe0301102
2 changed files with 30 additions and 64 deletions
|
@ -9,6 +9,7 @@
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/frontend/input.h"
|
#include "core/frontend/input.h"
|
||||||
|
#include "core/hardware_properties.h"
|
||||||
#include "core/hle/ipc_helpers.h"
|
#include "core/hle/ipc_helpers.h"
|
||||||
#include "core/hle/kernel/k_readable_event.h"
|
#include "core/hle/kernel/k_readable_event.h"
|
||||||
#include "core/hle/kernel/k_shared_memory.h"
|
#include "core/hle/kernel/k_shared_memory.h"
|
||||||
|
@ -34,10 +35,9 @@
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
|
|
||||||
// Updating period for each HID device.
|
// Updating period for each HID device.
|
||||||
// HID is polled every 15ms, this value was derived from
|
// Period time is obtained by measuring the number of samples in a second
|
||||||
// https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering#joy-con-status-data-packet
|
constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 250Hz)
|
||||||
constexpr auto pad_update_ns = std::chrono::nanoseconds{1000 * 1000}; // (1ms, 1000Hz)
|
constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz)
|
||||||
constexpr auto motion_update_ns = std::chrono::nanoseconds{15 * 1000 * 1000}; // (15ms, 66.666Hz)
|
|
||||||
constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
|
constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
|
||||||
|
|
||||||
IAppletResource::IAppletResource(Core::System& system_,
|
IAppletResource::IAppletResource(Core::System& system_,
|
||||||
|
@ -89,7 +89,7 @@ IAppletResource::IAppletResource(Core::System& system_,
|
||||||
system.CoreTiming().ScheduleEvent(pad_update_ns, pad_update_event);
|
system.CoreTiming().ScheduleEvent(pad_update_ns, pad_update_event);
|
||||||
system.CoreTiming().ScheduleEvent(motion_update_ns, motion_update_event);
|
system.CoreTiming().ScheduleEvent(motion_update_ns, motion_update_event);
|
||||||
|
|
||||||
ReloadInputDevices();
|
system.HIDCore().ReloadInputDevices();
|
||||||
}
|
}
|
||||||
|
|
||||||
void IAppletResource::ActivateController(HidController controller) {
|
void IAppletResource::ActivateController(HidController controller) {
|
||||||
|
@ -117,11 +117,7 @@ void IAppletResource::UpdateControllers(std::uintptr_t user_data,
|
||||||
std::chrono::nanoseconds ns_late) {
|
std::chrono::nanoseconds ns_late) {
|
||||||
auto& core_timing = system.CoreTiming();
|
auto& core_timing = system.CoreTiming();
|
||||||
|
|
||||||
const bool should_reload = false;
|
|
||||||
for (const auto& controller : controllers) {
|
for (const auto& controller : controllers) {
|
||||||
if (should_reload) {
|
|
||||||
controller->OnLoadInputDevices();
|
|
||||||
}
|
|
||||||
controller->OnUpdate(core_timing, system.Kernel().GetHidSharedMem().GetPointer(),
|
controller->OnUpdate(core_timing, system.Kernel().GetHidSharedMem().GetPointer(),
|
||||||
SHARED_MEMORY_SIZE);
|
SHARED_MEMORY_SIZE);
|
||||||
}
|
}
|
||||||
|
@ -891,7 +887,7 @@ void Hid::ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) {
|
||||||
void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
|
void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto applet_resource_user_id{rp.Pop<u64>()};
|
const auto applet_resource_user_id{rp.Pop<u64>()};
|
||||||
const auto hold_type{rp.PopEnum<Controller_NPad::NpadHoldType>()};
|
const auto hold_type{rp.PopEnum<Controller_NPad::NpadJoyHoldType>()};
|
||||||
|
|
||||||
applet_resource->GetController<Controller_NPad>(HidController::NPad).SetHoldType(hold_type);
|
applet_resource->GetController<Controller_NPad>(HidController::NPad).SetHoldType(hold_type);
|
||||||
|
|
||||||
|
@ -924,7 +920,7 @@ void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx
|
||||||
const auto parameters{rp.PopRaw<Parameters>()};
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
||||||
.SetNpadMode(parameters.npad_id, Controller_NPad::NpadAssignments::Single);
|
.SetNpadMode(parameters.npad_id, Controller_NPad::NpadJoyAssignmentMode::Single);
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
|
LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
|
||||||
parameters.npad_id, parameters.applet_resource_user_id);
|
parameters.npad_id, parameters.applet_resource_user_id);
|
||||||
|
@ -946,7 +942,7 @@ void Hid::SetNpadJoyAssignmentModeSingle(Kernel::HLERequestContext& ctx) {
|
||||||
const auto parameters{rp.PopRaw<Parameters>()};
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
||||||
.SetNpadMode(parameters.npad_id, Controller_NPad::NpadAssignments::Single);
|
.SetNpadMode(parameters.npad_id, Controller_NPad::NpadJoyAssignmentMode::Single);
|
||||||
|
|
||||||
LOG_WARNING(Service_HID,
|
LOG_WARNING(Service_HID,
|
||||||
"(STUBBED) called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}",
|
"(STUBBED) called, npad_id={}, applet_resource_user_id={}, npad_joy_device_type={}",
|
||||||
|
@ -968,7 +964,7 @@ void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) {
|
||||||
const auto parameters{rp.PopRaw<Parameters>()};
|
const auto parameters{rp.PopRaw<Parameters>()};
|
||||||
|
|
||||||
applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
||||||
.SetNpadMode(parameters.npad_id, Controller_NPad::NpadAssignments::Dual);
|
.SetNpadMode(parameters.npad_id, Controller_NPad::NpadJoyAssignmentMode::Dual);
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
|
LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
|
||||||
parameters.npad_id, parameters.applet_resource_user_id);
|
parameters.npad_id, parameters.applet_resource_user_id);
|
||||||
|
@ -1134,36 +1130,36 @@ void Hid::GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto vibration_device_handle{rp.PopRaw<Controller_NPad::DeviceHandle>()};
|
const auto vibration_device_handle{rp.PopRaw<Controller_NPad::DeviceHandle>()};
|
||||||
|
|
||||||
VibrationDeviceInfo vibration_device_info;
|
Core::HID::VibrationDeviceInfo vibration_device_info;
|
||||||
|
|
||||||
switch (vibration_device_handle.npad_type) {
|
switch (vibration_device_handle.npad_type) {
|
||||||
case Controller_NPad::NpadType::ProController:
|
case Core::HID::NpadType::ProController:
|
||||||
case Controller_NPad::NpadType::Handheld:
|
case Core::HID::NpadType::Handheld:
|
||||||
case Controller_NPad::NpadType::JoyconDual:
|
case Core::HID::NpadType::JoyconDual:
|
||||||
case Controller_NPad::NpadType::JoyconLeft:
|
case Core::HID::NpadType::JoyconLeft:
|
||||||
case Controller_NPad::NpadType::JoyconRight:
|
case Core::HID::NpadType::JoyconRight:
|
||||||
default:
|
default:
|
||||||
vibration_device_info.type = VibrationDeviceType::LinearResonantActuator;
|
vibration_device_info.type = Core::HID::VibrationDeviceType::LinearResonantActuator;
|
||||||
break;
|
break;
|
||||||
case Controller_NPad::NpadType::GameCube:
|
case Core::HID::NpadType::GameCube:
|
||||||
vibration_device_info.type = VibrationDeviceType::GcErm;
|
vibration_device_info.type = Core::HID::VibrationDeviceType::GcErm;
|
||||||
break;
|
break;
|
||||||
case Controller_NPad::NpadType::Pokeball:
|
case Core::HID::NpadType::Pokeball:
|
||||||
vibration_device_info.type = VibrationDeviceType::Unknown;
|
vibration_device_info.type = Core::HID::VibrationDeviceType::Unknown;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (vibration_device_handle.device_index) {
|
switch (vibration_device_handle.device_index) {
|
||||||
case Controller_NPad::DeviceIndex::Left:
|
case Controller_NPad::DeviceIndex::Left:
|
||||||
vibration_device_info.position = VibrationDevicePosition::Left;
|
vibration_device_info.position = Core::HID::VibrationDevicePosition::Left;
|
||||||
break;
|
break;
|
||||||
case Controller_NPad::DeviceIndex::Right:
|
case Controller_NPad::DeviceIndex::Right:
|
||||||
vibration_device_info.position = VibrationDevicePosition::Right;
|
vibration_device_info.position = Core::HID::VibrationDevicePosition::Right;
|
||||||
break;
|
break;
|
||||||
case Controller_NPad::DeviceIndex::None:
|
case Controller_NPad::DeviceIndex::None:
|
||||||
default:
|
default:
|
||||||
UNREACHABLE_MSG("DeviceIndex should never be None!");
|
UNREACHABLE_MSG("DeviceIndex should never be None!");
|
||||||
vibration_device_info.position = VibrationDevicePosition::None;
|
vibration_device_info.position = Core::HID::VibrationDevicePosition::None;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1278,7 +1274,7 @@ void Hid::SendVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
|
||||||
struct Parameters {
|
struct Parameters {
|
||||||
Controller_NPad::DeviceHandle vibration_device_handle;
|
Controller_NPad::DeviceHandle vibration_device_handle;
|
||||||
u64 applet_resource_user_id;
|
u64 applet_resource_user_id;
|
||||||
VibrationGcErmCommand gc_erm_command;
|
Core::HID::VibrationGcErmCommand gc_erm_command;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
|
static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size.");
|
||||||
|
|
||||||
|
@ -1292,21 +1288,21 @@ void Hid::SendVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
|
||||||
*/
|
*/
|
||||||
const auto vibration_value = [parameters] {
|
const auto vibration_value = [parameters] {
|
||||||
switch (parameters.gc_erm_command) {
|
switch (parameters.gc_erm_command) {
|
||||||
case VibrationGcErmCommand::Stop:
|
case Core::HID::VibrationGcErmCommand::Stop:
|
||||||
return Controller_NPad::VibrationValue{
|
return Controller_NPad::VibrationValue{
|
||||||
.amp_low = 0.0f,
|
.amp_low = 0.0f,
|
||||||
.freq_low = 160.0f,
|
.freq_low = 160.0f,
|
||||||
.amp_high = 0.0f,
|
.amp_high = 0.0f,
|
||||||
.freq_high = 320.0f,
|
.freq_high = 320.0f,
|
||||||
};
|
};
|
||||||
case VibrationGcErmCommand::Start:
|
case Core::HID::VibrationGcErmCommand::Start:
|
||||||
return Controller_NPad::VibrationValue{
|
return Controller_NPad::VibrationValue{
|
||||||
.amp_low = 1.0f,
|
.amp_low = 1.0f,
|
||||||
.freq_low = 160.0f,
|
.freq_low = 160.0f,
|
||||||
.amp_high = 1.0f,
|
.amp_high = 1.0f,
|
||||||
.freq_high = 320.0f,
|
.freq_high = 320.0f,
|
||||||
};
|
};
|
||||||
case VibrationGcErmCommand::StopHard:
|
case Core::HID::VibrationGcErmCommand::StopHard:
|
||||||
return Controller_NPad::VibrationValue{
|
return Controller_NPad::VibrationValue{
|
||||||
.amp_low = 0.0f,
|
.amp_low = 0.0f,
|
||||||
.freq_low = 0.0f,
|
.freq_low = 0.0f,
|
||||||
|
@ -1348,7 +1344,7 @@ void Hid::GetActualVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
|
||||||
|
|
||||||
const auto gc_erm_command = [last_vibration] {
|
const auto gc_erm_command = [last_vibration] {
|
||||||
if (last_vibration.amp_low != 0.0f || last_vibration.amp_high != 0.0f) {
|
if (last_vibration.amp_low != 0.0f || last_vibration.amp_high != 0.0f) {
|
||||||
return VibrationGcErmCommand::Start;
|
return Core::HID::VibrationGcErmCommand::Start;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1358,10 +1354,10 @@ void Hid::GetActualVibrationGcErmCommand(Kernel::HLERequestContext& ctx) {
|
||||||
* This is done to reuse the controller vibration functions made for regular controllers.
|
* This is done to reuse the controller vibration functions made for regular controllers.
|
||||||
*/
|
*/
|
||||||
if (last_vibration.freq_low == 0.0f && last_vibration.freq_high == 0.0f) {
|
if (last_vibration.freq_low == 0.0f && last_vibration.freq_high == 0.0f) {
|
||||||
return VibrationGcErmCommand::StopHard;
|
return Core::HID::VibrationGcErmCommand::StopHard;
|
||||||
}
|
}
|
||||||
|
|
||||||
return VibrationGcErmCommand::Stop;
|
return Core::HID::VibrationGcErmCommand::Stop;
|
||||||
}();
|
}();
|
||||||
|
|
||||||
LOG_DEBUG(Service_HID,
|
LOG_DEBUG(Service_HID,
|
||||||
|
@ -2037,9 +2033,6 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void ReloadInputDevices() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
|
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
|
||||||
std::make_shared<Hid>(system)->InstallAsService(service_manager);
|
std::make_shared<Hid>(system)->InstallAsService(service_manager);
|
||||||
std::make_shared<HidBus>(system)->InstallAsService(service_manager);
|
std::make_shared<HidBus>(system)->InstallAsService(service_manager);
|
||||||
|
|
|
@ -161,38 +161,11 @@ private:
|
||||||
void GetNpadCommunicationMode(Kernel::HLERequestContext& ctx);
|
void GetNpadCommunicationMode(Kernel::HLERequestContext& ctx);
|
||||||
void SetTouchScreenConfiguration(Kernel::HLERequestContext& ctx);
|
void SetTouchScreenConfiguration(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
enum class VibrationDeviceType : u32 {
|
|
||||||
Unknown = 0,
|
|
||||||
LinearResonantActuator = 1,
|
|
||||||
GcErm = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class VibrationDevicePosition : u32 {
|
|
||||||
None = 0,
|
|
||||||
Left = 1,
|
|
||||||
Right = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class VibrationGcErmCommand : u64 {
|
|
||||||
Stop = 0,
|
|
||||||
Start = 1,
|
|
||||||
StopHard = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VibrationDeviceInfo {
|
|
||||||
VibrationDeviceType type{};
|
|
||||||
VibrationDevicePosition position{};
|
|
||||||
};
|
|
||||||
static_assert(sizeof(VibrationDeviceInfo) == 0x8, "VibrationDeviceInfo has incorrect size.");
|
|
||||||
|
|
||||||
std::shared_ptr<IAppletResource> applet_resource;
|
std::shared_ptr<IAppletResource> applet_resource;
|
||||||
|
|
||||||
KernelHelpers::ServiceContext service_context;
|
KernelHelpers::ServiceContext service_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Reload input devices. Used when input configuration changed
|
|
||||||
void ReloadInputDevices();
|
|
||||||
|
|
||||||
/// Registers all HID services with the specified service manager.
|
/// Registers all HID services with the specified service manager.
|
||||||
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
|
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue