|
@@ -40,119 +40,82 @@ constexpr u64 pad_update_ticks = CoreTiming::BASE_CLOCK_RATE / 66;
|
|
|
constexpr u64 accelerometer_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100;
|
|
constexpr u64 accelerometer_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100;
|
|
|
constexpr u64 gyroscope_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100;
|
|
constexpr u64 gyroscope_update_ticks = CoreTiming::BASE_CLOCK_RATE / 100;
|
|
|
constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
|
|
constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
|
|
|
-enum class HidController : std::size_t {
|
|
|
|
|
- DebugPad,
|
|
|
|
|
- Touchscreen,
|
|
|
|
|
- Mouse,
|
|
|
|
|
- Keyboard,
|
|
|
|
|
- XPad,
|
|
|
|
|
- Unknown1,
|
|
|
|
|
- Unknown2,
|
|
|
|
|
- Unknown3,
|
|
|
|
|
- SixAxisSensor,
|
|
|
|
|
- NPad,
|
|
|
|
|
- Gesture,
|
|
|
|
|
-
|
|
|
|
|
- MaxControllers,
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-class IAppletResource final : public ServiceFramework<IAppletResource> {
|
|
|
|
|
-public:
|
|
|
|
|
- IAppletResource() : ServiceFramework("IAppletResource") {
|
|
|
|
|
- static const FunctionInfo functions[] = {
|
|
|
|
|
- {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
|
|
|
|
|
- };
|
|
|
|
|
- RegisterHandlers(functions);
|
|
|
|
|
|
|
|
|
|
- auto& kernel = Core::System::GetInstance().Kernel();
|
|
|
|
|
- shared_mem = Kernel::SharedMemory::Create(
|
|
|
|
|
- kernel, nullptr, SHARED_MEMORY_SIZE, Kernel::MemoryPermission::ReadWrite,
|
|
|
|
|
- Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory");
|
|
|
|
|
-
|
|
|
|
|
- MakeController<Controller_DebugPad>(HidController::DebugPad);
|
|
|
|
|
- MakeController<Controller_Touchscreen>(HidController::Touchscreen);
|
|
|
|
|
- MakeController<Controller_Mouse>(HidController::Mouse);
|
|
|
|
|
- MakeController<Controller_Keyboard>(HidController::Keyboard);
|
|
|
|
|
- MakeController<Controller_XPad>(HidController::XPad);
|
|
|
|
|
- MakeController<Controller_Stubbed>(HidController::Unknown1);
|
|
|
|
|
- MakeController<Controller_Stubbed>(HidController::Unknown2);
|
|
|
|
|
- MakeController<Controller_Stubbed>(HidController::Unknown3);
|
|
|
|
|
- MakeController<Controller_Stubbed>(HidController::SixAxisSensor);
|
|
|
|
|
- MakeController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
- MakeController<Controller_Gesture>(HidController::Gesture);
|
|
|
|
|
-
|
|
|
|
|
- // Homebrew doesn't try to activate some controllers, so we activate them by default
|
|
|
|
|
- GetController<Controller_NPad>(HidController::NPad).ActivateController();
|
|
|
|
|
- GetController<Controller_Touchscreen>(HidController::Touchscreen).ActivateController();
|
|
|
|
|
-
|
|
|
|
|
- GetController<Controller_Stubbed>(HidController::Unknown1).SetCommonHeaderOffset(0x4c00);
|
|
|
|
|
- GetController<Controller_Stubbed>(HidController::Unknown2).SetCommonHeaderOffset(0x4e00);
|
|
|
|
|
- GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000);
|
|
|
|
|
-
|
|
|
|
|
- // Register update callbacks
|
|
|
|
|
- pad_update_event = CoreTiming::RegisterEvent(
|
|
|
|
|
- "HID::UpdatePadCallback",
|
|
|
|
|
- [this](u64 userdata, int cycles_late) { UpdateControllers(userdata, cycles_late); });
|
|
|
|
|
-
|
|
|
|
|
- // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?)
|
|
|
|
|
-
|
|
|
|
|
- CoreTiming::ScheduleEvent(pad_update_ticks, pad_update_event);
|
|
|
|
|
-
|
|
|
|
|
- ReloadInputDevices();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void ActivateController(HidController controller) {
|
|
|
|
|
- controllers[static_cast<size_t>(controller)]->ActivateController();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void DeactivateController(HidController controller) {
|
|
|
|
|
- controllers[static_cast<size_t>(controller)]->DeactivateController();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") {
|
|
|
|
|
+ static const FunctionInfo functions[] = {
|
|
|
|
|
+ {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
|
|
|
|
|
+ };
|
|
|
|
|
+ RegisterHandlers(functions);
|
|
|
|
|
+
|
|
|
|
|
+ auto& kernel = Core::System::GetInstance().Kernel();
|
|
|
|
|
+ shared_mem = Kernel::SharedMemory::Create(
|
|
|
|
|
+ kernel, nullptr, SHARED_MEMORY_SIZE, Kernel::MemoryPermission::ReadWrite,
|
|
|
|
|
+ Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory");
|
|
|
|
|
+
|
|
|
|
|
+ MakeController<Controller_DebugPad>(HidController::DebugPad);
|
|
|
|
|
+ MakeController<Controller_Touchscreen>(HidController::Touchscreen);
|
|
|
|
|
+ MakeController<Controller_Mouse>(HidController::Mouse);
|
|
|
|
|
+ MakeController<Controller_Keyboard>(HidController::Keyboard);
|
|
|
|
|
+ MakeController<Controller_XPad>(HidController::XPad);
|
|
|
|
|
+ MakeController<Controller_Stubbed>(HidController::Unknown1);
|
|
|
|
|
+ MakeController<Controller_Stubbed>(HidController::Unknown2);
|
|
|
|
|
+ MakeController<Controller_Stubbed>(HidController::Unknown3);
|
|
|
|
|
+ MakeController<Controller_Stubbed>(HidController::SixAxisSensor);
|
|
|
|
|
+ MakeController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
+ MakeController<Controller_Gesture>(HidController::Gesture);
|
|
|
|
|
+
|
|
|
|
|
+ // Homebrew doesn't try to activate some controllers, so we activate them by default
|
|
|
|
|
+ GetController<Controller_NPad>(HidController::NPad).ActivateController();
|
|
|
|
|
+ GetController<Controller_Touchscreen>(HidController::Touchscreen).ActivateController();
|
|
|
|
|
+
|
|
|
|
|
+ GetController<Controller_Stubbed>(HidController::Unknown1).SetCommonHeaderOffset(0x4c00);
|
|
|
|
|
+ GetController<Controller_Stubbed>(HidController::Unknown2).SetCommonHeaderOffset(0x4e00);
|
|
|
|
|
+ GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000);
|
|
|
|
|
+
|
|
|
|
|
+ // Register update callbacks
|
|
|
|
|
+ pad_update_event =
|
|
|
|
|
+ CoreTiming::RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, int cycles_late) {
|
|
|
|
|
+ UpdateControllers(userdata, cycles_late);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?)
|
|
|
|
|
+
|
|
|
|
|
+ CoreTiming::ScheduleEvent(pad_update_ticks, pad_update_event);
|
|
|
|
|
+
|
|
|
|
|
+ ReloadInputDevices();
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- template <typename T>
|
|
|
|
|
- void MakeController(HidController controller) {
|
|
|
|
|
- controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void IAppletResource::ActivateController(HidController controller) {
|
|
|
|
|
+ controllers[static_cast<size_t>(controller)]->ActivateController();
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- template <typename T>
|
|
|
|
|
- T& GetController(HidController controller) {
|
|
|
|
|
- return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void IAppletResource::DeactivateController(HidController controller) {
|
|
|
|
|
+ controllers[static_cast<size_t>(controller)]->DeactivateController();
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- ~IAppletResource() {
|
|
|
|
|
- CoreTiming::UnscheduleEvent(pad_update_event, 0);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+IAppletResource ::~IAppletResource() {
|
|
|
|
|
+ CoreTiming::UnscheduleEvent(pad_update_event, 0);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
-private:
|
|
|
|
|
- void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
+void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 1};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.PushCopyObjects(shared_mem);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2, 1};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.PushCopyObjects(shared_mem);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- void UpdateControllers(u64 userdata, int cycles_late) {
|
|
|
|
|
- const bool should_reload = Settings::values.is_device_reload_pending.exchange(false);
|
|
|
|
|
- for (const auto& controller : controllers) {
|
|
|
|
|
- if (should_reload) {
|
|
|
|
|
- controller->OnLoadInputDevices();
|
|
|
|
|
- }
|
|
|
|
|
- controller->OnUpdate(shared_mem->GetPointer(), SHARED_MEMORY_SIZE);
|
|
|
|
|
|
|
+void IAppletResource::UpdateControllers(u64 userdata, int cycles_late) {
|
|
|
|
|
+ const bool should_reload = Settings::values.is_device_reload_pending.exchange(false);
|
|
|
|
|
+ for (const auto& controller : controllers) {
|
|
|
|
|
+ if (should_reload) {
|
|
|
|
|
+ controller->OnLoadInputDevices();
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- CoreTiming::ScheduleEvent(pad_update_ticks - cycles_late, pad_update_event);
|
|
|
|
|
|
|
+ controller->OnUpdate(shared_mem->GetPointer(), SHARED_MEMORY_SIZE);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Handle to shared memory region designated to HID service
|
|
|
|
|
- Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
|
|
|
|
|
-
|
|
|
|
|
- // CoreTiming update events
|
|
|
|
|
- CoreTiming::EventType* pad_update_event;
|
|
|
|
|
-
|
|
|
|
|
- std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
|
|
|
|
|
- controllers{};
|
|
|
|
|
-};
|
|
|
|
|
|
|
+ CoreTiming::ScheduleEvent(pad_update_ticks - cycles_late, pad_update_event);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> {
|
|
class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> {
|
|
|
public:
|
|
public:
|
|
@@ -172,599 +135,597 @@ private:
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-class Hid final : public ServiceFramework<Hid> {
|
|
|
|
|
-public:
|
|
|
|
|
- Hid() : ServiceFramework("hid") {
|
|
|
|
|
- // clang-format off
|
|
|
|
|
- static const FunctionInfo functions[] = {
|
|
|
|
|
- {0, &Hid::CreateAppletResource, "CreateAppletResource"},
|
|
|
|
|
- {1, &Hid::ActivateDebugPad, "ActivateDebugPad"},
|
|
|
|
|
- {11, &Hid::ActivateTouchScreen, "ActivateTouchScreen"},
|
|
|
|
|
- {21, &Hid::ActivateMouse, "ActivateMouse"},
|
|
|
|
|
- {31, &Hid::ActivateKeyboard, "ActivateKeyboard"},
|
|
|
|
|
- {32, nullptr, "SendKeyboardLockKeyEvent"},
|
|
|
|
|
- {40, nullptr, "AcquireXpadIdEventHandle"},
|
|
|
|
|
- {41, nullptr, "ReleaseXpadIdEventHandle"},
|
|
|
|
|
- {51, &Hid::ActivateXpad, "ActivateXpad"},
|
|
|
|
|
- {55, nullptr, "GetXpadIds"},
|
|
|
|
|
- {56, nullptr, "ActivateJoyXpad"},
|
|
|
|
|
- {58, nullptr, "GetJoyXpadLifoHandle"},
|
|
|
|
|
- {59, nullptr, "GetJoyXpadIds"},
|
|
|
|
|
- {60, nullptr, "ActivateSixAxisSensor"},
|
|
|
|
|
- {61, nullptr, "DeactivateSixAxisSensor"},
|
|
|
|
|
- {62, nullptr, "GetSixAxisSensorLifoHandle"},
|
|
|
|
|
- {63, nullptr, "ActivateJoySixAxisSensor"},
|
|
|
|
|
- {64, nullptr, "DeactivateJoySixAxisSensor"},
|
|
|
|
|
- {65, nullptr, "GetJoySixAxisSensorLifoHandle"},
|
|
|
|
|
- {66, &Hid::StartSixAxisSensor, "StartSixAxisSensor"},
|
|
|
|
|
- {67, &Hid::StopSixAxisSensor, "StopSixAxisSensor"},
|
|
|
|
|
- {68, nullptr, "IsSixAxisSensorFusionEnabled"},
|
|
|
|
|
- {69, nullptr, "EnableSixAxisSensorFusion"},
|
|
|
|
|
- {70, nullptr, "SetSixAxisSensorFusionParameters"},
|
|
|
|
|
- {71, nullptr, "GetSixAxisSensorFusionParameters"},
|
|
|
|
|
- {72, nullptr, "ResetSixAxisSensorFusionParameters"},
|
|
|
|
|
- {73, nullptr, "SetAccelerometerParameters"},
|
|
|
|
|
- {74, nullptr, "GetAccelerometerParameters"},
|
|
|
|
|
- {75, nullptr, "ResetAccelerometerParameters"},
|
|
|
|
|
- {76, nullptr, "SetAccelerometerPlayMode"},
|
|
|
|
|
- {77, nullptr, "GetAccelerometerPlayMode"},
|
|
|
|
|
- {78, nullptr, "ResetAccelerometerPlayMode"},
|
|
|
|
|
- {79, &Hid::SetGyroscopeZeroDriftMode, "SetGyroscopeZeroDriftMode"},
|
|
|
|
|
- {80, nullptr, "GetGyroscopeZeroDriftMode"},
|
|
|
|
|
- {81, nullptr, "ResetGyroscopeZeroDriftMode"},
|
|
|
|
|
- {82, &Hid::IsSixAxisSensorAtRest, "IsSixAxisSensorAtRest"},
|
|
|
|
|
- {83, nullptr, "IsFirmwareUpdateAvailableForSixAxisSensor"},
|
|
|
|
|
- {91, &Hid::ActivateGesture, "ActivateGesture"},
|
|
|
|
|
- {100, &Hid::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"},
|
|
|
|
|
- {101, &Hid::GetSupportedNpadStyleSet, "GetSupportedNpadStyleSet"},
|
|
|
|
|
- {102, &Hid::SetSupportedNpadIdType, "SetSupportedNpadIdType"},
|
|
|
|
|
- {103, &Hid::ActivateNpad, "ActivateNpad"},
|
|
|
|
|
- {104, nullptr, "DeactivateNpad"},
|
|
|
|
|
- {106, &Hid::AcquireNpadStyleSetUpdateEventHandle, "AcquireNpadStyleSetUpdateEventHandle"},
|
|
|
|
|
- {107, &Hid::DisconnectNpad, "DisconnectNpad"},
|
|
|
|
|
- {108, &Hid::GetPlayerLedPattern, "GetPlayerLedPattern"},
|
|
|
|
|
- {109, &Hid::ActivateNpadWithRevision, "ActivateNpadWithRevision"},
|
|
|
|
|
- {120, &Hid::SetNpadJoyHoldType, "SetNpadJoyHoldType"},
|
|
|
|
|
- {121, &Hid::GetNpadJoyHoldType, "GetNpadJoyHoldType"},
|
|
|
|
|
- {122, &Hid::SetNpadJoyAssignmentModeSingleByDefault, "SetNpadJoyAssignmentModeSingleByDefault"},
|
|
|
|
|
- {123, nullptr, "SetNpadJoyAssignmentModeSingleByDefault"},
|
|
|
|
|
- {124, &Hid::SetNpadJoyAssignmentModeDual, "SetNpadJoyAssignmentModeDual"},
|
|
|
|
|
- {125, &Hid::MergeSingleJoyAsDualJoy, "MergeSingleJoyAsDualJoy"},
|
|
|
|
|
- {126, nullptr, "StartLrAssignmentMode"},
|
|
|
|
|
- {127, nullptr, "StopLrAssignmentMode"},
|
|
|
|
|
- {128, &Hid::SetNpadHandheldActivationMode, "SetNpadHandheldActivationMode"},
|
|
|
|
|
- {129, nullptr, "GetNpadHandheldActivationMode"},
|
|
|
|
|
- {130, nullptr, "SwapNpadAssignment"},
|
|
|
|
|
- {131, nullptr, "IsUnintendedHomeButtonInputProtectionEnabled"},
|
|
|
|
|
- {132, nullptr, "EnableUnintendedHomeButtonInputProtection"},
|
|
|
|
|
- {133, nullptr, "SetNpadJoyAssignmentModeSingleWithDestination"},
|
|
|
|
|
- {200, &Hid::GetVibrationDeviceInfo, "GetVibrationDeviceInfo"},
|
|
|
|
|
- {201, &Hid::SendVibrationValue, "SendVibrationValue"},
|
|
|
|
|
- {202, &Hid::GetActualVibrationValue, "GetActualVibrationValue"},
|
|
|
|
|
- {203, &Hid::CreateActiveVibrationDeviceList, "CreateActiveVibrationDeviceList"},
|
|
|
|
|
- {204, nullptr, "PermitVibration"},
|
|
|
|
|
- {205, nullptr, "IsVibrationPermitted"},
|
|
|
|
|
- {206, &Hid::SendVibrationValues, "SendVibrationValues"},
|
|
|
|
|
- {207, nullptr, "SendVibrationGcErmCommand"},
|
|
|
|
|
- {208, nullptr, "GetActualVibrationGcErmCommand"},
|
|
|
|
|
- {209, &Hid::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
|
|
|
|
|
- {210, &Hid::EndPermitVibrationSession, "EndPermitVibrationSession"},
|
|
|
|
|
- {300, &Hid::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"},
|
|
|
|
|
- {301, &Hid::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"},
|
|
|
|
|
- {302, nullptr, "StopConsoleSixAxisSensor"},
|
|
|
|
|
- {303, nullptr, "ActivateSevenSixAxisSensor"},
|
|
|
|
|
- {304, nullptr, "StartSevenSixAxisSensor"},
|
|
|
|
|
- {305, nullptr, "StopSevenSixAxisSensor"},
|
|
|
|
|
- {306, nullptr, "InitializeSevenSixAxisSensor"},
|
|
|
|
|
- {307, nullptr, "FinalizeSevenSixAxisSensor"},
|
|
|
|
|
- {308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
|
|
|
|
|
- {309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
|
|
|
|
|
- {310, nullptr, "ResetSevenSixAxisSensorTimestamp"},
|
|
|
|
|
- {400, nullptr, "IsUsbFullKeyControllerEnabled"},
|
|
|
|
|
- {401, nullptr, "EnableUsbFullKeyController"},
|
|
|
|
|
- {402, nullptr, "IsUsbFullKeyControllerConnected"},
|
|
|
|
|
- {403, nullptr, "HasBattery"},
|
|
|
|
|
- {404, nullptr, "HasLeftRightBattery"},
|
|
|
|
|
- {405, nullptr, "GetNpadInterfaceType"},
|
|
|
|
|
- {406, nullptr, "GetNpadLeftRightInterfaceType"},
|
|
|
|
|
- {500, nullptr, "GetPalmaConnectionHandle"},
|
|
|
|
|
- {501, nullptr, "InitializePalma"},
|
|
|
|
|
- {502, nullptr, "AcquirePalmaOperationCompleteEvent"},
|
|
|
|
|
- {503, nullptr, "GetPalmaOperationInfo"},
|
|
|
|
|
- {504, nullptr, "PlayPalmaActivity"},
|
|
|
|
|
- {505, nullptr, "SetPalmaFrModeType"},
|
|
|
|
|
- {506, nullptr, "ReadPalmaStep"},
|
|
|
|
|
- {507, nullptr, "EnablePalmaStep"},
|
|
|
|
|
- {508, nullptr, "ResetPalmaStep"},
|
|
|
|
|
- {509, nullptr, "ReadPalmaApplicationSection"},
|
|
|
|
|
- {510, nullptr, "WritePalmaApplicationSection"},
|
|
|
|
|
- {511, nullptr, "ReadPalmaUniqueCode"},
|
|
|
|
|
- {512, nullptr, "SetPalmaUniqueCodeInvalid"},
|
|
|
|
|
- {513, nullptr, "WritePalmaActivityEntry"},
|
|
|
|
|
- {514, nullptr, "WritePalmaRgbLedPatternEntry"},
|
|
|
|
|
- {515, nullptr, "WritePalmaWaveEntry"},
|
|
|
|
|
- {516, nullptr, "SetPalmaDataBaseIdentificationVersion"},
|
|
|
|
|
- {517, nullptr, "GetPalmaDataBaseIdentificationVersion"},
|
|
|
|
|
- {518, nullptr, "SuspendPalmaFeature"},
|
|
|
|
|
- {519, nullptr, "GetPalmaOperationResult"},
|
|
|
|
|
- {520, nullptr, "ReadPalmaPlayLog"},
|
|
|
|
|
- {521, nullptr, "ResetPalmaPlayLog"},
|
|
|
|
|
- {522, &Hid::SetIsPalmaAllConnectable, "SetIsPalmaAllConnectable"},
|
|
|
|
|
- {523, nullptr, "SetIsPalmaPairedConnectable"},
|
|
|
|
|
- {524, nullptr, "PairPalma"},
|
|
|
|
|
- {525, &Hid::SetPalmaBoostMode, "SetPalmaBoostMode"},
|
|
|
|
|
- {1000, nullptr, "SetNpadCommunicationMode"},
|
|
|
|
|
- {1001, nullptr, "GetNpadCommunicationMode"},
|
|
|
|
|
- };
|
|
|
|
|
- // clang-format on
|
|
|
|
|
-
|
|
|
|
|
- RegisterHandlers(functions);
|
|
|
|
|
|
|
+std::shared_ptr<IAppletResource> Hid::GetAppletResource() {
|
|
|
|
|
+ if (applet_resource == nullptr) {
|
|
|
|
|
+ applet_resource = std::make_shared<IAppletResource>();
|
|
|
}
|
|
}
|
|
|
- ~Hid() = default;
|
|
|
|
|
|
|
|
|
|
-private:
|
|
|
|
|
- std::shared_ptr<IAppletResource> applet_resource;
|
|
|
|
|
|
|
+ return applet_resource;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- void CreateAppletResource(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+Hid::Hid() : ServiceFramework("hid") {
|
|
|
|
|
+ // clang-format off
|
|
|
|
|
+ static const FunctionInfo functions[] = {
|
|
|
|
|
+ {0, &Hid::CreateAppletResource, "CreateAppletResource"},
|
|
|
|
|
+ {1, &Hid::ActivateDebugPad, "ActivateDebugPad"},
|
|
|
|
|
+ {11, &Hid::ActivateTouchScreen, "ActivateTouchScreen"},
|
|
|
|
|
+ {21, &Hid::ActivateMouse, "ActivateMouse"},
|
|
|
|
|
+ {31, &Hid::ActivateKeyboard, "ActivateKeyboard"},
|
|
|
|
|
+ {32, nullptr, "SendKeyboardLockKeyEvent"},
|
|
|
|
|
+ {40, nullptr, "AcquireXpadIdEventHandle"},
|
|
|
|
|
+ {41, nullptr, "ReleaseXpadIdEventHandle"},
|
|
|
|
|
+ {51, &Hid::ActivateXpad, "ActivateXpad"},
|
|
|
|
|
+ {55, nullptr, "GetXpadIds"},
|
|
|
|
|
+ {56, nullptr, "ActivateJoyXpad"},
|
|
|
|
|
+ {58, nullptr, "GetJoyXpadLifoHandle"},
|
|
|
|
|
+ {59, nullptr, "GetJoyXpadIds"},
|
|
|
|
|
+ {60, nullptr, "ActivateSixAxisSensor"},
|
|
|
|
|
+ {61, nullptr, "DeactivateSixAxisSensor"},
|
|
|
|
|
+ {62, nullptr, "GetSixAxisSensorLifoHandle"},
|
|
|
|
|
+ {63, nullptr, "ActivateJoySixAxisSensor"},
|
|
|
|
|
+ {64, nullptr, "DeactivateJoySixAxisSensor"},
|
|
|
|
|
+ {65, nullptr, "GetJoySixAxisSensorLifoHandle"},
|
|
|
|
|
+ {66, &Hid::StartSixAxisSensor, "StartSixAxisSensor"},
|
|
|
|
|
+ {67, &Hid::StopSixAxisSensor, "StopSixAxisSensor"},
|
|
|
|
|
+ {68, nullptr, "IsSixAxisSensorFusionEnabled"},
|
|
|
|
|
+ {69, nullptr, "EnableSixAxisSensorFusion"},
|
|
|
|
|
+ {70, nullptr, "SetSixAxisSensorFusionParameters"},
|
|
|
|
|
+ {71, nullptr, "GetSixAxisSensorFusionParameters"},
|
|
|
|
|
+ {72, nullptr, "ResetSixAxisSensorFusionParameters"},
|
|
|
|
|
+ {73, nullptr, "SetAccelerometerParameters"},
|
|
|
|
|
+ {74, nullptr, "GetAccelerometerParameters"},
|
|
|
|
|
+ {75, nullptr, "ResetAccelerometerParameters"},
|
|
|
|
|
+ {76, nullptr, "SetAccelerometerPlayMode"},
|
|
|
|
|
+ {77, nullptr, "GetAccelerometerPlayMode"},
|
|
|
|
|
+ {78, nullptr, "ResetAccelerometerPlayMode"},
|
|
|
|
|
+ {79, &Hid::SetGyroscopeZeroDriftMode, "SetGyroscopeZeroDriftMode"},
|
|
|
|
|
+ {80, nullptr, "GetGyroscopeZeroDriftMode"},
|
|
|
|
|
+ {81, nullptr, "ResetGyroscopeZeroDriftMode"},
|
|
|
|
|
+ {82, &Hid::IsSixAxisSensorAtRest, "IsSixAxisSensorAtRest"},
|
|
|
|
|
+ {83, nullptr, "IsFirmwareUpdateAvailableForSixAxisSensor"},
|
|
|
|
|
+ {91, &Hid::ActivateGesture, "ActivateGesture"},
|
|
|
|
|
+ {100, &Hid::SetSupportedNpadStyleSet, "SetSupportedNpadStyleSet"},
|
|
|
|
|
+ {101, &Hid::GetSupportedNpadStyleSet, "GetSupportedNpadStyleSet"},
|
|
|
|
|
+ {102, &Hid::SetSupportedNpadIdType, "SetSupportedNpadIdType"},
|
|
|
|
|
+ {103, &Hid::ActivateNpad, "ActivateNpad"},
|
|
|
|
|
+ {104, nullptr, "DeactivateNpad"},
|
|
|
|
|
+ {106, &Hid::AcquireNpadStyleSetUpdateEventHandle, "AcquireNpadStyleSetUpdateEventHandle"},
|
|
|
|
|
+ {107, &Hid::DisconnectNpad, "DisconnectNpad"},
|
|
|
|
|
+ {108, &Hid::GetPlayerLedPattern, "GetPlayerLedPattern"},
|
|
|
|
|
+ {109, &Hid::ActivateNpadWithRevision, "ActivateNpadWithRevision"},
|
|
|
|
|
+ {120, &Hid::SetNpadJoyHoldType, "SetNpadJoyHoldType"},
|
|
|
|
|
+ {121, &Hid::GetNpadJoyHoldType, "GetNpadJoyHoldType"},
|
|
|
|
|
+ {122, &Hid::SetNpadJoyAssignmentModeSingleByDefault, "SetNpadJoyAssignmentModeSingleByDefault"},
|
|
|
|
|
+ {123, nullptr, "SetNpadJoyAssignmentModeSingleByDefault"},
|
|
|
|
|
+ {124, &Hid::SetNpadJoyAssignmentModeDual, "SetNpadJoyAssignmentModeDual"},
|
|
|
|
|
+ {125, &Hid::MergeSingleJoyAsDualJoy, "MergeSingleJoyAsDualJoy"},
|
|
|
|
|
+ {126, nullptr, "StartLrAssignmentMode"},
|
|
|
|
|
+ {127, nullptr, "StopLrAssignmentMode"},
|
|
|
|
|
+ {128, &Hid::SetNpadHandheldActivationMode, "SetNpadHandheldActivationMode"},
|
|
|
|
|
+ {129, nullptr, "GetNpadHandheldActivationMode"},
|
|
|
|
|
+ {130, nullptr, "SwapNpadAssignment"},
|
|
|
|
|
+ {131, nullptr, "IsUnintendedHomeButtonInputProtectionEnabled"},
|
|
|
|
|
+ {132, nullptr, "EnableUnintendedHomeButtonInputProtection"},
|
|
|
|
|
+ {133, nullptr, "SetNpadJoyAssignmentModeSingleWithDestination"},
|
|
|
|
|
+ {200, &Hid::GetVibrationDeviceInfo, "GetVibrationDeviceInfo"},
|
|
|
|
|
+ {201, &Hid::SendVibrationValue, "SendVibrationValue"},
|
|
|
|
|
+ {202, &Hid::GetActualVibrationValue, "GetActualVibrationValue"},
|
|
|
|
|
+ {203, &Hid::CreateActiveVibrationDeviceList, "CreateActiveVibrationDeviceList"},
|
|
|
|
|
+ {204, nullptr, "PermitVibration"},
|
|
|
|
|
+ {205, nullptr, "IsVibrationPermitted"},
|
|
|
|
|
+ {206, &Hid::SendVibrationValues, "SendVibrationValues"},
|
|
|
|
|
+ {207, nullptr, "SendVibrationGcErmCommand"},
|
|
|
|
|
+ {208, nullptr, "GetActualVibrationGcErmCommand"},
|
|
|
|
|
+ {209, &Hid::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
|
|
|
|
|
+ {210, &Hid::EndPermitVibrationSession, "EndPermitVibrationSession"},
|
|
|
|
|
+ {300, &Hid::ActivateConsoleSixAxisSensor, "ActivateConsoleSixAxisSensor"},
|
|
|
|
|
+ {301, &Hid::StartConsoleSixAxisSensor, "StartConsoleSixAxisSensor"},
|
|
|
|
|
+ {302, nullptr, "StopConsoleSixAxisSensor"},
|
|
|
|
|
+ {303, nullptr, "ActivateSevenSixAxisSensor"},
|
|
|
|
|
+ {304, nullptr, "StartSevenSixAxisSensor"},
|
|
|
|
|
+ {305, nullptr, "StopSevenSixAxisSensor"},
|
|
|
|
|
+ {306, nullptr, "InitializeSevenSixAxisSensor"},
|
|
|
|
|
+ {307, nullptr, "FinalizeSevenSixAxisSensor"},
|
|
|
|
|
+ {308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
|
|
|
|
|
+ {309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
|
|
|
|
|
+ {310, nullptr, "ResetSevenSixAxisSensorTimestamp"},
|
|
|
|
|
+ {400, nullptr, "IsUsbFullKeyControllerEnabled"},
|
|
|
|
|
+ {401, nullptr, "EnableUsbFullKeyController"},
|
|
|
|
|
+ {402, nullptr, "IsUsbFullKeyControllerConnected"},
|
|
|
|
|
+ {403, nullptr, "HasBattery"},
|
|
|
|
|
+ {404, nullptr, "HasLeftRightBattery"},
|
|
|
|
|
+ {405, nullptr, "GetNpadInterfaceType"},
|
|
|
|
|
+ {406, nullptr, "GetNpadLeftRightInterfaceType"},
|
|
|
|
|
+ {500, nullptr, "GetPalmaConnectionHandle"},
|
|
|
|
|
+ {501, nullptr, "InitializePalma"},
|
|
|
|
|
+ {502, nullptr, "AcquirePalmaOperationCompleteEvent"},
|
|
|
|
|
+ {503, nullptr, "GetPalmaOperationInfo"},
|
|
|
|
|
+ {504, nullptr, "PlayPalmaActivity"},
|
|
|
|
|
+ {505, nullptr, "SetPalmaFrModeType"},
|
|
|
|
|
+ {506, nullptr, "ReadPalmaStep"},
|
|
|
|
|
+ {507, nullptr, "EnablePalmaStep"},
|
|
|
|
|
+ {508, nullptr, "ResetPalmaStep"},
|
|
|
|
|
+ {509, nullptr, "ReadPalmaApplicationSection"},
|
|
|
|
|
+ {510, nullptr, "WritePalmaApplicationSection"},
|
|
|
|
|
+ {511, nullptr, "ReadPalmaUniqueCode"},
|
|
|
|
|
+ {512, nullptr, "SetPalmaUniqueCodeInvalid"},
|
|
|
|
|
+ {513, nullptr, "WritePalmaActivityEntry"},
|
|
|
|
|
+ {514, nullptr, "WritePalmaRgbLedPatternEntry"},
|
|
|
|
|
+ {515, nullptr, "WritePalmaWaveEntry"},
|
|
|
|
|
+ {516, nullptr, "SetPalmaDataBaseIdentificationVersion"},
|
|
|
|
|
+ {517, nullptr, "GetPalmaDataBaseIdentificationVersion"},
|
|
|
|
|
+ {518, nullptr, "SuspendPalmaFeature"},
|
|
|
|
|
+ {519, nullptr, "GetPalmaOperationResult"},
|
|
|
|
|
+ {520, nullptr, "ReadPalmaPlayLog"},
|
|
|
|
|
+ {521, nullptr, "ResetPalmaPlayLog"},
|
|
|
|
|
+ {522, &Hid::SetIsPalmaAllConnectable, "SetIsPalmaAllConnectable"},
|
|
|
|
|
+ {523, nullptr, "SetIsPalmaPairedConnectable"},
|
|
|
|
|
+ {524, nullptr, "PairPalma"},
|
|
|
|
|
+ {525, &Hid::SetPalmaBoostMode, "SetPalmaBoostMode"},
|
|
|
|
|
+ {1000, nullptr, "SetNpadCommunicationMode"},
|
|
|
|
|
+ {1001, nullptr, "GetNpadCommunicationMode"},
|
|
|
|
|
+ };
|
|
|
|
|
+ // clang-format on
|
|
|
|
|
+
|
|
|
|
|
+ RegisterHandlers(functions);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+Hid::~Hid() = default;
|
|
|
|
|
|
|
|
- if (applet_resource == nullptr) {
|
|
|
|
|
- applet_resource = std::make_shared<IAppletResource>();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void Hid::CreateAppletResource(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.PushIpcInterface<IAppletResource>(applet_resource);
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
+
|
|
|
|
|
+ if (applet_resource == nullptr) {
|
|
|
|
|
+ applet_resource = std::make_shared<IAppletResource>();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void ActivateXpad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto basic_xpad_id{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.PushIpcInterface<IAppletResource>(applet_resource);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, basic_xpad_id={}, applet_resource_user_id={}",
|
|
|
|
|
- basic_xpad_id, applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateXpad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto basic_xpad_id{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->ActivateController(HidController::XPad);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, basic_xpad_id={}, applet_resource_user_id={}", basic_xpad_id,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void ActivateDebugPad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->ActivateController(HidController::XPad);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateDebugPad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->ActivateController(HidController::DebugPad);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void ActivateTouchScreen(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->ActivateController(HidController::DebugPad);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateTouchScreen(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->ActivateController(HidController::Touchscreen);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void ActivateMouse(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->ActivateController(HidController::Touchscreen);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateMouse(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->ActivateController(HidController::Mouse);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void ActivateKeyboard(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->ActivateController(HidController::Mouse);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateKeyboard(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->ActivateController(HidController::Keyboard);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void ActivateGesture(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->ActivateController(HidController::Keyboard);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown,
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateGesture(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->ActivateController(HidController::Gesture);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- // Should have no effect with how our npad sets up the data
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->ActivateController(HidController::Gesture);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown,
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateNpadWithRevision(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ // Should have no effect with how our npad sets up the data
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->ActivateController(HidController::NPad);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, unknown={}, applet_resource_user_id={}", unknown,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void StartSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto handle{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->ActivateController(HidController::NPad);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::StartSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto handle{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto handle{rp.Pop<u32>()};
|
|
|
|
|
- const auto drift_mode{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID,
|
|
|
|
|
- "(STUBBED) called, handle={}, drift_mode={}, applet_resource_user_id={}",
|
|
|
|
|
- handle, drift_mode, applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto handle{rp.Pop<u32>()};
|
|
|
|
|
+ const auto drift_mode{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID,
|
|
|
|
|
+ "(STUBBED) called, handle={}, drift_mode={}, applet_resource_user_id={}", handle,
|
|
|
|
|
+ drift_mode, applet_resource_user_id);
|
|
|
|
|
|
|
|
- void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto handle{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto handle{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- // TODO (Hexagon12): Properly implement reading gyroscope values from controllers.
|
|
|
|
|
- rb.Push(true);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto supported_styleset{rp.Pop<u32>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ // TODO (Hexagon12): Properly implement reading gyroscope values from controllers.
|
|
|
|
|
+ rb.Push(true);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, supported_styleset={}", supported_styleset);
|
|
|
|
|
|
|
+void Hid::SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto supported_styleset{rp.Pop<u32>()};
|
|
|
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .SetSupportedStyleSet({supported_styleset});
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, supported_styleset={}", supported_styleset);
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
+ .SetSupportedStyleSet({supported_styleset});
|
|
|
|
|
|
|
|
- void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.Push<u32>(controller.GetSupportedStyleSet().raw);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
|
|
|
- void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.Push<u32>(controller.GetSupportedStyleSet().raw);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .SetSupportedNPadIdTypes(ctx.ReadBuffer().data(), ctx.GetReadBufferSize());
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void ActivateNpad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
+ .SetSupportedNPadIdTypes(ctx.ReadBuffer().data(), ctx.GetReadBufferSize());
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- applet_resource->ActivateController(HidController::NPad);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
- const auto unknown{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ applet_resource->ActivateController(HidController::NPad);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}, unknown={}",
|
|
|
|
|
- npad_id, applet_resource_user_id, unknown);
|
|
|
|
|
|
|
+void Hid::AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
+ const auto unknown{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 1};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.PushCopyObjects(applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .GetStyleSetChangedEvent());
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}, unknown={}", npad_id,
|
|
|
|
|
+ applet_resource_user_id, unknown);
|
|
|
|
|
|
|
|
- void DisconnectNpad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2, 1};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.PushCopyObjects(applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
+ .GetStyleSetChangedEvent());
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id,
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::DisconnectNpad(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .DisconnectNPad(npad_id);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void GetPlayerLedPattern(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad).DisconnectNPad(npad_id);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id);
|
|
|
|
|
|
|
+void Hid::GetPlayerLedPattern(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.PushRaw<u64>(applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .GetLedPattern(npad_id)
|
|
|
|
|
- .raw);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, npad_id={}", npad_id);
|
|
|
|
|
|
|
|
- void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
- const auto hold_type{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.PushRaw<u64>(applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
+ .GetLedPattern(npad_id)
|
|
|
|
|
+ .raw);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, hold_type={}",
|
|
|
|
|
- applet_resource_user_id, hold_type);
|
|
|
|
|
|
|
+void Hid::SetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
+ const auto hold_type{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
- controller.SetHoldType(Controller_NPad::NpadHoldType{hold_type});
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}, hold_type={}",
|
|
|
|
|
+ applet_resource_user_id, hold_type);
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
+ controller.SetHoldType(Controller_NPad::NpadHoldType{hold_type});
|
|
|
|
|
|
|
|
- void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::GetNpadJoyHoldType(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- const auto& controller =
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.Push<u64>(static_cast<u64>(controller.GetHoldType()));
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ const auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.Push<u64>(static_cast<u64>(controller.GetHoldType()));
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}",
|
|
|
|
|
- npad_id, applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, npad_id={}, applet_resource_user_id={}", npad_id,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::BeginPermitVibrationSession(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .SetVibrationEnabled(true);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- void EndPermitVibrationSession(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(true);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .SetVibrationEnabled(false);
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void Hid::EndPermitVibrationSession(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
|
- void SendVibrationValue(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto controller_id{rp.Pop<u32>()};
|
|
|
|
|
- const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad).SetVibrationEnabled(false);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}",
|
|
|
|
|
- controller_id, applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::SendVibrationValue(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto controller_id{rp.Pop<u32>()};
|
|
|
|
|
+ const auto vibration_values{rp.PopRaw<Controller_NPad::Vibration>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", controller_id,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .VibrateController({controller_id}, {vibration_values});
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
|
|
|
- void SendVibrationValues(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
+ .VibrateController({controller_id}, {vibration_values});
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::SendVibrationValues(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- const auto controllers = ctx.ReadBuffer(0);
|
|
|
|
|
- const auto vibrations = ctx.ReadBuffer(1);
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
|
|
|
|
|
|
|
|
- std::vector<u32> controller_list(controllers.size() / sizeof(u32));
|
|
|
|
|
- std::vector<Controller_NPad::Vibration> vibration_list(vibrations.size() /
|
|
|
|
|
- sizeof(Controller_NPad::Vibration));
|
|
|
|
|
|
|
+ const auto controllers = ctx.ReadBuffer(0);
|
|
|
|
|
+ const auto vibrations = ctx.ReadBuffer(1);
|
|
|
|
|
|
|
|
- std::memcpy(controller_list.data(), controllers.data(), controllers.size());
|
|
|
|
|
- std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size());
|
|
|
|
|
- std::transform(controller_list.begin(), controller_list.end(), controller_list.begin(),
|
|
|
|
|
- [](u32 controller_id) { return controller_id - 3; });
|
|
|
|
|
|
|
+ std::vector<u32> controller_list(controllers.size() / sizeof(u32));
|
|
|
|
|
+ std::vector<Controller_NPad::Vibration> vibration_list(vibrations.size() /
|
|
|
|
|
+ sizeof(Controller_NPad::Vibration));
|
|
|
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .VibrateController(controller_list, vibration_list);
|
|
|
|
|
|
|
+ std::memcpy(controller_list.data(), controllers.data(), controllers.size());
|
|
|
|
|
+ std::memcpy(vibration_list.data(), vibrations.data(), vibrations.size());
|
|
|
|
|
+ std::transform(controller_list.begin(), controller_list.end(), controller_list.begin(),
|
|
|
|
|
+ [](u32 controller_id) { return controller_id - 3; });
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
+ .VibrateController(controller_list, vibration_list);
|
|
|
|
|
|
|
|
- void GetActualVibrationValue(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto controller_id{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}",
|
|
|
|
|
- controller_id, applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::GetActualVibrationValue(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto controller_id{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 6};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.PushRaw<Controller_NPad::Vibration>(
|
|
|
|
|
- applet_resource->GetController<Controller_NPad>(HidController::NPad)
|
|
|
|
|
- .GetLastVibration());
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, controller_id={}, applet_resource_user_id={}", controller_id,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 6};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.PushRaw<Controller_NPad::Vibration>(
|
|
|
|
|
+ applet_resource->GetController<Controller_NPad>(HidController::NPad).GetLastVibration());
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id,
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto npad_id{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
- controller.SetNpadMode(npad_id, Controller_NPad::NPadAssignments::Dual);
|
|
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called, npad_id={}, applet_resource_user_id={}", npad_id,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ auto& controller = applet_resource->GetController<Controller_NPad>(HidController::NPad);
|
|
|
|
|
+ controller.SetNpadMode(npad_id, Controller_NPad::NPadAssignments::Dual);
|
|
|
|
|
|
|
|
- void MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto unknown_1{rp.Pop<u32>()};
|
|
|
|
|
- const auto unknown_2{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID,
|
|
|
|
|
- "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}",
|
|
|
|
|
- unknown_1, unknown_2, applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto unknown_1{rp.Pop<u32>()};
|
|
|
|
|
+ const auto unknown_2{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID,
|
|
|
|
|
+ "(STUBBED) called, unknown_1={}, unknown_2={}, applet_resource_user_id={}",
|
|
|
|
|
+ unknown_1, unknown_2, applet_resource_user_id);
|
|
|
|
|
|
|
|
- void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
- const auto mode{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, mode={}",
|
|
|
|
|
- applet_resource_user_id, mode);
|
|
|
|
|
|
|
+void Hid::SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
+ const auto mode{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, mode={}",
|
|
|
|
|
+ applet_resource_user_id, mode);
|
|
|
|
|
|
|
|
- void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.Push<u32>(1);
|
|
|
|
|
- rb.Push<u32>(0);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void Hid::GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
|
- void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.Push<u32>(1);
|
|
|
|
|
+ rb.Push<u32>(0);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- rb.PushIpcInterface<IActiveVibrationDeviceList>();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+void Hid::CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ LOG_DEBUG(Service_HID, "called");
|
|
|
|
|
|
|
|
- void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.PushIpcInterface<IActiveVibrationDeviceList>();
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}",
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto handle{rp.Pop<u32>()};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
|
|
|
|
|
- applet_resource_user_id);
|
|
|
|
|
|
|
+void Hid::StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto handle{rp.Pop<u32>()};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, handle={}, applet_resource_user_id={}", handle,
|
|
|
|
|
+ applet_resource_user_id);
|
|
|
|
|
|
|
|
- void StopSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto handle{rp.Pop<u32>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, handle={}", handle);
|
|
|
|
|
|
|
+void Hid::StopSixAxisSensor(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto handle{rp.Pop<u32>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, handle={}", handle);
|
|
|
|
|
|
|
|
- void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
- const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, unknown={}",
|
|
|
|
|
- applet_resource_user_id, unknown);
|
|
|
|
|
|
|
+void Hid::SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto applet_resource_user_id{rp.Pop<u64>()};
|
|
|
|
|
+ const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}, unknown={}",
|
|
|
|
|
+ applet_resource_user_id, unknown);
|
|
|
|
|
|
|
|
- void SetPalmaBoostMode(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
- IPC::RequestParser rp{ctx};
|
|
|
|
|
- const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}", unknown);
|
|
|
|
|
|
|
+void Hid::SetPalmaBoostMode(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+ const auto unknown{rp.Pop<u32>()};
|
|
|
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(RESULT_SUCCESS);
|
|
|
|
|
- }
|
|
|
|
|
-};
|
|
|
|
|
|
|
+ LOG_WARNING(Service_HID, "(STUBBED) called, unknown={}", unknown);
|
|
|
|
|
+
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
class HidDbg final : public ServiceFramework<HidDbg> {
|
|
class HidDbg final : public ServiceFramework<HidDbg> {
|
|
|
public:
|
|
public:
|