Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
Suyu
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
many-archive
Suyu
Commits
83a66dd7
There was an error fetching the commit references. Please try again later.
Commit
83a66dd7
authored
10 years ago
by
bunnei
Browse files
Options
Downloads
Patches
Plain Diff
HID: Refactored shared memory decoding for touchpad support.
parent
6c37a90d
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/core/hle/service/hid/hid.cpp
+30
-21
30 additions, 21 deletions
src/core/hle/service/hid/hid.cpp
src/core/hle/service/hid/hid.h
+34
-12
34 additions, 12 deletions
src/core/hle/service/hid/hid.h
with
64 additions
and
33 deletions
src/core/hle/service/hid/hid.cpp
+
30
−
21
View file @
83a66dd7
...
...
@@ -25,17 +25,17 @@ Kernel::SharedPtr<Kernel::Event> g_event_debug_pad;
// Next Pad state update information
static
PadState
next_state
=
{{
0
}};
static
u32
next_index
=
0
;
static
s16
next_circle_x
=
0
;
static
s16
next_circle_y
=
0
;
static
u32
next_
pad_
index
=
0
;
static
s16
next_
pad_
circle_x
=
0
;
static
s16
next_
pad_
circle_y
=
0
;
/**
* Gets a pointer to the PadData structure inside HID shared memory
*/
static
inline
PadData
*
GetPadData
()
{
static
inline
SharedMem
*
GetPadData
()
{
if
(
g_shared_mem
==
nullptr
)
return
nullptr
;
return
reinterpret_cast
<
PadData
*>
(
g_shared_mem
->
GetPointer
().
ValueOr
(
nullptr
));
return
reinterpret_cast
<
SharedMem
*>
(
g_shared_mem
->
GetPointer
().
ValueOr
(
nullptr
));
}
// TODO(peachum):
...
...
@@ -60,10 +60,10 @@ static inline PadData* GetPadData() {
*/
static
void
UpdateNextCirclePadState
()
{
static
const
s16
max_value
=
0x9C
;
next_circle_x
=
next_state
.
circle_left
?
-
max_value
:
0x0
;
next_circle_x
+=
next_state
.
circle_right
?
max_value
:
0x0
;
next_circle_y
=
next_state
.
circle_down
?
-
max_value
:
0x0
;
next_circle_y
+=
next_state
.
circle_up
?
max_value
:
0x0
;
next_
pad_
circle_x
=
next_state
.
circle_left
?
-
max_value
:
0x0
;
next_
pad_
circle_x
+=
next_state
.
circle_right
?
max_value
:
0x0
;
next_
pad_
circle_y
=
next_state
.
circle_down
?
-
max_value
:
0x0
;
next_
pad_
circle_y
+=
next_state
.
circle_up
?
max_value
:
0x0
;
}
/**
...
...
@@ -87,20 +87,18 @@ void PadButtonRelease(const PadState& pad_state) {
* including both Pad key changes and analog circle Pad changes.
*/
void
PadUpdateComplete
()
{
PadData
*
pad_data
=
GetPadData
();
SharedMem
*
shared_mem
=
GetPadData
();
if
(
pad_data
==
nullptr
)
{
if
(
shared_mem
==
nullptr
)
return
;
}
// Update PadData struct
pad_data
->
current_state
.
hex
=
next_state
.
hex
;
pad_data
->
index
=
next_index
;
next_index
=
(
next_index
+
1
)
%
pad_data
->
entries
.
size
();
shared_mem
->
pad
.
current_state
.
hex
=
next_state
.
hex
;
shared_mem
->
pad
.
index
=
next_pad_index
;
next_pad_index
=
(
next_pad_index
+
1
)
%
shared_mem
->
pad
.
entries
.
size
();
// Get the previous Pad state
u32
last_entry_index
=
(
pad_data
->
index
-
1
)
%
pad_data
->
entries
.
size
();
PadState
old_state
=
pad_data
->
entries
[
last_entry_index
].
current_state
;
u32
last_entry_index
=
(
shared_mem
->
pad
.
index
-
1
)
%
shared_mem
->
pad
.
entries
.
size
();
PadState
old_state
=
shared_mem
->
pad
.
entries
[
last_entry_index
].
current_state
;
// Compute bitmask with 1s for bits different from the old state
PadState
changed
;
...
...
@@ -115,7 +113,7 @@ void PadUpdateComplete() {
removals
.
hex
=
changed
.
hex
&
old_state
.
hex
;
// Get the current Pad entry
PadDataEntry
*
current_pad_entry
=
&
pad_data
->
entries
[
pad_data
->
index
];
PadDataEntry
*
current_pad_entry
=
&
shared_mem
->
pad
.
entries
[
shared_mem
->
pad
.
index
];
// Update entry properties
current_pad_entry
->
current_state
.
hex
=
next_state
.
hex
;
...
...
@@ -123,8 +121,19 @@ void PadUpdateComplete() {
current_pad_entry
->
delta_removals
.
hex
=
removals
.
hex
;
// Set circle Pad
current_pad_entry
->
circle_pad_x
=
next_circle_x
;
current_pad_entry
->
circle_pad_y
=
next_circle_y
;
current_pad_entry
->
circle_pad_x
=
next_pad_circle_x
;
current_pad_entry
->
circle_pad_y
=
next_pad_circle_y
;
// If we just updated index 0, provide a new timestamp
if
(
shared_mem
->
pad
.
index
==
0
)
{
shared_mem
->
pad
.
index_reset_ticks_previous
=
shared_mem
->
pad
.
index_reset_ticks
;
shared_mem
->
pad
.
index_reset_ticks
=
(
s64
)
Core
::
g_app_core
->
GetTicks
();
}
// Signal both handles when there's an update to Pad or touch
g_event_pad_or_touch_1
->
Signal
();
g_event_pad_or_touch_2
->
Signal
();
}
// If we just updated index 0, provide a new timestamp
if
(
pad_data
->
index
==
0
)
{
...
...
This diff is collapsed.
Click to expand it.
src/core/hle/service/hid/hid.h
+
34
−
12
View file @
83a66dd7
...
...
@@ -65,7 +65,7 @@ struct PadState {
};
/**
* Structure of a single entry
in the PadData's
Pad state history
array.
* Structure of a single entry
of
Pad state history
within HID shared memory
*/
struct
PadDataEntry
{
PadState
current_state
;
...
...
@@ -77,22 +77,44 @@ struct PadDataEntry {
};
/**
* Structure of a
ll data related to the 3DS Pad.
* Structure of a
single entry of touch state history within HID shared memory
*/
struct
PadData
{
s64
index_reset_ticks
;
s64
index_reset_ticks_previous
;
u32
index
;
// the index of the last updated Pad state history element
struct
TouchDataEntry
{
u16
x
;
u16
y
;
u32
data_valid
;
};
/**
* Structure of data stored in HID shared memory
*/
struct
SharedMem
{
// Offset 0x0 : "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
INSERT_PADDING_BYTES
(
0x8
);
PadState
current_state
;
// Same as entries[index].current_state
u32
raw_circle_pad_data
;
INSERT_PADDING_BYTES
(
0x4
);
u32
pad1
;
u32
pad
2
;
std
::
array
<
PadDataEntry
,
8
>
entries
;
// Pad state history
}
pad
;
PadState
current_state
;
// same as entries[index].current_state
u32
raw_circle_pad_data
;
// Offset 0xA8 : 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
u32
pad3
;
INSERT_PADDING_BYTES
(
0xC
)
;
std
::
array
<
PadDataEntry
,
8
>
entries
;
// Pad state history
std
::
array
<
TouchDataEntry
,
8
>
entries
;
}
touch
;
};
// Pre-defined PadStates for single button presses
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment