Skip to content

Commit 337d3db

Browse files
authored
Centered Analog Stick in Non-PS4 Mode Display on Haute X (#1538)
* Fix for middle-alignment if the middle is 0x7FFF and not 0x8000 in analog display driver. * if our mid is 0x7FFF (or 0x7F00), we need to offset analog one to the right in order to show it on display lever
1 parent c613e8d commit 337d3db

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

src/display/ui/elements/GPLever.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "GPLever.h"
22

3+
#include "drivermanager.h"
4+
35
void GPLever::draw() {
46
// new style lever:
57
// radius defines the base of the lever
@@ -72,9 +74,32 @@ void GPLever::draw() {
7274
leverX -= leftState ? (!invertX ? leverRadius : -leverRadius) : (!invertX ? -leverRadius : leverRadius);
7375
}
7476
} else if (leftAnalog || rightAnalog) {
77+
uint16_t middleX;
78+
uint16_t middleY;
79+
if (leftAnalog) {
80+
middleX = getProcessedGamepad()->state.lx;
81+
middleY = getProcessedGamepad()->state.ly;
82+
} else {
83+
middleX = getProcessedGamepad()->state.rx;
84+
middleY = getProcessedGamepad()->state.ry;
85+
}
86+
87+
// Different analogs have different middles
88+
// Get the midpoint value for the current mode
89+
uint16_t joystickMid = GAMEPAD_JOYSTICK_MID;
90+
if ( DriverManager::getInstance().getDriver() != nullptr ) {
91+
joystickMid = DriverManager::getInstance().getDriver()->GetJoystickMidValue();
92+
}
93+
94+
// Accomodate for our offset by 1 for mapping if the driver input uses 0x7FFF instead of 0x8000
95+
if ( joystickMid < 0x8000 ) {
96+
middleX += (0x8000 - joystickMid);
97+
middleY += (0x8000 - joystickMid);
98+
}
99+
75100
// analog
76-
uint16_t analogX = map((leftAnalog ? getProcessedGamepad()->state.lx : getProcessedGamepad()->state.rx), (!invertX ? 0 : 0xFFFF), (!invertX ? 0xFFFF : 0), 0, 100);
77-
uint16_t analogY = map((leftAnalog ? getProcessedGamepad()->state.ly : getProcessedGamepad()->state.ry), (!invertY ? 0 : 0xFFFF), (!invertY ? 0xFFFF : 0), 0, 100);
101+
uint16_t analogX = map(middleX, (!invertX ? 0 : 0xFFFF), (!invertX ? 0xFFFF : 0), 0, 100);
102+
uint16_t analogY = map(middleY, (!invertY ? 0 : 0xFFFF), (!invertY ? 0xFFFF : 0), 0, 100);
78103

79104
uint16_t minX = std::max(0,(baseX - baseRadius));
80105
uint16_t maxX = std::min((baseX + baseRadius),128);

0 commit comments

Comments
 (0)