mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 23:49:01 -05:00 
			
		
		
		
	hid: Make Hid service accessible and add GetPressState
This commit is contained in:
		| @@ -410,6 +410,8 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) { | ||||
|         libnx_entry.pad.pad_states.raw = pad_state.pad_states.raw; | ||||
|         libnx_entry.pad.l_stick = pad_state.l_stick; | ||||
|         libnx_entry.pad.r_stick = pad_state.r_stick; | ||||
|  | ||||
|         press_state |= static_cast<u32>(pad_state.pad_states.raw); | ||||
|     } | ||||
|     std::memcpy(data + NPAD_OFFSET, shared_memory_entries.data(), | ||||
|                 shared_memory_entries.size() * sizeof(NPadEntry)); | ||||
| @@ -636,6 +638,12 @@ void Controller_NPad::ClearAllControllers() { | ||||
|                   }); | ||||
| } | ||||
|  | ||||
| u32 Controller_NPad::GetPressState() { | ||||
|     const auto res = press_state; | ||||
|     press_state = 0; | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| bool Controller_NPad::IsControllerSupported(NPadControllerType controller) const { | ||||
|     const bool support_handheld = | ||||
|         std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), NPAD_HANDHELD) != | ||||
|   | ||||
| @@ -124,6 +124,10 @@ public: | ||||
|     void ConnectAllDisconnectedControllers(); | ||||
|     void ClearAllControllers(); | ||||
|  | ||||
|     // Logical OR for all buttons presses on all controllers | ||||
|     // Specifically for cheat engine and other features. | ||||
|     u32 GetPressState(); | ||||
|  | ||||
|     static std::size_t NPadIdToIndex(u32 npad_id); | ||||
|     static u32 IndexToNPad(std::size_t index); | ||||
|  | ||||
| @@ -292,6 +296,8 @@ private: | ||||
|         bool is_connected; | ||||
|     }; | ||||
|  | ||||
|     u32 press_state{}; | ||||
|  | ||||
|     NPadType style{}; | ||||
|     std::array<NPadEntry, 10> shared_memory_entries{}; | ||||
|     std::array< | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -3,6 +3,15 @@ | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #pragma once | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace CoreTiming { | ||||
| struct EventType; | ||||
| } | ||||
|  | ||||
| namespace Kernel { | ||||
| class SharedMemory; | ||||
| } | ||||
|  | ||||
| namespace SM { | ||||
| class ServiceManager; | ||||
| @@ -10,6 +19,107 @@ class ServiceManager; | ||||
|  | ||||
| namespace Service::HID { | ||||
|  | ||||
| class ControllerBase; | ||||
|  | ||||
| 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(); | ||||
|     ~IAppletResource() override; | ||||
|  | ||||
|     void ActivateController(HidController controller); | ||||
|     void DeactivateController(HidController controller); | ||||
|  | ||||
|     template <typename T> | ||||
|     T& GetController(HidController controller) { | ||||
|         return static_cast<T&>(*controllers[static_cast<size_t>(controller)]); | ||||
|     } | ||||
|  | ||||
|     template <typename T> | ||||
|     const T& GetController(HidController controller) const { | ||||
|         return static_cast<T&>(*controllers[static_cast<size_t>(controller)]); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     template <typename T> | ||||
|     void MakeController(HidController controller) { | ||||
|         controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(); | ||||
|     } | ||||
|  | ||||
|     void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); | ||||
|     void UpdateControllers(u64 userdata, int cycles_late); | ||||
|  | ||||
|     Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; | ||||
|  | ||||
|     CoreTiming::EventType* pad_update_event; | ||||
|  | ||||
|     std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)> | ||||
|         controllers{}; | ||||
| }; | ||||
|  | ||||
| class Hid final : public ServiceFramework<Hid> { | ||||
| public: | ||||
|     Hid(); | ||||
|     ~Hid() override; | ||||
|  | ||||
|     std::shared_ptr<IAppletResource> GetAppletResource(); | ||||
|  | ||||
| private: | ||||
|     void CreateAppletResource(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateXpad(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateDebugPad(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateTouchScreen(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateMouse(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateKeyboard(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateGesture(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateNpadWithRevision(Kernel::HLERequestContext& ctx); | ||||
|     void StartSixAxisSensor(Kernel::HLERequestContext& ctx); | ||||
|     void SetGyroscopeZeroDriftMode(Kernel::HLERequestContext& ctx); | ||||
|     void IsSixAxisSensorAtRest(Kernel::HLERequestContext& ctx); | ||||
|     void SetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | ||||
|     void GetSupportedNpadStyleSet(Kernel::HLERequestContext& ctx); | ||||
|     void SetSupportedNpadIdType(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateNpad(Kernel::HLERequestContext& ctx); | ||||
|     void AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx); | ||||
|     void DisconnectNpad(Kernel::HLERequestContext& ctx); | ||||
|     void GetPlayerLedPattern(Kernel::HLERequestContext& ctx); | ||||
|     void SetNpadJoyHoldType(Kernel::HLERequestContext& ctx); | ||||
|     void GetNpadJoyHoldType(Kernel::HLERequestContext& ctx); | ||||
|     void SetNpadJoyAssignmentModeSingleByDefault(Kernel::HLERequestContext& ctx); | ||||
|     void BeginPermitVibrationSession(Kernel::HLERequestContext& ctx); | ||||
|     void EndPermitVibrationSession(Kernel::HLERequestContext& ctx); | ||||
|     void SendVibrationValue(Kernel::HLERequestContext& ctx); | ||||
|     void SendVibrationValues(Kernel::HLERequestContext& ctx); | ||||
|     void GetActualVibrationValue(Kernel::HLERequestContext& ctx); | ||||
|     void SetNpadJoyAssignmentModeDual(Kernel::HLERequestContext& ctx); | ||||
|     void MergeSingleJoyAsDualJoy(Kernel::HLERequestContext& ctx); | ||||
|     void SetNpadHandheldActivationMode(Kernel::HLERequestContext& ctx); | ||||
|     void GetVibrationDeviceInfo(Kernel::HLERequestContext& ctx); | ||||
|     void CreateActiveVibrationDeviceList(Kernel::HLERequestContext& ctx); | ||||
|     void ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); | ||||
|     void StartConsoleSixAxisSensor(Kernel::HLERequestContext& ctx); | ||||
|     void StopSixAxisSensor(Kernel::HLERequestContext& ctx); | ||||
|     void SetIsPalmaAllConnectable(Kernel::HLERequestContext& ctx); | ||||
|     void SetPalmaBoostMode(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     std::shared_ptr<IAppletResource> applet_resource; | ||||
| }; | ||||
|  | ||||
| /// Reload input devices. Used when input configuration changed | ||||
| void ReloadInputDevices(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zach Hilman
					Zach Hilman