make now static sdl effect direction a template

This commit is contained in:
Katharine Chui 2025-05-06 01:36:57 +02:00
parent 79681dd601
commit 428538ceff

View file

@ -19,6 +19,12 @@
LOG_CHANNEL(logitech_g27_log, "LOGIG27"); LOG_CHANNEL(logitech_g27_log, "LOGIG27");
// ref: https://github.com/libsdl-org/SDL/issues/7941, need to use SDL_HAPTIC_STEERING_AXIS for some windows drivers
static const SDL_HapticDirection STEERING_DIRECTION = {
.type = SDL_HAPTIC_STEERING_AXIS,
.dir = {0, 0, 0}
};
usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std::array<u8, 7>& location) usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std::array<u8, 7>& location)
: usb_device_emulated(location), m_controller_index(controller_index) : usb_device_emulated(location), m_controller_index(controller_index)
{ {
@ -34,13 +40,7 @@ usb_device_logitech_g27::usb_device_logitech_g27(u32 controller_index, const std
} }
m_default_spring_effect.type = SDL_HAPTIC_SPRING; m_default_spring_effect.type = SDL_HAPTIC_SPRING;
m_default_spring_effect.condition.direction = STEERING_DIRECTION;
// ref: https://github.com/libsdl-org/SDL/issues/7941, need to use SDL_HAPTIC_STEERING_AXIS for some windows drivers
m_default_spring_effect.condition.direction = SDL_HapticDirection
{
.type = SDL_HAPTIC_STEERING_AXIS,
.dir = {0, 0, 0}
};
m_default_spring_effect.condition.length = SDL_HAPTIC_INFINITY; m_default_spring_effect.condition.length = SDL_HAPTIC_INFINITY;
for (int i = 0; i < 1 /*3*/; i++) for (int i = 0; i < 1 /*3*/; i++)
{ {
@ -790,12 +790,6 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
// logitech_g27_log.error("%02x %02x %02x %02x %02x %02x %02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); // logitech_g27_log.error("%02x %02x %02x %02x %02x %02x %02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
// printf("%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); // printf("%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
// ref: https://github.com/libsdl-org/SDL/issues/7941, need to use SDL_HAPTIC_STEERING_AXIS for some windows drivers
SDL_HapticDirection direction = {
.type = SDL_HAPTIC_STEERING_AXIS,
.dir = {0, 0, 0}
};
// TODO maybe force clipping from cfg // TODO maybe force clipping from cfg
// Process effects // Process effects
@ -908,7 +902,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
// Constant force // Constant force
new_effect.type = SDL_HAPTIC_CONSTANT; new_effect.type = SDL_HAPTIC_CONSTANT;
new_effect.constant.direction = direction; new_effect.constant.direction = STEERING_DIRECTION;
new_effect.constant.length = SDL_HAPTIC_INFINITY; new_effect.constant.length = SDL_HAPTIC_INFINITY;
new_effect.constant.level = logitech_g27_force_to_level(buf[2 + i], m_reverse_effects); new_effect.constant.level = logitech_g27_force_to_level(buf[2 + i], m_reverse_effects);
break; break;
@ -918,7 +912,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
// Spring/High resolution spring // Spring/High resolution spring
new_effect.type = SDL_HAPTIC_SPRING; new_effect.type = SDL_HAPTIC_SPRING;
new_effect.condition.direction = direction; new_effect.condition.direction = STEERING_DIRECTION;
new_effect.condition.length = SDL_HAPTIC_INFINITY; new_effect.condition.length = SDL_HAPTIC_INFINITY;
const u8 s1 = buf[5] & 1; const u8 s1 = buf[5] & 1;
const u8 s2 = (buf[5] >> 4) & 1; const u8 s2 = (buf[5] >> 4) & 1;
@ -969,7 +963,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
// Damper/High resolution damper // Damper/High resolution damper
new_effect.type = SDL_HAPTIC_DAMPER; new_effect.type = SDL_HAPTIC_DAMPER;
new_effect.condition.direction = direction; new_effect.condition.direction = STEERING_DIRECTION;
new_effect.condition.length = SDL_HAPTIC_INFINITY; new_effect.condition.length = SDL_HAPTIC_INFINITY;
const u8 s1 = buf[3] & 1; const u8 s1 = buf[3] & 1;
const u8 s2 = buf[5] & 1; const u8 s2 = buf[5] & 1;
@ -1009,7 +1003,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
// Friction // Friction
new_effect.type = SDL_HAPTIC_FRICTION; new_effect.type = SDL_HAPTIC_FRICTION;
new_effect.condition.direction = direction; new_effect.condition.direction = STEERING_DIRECTION;
new_effect.condition.length = SDL_HAPTIC_INFINITY; new_effect.condition.length = SDL_HAPTIC_INFINITY;
const u8 k1 = buf[2]; const u8 k1 = buf[2];
const u8 k2 = buf[3]; const u8 k2 = buf[3];
@ -1036,7 +1030,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
// Auto center spring/High resolution auto center spring // Auto center spring/High resolution auto center spring
new_effect.type = SDL_HAPTIC_SPRING; new_effect.type = SDL_HAPTIC_SPRING;
new_effect.condition.direction = direction; new_effect.condition.direction = STEERING_DIRECTION;
new_effect.condition.length = SDL_HAPTIC_INFINITY; new_effect.condition.length = SDL_HAPTIC_INFINITY;
const u16 saturation = logitech_g27_clip_to_saturation(buf[4]); const u16 saturation = logitech_g27_clip_to_saturation(buf[4]);
const u16 deadband = 2 * 0xFFFF / 255; const u16 deadband = 2 * 0xFFFF / 255;
@ -1082,7 +1076,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
else else
new_effect.type = m_reverse_effects ? SDL_HAPTIC_SAWTOOTHUP : SDL_HAPTIC_SAWTOOTHDOWN; new_effect.type = m_reverse_effects ? SDL_HAPTIC_SAWTOOTHUP : SDL_HAPTIC_SAWTOOTHDOWN;
new_effect.type = buf[1] == 0x04 ? SDL_HAPTIC_SAWTOOTHUP : SDL_HAPTIC_SAWTOOTHDOWN; new_effect.type = buf[1] == 0x04 ? SDL_HAPTIC_SAWTOOTHUP : SDL_HAPTIC_SAWTOOTHDOWN;
new_effect.periodic.direction = direction; new_effect.periodic.direction = STEERING_DIRECTION;
new_effect.periodic.length = SDL_HAPTIC_INFINITY; new_effect.periodic.length = SDL_HAPTIC_INFINITY;
const u8 l1 = buf[2]; const u8 l1 = buf[2];
const u8 l2 = buf[3]; const u8 l2 = buf[3];
@ -1106,7 +1100,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
// Trapezoid, convert to SDL_HAPTIC_SQUARE or SDL_HAPTIC_TRIANGLE // Trapezoid, convert to SDL_HAPTIC_SQUARE or SDL_HAPTIC_TRIANGLE
// TODO full accuracy will need some kind of rendering thread, cannot be represented with a single effect // TODO full accuracy will need some kind of rendering thread, cannot be represented with a single effect
new_effect.periodic.direction = direction; new_effect.periodic.direction = STEERING_DIRECTION;
new_effect.periodic.length = SDL_HAPTIC_INFINITY; new_effect.periodic.length = SDL_HAPTIC_INFINITY;
const u8 l1 = buf[2]; const u8 l1 = buf[2];
const u8 l2 = buf[3]; const u8 l2 = buf[3];
@ -1135,7 +1129,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
// Rectangle, convert to SDL_HAPTIC_SQUARE // Rectangle, convert to SDL_HAPTIC_SQUARE
// TODO full accuracy will need some kind of rendering thread, cannot be represented with a single effect // TODO full accuracy will need some kind of rendering thread, cannot be represented with a single effect
new_effect.type = SDL_HAPTIC_SQUARE; new_effect.type = SDL_HAPTIC_SQUARE;
new_effect.periodic.direction = direction; new_effect.periodic.direction = STEERING_DIRECTION;
new_effect.periodic.length = SDL_HAPTIC_INFINITY; new_effect.periodic.length = SDL_HAPTIC_INFINITY;
const u8 l1 = buf[2]; const u8 l1 = buf[2];
const u8 l2 = buf[3]; const u8 l2 = buf[3];
@ -1178,7 +1172,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
const u8 d = i == 0 ? d1 : d2; const u8 d = i == 0 ? d1 : d2;
const u8 l = i == 0 ? l1 : l2; const u8 l = i == 0 ? l1 : l2;
new_effect.constant.length = SDL_HAPTIC_INFINITY; new_effect.constant.length = SDL_HAPTIC_INFINITY;
new_effect.constant.direction = direction; new_effect.constant.direction = STEERING_DIRECTION;
if (s == 0 || t == 0) if (s == 0 || t == 0)
{ {
// gran turismo 6 does this, gives a variable force with no step so it just behaves as constant force // gran turismo 6 does this, gives a variable force with no step so it just behaves as constant force
@ -1204,7 +1198,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
new_effect.type = SDL_HAPTIC_RAMP; new_effect.type = SDL_HAPTIC_RAMP;
new_effect.ramp.direction = direction; new_effect.ramp.direction = STEERING_DIRECTION;
const s16 l1_converted = logitech_g27_force_to_level(l1, m_reverse_effects); const s16 l1_converted = logitech_g27_force_to_level(l1, m_reverse_effects);
const s16 l2_converted = logitech_g27_force_to_level(l2, m_reverse_effects); const s16 l2_converted = logitech_g27_force_to_level(l2, m_reverse_effects);
new_effect.ramp.start = d1 ? l1_converted : l2_converted; new_effect.ramp.start = d1 ? l1_converted : l2_converted;
@ -1221,7 +1215,7 @@ void usb_device_logitech_g27::interrupt_transfer(u32 buf_size, u8* buf, u32 endp
{ {
// Square // Square
new_effect.type = SDL_HAPTIC_SQUARE; new_effect.type = SDL_HAPTIC_SQUARE;
new_effect.periodic.direction = direction; new_effect.periodic.direction = STEERING_DIRECTION;
const u8 a = buf[2]; const u8 a = buf[2];
const u8 tl = buf[3]; const u8 tl = buf[3];
const u8 th = buf[4]; const u8 th = buf[4];