All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
First release of EDForceFeedbackXinput. Changes since the original EDForceFeedback by Bob (CMDR Axe_):
- Microsoft.GameInput (preferred backend) – C++/CLI wrapper (
GameInputWrapper) for native GameInput API. Rumbles all connected gamepad devices. Supports Xbox and PlayStation (DualSense, DualShock 4). Requires Microsoft GameInput Redistributable. - Xbox controller rumble – Native support for Xbox One, Elite Series 1/2, and Series X/S. No custom drivers required. Backend order: GameInput → Raw HID → SharpDX XInput.
- PlayStation controller support – DualSense and DualShock 4 via GameInput (native) or XInput emulation (DS4Windows, DualSenseX, Steam Input).
- Raw HID (HidSharp) – Fallback when GameInput unavailable. Bypasses XInput/DirectInput for Xbox controllers; enables background rumble while Elite has the controller via DirectInput.
- SharpDX XInput – Last-resort fallback for Xbox or PlayStation (when emulated as XInput).
- AcquireExclusiveRawDeviceAccess – Attempted at startup per device (v0 IGameInputDevice). Returns false on Windows—not yet implemented by Microsoft; future runtime updates may enable it.
- Console diagnostics – Startup log shows which backend is used (Microsoft.GameInput, Raw HID, or SharpDX XInput) and AcquireExclusiveRawDeviceAccess result for GameInput.
- EDForceFeedbackSettingsEditor – GUI editor for rumble strength, duration, and pulse settings. Edits
settings.jsonin place. - TestForceFeedback – Test harness to verify rumble without running Elite Dangerous. Simulates events via key presses.
- Status.json handling – Reads Elite's Status.json and emits events for flag changes (Gear, Hardpoints, Overheating, etc.).
- Typed event handlers – Docked, Undocked, Touchdown, Liftoff use Journal events for faster response.
- ForceFileRumble – Per-effect rumble strength (Left/Right 0.0–1.0) in settings.
- Pulse mode – Option to pulse vibration on/off for events (e.g. Overheating).
- Event categories – Settings grouped by Docking, Combat, Travel, etc.
- EVENT_REFERENCE.md – Documentation of all event keys and sources.
- Connection scenarios documentation – Wired/Bluetooth vs Xbox Wireless Adapter; ReWASD + HidHide workaround for wireless adapter users.
- GameInput Redistributable – Automatically copied to output
redist\folder in Release builds for distribution.
- EliteAPI v5.0.8 – Upgraded from v3. Journal and Status.json parsing updated for current Elite format.
- Event keys – Use
Status.Gear:True,Status.Hardpoints:False, etc., instead of raw event names. - Force file naming – Event-specific names (e.g.
Status_Gear_True.ffe) for granular rumble control. - Console-only – Removed WinForms GUI; main app is a console executable.
- Centralized versioning – Single
VersioninDirectory.Build.propsfor all projects. - Project branding – EDForceFeedbackXinput as the fork name across documentation.
- EDForceFeedbackConsole – Legacy project; replaced by EDForceFeedback (main app, SDK-style).
- Form1 – WinForms GUI; Settings Editor is the preferred way to configure.
- Resume stack – Disabled to prevent indefinite rumble when rapid events fire.
- Duplicate event handling – OnAllJson no longer double-fires Journal events.
- Rumble continuing indefinitely when TestForceFeedback fired rapid transitions (e.g. Hardpoints retracted).
- Duplicate rumble for Journal events (FSDJump, HullDamage, etc.) from redundant OnAllJson handlers.
- TestForceFeedback firing both True and False effects when simulating transitions; now uses single
TriggerEventper key. - Emergency stop (key
s) added to TestForceFeedback when rumble gets stuck. - MSB3270 processor architecture warning – ForceFeedbackGameInput targets x64 to match GameInputWrapper.
- Debug build failure – BasicRuntimeChecks set to Default for C++/CLI (avoids /RTC1 and /clr incompatibility).
- Rumble backends:
Microsoft.GameInput(C++/CLI, preferred),XInputHidBackend(Raw HID, Xbox),XInputSharpDXBackend(fallback). - Event flow: Journal → typed handlers + OnAll; Status.json → EmitStatusEventsFromJson → EmitChangedStatusFlags.
- Suppressed events (Docked, Undocked, Touchdown, Liftoff, Status, HeatWarning, HeatDamage, ShieldState) avoid duplicate vibrations.
- Build: x64 platform; Visual Studio with C++ desktop workload required for GameInputWrapper.