Building a HOTAS configurator that actually works
The Saitek X52 Pro is one of the best HOTAS setups you can buy for the money. Thirteen axes, 39 buttons, a hat, a scroll wheel, a mouse nub, mode switching. It's a proper piece of kit.
The software is abandonware.
Saitek got bought by MadCatz, MadCatz went bust, Logitech bought the brand, and the driver situation has been a mess ever since. The official SST software still sort of works on Windows 11 but it fights with everything else, randomly stops responding, and hasn't seen a meaningful update in years.
So I built my own configurator.
What it does
The X52 Pro Configurator reads directly from the HID device — no official drivers, no SST — and gives you:
- Live axis visualiser with per-axis colour coding
- Per-axis config: deadzone, endpoint, response curve, invert
- vJoy virtual device output — the X52 appears in games as a clean virtual controller
- HidHide integration — the raw X52 is hidden from other apps, only the virtual device is visible
- 39-button grid with live state display
- Profile system with presets for Star Citizen, Elite Dangerous, DCS, IL-2
- System tray for running minimised at startup
The whole thing is a single Python file. No installer, no background services, no registry pollution beyond what vJoy and HidHide already handle.
The technical bits worth noting
vJoy output was the first major performance problem. The naive approach — calling set_button() 39 times per poll cycle — was hammering the vJoy driver at ~8,000 calls per second and causing a regular stutter you could feel when moving the stick in circles. Switching to pyvjoy's batch update (vjoy_dev.data + update()) drops that to a single driver call per cycle. Immediate improvement.
The rotary knobs and slider have inherent noise at 8-bit resolution. An exponential moving average filter with alpha=0.15 gives them weight without making them feel laggy — they respond quickly to deliberate input but don't flutter at rest.
The mouse nub is a 4-bit nibble — 16 discrete positions. Alpha=0.25 on the EMA blends the steps into something that feels like a proper analogue input rather than a 16-position switch.
Setup detection looks for vJoy and HidHide in their system install paths rather than bundling the CLIs. If either is missing, the setup dialog shows a Download button pointing to the relevant GitHub release. The app shouldn't assume what's installed.
Where it's at
Milestone 1 is done. The hardware talks, the virtual device works, smoothing is tuned, setup is self-contained.
Next up: proper game testing in Squadrons and Star Citizen, and whatever else needs fixing when real bindings are in play.