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
This commit is contained in:
@@ -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 },
|
||||
{ }
|
||||
|
||||
34
hid-pidff.c
34
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 ||
|
||||
@@ -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;
|
||||
|
||||
14
hid-pidff.h
14
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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user