diff options
Diffstat (limited to 'src/core/hle/service/hid')
-rw-r--r-- | src/core/hle/service/hid/hid.cpp | 8 | ||||
-rw-r--r-- | src/core/hle/service/hid/hid.h | 41 |
2 files changed, 29 insertions, 20 deletions
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index baff92716..6aa8bfd1f 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -17,6 +17,8 @@ namespace Service { namespace HID { +static const int MAX_CIRCLEPAD_POS = 0x9C; ///< Max value for a circle pad position + Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem = nullptr; Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_1; @@ -78,8 +80,10 @@ void HIDUpdate() { pad_entry->delta_removals.hex = changed.hex & old_state.hex;; // Set circle Pad - pad_entry->circle_pad_x = state.circle_left ? -0x9C : state.circle_right ? 0x9C : 0x0; - pad_entry->circle_pad_y = state.circle_down ? -0x9C : state.circle_up ? 0x9C : 0x0; + pad_entry->circle_pad_x = state.circle_left ? -MAX_CIRCLEPAD_POS : + state.circle_right ? MAX_CIRCLEPAD_POS : 0x0; + pad_entry->circle_pad_y = state.circle_down ? -MAX_CIRCLEPAD_POS : + state.circle_up ? MAX_CIRCLEPAD_POS : 0x0; // If we just updated index 0, provide a new timestamp if (shared_mem->pad.index == 0) { diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index 063f06858..03971d3c7 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -80,40 +80,45 @@ struct PadDataEntry { * Structure of a single entry of touch state history within HID shared memory */ struct TouchDataEntry { - u16 x; ///< Y-coordinate of a touchpad press on the lower screen - u16 y; ///< X-coordinate of a touchpad press on the lower screen - BitField<0,7,u32> valid; ///< Set to 1 when this entry contains actual X/Y data, otherwise 0 + u16 x; ///< Y-coordinate of a touchpad press on the lower screen + u16 y; ///< X-coordinate of a touchpad press on the lower screen + BitField<0, 7, u32> valid; ///< Set to 1 when this entry contains actual X/Y data, otherwise 0 }; /** * Structure of data stored in HID shared memory */ struct SharedMem { - // "Pad data, this is used for buttons and the circle pad + /// Pad data, this is used for buttons and the circle pad struct { - s64 index_reset_ticks; - s64 index_reset_ticks_previous; - u32 index; // Index of the last updated pad state history element + s64 index_reset_ticks; ///< CPU tick count for when HID module updated entry index 0 + s64 index_reset_ticks_previous; ///< Previous `index_reset_ticks` + u32 index; ///< Index of the last updated pad state entry - INSERT_PADDING_BYTES(0x8); + INSERT_PADDING_WORDS(0x2); - PadState current_state; // Same as entries[index].current_state - u32 raw_circle_pad_data; + PadState current_state; ///< Current state of the pad buttons - INSERT_PADDING_BYTES(0x4); + // TODO(bunnei): Implement `raw_circle_pad_data` field + u32 raw_circle_pad_data; ///< Raw (analog) circle pad data, before being converted - std::array<PadDataEntry, 8> entries; // Pad state history + INSERT_PADDING_WORDS(0x1); + + std::array<PadDataEntry, 8> entries; ///< Last 8 pad entries } pad; - // Touchpad data, this is used for touchpad input + /// Touchpad data, this is used for touchpad input struct { - s64 index_reset_ticks; - s64 index_reset_ticks_previous; - u32 index; // Index of the last updated touch state history element + s64 index_reset_ticks; ///< CPU tick count for when HID module updated entry index 0 + s64 index_reset_ticks_previous; ///< Previous `index_reset_ticks` + u32 index; ///< Index of the last updated touch entry + + INSERT_PADDING_WORDS(0x1); - INSERT_PADDING_BYTES(0xC); + // TODO(bunnei): Implement `raw_entry` field + TouchDataEntry raw_entry; ///< Raw (analog) touch data, before being converted - std::array<TouchDataEntry, 8> entries; + std::array<TouchDataEntry, 8> entries; ///< Last 8 touch entries, in pixel coordinates } touch; }; |