The joystick wizard works out the shape of your pedals

You are never asked what you own. Two controls cannot simply be watched,
so they are asked for differently.

Yaw is asked for twice, right then left, and which axis answers is the
measurement. The same axis both times is one control covering both
directions - a twist grip, a rudder bar, pedals the driver has already
mixed - and binds to the signed Pedals axis. Two different axes are two
real pedals, one per foot, which is what the pod had, so they bind to the
pod's own LeftPedal/RightPedal pair and the game does the mixing: both at
once then does what both at once did in the pod.

The throttle is zeroed first. A lever sits wherever it was last left,
possibly hard against the stop that reads +1, so watching it move says
nothing about which end means power. Close it, press SPACE, then open it,
and the direction it travels from a known idle is the direction that
means throttle.

CONTROLS.md, the handbook and the packaged README say all of this, and
joyconfig.bat's own header no longer promises "rudder-pedal setup" when
racing pedals work too.
This commit is contained in:
Cyd
2026-08-07 16:31:40 -05:00
parent 6e829f815e
commit d35af59136
7 changed files with 590 additions and 89 deletions
+45 -11
View File
@@ -163,15 +163,34 @@ it off.
---
## Flight sticks, HOTAS and rudder pedals
## Flight sticks, HOTAS and pedals
Anything that is not an Xbox-class pad — a flight stick, a HOTAS
throttle, a twist grip, rudder pedals, a wheel — comes in through
DirectInput rather than XInput, and needs to be told which axis is
which. **Run `joyconfig.bat` once.** It asks you to move each control in
turn, works out which device and axis you moved and which way round it
reads, and writes the joystick rows of `bindings.txt`. Then it carries
on into the setup screen so you can try them straight away.
throttle, a twist grip, rudder or racing pedals, a wheel — comes in
through DirectInput rather than XInput, and needs to be told which axis
is which. **Run `joyconfig.bat` once.** It asks you to move each control
in turn, works out which device and axis you moved and which way round
it reads, and writes the joystick rows of `bindings.txt`. Then it
carries on into the setup screen so you can try them straight away.
You are never asked what you own. Two of the controls can't simply be
watched, though, so they are asked for differently:
**Yaw is asked for twice** — right, then left — and *which axis answers*
is the measurement. The same axis both times is one control covering
both directions: a twist grip, a rudder bar, rudder pedals their driver
has already mixed, racing pedals in combined mode. Two different axes
are two real pedals, one per foot, which is what the pod itself had, and
they bind to the pod's own pair so the game does the mixing — both at
once then does what both at once did in the pod. Either way you just
move the thing twice; the wizard works out the shape.
**The throttle is set to zero first.** A lever sits wherever it was last
left — halfway, or hard against the stop that happens to read `+1` — so
watching it move says nothing about which end means power. The wizard
asks you to close it, press SPACE to say so, and *then* open it: the
direction it travels from a known idle is the direction that means
throttle. (Press `S` there if you have no throttle lever.)
It only writes its own section, between two marker lines, so anything
you have edited yourself survives re-running it. Xbox-class controllers
@@ -189,15 +208,30 @@ joybutton 0 button 0x40 # trigger
joyhat 0 up button 0x42
```
Two separate pedals bind to the pod's real pair instead, usually on a
device of their own:
```
joydev 1 Pedals
joyaxis Y axis LeftPedal lever deadzone 0.05
joyaxis RZ axis RightPedal lever deadzone 0.05
```
Axis names are DirectInput's — `X Y Z RX RY RZ SL0 SL1` — where a twist
grip is usually `RZ` and a HOTAS throttle usually `Z` or `SL0`.
Two things are worth knowing. `Pedals` is a signed axis that drives the
Three things are worth knowing. `Pedals` is a signed axis that drives the
pedal *pair*, positive for the right pedal and negative for the left, so
one rudder bar or twist grip works both the way a foot never could. And
a `joyaxis` on `Throttle` with no `rate` is treated as a real lever: its
one rudder bar or twist grip works both the way a foot never could. A
`joyaxis` on `Throttle` with no `rate` is treated as a real lever: its
full travel *is* the throttle range, rather than nudging a position the
way a spring-centred pad stick has to.
way a spring-centred pad stick has to. And `lever` says the same thing
about any other one-way control — a floor pedal rests at one *end* of
its travel, not in the middle, but Windows still reports it as a full
1..+1 axis, so without the word the first half of the press does
nothing. With it, the travel maps onto the channel's 0..1 and the
deadzone measures from the released end, where a tired return spring's
slack actually lives. Add or remove `invert` if a pedal reads backwards.
## Rebinding
+48 -2
View File
@@ -1183,6 +1183,10 @@
<dt>It watches</dt>
<dd>Which way<small>the direction you moved sets the sign</small></dd>
</div>
<div>
<dt>And which</dt>
<dd>Yaw twice<small>right then left: one axis or two?</small></dd>
</div>
<div>
<dt>Then</dt>
<dd>Straight in<small>the game carries on to the setup screen</small></dd>
@@ -1199,6 +1203,23 @@
answer off the movement. Skip a prompt with <code>SPACE</code> if you
have no such control, <code>ESC</code> to abort without writing.
</p>
<p>
It goes further than the sign: it works out the <b>shape</b> of your
rig the same way. <b>Yaw is asked for twice</b>, right and then left,
and which axis answers is the measurement — the same axis both times
is one control covering both ways (a twist grip, a rudder bar, pedals
their driver has already mixed), two different axes are two real
pedals, one per foot. You just move the thing twice.
</p>
<p>
The <b>throttle</b> is the one prompt that works backwards, because a
lever sits wherever it was left: halfway, or hard against the stop
that happens to read <span class="mono">+1</span>. Watching it move
cannot tell you which end means power. So close it, press
<code>SPACE</code> to say <i>it is at zero now</i>, and then open it —
the travel from a known idle is the direction that means throttle.
<code>S</code> there if you have no lever at all.
</p>
</div>
<p class="sub">
@@ -1223,7 +1244,7 @@
<pre><i># grammar</i>
<b>joydev</b> &lt;slot&gt; [product-name substring]
<b>joyaxis</b> &lt;src&gt; <b>axis</b> &lt;axis&gt; [invert]
<b>joyaxis</b> &lt;src&gt; <b>axis</b> &lt;axis&gt; [invert] [lever]
[deadzone &lt;d&gt;] [rate &lt;n&gt;]
<b>joybutton</b> &lt;n&gt; <b>button</b> &lt;addr&gt; [toggle]
<b>joyhat</b> &lt;n&gt; &lt;up|down|left|right&gt;
@@ -1235,7 +1256,7 @@
<div class="tbl-scroll" style="margin-top:22px">
<table>
<caption>Two rules the pod's shape asks for</caption>
<caption>Three rules the pod's shape asks for</caption>
<tbody>
<tr>
<th class="mono">Pedals</th>
@@ -1246,6 +1267,31 @@
that presses one or the other and never both, which is exactly
what this says. It is a channel name like any other, so a gamepad
stick can drive the turn with it too.
<br><br>
Two real pedals — racing pedals, or rudder pedals with an axis
per foot — bind to
<span class="mono">LeftPedal</span> and
<span class="mono">RightPedal</span> one axis each instead, and
the wizard picks that up on its own from the two yaw prompts
answering on two different axes. That is the pod's own
arrangement: the game mixes your two feet into the turn rather
than taking a turn already mixed for it, and both pedals at once
does what both pedals at once did in the pod.
</td>
</tr>
<tr>
<th class="mono">lever</th>
<td>
A pedal rests at one <b>end</b> of its travel, not in the middle,
and Windows reports it as a full
<span class="mono">1..+1</span> axis regardless — so half the
travel reads below zero and the first half of the press would do
nothing at all. <span class="mono">lever</span> says the control
is one-way: the travel maps onto the channel's
<span class="mono">0..1</span>, and the deadzone then measures
from the released end, where the slack in a tired return spring
actually lives. The wizard writes it for you; add or remove
<span class="mono">invert</span> if a pedal reads backwards.
</td>
</tr>
<tr>