From 3ff5c197cfbdcac810481cc7cc71903dee80432e Mon Sep 17 00:00:00 2001
From: mescon <5875228+mescon@users.noreply.github.com>
Date: Thu, 17 Sep 2026 17:11:52 +0200
Subject: [PATCH] games: Assetto Corsa Rally takes the SDK route
The registry listed it as plain force feedback with nothing to do. On a
G PRO that gave nothing: with raw HID off the game did not see the wheel,
and with it on by hand the stock Logitech library took the wheel and
returned only its own damping (#105). On a G923 Xbox edition with
Logitech's files in the prefix and raw HID on, its force feedback and
TrueForce were confirmed working (#83). It now gets the same route as
Assetto Corsa EVO: the launcher turns raw HID on, stages the proxy that
answers the SDK's rotation question and resets the wheel first, and the
app's Setup page offers the shim install. Expected rather than Verified
until a direct-drive owner reports on it.
The generated setup doc and the setup line for a wheel without SDK
TrueForce offered simulated TrueForce for every SDK title; this one
publishes no telemetry, so those now say plain force feedback instead.
setup.sh's SDK appid list gains the game, as its guard test demands.
---
CHANGELOG.md | 11 +++++++
docs/GAME_SETUP.md | 6 ++--
tools/setup.sh | 2 +-
.../crates/logi-wheel-core/src/games.rs | 31 ++++++++++++++++---
.../logi-wheel-core/tests/game_setup_doc.rs | 13 ++++++--
5 files changed, 51 insertions(+), 12 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b31ab7f..d93d197 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,17 @@ the contract is "it works on RS50 and G Pro as listed here".
## Unreleased
+**Assetto Corsa Rally takes the SDK route.** The registry listed it as plain
+force feedback with nothing to do, and on a G PRO that gave nothing: with
+raw HID off the game did not see the wheel, and with it on by hand the stock
+Logitech library took the wheel and returned only its own damping
+([#105](../../issues/105)). On a G923 Xbox edition with Logitech's files in
+the prefix and raw HID on, its force feedback and TrueForce were confirmed
+working ([#83](../../issues/83)). The game now gets the same route as
+Assetto Corsa EVO: `logi-launch` turns raw HID on, stages the proxy that
+answers the SDK's rotation question and resets the wheel first, and the
+app's Setup page offers the shim install for it.
+
**Inertia no longer renders the encoder's grain, and the per-class levels
reach past 100.** `FF_INERTIA` was fed the per-tick velocity difference,
which on a quantised encoder is an impulse train: a rim turning smoothly
diff --git a/docs/GAME_SETUP.md b/docs/GAME_SETUP.md
index 6c73cc6..b6ae2f4 100644
--- a/docs/GAME_SETUP.md
+++ b/docs/GAME_SETUP.md
@@ -56,7 +56,7 @@ instead of wrapping it.
| Assetto Corsa (original) | Proton | Native FFB | Turn on simulated TrueForce | Turn on simulated TrueForce |
| Assetto Corsa Competizione | Proton | TrueForce shim | Install the shim
`logi-launch %command%` | Turn on simulated TrueForce
and leave `PROTON_ENABLE_HIDRAW` unset |
| Assetto Corsa EVO (early access) | Proton | TrueForce shim | Install the shim
`logi-launch %command%` | Turn on simulated TrueForce
and leave `PROTON_ENABLE_HIDRAW` unset |
-| Assetto Corsa Rally (early access) * | Proton | Native FFB | Nothing to do | Nothing to do |
+| Assetto Corsa Rally (early access) * | Proton | TrueForce shim | Install the shim
`logi-launch %command%` | Plain force feedback
leave `PROTON_ENABLE_HIDRAW` unset |
| Automobilista 2 | Proton | Native FFB | Turn on simulated TrueForce | Turn on simulated TrueForce |
| BeamNG.drive * | Native Linux | Native FFB | Turn on simulated TrueForce | Turn on simulated TrueForce |
| CarX Drift Racing Online | Proton | Native FFB | Nothing to do | Nothing to do |
@@ -144,5 +144,5 @@ app's Setup page afterwards.
- **verified** (4 titles): confirmed end to end by this project
- **documented** (16 titles): documented by the vendor or a reliable community source
-- **expected** (6 titles): expected to work, not confirmed
-- **unknown** (4 titles): genuinely unknown
+- **expected** (7 titles): expected to work, not confirmed
+- **unknown** (3 titles): genuinely unknown
diff --git a/tools/setup.sh b/tools/setup.sh
index a63112b..90032d8 100755
--- a/tools/setup.sh
+++ b/tools/setup.sh
@@ -72,7 +72,7 @@ TF_PFX_DIR_REL="drive_c/Program Files/Logi/Trueforce"
# their force feedback, so the copy is guarded rather than trusted.
#
# Sims that load Logitech's TrueForce SDK: ACC, AC EVO.
-SDK_SIM_APPIDS="805550 3058630"
+SDK_SIM_APPIDS="805550 3058630 3917090"
# Sims driven through DirectInput, i.e. logi-ffb: rFactor 2, Le Mans Ultimate,
# iRacing, RaceRoom. PROTON_ENABLE_HIDRAW must NOT be set for these.
DINPUT_SIM_APPIDS="365960 2399420 266410 211500"
diff --git a/userspace/logi-wheel/crates/logi-wheel-core/src/games.rs b/userspace/logi-wheel/crates/logi-wheel-core/src/games.rs
index fb7b4ba..7e68074 100644
--- a/userspace/logi-wheel/crates/logi-wheel-core/src/games.rs
+++ b/userspace/logi-wheel/crates/logi-wheel-core/src/games.rs
@@ -494,7 +494,19 @@ impl GameCompat {
if self.linux == Linux::Unsupported {
return self.setup;
}
- if self.ffb == Ffb::TrueForceShim && !caps.sdk_trueforce {
+ if self.ffb == Ffb::TrueForceShim
+ && !caps.sdk_trueforce
+ && self.simulated_tf.live_id().is_none()
+ {
+ // An SDK title with no telemetry: the simulated route below
+ // has nothing to synthesise from, so it must not be offered.
+ "Leave PROTON_ENABLE_HIDRAW unset: on this wheel it costs you \
+ force feedback, and this game publishes no telemetry yet, so \
+ there is no simulated TrueForce to turn on either. Installing \
+ the shim WITH --proxy carries the game's own TrueForce to the \
+ wheel instead (tools/install-tf-shim.sh --proxy). Steam Input \
+ off."
+ } else if self.ffb == Ffb::TrueForceShim && !caps.sdk_trueforce {
// Worded as "not available on this wheel" rather than "this
// wheel has no SDK TrueForce", because it also covers the
// unidentified wheel, about which we know only that we cannot
@@ -826,11 +838,20 @@ logi-tf-sim.",
GameCompat {
name: "Assetto Corsa Rally (early access)",
linux: Linux::Proton,
- ffb: Ffb::NativeEvdev,
- native_trueforce: Support::No,
+ // The same SDK route as Assetto Corsa EVO. Listed as plain force
+ // feedback until 2026-09: with raw HID left off, the game did not
+ // see a G PRO at all, and with it on by hand, the stock library
+ // took the wheel and gave back only its own damping (#105). On a
+ // G923 Xbox edition with Logitech's files in the prefix and raw
+ // HID on, its force feedback and TrueForce were confirmed working
+ // (#83), which is what this route arranges.
+ ffb: Ffb::TrueForceShim,
+ native_trueforce: Support::Yes,
simulated_tf: SimTf::No,
- setup: "Plain force feedback; watch for telemetry as it matures.",
- confidence: Confidence::Unknown,
+ setup: "Install the TrueForce shim once, from the app's Setup page; launch options `logi-launch %command%` (it turns raw HID on, stages the proxy that answers the SDK's rotation question, and resets the wheel first, the same recipe as Assetto Corsa EVO); turn Steam Input off. No telemetry yet, so nothing to feed the lights.",
+ // Confirmed on a G923 Xbox edition (#83); a direct-drive wheel has
+ // not yet been reported on this route.
+ confidence: Confidence::Expected,
},
GameCompat {
name: "Euro Truck Simulator 2",
diff --git a/userspace/logi-wheel/crates/logi-wheel-core/tests/game_setup_doc.rs b/userspace/logi-wheel/crates/logi-wheel-core/tests/game_setup_doc.rs
index 33463af..a2de8e8 100644
--- a/userspace/logi-wheel/crates/logi-wheel-core/tests/game_setup_doc.rs
+++ b/userspace/logi-wheel/crates/logi-wheel-core/tests/game_setup_doc.rs
@@ -46,9 +46,16 @@ fn recipe_cell(g: &GameCompat, caps: WheelCaps) -> String {
// having seen the other column say to set a variable, and needs telling
// that doing so on their wheel is not merely pointless.
if g.ffb == Ffb::TrueForceShim && !caps.sdk_trueforce {
- return "Turn on simulated TrueForce
and leave \
- `PROTON_ENABLE_HIDRAW` unset"
- .to_string();
+ // Simulated TrueForce is only on offer where the game publishes
+ // telemetry to synthesise it from; a title without any has plain
+ // force feedback on this wheel and nothing to add to it.
+ return if g.simulated_tf.live_id().is_some() {
+ "Turn on simulated TrueForce
and leave \
+ `PROTON_ENABLE_HIDRAW` unset"
+ } else {
+ "Plain force feedback
leave `PROTON_ENABLE_HIDRAW` unset"
+ }
+ .to_string();
}
let action = match g.setup_action(caps) {
SetupAction::InstallShim => "Install the shim",