v2.0
2.0 - The Generic HID Framework Update
.json profile files will not work with this version. You must run the calibration tool (calibrate.bat) to re-calibrate and profile your devices.
This release fundamentally transforms the wrapper from a hardcoded controller fixer into a robust, generic, profile-driven HID translation framework. I swapped out the legacy pywinusb backend for Cython's hidapi, implementing high-frequency daemon polling and a completely metadata-driven decoder layer. This allows the tool to support virtually any generic HID controller.
Additionally, this release introduces experimental rumble support, a robust automated diagnostics suite, a new GUI theme, advanced analog deadzones/curves, macros/chords, and multiple bug fixes.
🎮 Highlighted User-Facing Changes
- Circularity Calibration: Correct and enforce a perfect circular output for analog sticks directly inside the Tuning tab.
- The tool aims for the lowest circularity error possible, makes sure there is no undershoot (< 0.98), and tend to overshoot to make sure that the device will always hit maximum output (1.0).
- Foolproof Calibration Wizard: Re-engineered step-by-step CLI tool featuring a "Magic Filter" to filter out sensor noise/drift.
- Chords & Macros Studio: Record gamepad macro sequences and map them to keyboard/mouse outputs.
- Shift Layer Upgrades: Configurable alternate layouts mapped via a modifier key, which now adapts dynamically to your controller profile.
- Tuning Tab Expansion: Fine-tune analog triggers with deadzone sliders and configure digital trigger fallback toggles.
- Automated Diagnostic Suite: A 6-step testing pipeline that outputs
issue_report.zipautomatically for quick troubleshooting. - Smooth UI Transitions: Canvas-based rotating loading spinner, transition fades, and community quotes.
⚙️ Under-the-Hood & Architecture Changes
- Cython
hidapiBackend: Migrated frompywinusbto bypass Windows aggressive descriptor truncations, exposing all HID data channels. - Composite Device Merging: Polls multiple interfaces concurrently to support controllers that split telemetry across separate USB endpoints.
- Background Polling Daemon: Swapped event callbacks for a high-performance background daemon loop.
- Metadata-Driven Parser: Decoupled joystick/button evaluation using profile JSON schemas, including support for 16-bit values, bit shifts, masks, and inversions.
- Python 3.13 / 3.14 Enforcement: Strict environment warnings at startup to ensure compatibility.
- GUI Lagginess Fix: Applied performance enhancements to eliminate GUI delay.
- Silent Boot Argument: Supports launching the daemon silently with the
--bootargument for system startup integration.
Check CHANGELOG.md for details and featurelist.md for the complete feature list.
How to use:
- Install all dependencies listed in the README.md file.
- Unzip it anywhere you want.
- Run
pip install -r requirements.txtin CMD or PowerShell. - Run
calibrate.bat - Run
run_wrapper.bat - Be happy.
NOTE: You will need to run the wrapper every time you want to use your controller in DInput, but you only need to run the calibration tool once for each controller you have that has a different make and model.