From 8220bbbfb086f26aab8ac9bb3fa1e4c602583c0c Mon Sep 17 00:00:00 2001 From: Lawstorant Date: Fri, 26 Jul 2024 23:28:57 +0200 Subject: [PATCH] Rework envelope checks to fix FFB for Moza Only set envelopes when they are needed (any value is != 0). This fixes Moza FFB in games that use Sine effect to emulate constant force. Remove FIX_PERIODIC_ENVELOPE quirk as it's no longer needed --- hid-pidff-wrapper.c | 10 +++++----- hid-pidff.c | 38 +++++++++++++++++--------------------- hid-pidff.h | 14 ++++---------- 3 files changed, 26 insertions(+), 36 deletions(-) diff --git a/hid-pidff-wrapper.c b/hid-pidff-wrapper.c index 5ebdbda..bc019a9 100644 --- a/hid-pidff-wrapper.c +++ b/hid-pidff-wrapper.c @@ -14,15 +14,15 @@ static const struct hid_device_id pidff_wheel_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R3), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R5), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R9), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R12), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_MOZA, USB_DEVICE_ID_MOZA_R16_R21), - .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION | PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE }, + .driver_data = PIDFF_QUIRK_FIX_WHEEL_DIRECTION }, { HID_USB_DEVICE(USB_VENDOR_ID_CAMMUS, USB_DEVICE_ID_CAMMUS_C5), .driver_data = PIDFF_QUIRK_NO_DELAY_EFFECT }, { } diff --git a/hid-pidff.c b/hid-pidff.c index 5bb858f..22e4b9b 100644 --- a/hid-pidff.c +++ b/hid-pidff.c @@ -311,6 +311,14 @@ static void pidff_set_envelope_report(struct pidff_device *pidff, static int pidff_needs_set_envelope(struct ff_envelope *envelope, struct ff_envelope *old) { + if (!old) { + return envelope->attack_level != 0 || + envelope->fade_level != 0 || + envelope->attack_length != 0 || + envelope->fade_length != 0; + + } + return envelope->attack_level != old->attack_level || envelope->fade_level != old->fade_level || envelope->attack_length != old->attack_length || @@ -406,8 +414,8 @@ static void pidff_set_periodic_report(struct pidff_device *pidff, // Actually we just can use clamp macro // from include/linux/kernel.h#L59 // But for the debug purposes we're leaving it as is - pidff->set_periodic[PID_PERIOD].value[0] = - pidff_clamp(effect->u.periodic.period, + pidff->set_periodic[PID_PERIOD].value[0] = + pidff_clamp(effect->u.periodic.period, pidff->set_periodic[PID_PERIOD].field); hid_hw_request(pidff->hid, pidff->reports[PID_SET_PERIODIC], @@ -643,9 +651,8 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, pidff_set_effect_report(pidff, effect); if (!old || pidff_needs_set_constant(effect, old)) pidff_set_constant_force_report(pidff, effect); - if (!old || - pidff_needs_set_envelope(&effect->u.constant.envelope, - &old->u.constant.envelope)) + if (pidff_needs_set_envelope(&effect->u.constant.envelope, + old ? &old->u.periodic.envelope : NULL)) pidff_set_envelope_report(pidff, &effect->u.constant.envelope); break; @@ -683,19 +690,8 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, if (!old || pidff_needs_set_periodic(effect, old)) pidff_set_periodic_report(pidff, effect); - if (pidff->quirks & PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE) - { - effect->u.periodic.envelope.attack_level = - effect->u.periodic.envelope.attack_level == 0 - ? 0x7fff : effect->u.periodic.envelope.attack_level; - - effect->u.periodic.envelope.fade_level = - effect->u.periodic.envelope.fade_level == 0 - ? 0x7fff : effect->u.periodic.envelope.fade_level; - } - if (!old || - pidff_needs_set_envelope(&effect->u.periodic.envelope, - &old->u.periodic.envelope)) + if (pidff_needs_set_envelope(&effect->u.periodic.envelope, + old ? &old->u.periodic.envelope : NULL)) pidff_set_envelope_report(pidff, &effect->u.periodic.envelope); break; @@ -711,9 +707,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect, pidff_set_effect_report(pidff, effect); if (!old || pidff_needs_set_ramp(effect, old)) pidff_set_ramp_force_report(pidff, effect); - if (!old || - pidff_needs_set_envelope(&effect->u.ramp.envelope, - &old->u.ramp.envelope)) + + if (pidff_needs_set_envelope(&effect->u.ramp.envelope, + old ? &old->u.periodic.envelope : NULL)) pidff_set_envelope_report(pidff, &effect->u.ramp.envelope); break; diff --git a/hid-pidff.h b/hid-pidff.h index 5009cc9..e9b504e 100644 --- a/hid-pidff.h +++ b/hid-pidff.h @@ -4,21 +4,15 @@ /* PIDFF Quirks to solve issues with certain devices */ -/* - * Always set a value > 0 for PERIODIC envelope attack and fade level -*/ -#define PIDFF_QUIRK_FIX_PERIODIC_ENVELOPE BIT(0) - /* * Ignore direction and always set 16384 (0x4000) -*/ -#define PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(1) + */ +#define PIDFF_QUIRK_FIX_WHEEL_DIRECTION BIT(0) /* * Skip initialization of 0xA7 descriptor (Delay effect) -*/ -#define PIDFF_QUIRK_NO_DELAY_EFFECT BIT(2) - + */ +#define PIDFF_QUIRK_NO_DELAY_EFFECT BIT(1) int hid_pidff_init_quirks(struct hid_device *hid, const struct hid_device_id *id);