Force Feedback with Fanatec products, is it possible?

TLDR: FF doesn’t play back on my Fanatec racing wheel and I want to know what I should do next.

I made a program that probes sdl_joystick layouts and haptics support and gives sort of a generic diagnostic/test screen. It works beautifully for the Microsoft Sidewinder Force Feedback 2 joystick and I can run every type of effect (except leftright, of course). It also works with the xbox360 gamepad where leftright works.
Things are a little more shaky with my Thrustmaster T300RS, some effects claim support but give errors, but all effects that return success on run do actually work and I’m able to spin the wheel left and right as expected.
However, with a Fanatec CSL Elite, I can read the inputs just fine but Force Feedback doesn’t work at all. Here’s a list of results:

– API (probably correctly) reports “Not Supported”:
leftright
Autocentering

– API reports support present but gives error on creating effect:
Custom
Condition (all)
anything with polar directionality

– API returns success on playing FF effects but the effect doesn’t actually play on the device:
Constant (cartesian/spherical)
Periodic (cartesian/spherical)
Ramp (cartesian/spherical)

– Works
(Nothing)

It does work in games so the wheel is fine.
In fact, I found someone on the Fanatec forums saying “in some situations […] all games/apps which use the SDL library don’t see the wheel as a haptic device. I’ve seen a few other people reporting that too.” https://forum.fanatec.com/discussion/1058/fanatec-beta-driver-v347-for-csl-csw-all-wheels/p5

So it looks like some compatibility issues between the Fanatec driver and SDL. However, where is the problem likely to be?

  1. I should complain to Fanatec?
  2. I should file a bug on SDL_Haptic?

If it can be fixed in SDL_Haptic I may be able to contribute a patch, however it would be nice to get some confirmation that it’s the right path to go down

There is already a bug reported and I didn’t manage to get it working either: https://bugzilla.libsdl.org/show_bug.cgi?id=3888

Steering wheel only have 1 axis, so it doesn’t matter anyway.

Even if steering have only 1 physical axis, some device report having more than 1. Try playing the effect in a different direction. If it doesn’t work, take a look at this patch:
https://bugzilla.libsdl.org/show_bug.cgi?id=3446

I see this patch was very recently brought into SDL master. I tried the latest dev version of SDL, which includes this patch, and playing a FIRST_AXIS type effect works on my Fanatec wheel now! Not perfectly though. It’s very odd, the two wheels behave very differently:

  • the Thrustmaster wheel normally does not do anything, but when an effect is played, the wheel will move in the direction of the effect, how much it moves is defined by the strength value
  • the Fanatec wheel, once haptics are opened, has strong autocentering, and when an effect is played, the wheel will ‘snap’ to a location defined by the strength value, then when the effect is over, go back to centering.

It’s fine that the wheels simply behave differently, I guess that’s why high end racing sims all detect individual models of wheels and have unique code for them, because the wheels are inconsistent with how they implement directinput.
However, the SDL specific problem is that the fanatec wheel can’t be moved to its full range this way. Even +/- INT16_MAX strength only moves the wheel about 50% of its total range. So it’s impossible to make the wheel go all the way to either side with haptic calls in SDL.
Unless I’m missing a function somewhere that sets the range?

My Logitech device also have strong autocentering, but when I open it with SDL it disappears. Maybe there is a setting in the driver of your device.

Some devices have compatibility/raw/extended mode that provide different capability and behavior. Again, check the settings of your device.

Even if you set a long duration for the effect, the real duration may be shorter (several seconds, depends on device). I think the effect expires when the wheel reaches half its range. You need to update the force regularly to reset the duration.