mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	service: hid: Migrate HidServer to new IPC
This commit is contained in:
		
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -6,12 +6,20 @@
 | 
				
			|||||||
#include "core/hle/service/cmif_types.h"
 | 
					#include "core/hle/service/cmif_types.h"
 | 
				
			||||||
#include "core/hle/service/service.h"
 | 
					#include "core/hle/service/service.h"
 | 
				
			||||||
#include "hid_core/hid_types.h"
 | 
					#include "hid_core/hid_types.h"
 | 
				
			||||||
 | 
					#include "hid_core/resources/npad/npad_types.h"
 | 
				
			||||||
 | 
					#include "hid_core/resources/palma/palma.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Core {
 | 
					namespace Core {
 | 
				
			||||||
class System;
 | 
					class System;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Kernel {
 | 
				
			||||||
 | 
					class KReadableEvent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Service::HID {
 | 
					namespace Service::HID {
 | 
				
			||||||
 | 
					class IActiveVibrationDeviceList;
 | 
				
			||||||
 | 
					class IAppletResource;
 | 
				
			||||||
class ResourceManager;
 | 
					class ResourceManager;
 | 
				
			||||||
class HidFirmwareSettings;
 | 
					class HidFirmwareSettings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -24,128 +32,232 @@ public:
 | 
				
			|||||||
    std::shared_ptr<ResourceManager> GetResourceManager();
 | 
					    std::shared_ptr<ResourceManager> GetResourceManager();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    void CreateAppletResource(HLERequestContext& ctx);
 | 
					    Result CreateAppletResource(OutInterface<IAppletResource> out_applet_resource,
 | 
				
			||||||
    void ActivateDebugPad(HLERequestContext& ctx);
 | 
					                                ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void ActivateTouchScreen(HLERequestContext& ctx);
 | 
					    Result ActivateDebugPad(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void ActivateMouse(HLERequestContext& ctx);
 | 
					    Result ActivateTouchScreen(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void ActivateKeyboard(HLERequestContext& ctx);
 | 
					    Result ActivateMouse(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SendKeyboardLockKeyEvent(HLERequestContext& ctx);
 | 
					    Result ActivateKeyboard(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void AcquireXpadIdEventHandle(HLERequestContext& ctx);
 | 
					    Result SendKeyboardLockKeyEvent(u32 flags);
 | 
				
			||||||
    void ReleaseXpadIdEventHandle(HLERequestContext& ctx);
 | 
					    Result AcquireXpadIdEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event,
 | 
				
			||||||
    void ActivateXpad(HLERequestContext& ctx);
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetXpadIds(HLERequestContext& ctx);
 | 
					    Result ReleaseXpadIdEventHandle(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void ActivateJoyXpad(HLERequestContext& ctx);
 | 
					    Result ActivateXpad(u32 basic_xpad_id, ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetJoyXpadLifoHandle(HLERequestContext& ctx);
 | 
					    Result GetXpadIds(Out<u64> out_count, OutArray<u32, BufferAttr_HipcPointer> out_basic_pad_ids);
 | 
				
			||||||
    void GetJoyXpadIds(HLERequestContext& ctx);
 | 
					    Result ActivateJoyXpad(u32 joy_xpad_id);
 | 
				
			||||||
    void ActivateSixAxisSensor(HLERequestContext& ctx);
 | 
					    Result GetJoyXpadLifoHandle(OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_handle,
 | 
				
			||||||
    void DeactivateSixAxisSensor(HLERequestContext& ctx);
 | 
					                                u32 joy_xpad_id);
 | 
				
			||||||
    void GetSixAxisSensorLifoHandle(HLERequestContext& ctx);
 | 
					    Result GetJoyXpadIds(Out<s64> out_basic_xpad_id_count);
 | 
				
			||||||
    void ActivateJoySixAxisSensor(HLERequestContext& ctx);
 | 
					    Result ActivateSixAxisSensor(u32 joy_xpad_id);
 | 
				
			||||||
    void DeactivateJoySixAxisSensor(HLERequestContext& ctx);
 | 
					    Result DeactivateSixAxisSensor(u32 joy_xpad_id);
 | 
				
			||||||
    void GetJoySixAxisSensorLifoHandle(HLERequestContext& ctx);
 | 
					    Result GetSixAxisSensorLifoHandle(OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_handle,
 | 
				
			||||||
    void StartSixAxisSensor(HLERequestContext& ctx);
 | 
					                                      u32 joy_xpad_id);
 | 
				
			||||||
    void StopSixAxisSensor(HLERequestContext& ctx);
 | 
					    Result ActivateJoySixAxisSensor(u32 joy_xpad_id);
 | 
				
			||||||
    void IsSixAxisSensorFusionEnabled(HLERequestContext& ctx);
 | 
					    Result DeactivateJoySixAxisSensor(u32 joy_xpad_id);
 | 
				
			||||||
    void EnableSixAxisSensorFusion(HLERequestContext& ctx);
 | 
					    Result GetJoySixAxisSensorLifoHandle(
 | 
				
			||||||
    void SetSixAxisSensorFusionParameters(HLERequestContext& ctx);
 | 
					        OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_handle, u32 joy_xpad_id);
 | 
				
			||||||
    void GetSixAxisSensorFusionParameters(HLERequestContext& ctx);
 | 
					    Result StartSixAxisSensor(Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
    void ResetSixAxisSensorFusionParameters(HLERequestContext& ctx);
 | 
					                              ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetGyroscopeZeroDriftMode(HLERequestContext& ctx);
 | 
					    Result StopSixAxisSensor(Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
    void GetGyroscopeZeroDriftMode(HLERequestContext& ctx);
 | 
					                             ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void ResetGyroscopeZeroDriftMode(HLERequestContext& ctx);
 | 
					    Result IsSixAxisSensorFusionEnabled(Out<bool> out_is_enabled,
 | 
				
			||||||
    void IsSixAxisSensorAtRest(HLERequestContext& ctx);
 | 
					                                        Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
    void IsFirmwareUpdateAvailableForSixAxisSensor(HLERequestContext& ctx);
 | 
					                                        ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void EnableSixAxisSensorUnalteredPassthrough(HLERequestContext& ctx);
 | 
					    Result EnableSixAxisSensorFusion(bool is_enabled, Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
    void IsSixAxisSensorUnalteredPassthroughEnabled(HLERequestContext& ctx);
 | 
					                                     ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void LoadSixAxisSensorCalibrationParameter(HLERequestContext& ctx);
 | 
					    Result SetSixAxisSensorFusionParameters(Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
    void GetSixAxisSensorIcInformation(HLERequestContext& ctx);
 | 
					                                            Core::HID::SixAxisSensorFusionParameters sixaxis_fusion,
 | 
				
			||||||
    void ResetIsSixAxisSensorDeviceNewlyAssigned(HLERequestContext& ctx);
 | 
					                                            ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void ActivateGesture(HLERequestContext& ctx);
 | 
					    Result GetSixAxisSensorFusionParameters(
 | 
				
			||||||
    void SetSupportedNpadStyleSet(HLERequestContext& ctx);
 | 
					        Out<Core::HID::SixAxisSensorFusionParameters> out_fusion_parameters,
 | 
				
			||||||
    void GetSupportedNpadStyleSet(HLERequestContext& ctx);
 | 
					        Core::HID::SixAxisSensorHandle sixaxis_handle, ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetSupportedNpadIdType(HLERequestContext& ctx);
 | 
					    Result ResetSixAxisSensorFusionParameters(Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
    void ActivateNpad(HLERequestContext& ctx);
 | 
					                                              ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void DeactivateNpad(HLERequestContext& ctx);
 | 
					    Result SetGyroscopeZeroDriftMode(Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
    void AcquireNpadStyleSetUpdateEventHandle(HLERequestContext& ctx);
 | 
					                                     Core::HID::GyroscopeZeroDriftMode drift_mode,
 | 
				
			||||||
    void DisconnectNpad(HLERequestContext& ctx);
 | 
					                                     ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result GetGyroscopeZeroDriftMode(Out<Core::HID::GyroscopeZeroDriftMode> out_drift_mode,
 | 
				
			||||||
 | 
					                                     Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
 | 
					                                     ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result ResetGyroscopeZeroDriftMode(Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
 | 
					                                       ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result IsSixAxisSensorAtRest(Out<bool> out_is_at_rest,
 | 
				
			||||||
 | 
					                                 Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
 | 
					                                 ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result IsFirmwareUpdateAvailableForSixAxisSensor(Out<bool> out_is_firmware_available,
 | 
				
			||||||
 | 
					                                                     Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
 | 
					                                                     ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result EnableSixAxisSensorUnalteredPassthrough(bool is_enabled,
 | 
				
			||||||
 | 
					                                                   Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
 | 
					                                                   ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result IsSixAxisSensorUnalteredPassthroughEnabled(Out<bool> out_is_enabled,
 | 
				
			||||||
 | 
					                                                      Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
 | 
					                                                      ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result LoadSixAxisSensorCalibrationParameter(
 | 
				
			||||||
 | 
					        OutLargeData<Core::HID::SixAxisSensorCalibrationParameter, BufferAttr_HipcMapAlias>
 | 
				
			||||||
 | 
					            out_calibration,
 | 
				
			||||||
 | 
					        Core::HID::SixAxisSensorHandle sixaxis_handle, ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result GetSixAxisSensorIcInformation(
 | 
				
			||||||
 | 
					        OutLargeData<Core::HID::SixAxisSensorIcInformation, BufferAttr_HipcPointer>
 | 
				
			||||||
 | 
					            out_ic_information,
 | 
				
			||||||
 | 
					        Core::HID::SixAxisSensorHandle sixaxis_handle, ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result ResetIsSixAxisSensorDeviceNewlyAssigned(Core::HID::SixAxisSensorHandle sixaxis_handle,
 | 
				
			||||||
 | 
					                                                   ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result ActivateGesture(u32 basic_gesture_id, ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result SetSupportedNpadStyleSet(Core::HID::NpadStyleSet supported_style_set,
 | 
				
			||||||
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result GetSupportedNpadStyleSet(Out<Core::HID::NpadStyleSet> out_supported_style_set,
 | 
				
			||||||
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result SetSupportedNpadIdType(
 | 
				
			||||||
 | 
					        ClientAppletResourceUserId aruid,
 | 
				
			||||||
 | 
					        InArray<Core::HID::NpadIdType, BufferAttr_HipcPointer> supported_npad_list);
 | 
				
			||||||
 | 
					    Result ActivateNpad(ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result DeactivateNpad(ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result AcquireNpadStyleSetUpdateEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event,
 | 
				
			||||||
 | 
					                                                Core::HID::NpadIdType npad_id,
 | 
				
			||||||
 | 
					                                                ClientAppletResourceUserId aruid, u64 unknown);
 | 
				
			||||||
 | 
					    Result DisconnectNpad(Core::HID::NpadIdType npad_id, ClientAppletResourceUserId aruid);
 | 
				
			||||||
    Result GetPlayerLedPattern(Out<Core::HID::LedPattern> out_led_pattern,
 | 
					    Result GetPlayerLedPattern(Out<Core::HID::LedPattern> out_led_pattern,
 | 
				
			||||||
                               Core::HID::NpadIdType npad_id);
 | 
					                               Core::HID::NpadIdType npad_id);
 | 
				
			||||||
    void ActivateNpadWithRevision(HLERequestContext& ctx);
 | 
					    Result ActivateNpadWithRevision(NpadRevision revision, ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetNpadJoyHoldType(HLERequestContext& ctx);
 | 
					    Result SetNpadJoyHoldType(ClientAppletResourceUserId aruid, NpadJoyHoldType hold_type);
 | 
				
			||||||
    void GetNpadJoyHoldType(HLERequestContext& ctx);
 | 
					    Result GetNpadJoyHoldType(Out<NpadJoyHoldType> out_hold_type, ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetNpadJoyAssignmentModeSingleByDefault(HLERequestContext& ctx);
 | 
					    Result SetNpadJoyAssignmentModeSingleByDefault(Core::HID::NpadIdType npad_id,
 | 
				
			||||||
    void SetNpadJoyAssignmentModeSingle(HLERequestContext& ctx);
 | 
					                                                   ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetNpadJoyAssignmentModeDual(HLERequestContext& ctx);
 | 
					    Result SetNpadJoyAssignmentModeSingle(Core::HID::NpadIdType npad_id,
 | 
				
			||||||
    void MergeSingleJoyAsDualJoy(HLERequestContext& ctx);
 | 
					                                          ClientAppletResourceUserId aruid,
 | 
				
			||||||
    void StartLrAssignmentMode(HLERequestContext& ctx);
 | 
					                                          NpadJoyDeviceType npad_joy_device_type);
 | 
				
			||||||
    void StopLrAssignmentMode(HLERequestContext& ctx);
 | 
					    Result SetNpadJoyAssignmentModeDual(Core::HID::NpadIdType npad_id,
 | 
				
			||||||
    void SetNpadHandheldActivationMode(HLERequestContext& ctx);
 | 
					                                        ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetNpadHandheldActivationMode(HLERequestContext& ctx);
 | 
					    Result MergeSingleJoyAsDualJoy(Core::HID::NpadIdType npad_id_1, Core::HID::NpadIdType npad_id_2,
 | 
				
			||||||
    void SwapNpadAssignment(HLERequestContext& ctx);
 | 
					                                   ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void IsUnintendedHomeButtonInputProtectionEnabled(HLERequestContext& ctx);
 | 
					    Result StartLrAssignmentMode(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void EnableUnintendedHomeButtonInputProtection(HLERequestContext& ctx);
 | 
					    Result StopLrAssignmentMode(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetNpadJoyAssignmentModeSingleWithDestination(HLERequestContext& ctx);
 | 
					    Result SetNpadHandheldActivationMode(ClientAppletResourceUserId aruid,
 | 
				
			||||||
    void SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx);
 | 
					                                         NpadHandheldActivationMode activation_mode);
 | 
				
			||||||
    void SetNpadCaptureButtonAssignment(HLERequestContext& ctx);
 | 
					    Result GetNpadHandheldActivationMode(Out<NpadHandheldActivationMode> out_activation_mode,
 | 
				
			||||||
    void ClearNpadCaptureButtonAssignment(HLERequestContext& ctx);
 | 
					                                         ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetVibrationDeviceInfo(HLERequestContext& ctx);
 | 
					    Result SwapNpadAssignment(Core::HID::NpadIdType npad_id_1, Core::HID::NpadIdType npad_id_2,
 | 
				
			||||||
    void SendVibrationValue(HLERequestContext& ctx);
 | 
					                              ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetActualVibrationValue(HLERequestContext& ctx);
 | 
					    Result IsUnintendedHomeButtonInputProtectionEnabled(Out<bool> out_is_enabled,
 | 
				
			||||||
    void CreateActiveVibrationDeviceList(HLERequestContext& ctx);
 | 
					                                                        Core::HID::NpadIdType npad_id,
 | 
				
			||||||
    void PermitVibration(HLERequestContext& ctx);
 | 
					                                                        ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void IsVibrationPermitted(HLERequestContext& ctx);
 | 
					    Result EnableUnintendedHomeButtonInputProtection(bool is_enabled, Core::HID::NpadIdType npad_id,
 | 
				
			||||||
    void SendVibrationValues(HLERequestContext& ctx);
 | 
					                                                     ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SendVibrationGcErmCommand(HLERequestContext& ctx);
 | 
					    Result SetNpadJoyAssignmentModeSingleWithDestination(Out<bool> out_is_reassigned,
 | 
				
			||||||
    void GetActualVibrationGcErmCommand(HLERequestContext& ctx);
 | 
					                                                         Out<Core::HID::NpadIdType> out_new_npad_id,
 | 
				
			||||||
    void BeginPermitVibrationSession(HLERequestContext& ctx);
 | 
					                                                         Core::HID::NpadIdType npad_id,
 | 
				
			||||||
    void EndPermitVibrationSession(HLERequestContext& ctx);
 | 
					                                                         ClientAppletResourceUserId aruid,
 | 
				
			||||||
    void IsVibrationDeviceMounted(HLERequestContext& ctx);
 | 
					                                                         NpadJoyDeviceType npad_joy_device_type);
 | 
				
			||||||
    void SendVibrationValueInBool(HLERequestContext& ctx);
 | 
					    Result SetNpadAnalogStickUseCenterClamp(bool use_center_clamp,
 | 
				
			||||||
    void ActivateConsoleSixAxisSensor(HLERequestContext& ctx);
 | 
					                                            ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void StartConsoleSixAxisSensor(HLERequestContext& ctx);
 | 
					    Result SetNpadCaptureButtonAssignment(Core::HID::NpadStyleSet npad_styleset,
 | 
				
			||||||
    void StopConsoleSixAxisSensor(HLERequestContext& ctx);
 | 
					                                          ClientAppletResourceUserId aruid,
 | 
				
			||||||
    void ActivateSevenSixAxisSensor(HLERequestContext& ctx);
 | 
					                                          Core::HID::NpadButton button);
 | 
				
			||||||
    void StartSevenSixAxisSensor(HLERequestContext& ctx);
 | 
					    Result ClearNpadCaptureButtonAssignment(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void StopSevenSixAxisSensor(HLERequestContext& ctx);
 | 
					    Result GetVibrationDeviceInfo(Out<Core::HID::VibrationDeviceInfo> out_vibration_device_info,
 | 
				
			||||||
    void InitializeSevenSixAxisSensor(HLERequestContext& ctx);
 | 
					                                  Core::HID::VibrationDeviceHandle vibration_device_handle);
 | 
				
			||||||
    void FinalizeSevenSixAxisSensor(HLERequestContext& ctx);
 | 
					    Result SendVibrationValue(Core::HID::VibrationDeviceHandle vibration_device_handle,
 | 
				
			||||||
    void ResetSevenSixAxisSensorTimestamp(HLERequestContext& ctx);
 | 
					                              Core::HID::VibrationValue vibration_value,
 | 
				
			||||||
    void IsUsbFullKeyControllerEnabled(HLERequestContext& ctx);
 | 
					                              ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetPalmaConnectionHandle(HLERequestContext& ctx);
 | 
					    Result GetActualVibrationValue(Out<Core::HID::VibrationValue> out_vibration_value,
 | 
				
			||||||
    void InitializePalma(HLERequestContext& ctx);
 | 
					                                   Core::HID::VibrationDeviceHandle vibration_device_handle,
 | 
				
			||||||
    void AcquirePalmaOperationCompleteEvent(HLERequestContext& ctx);
 | 
					                                   ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetPalmaOperationInfo(HLERequestContext& ctx);
 | 
					    Result CreateActiveVibrationDeviceList(OutInterface<IActiveVibrationDeviceList> out_interface);
 | 
				
			||||||
    void PlayPalmaActivity(HLERequestContext& ctx);
 | 
					    Result PermitVibration(bool can_vibrate);
 | 
				
			||||||
    void SetPalmaFrModeType(HLERequestContext& ctx);
 | 
					    Result IsVibrationPermitted(Out<bool> out_is_permitted);
 | 
				
			||||||
    void ReadPalmaStep(HLERequestContext& ctx);
 | 
					    Result SendVibrationValues(
 | 
				
			||||||
    void EnablePalmaStep(HLERequestContext& ctx);
 | 
					        ClientAppletResourceUserId aruid,
 | 
				
			||||||
    void ResetPalmaStep(HLERequestContext& ctx);
 | 
					        InArray<Core::HID::VibrationDeviceHandle, BufferAttr_HipcPointer> vibration_handles,
 | 
				
			||||||
    void ReadPalmaApplicationSection(HLERequestContext& ctx);
 | 
					        InArray<Core::HID::VibrationValue, BufferAttr_HipcPointer> vibration_values);
 | 
				
			||||||
    void WritePalmaApplicationSection(HLERequestContext& ctx);
 | 
					    Result SendVibrationGcErmCommand(Core::HID::VibrationDeviceHandle vibration_device_handle,
 | 
				
			||||||
    void ReadPalmaUniqueCode(HLERequestContext& ctx);
 | 
					                                     ClientAppletResourceUserId aruid,
 | 
				
			||||||
    void SetPalmaUniqueCodeInvalid(HLERequestContext& ctx);
 | 
					                                     Core::HID::VibrationGcErmCommand gc_erm_command);
 | 
				
			||||||
    void WritePalmaActivityEntry(HLERequestContext& ctx);
 | 
					    Result GetActualVibrationGcErmCommand(Out<Core::HID::VibrationGcErmCommand> out_gc_erm_command,
 | 
				
			||||||
    void WritePalmaRgbLedPatternEntry(HLERequestContext& ctx);
 | 
					                                          Core::HID::VibrationDeviceHandle vibration_device_handle,
 | 
				
			||||||
    void WritePalmaWaveEntry(HLERequestContext& ctx);
 | 
					                                          ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx);
 | 
					    Result BeginPermitVibrationSession(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx);
 | 
					    Result EndPermitVibrationSession(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SuspendPalmaFeature(HLERequestContext& ctx);
 | 
					    Result IsVibrationDeviceMounted(Out<bool> out_is_mounted,
 | 
				
			||||||
    void GetPalmaOperationResult(HLERequestContext& ctx);
 | 
					                                    Core::HID::VibrationDeviceHandle vibration_device_handle,
 | 
				
			||||||
    void ReadPalmaPlayLog(HLERequestContext& ctx);
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void ResetPalmaPlayLog(HLERequestContext& ctx);
 | 
					    Result SendVibrationValueInBool(bool is_vibrating,
 | 
				
			||||||
    void SetIsPalmaAllConnectable(HLERequestContext& ctx);
 | 
					                                    Core::HID::VibrationDeviceHandle vibration_device_handle,
 | 
				
			||||||
    void SetIsPalmaPairedConnectable(HLERequestContext& ctx);
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void PairPalma(HLERequestContext& ctx);
 | 
					    Result ActivateConsoleSixAxisSensor(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetPalmaBoostMode(HLERequestContext& ctx);
 | 
					    Result StartConsoleSixAxisSensor(Core::HID::ConsoleSixAxisSensorHandle console_sixaxis_handle,
 | 
				
			||||||
    void CancelWritePalmaWaveEntry(HLERequestContext& ctx);
 | 
					                                     ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void EnablePalmaBoostMode(HLERequestContext& ctx);
 | 
					    Result StopConsoleSixAxisSensor(Core::HID::ConsoleSixAxisSensorHandle console_sixaxis_handle,
 | 
				
			||||||
    void GetPalmaBluetoothAddress(HLERequestContext& ctx);
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetDisallowedPalmaConnection(HLERequestContext& ctx);
 | 
					    Result ActivateSevenSixAxisSensor(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetNpadCommunicationMode(HLERequestContext& ctx);
 | 
					    Result StartSevenSixAxisSensor(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void GetNpadCommunicationMode(HLERequestContext& ctx);
 | 
					    Result StopSevenSixAxisSensor(ClientAppletResourceUserId aruid);
 | 
				
			||||||
    void SetTouchScreenConfiguration(HLERequestContext& ctx);
 | 
					    Result InitializeSevenSixAxisSensor(ClientAppletResourceUserId aruid, u64 t_mem_1_size,
 | 
				
			||||||
    void IsFirmwareUpdateNeededForNotification(HLERequestContext& ctx);
 | 
					                                        u64 t_mem_2_size,
 | 
				
			||||||
    void SetTouchScreenResolution(HLERequestContext& ctx);
 | 
					                                        InCopyHandle<Kernel::KTransferMemory> t_mem_1,
 | 
				
			||||||
 | 
					                                        InCopyHandle<Kernel::KTransferMemory> t_mem_2);
 | 
				
			||||||
 | 
					    Result FinalizeSevenSixAxisSensor(ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result ResetSevenSixAxisSensorTimestamp(ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result IsUsbFullKeyControllerEnabled(Out<bool> out_is_enabled,
 | 
				
			||||||
 | 
					                                         ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result GetPalmaConnectionHandle(Out<Palma::PalmaConnectionHandle> out_handle,
 | 
				
			||||||
 | 
					                                    Core::HID::NpadIdType npad_id,
 | 
				
			||||||
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result InitializePalma(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result AcquirePalmaOperationCompleteEvent(OutCopyHandle<Kernel::KReadableEvent> out_event,
 | 
				
			||||||
 | 
					                                              Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result GetPalmaOperationInfo(Out<Palma::PalmaOperationType> out_operation_type,
 | 
				
			||||||
 | 
					                                 Palma::PalmaConnectionHandle connection_handle,
 | 
				
			||||||
 | 
					                                 OutBuffer<BufferAttr_HipcMapAlias> out_data);
 | 
				
			||||||
 | 
					    Result PlayPalmaActivity(Palma::PalmaConnectionHandle connection_handle, u64 palma_activity);
 | 
				
			||||||
 | 
					    Result SetPalmaFrModeType(Palma::PalmaConnectionHandle connection_handle,
 | 
				
			||||||
 | 
					                              Palma::PalmaFrModeType fr_mode);
 | 
				
			||||||
 | 
					    Result ReadPalmaStep(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result EnablePalmaStep(bool is_enabled, Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result ResetPalmaStep(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result ReadPalmaApplicationSection(Palma::PalmaConnectionHandle connection_handle, u64 offset,
 | 
				
			||||||
 | 
					                                       u64 size);
 | 
				
			||||||
 | 
					    Result WritePalmaApplicationSection(
 | 
				
			||||||
 | 
					        Palma::PalmaConnectionHandle connection_handle, u64 offset, u64 size,
 | 
				
			||||||
 | 
					        InLargeData<Palma::PalmaApplicationSection, BufferAttr_HipcPointer> data);
 | 
				
			||||||
 | 
					    Result ReadPalmaUniqueCode(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result SetPalmaUniqueCodeInvalid(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result WritePalmaActivityEntry(Palma::PalmaConnectionHandle connection_handle,
 | 
				
			||||||
 | 
					                                   Palma::PalmaActivityEntry activity_entry);
 | 
				
			||||||
 | 
					    Result WritePalmaRgbLedPatternEntry(Palma::PalmaConnectionHandle connection_handle, u64 unknown,
 | 
				
			||||||
 | 
					                                        InBuffer<BufferAttr_HipcMapAlias> led_pattern);
 | 
				
			||||||
 | 
					    Result WritePalmaWaveEntry(Palma::PalmaConnectionHandle connection_handle,
 | 
				
			||||||
 | 
					                               Palma::PalmaWaveSet wave_set, u64 unknown, u64 t_mem_size, u64 size,
 | 
				
			||||||
 | 
					                               InCopyHandle<Kernel::KTransferMemory> t_mem);
 | 
				
			||||||
 | 
					    Result SetPalmaDataBaseIdentificationVersion(s32 database_id_version,
 | 
				
			||||||
 | 
					                                                 Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result GetPalmaDataBaseIdentificationVersion(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result SuspendPalmaFeature(Palma::PalmaFeature feature,
 | 
				
			||||||
 | 
					                               Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result GetPalmaOperationResult(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result ReadPalmaPlayLog(u16 unknown, Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result ResetPalmaPlayLog(u16 unknown, Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result SetIsPalmaAllConnectable(bool is_palma_all_connectable, ClientAppletResourceUserId arui);
 | 
				
			||||||
 | 
					    Result SetIsPalmaPairedConnectable(bool is_palma_paired_connectable,
 | 
				
			||||||
 | 
					                                       ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result PairPalma(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result SetPalmaBoostMode(bool is_enabled);
 | 
				
			||||||
 | 
					    Result CancelWritePalmaWaveEntry(Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result EnablePalmaBoostMode(bool is_enabled, ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result GetPalmaBluetoothAddress(Out<Palma::Address> out_bt_address,
 | 
				
			||||||
 | 
					                                    Palma::PalmaConnectionHandle connection_handle);
 | 
				
			||||||
 | 
					    Result SetDisallowedPalmaConnection(
 | 
				
			||||||
 | 
					        ClientAppletResourceUserId aruid,
 | 
				
			||||||
 | 
					        InArray<Palma::Address, BufferAttr_HipcPointer> disallowed_address);
 | 
				
			||||||
 | 
					    Result SetNpadCommunicationMode(ClientAppletResourceUserId aruid,
 | 
				
			||||||
 | 
					                                    NpadCommunicationMode communication_mode);
 | 
				
			||||||
 | 
					    Result GetNpadCommunicationMode(Out<NpadCommunicationMode> out_communication_mode,
 | 
				
			||||||
 | 
					                                    ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result SetTouchScreenConfiguration(Core::HID::TouchScreenConfigurationForNx touchscreen_config,
 | 
				
			||||||
 | 
					                                       ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result IsFirmwareUpdateNeededForNotification(Out<bool> out_is_firmware_update_needed,
 | 
				
			||||||
 | 
					                                                 s32 unknown, ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					    Result SetTouchScreenResolution(u32 width, u32 height, ClientAppletResourceUserId aruid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::shared_ptr<ResourceManager> resource_manager;
 | 
					    std::shared_ptr<ResourceManager> resource_manager;
 | 
				
			||||||
    std::shared_ptr<HidFirmwareSettings> firmware_settings;
 | 
					    std::shared_ptr<HidFirmwareSettings> firmware_settings;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -565,36 +565,28 @@ static_assert(sizeof(SixAxisSensorProperties) == 1, "SixAxisSensorProperties is
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// This is nn::hid::SixAxisSensorCalibrationParameter
 | 
					// This is nn::hid::SixAxisSensorCalibrationParameter
 | 
				
			||||||
struct SixAxisSensorCalibrationParameter {
 | 
					struct SixAxisSensorCalibrationParameter {
 | 
				
			||||||
    std::array<u8, 0x744> unknown_data{};
 | 
					    std::array<u8, 0x744> unknown_data;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
static_assert(sizeof(SixAxisSensorCalibrationParameter) == 0x744,
 | 
					static_assert(sizeof(SixAxisSensorCalibrationParameter) == 0x744,
 | 
				
			||||||
              "SixAxisSensorCalibrationParameter is an invalid size");
 | 
					              "SixAxisSensorCalibrationParameter is an invalid size");
 | 
				
			||||||
 | 
					static_assert(std::is_trivial_v<SixAxisSensorCalibrationParameter>,
 | 
				
			||||||
 | 
					              "SixAxisSensorCalibrationParameter must be trivial.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is nn::hid::SixAxisSensorIcInformation
 | 
					// This is nn::hid::SixAxisSensorIcInformation
 | 
				
			||||||
struct SixAxisSensorIcInformation {
 | 
					struct SixAxisSensorIcInformation {
 | 
				
			||||||
    f32 angular_rate{2000.0f}; // dps
 | 
					    f32 angular_rate;                      // dps
 | 
				
			||||||
    std::array<f32, 6> unknown_gyro_data1{
 | 
					    std::array<f32, 6> unknown_gyro_data1; // dps
 | 
				
			||||||
        -10.0f, -10.0f, -10.0f, 10.0f, 10.0f, 10.0f,
 | 
					    std::array<f32, 9> unknown_gyro_data2;
 | 
				
			||||||
    }; // dps
 | 
					    std::array<f32, 9> unknown_gyro_data3;
 | 
				
			||||||
    std::array<f32, 9> unknown_gyro_data2{
 | 
					    f32 acceleration_range;                 // g force
 | 
				
			||||||
        0.95f, -0.003f, -0.003f, -0.003f, 0.95f, -0.003f, -0.003f, -0.003f, 0.95f,
 | 
					    std::array<f32, 6> unknown_accel_data1; // g force
 | 
				
			||||||
    };
 | 
					    std::array<f32, 9> unknown_accel_data2;
 | 
				
			||||||
    std::array<f32, 9> unknown_gyro_data3{
 | 
					    std::array<f32, 9> unknown_accel_data3;
 | 
				
			||||||
        1.05f, 0.003f, 0.003f, 0.003f, 1.05f, 0.003f, 0.003f, 0.003f, 1.05f,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    f32 acceleration_range{8.0f}; // g force
 | 
					 | 
				
			||||||
    std::array<f32, 6> unknown_accel_data1{
 | 
					 | 
				
			||||||
        -0.0612f, -0.0612f, -0.0612f, 0.0612f, 0.0612f, 0.0612f,
 | 
					 | 
				
			||||||
    }; // g force
 | 
					 | 
				
			||||||
    std::array<f32, 9> unknown_accel_data2{
 | 
					 | 
				
			||||||
        0.95f, -0.003f, -0.003f, -0.003f, 0.95f, -0.003f, -0.003f, -0.003f, 0.95f,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    std::array<f32, 9> unknown_accel_data3{
 | 
					 | 
				
			||||||
        1.05f, 0.003f, 0.003f, 0.003f, 1.05f, 0.003f, 0.003f, 0.003f, 1.05f,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
static_assert(sizeof(SixAxisSensorIcInformation) == 0xC8,
 | 
					static_assert(sizeof(SixAxisSensorIcInformation) == 0xC8,
 | 
				
			||||||
              "SixAxisSensorIcInformation is an invalid size");
 | 
					              "SixAxisSensorIcInformation is an invalid size");
 | 
				
			||||||
 | 
					static_assert(std::is_trivial_v<SixAxisSensorIcInformation>,
 | 
				
			||||||
 | 
					              "SixAxisSensorIcInformation must be trivial.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This is nn::hid::SixAxisSensorAttribute
 | 
					// This is nn::hid::SixAxisSensorAttribute
 | 
				
			||||||
struct SixAxisSensorAttribute {
 | 
					struct SixAxisSensorAttribute {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,12 +56,14 @@ Kernel::KReadableEvent& Palma::AcquirePalmaOperationCompleteEvent(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Result Palma::GetPalmaOperationInfo(const PalmaConnectionHandle& handle,
 | 
					Result Palma::GetPalmaOperationInfo(const PalmaConnectionHandle& handle,
 | 
				
			||||||
                                    PalmaOperationType& operation_type,
 | 
					                                    PalmaOperationType& operation_type,
 | 
				
			||||||
                                    PalmaOperationData& data) const {
 | 
					                                    std::span<u8> out_data) const {
 | 
				
			||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation_type = operation.operation;
 | 
					    operation_type = static_cast<PalmaOperationType>(operation.operation);
 | 
				
			||||||
    data = operation.data;
 | 
					    std::memcpy(out_data.data(), operation.data.data(),
 | 
				
			||||||
 | 
					                std::min(out_data.size(), operation.data.size()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ResultSuccess;
 | 
					    return ResultSuccess;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -69,7 +71,7 @@ Result Palma::PlayPalmaActivity(const PalmaConnectionHandle& handle, u64 palma_a
 | 
				
			|||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation.operation = PalmaOperationType::PlayActivity;
 | 
					    operation.operation = PackedPalmaOperationType::PlayActivity;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data = {};
 | 
					    operation.data = {};
 | 
				
			||||||
    operation_complete_event->Signal();
 | 
					    operation_complete_event->Signal();
 | 
				
			||||||
@@ -88,7 +90,7 @@ Result Palma::ReadPalmaStep(const PalmaConnectionHandle& handle) {
 | 
				
			|||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation.operation = PalmaOperationType::ReadStep;
 | 
					    operation.operation = PackedPalmaOperationType::ReadStep;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data = {};
 | 
					    operation.data = {};
 | 
				
			||||||
    operation_complete_event->Signal();
 | 
					    operation_complete_event->Signal();
 | 
				
			||||||
@@ -117,7 +119,7 @@ Result Palma::ReadPalmaUniqueCode(const PalmaConnectionHandle& handle) {
 | 
				
			|||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation.operation = PalmaOperationType::ReadUniqueCode;
 | 
					    operation.operation = PackedPalmaOperationType::ReadUniqueCode;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data = {};
 | 
					    operation.data = {};
 | 
				
			||||||
    operation_complete_event->Signal();
 | 
					    operation_complete_event->Signal();
 | 
				
			||||||
@@ -128,7 +130,7 @@ Result Palma::SetPalmaUniqueCodeInvalid(const PalmaConnectionHandle& handle) {
 | 
				
			|||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation.operation = PalmaOperationType::SetUniqueCodeInvalid;
 | 
					    operation.operation = PackedPalmaOperationType::SetUniqueCodeInvalid;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data = {};
 | 
					    operation.data = {};
 | 
				
			||||||
    operation_complete_event->Signal();
 | 
					    operation_complete_event->Signal();
 | 
				
			||||||
@@ -141,7 +143,7 @@ Result Palma::WritePalmaRgbLedPatternEntry(const PalmaConnectionHandle& handle,
 | 
				
			|||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation.operation = PalmaOperationType::WriteRgbLedPatternEntry;
 | 
					    operation.operation = PackedPalmaOperationType::WriteRgbLedPatternEntry;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data = {};
 | 
					    operation.data = {};
 | 
				
			||||||
    operation_complete_event->Signal();
 | 
					    operation_complete_event->Signal();
 | 
				
			||||||
@@ -153,7 +155,7 @@ Result Palma::WritePalmaWaveEntry(const PalmaConnectionHandle& handle, PalmaWave
 | 
				
			|||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation.operation = PalmaOperationType::WriteWaveEntry;
 | 
					    operation.operation = PackedPalmaOperationType::WriteWaveEntry;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data = {};
 | 
					    operation.data = {};
 | 
				
			||||||
    operation_complete_event->Signal();
 | 
					    operation_complete_event->Signal();
 | 
				
			||||||
@@ -166,7 +168,7 @@ Result Palma::SetPalmaDataBaseIdentificationVersion(const PalmaConnectionHandle&
 | 
				
			|||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    database_id_version = database_id_version_;
 | 
					    database_id_version = database_id_version_;
 | 
				
			||||||
    operation.operation = PalmaOperationType::ReadDataBaseIdentificationVersion;
 | 
					    operation.operation = PackedPalmaOperationType::ReadDataBaseIdentificationVersion;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data[0] = {};
 | 
					    operation.data[0] = {};
 | 
				
			||||||
    operation_complete_event->Signal();
 | 
					    operation_complete_event->Signal();
 | 
				
			||||||
@@ -177,7 +179,7 @@ Result Palma::GetPalmaDataBaseIdentificationVersion(const PalmaConnectionHandle&
 | 
				
			|||||||
    if (handle.npad_id != active_handle.npad_id) {
 | 
					    if (handle.npad_id != active_handle.npad_id) {
 | 
				
			||||||
        return InvalidPalmaHandle;
 | 
					        return InvalidPalmaHandle;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    operation.operation = PalmaOperationType::ReadDataBaseIdentificationVersion;
 | 
					    operation.operation = PackedPalmaOperationType::ReadDataBaseIdentificationVersion;
 | 
				
			||||||
    operation.result = PalmaResultSuccess;
 | 
					    operation.result = PalmaResultSuccess;
 | 
				
			||||||
    operation.data = {};
 | 
					    operation.data = {};
 | 
				
			||||||
    operation.data[0] = static_cast<u8>(database_id_version);
 | 
					    operation.data[0] = static_cast<u8>(database_id_version);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,8 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <array>
 | 
					#include <array>
 | 
				
			||||||
 | 
					#include <span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "common/common_funcs.h"
 | 
					#include "common/common_funcs.h"
 | 
				
			||||||
#include "common/typed_address.h"
 | 
					#include "common/typed_address.h"
 | 
				
			||||||
#include "hid_core/hid_result.h"
 | 
					#include "hid_core/hid_result.h"
 | 
				
			||||||
@@ -27,9 +29,31 @@ namespace Service::HID {
 | 
				
			|||||||
class Palma final : public ControllerBase {
 | 
					class Palma final : public ControllerBase {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    using PalmaOperationData = std::array<u8, 0x140>;
 | 
					    using PalmaOperationData = std::array<u8, 0x140>;
 | 
				
			||||||
 | 
					    using PalmaApplicationSection = std::array<u8, 0x100>;
 | 
				
			||||||
 | 
					    using Address = std::array<u8, 0x6>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // This is nn::hid::PalmaOperationType
 | 
					    // This is nn::hid::PalmaOperationType
 | 
				
			||||||
    enum class PalmaOperationType {
 | 
					    enum class PalmaOperationType : u64 {
 | 
				
			||||||
 | 
					        PlayActivity,
 | 
				
			||||||
 | 
					        SetFrModeType,
 | 
				
			||||||
 | 
					        ReadStep,
 | 
				
			||||||
 | 
					        EnableStep,
 | 
				
			||||||
 | 
					        ResetStep,
 | 
				
			||||||
 | 
					        ReadApplicationSection,
 | 
				
			||||||
 | 
					        WriteApplicationSection,
 | 
				
			||||||
 | 
					        ReadUniqueCode,
 | 
				
			||||||
 | 
					        SetUniqueCodeInvalid,
 | 
				
			||||||
 | 
					        WriteActivityEntry,
 | 
				
			||||||
 | 
					        WriteRgbLedPatternEntry,
 | 
				
			||||||
 | 
					        WriteWaveEntry,
 | 
				
			||||||
 | 
					        ReadDataBaseIdentificationVersion,
 | 
				
			||||||
 | 
					        WriteDataBaseIdentificationVersion,
 | 
				
			||||||
 | 
					        SuspendFeature,
 | 
				
			||||||
 | 
					        ReadPlayLog,
 | 
				
			||||||
 | 
					        ResetPlayLog,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    enum class PackedPalmaOperationType : u32 {
 | 
				
			||||||
        PlayActivity,
 | 
					        PlayActivity,
 | 
				
			||||||
        SetFrModeType,
 | 
					        SetFrModeType,
 | 
				
			||||||
        ReadStep,
 | 
					        ReadStep,
 | 
				
			||||||
@@ -75,7 +99,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // This is nn::hid::PalmaOperationInfo
 | 
					    // This is nn::hid::PalmaOperationInfo
 | 
				
			||||||
    struct PalmaOperationInfo {
 | 
					    struct PalmaOperationInfo {
 | 
				
			||||||
        PalmaOperationType operation{};
 | 
					        PackedPalmaOperationType operation{};
 | 
				
			||||||
        Result result{PalmaResultSuccess};
 | 
					        Result result{PalmaResultSuccess};
 | 
				
			||||||
        PalmaOperationData data{};
 | 
					        PalmaOperationData data{};
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -92,8 +116,7 @@ public:
 | 
				
			|||||||
    static_assert(sizeof(PalmaActivityEntry) == 0x20, "PalmaActivityEntry is an invalid size");
 | 
					    static_assert(sizeof(PalmaActivityEntry) == 0x20, "PalmaActivityEntry is an invalid size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct PalmaConnectionHandle {
 | 
					    struct PalmaConnectionHandle {
 | 
				
			||||||
        Core::HID::NpadIdType npad_id;
 | 
					        alignas(8) Core::HID::NpadIdType npad_id;
 | 
				
			||||||
        INSERT_PADDING_BYTES(4); // Unknown
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    static_assert(sizeof(PalmaConnectionHandle) == 0x8,
 | 
					    static_assert(sizeof(PalmaConnectionHandle) == 0x8,
 | 
				
			||||||
                  "PalmaConnectionHandle has incorrect size.");
 | 
					                  "PalmaConnectionHandle has incorrect size.");
 | 
				
			||||||
@@ -115,8 +138,7 @@ public:
 | 
				
			|||||||
    Kernel::KReadableEvent& AcquirePalmaOperationCompleteEvent(
 | 
					    Kernel::KReadableEvent& AcquirePalmaOperationCompleteEvent(
 | 
				
			||||||
        const PalmaConnectionHandle& handle) const;
 | 
					        const PalmaConnectionHandle& handle) const;
 | 
				
			||||||
    Result GetPalmaOperationInfo(const PalmaConnectionHandle& handle,
 | 
					    Result GetPalmaOperationInfo(const PalmaConnectionHandle& handle,
 | 
				
			||||||
                                 PalmaOperationType& operation_type,
 | 
					                                 PalmaOperationType& operation_type, std::span<u8> out_data) const;
 | 
				
			||||||
                                 PalmaOperationData& data) const;
 | 
					 | 
				
			||||||
    Result PlayPalmaActivity(const PalmaConnectionHandle& handle, u64 palma_activity);
 | 
					    Result PlayPalmaActivity(const PalmaConnectionHandle& handle, u64 palma_activity);
 | 
				
			||||||
    Result SetPalmaFrModeType(const PalmaConnectionHandle& handle, PalmaFrModeType fr_mode_);
 | 
					    Result SetPalmaFrModeType(const PalmaConnectionHandle& handle, PalmaFrModeType fr_mode_);
 | 
				
			||||||
    Result ReadPalmaStep(const PalmaConnectionHandle& handle);
 | 
					    Result ReadPalmaStep(const PalmaConnectionHandle& handle);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user