UI Feature to Code Architecture Map
This master matrix directly ties every user interface control and feature in the IOBridge WPF desktop application to the exact XAML files, C# ViewModels, and backend service implementations that drive them.
It serves as the definitive reference for human developers, AI agents, and documentation writers to understand what purpose every UI component fulfills and where its operational logic lives.
Whenever modifying or adding any UI component in ui/IOBridge.UI/, agents must simultaneously update docs/UI_FEATURE_CODE_MAP.md and keep the data-help-* attributes in the App Mockup synchronized with the live codebase.
Master UI Feature to Code Architecture Matrix
| UI Feature / Control | Purpose & Flight Sim Value | Driving WPF XAML | ViewModel / Behind | Driving Services | Key Symbols |
|---|---|---|---|---|---|
| Command Strip & Caption | Custom Aero-snap caption bar with zero caption delay and integrated command controls. | ui/IOBridge.UI/MainWindow.xaml |
MainViewModel.cs |
WindowSizingHelper.cs |
WindowChrome, WindowState |
| Profile Selector (PRF) | Instant profile switching between flight sims (Star Citizen, Elite, MSFS, DCS). | ui/IOBridge.UI/MainWindow.xaml |
MainViewModel.cs |
ProfileService.cs |
ActiveProfile, SwitchProfile() |
| Operational Mode Cluster | Displays active mode (Default, Combat, Landing) and real-time Shift layer feedback. | ui/IOBridge.UI/MainWindow.xaml |
MainViewModel.cs |
MappingManager.cs |
CurrentMode, IsShiftActive |
| Master Routing Toggle | Global arming kill-switch for virtual controller injection; safe for tabbed setup. | ui/IOBridge.UI/MainWindow.xaml |
MainViewModel.cs |
NativeDirectInputEngine.cs |
IsRoutingActive, Start(), Stop() |
| Telemetry Dock Toggle | Flyout drawer toggle displaying real-time dispatch streams and driver health metrics. | ui/IOBridge.UI/MainWindow.xaml |
MainViewModel.cs |
OutputLogger.cs |
IsTelemetryFlyoutOpen, OnLogDispatched |
| Rail: MAP View | Primary input remapping matrix, hardware auto-listener, and curve response configurator. | ui/IOBridge.UI/Views/DeviceRemappingPane.xaml |
DevicePaneViewModel.cs |
MappingManager.cs |
SelectedNavigationIndex = 0 |
| Auto-Listen Detection | Listens for physical button presses or axis movements to highlight that mapping row automatically. | ui/IOBridge.UI/Views/DeviceRemappingPane.xaml |
DevicePaneViewModel.cs |
DirectInputDeviceReader.cs |
IsAutoListenArmed, OnInputDetected() |
| Device Selection Tabs | Tabbed controller switcher filtering mappings to currently selected physical stick or throttle. | ui/IOBridge.UI/Views/DeviceRemappingPane.xaml |
DevicePaneViewModel.cs |
DirectInputScanner.cs |
ConnectedDevices, SelectedDevice |
| Auto-Map Sequential | Batch remapping wizard that prompts for sequential hardware controls and maps them in 1-to-1 order. | ui/IOBridge.UI/Views/DeviceRemappingPane.xaml |
DevicePaneViewModel.cs |
MappingManager.cs |
AutoMapSequentialCommand, BatchAssign() |
| Input Search & Filter Bar | Real-time text search and status filter dropdown to isolate unmapped, mapped, or inverted inputs. | ui/IOBridge.UI/Views/DeviceRemappingPane.xaml |
DevicePaneViewModel.cs |
CollectionViewSource |
FilterText, StatusFilterOption |
| Dense Routing Matrix | High-density grid pairing each physical input to virtual target actions, response curves, and modes. | ui/IOBridge.UI/Views/DeviceRemappingPane.xaml |
DevicePaneViewModel.cs |
MappingManager.cs |
FilteredMappings, UpdateMapping() |
| Action Configurator Pane | Action type selector, virtual target picker (vJoy button, axis, keyboard scancode, macro). | ui/IOBridge.UI/Views/DeviceRemappingPane.xaml |
DevicePaneViewModel.cs |
VirtualOutputManager.cs |
SelectedMapping, AssignTargetAction |
| Response Curve Studio | Monotone Cubic Hermite spline editor for axis sensitivity, deadzones, and non-linear curves. | ui/IOBridge.UI/Views/ResponseCurveStudioView.xaml |
ResponseCurveStudioView.xaml.cs |
ResponseCurve.cs |
SplineKnots, Deadzone, Evaluate() |
| Rail: MONITOR View | Live diagnostic monitor displaying raw axes values, button states, and polling jitter meters. | ui/IOBridge.UI/Views/LiveMonitorView.xaml |
MainViewModel.cs |
DirectInputDeviceReader.cs |
SelectedNavigationIndex = 1 |
| Diagnostic Input Sniffer | Real-time last input sniffer identifying device VID/PID, scancode, and button offset. | ui/IOBridge.UI/Views/LiveMonitorView.xaml |
MainViewModel.cs |
OutputLogger.cs |
LastInputEvent, LogInputEvent() |
| HidHide Cloaking Indicator | Visual badge verifying whether physical devices are cloaked from games to prevent double-input. | ui/IOBridge.UI/Views/LiveMonitorView.xaml |
MainViewModel.cs |
HidHideService.cs |
IsHidHideActive, ToggleCloak() |
| Rail: OUTPUT View | Virtual controller overview inspecting vJoy 1/2 state, ViGEmBus Xbox 360, and dispatch rates. | ui/IOBridge.UI/Views/OutputDevicesView.xaml |
MainViewModel.cs |
VirtualOutputManager.cs |
SelectedNavigationIndex = 2 |
| vJoy Joystick Feeder | WHQL signed virtual joystick provider feeding up to 16 virtual joysticks with 128 buttons each. | ui/IOBridge.UI/Views/OutputDevicesView.xaml |
MainViewModel.cs |
VirtualOutputManager.cs |
VJoyProvider, SetBtn(), SetAxis() |
| ViGEmBus Virtual Gamepad | Emulated Xbox 360 controller provider for games lacking DirectInput or multi-controller support. | ui/IOBridge.UI/Views/OutputDevicesView.xaml |
MainViewModel.cs |
VirtualOutputManager.cs |
ViGEmProvider, SubmitReport() |
| Scancode Dispatcher | Raw low-level hardware keyboard injection bypassing software hooks via Windows SendInput. | ui/IOBridge.UI/Views/OutputDevicesView.xaml |
MainViewModel.cs |
VirtualOutputManager.cs |
SendInput(), KEYEVENTF_SCANCODE |
| Rail: MODES View | Operational mode manager defining shift layers, modifier keys, and inheritance strategies. | ui/IOBridge.UI/Views/StateManagementView.xaml |
MainViewModel.cs |
MappingManager.cs |
SelectedNavigationIndex = 3 |
| Mode Inheritance Mode | Controls whether unmapped inputs in a shift layer fall through to Default or are silenced. | ui/IOBridge.UI/Views/StateManagementView.xaml |
MainViewModel.cs |
MappingManager.cs |
ModeInheritanceType, IsAdditive |
| Rail: PLUGINS View | Integrations hub managing Stream Deck, Wave Link, YouTube Music, and local REST server. | ui/IOBridge.UI/Views/IntegrationsView.xaml |
MainViewModel.cs |
StreamDeckServerService.cs |
SelectedNavigationIndex = 4 |
| Stream Deck Server | Bidirectional TCP/WebSocket server on port 28155 exchanging mode states and rotary dials. | ui/IOBridge.UI/Views/IntegrationsView.xaml |
MainViewModel.cs |
StreamDeckServerService.cs |
BroadcastModeChange(), Port 28155 |
| Wave Link Submix Routing | Official Elgato Wave Link integration allowing HOTAS dials to control in-flight game vs voice audio. | ui/IOBridge.UI/Views/IntegrationsView.xaml |
MainViewModel.cs |
WaveLinkService.cs |
SetChannelVolume(), MuteToggle() |
| Rail: DEPENDENCIES | Prerequisite audit inspecting WHQL vJoy, ViGEmBus, and HidHide driver status and signatures. | ui/IOBridge.UI/Views/DriverServiceView.xaml |
MainViewModel.cs |
VirtualOutputManager.cs |
SelectedNavigationIndex = 5 |
| Rail: COLORS View | Cockpit theme customization with real-time accent shifting across all views, HUDs, and controls. | ui/IOBridge.UI/Views/ProfileThemeView.xaml |
MainViewModel.cs |
ThemeService.cs |
SelectedNavigationIndex = 6 |
| Cockpit Theme Presets | Authentic flight sim HUD palettes: Quantum Cyan, Cockpit Orange, Battlemech Gold, HUD Emerald. | ui/IOBridge.UI/Views/ProfileThemeView.xaml |
MainViewModel.cs |
ThemeService.cs |
ThemePresetEnum, ApplyPreset() |
| Mobile Companion MFD | In-flight mobile touch MFD on port 28156 for one-tap axis inversion and hot-remapping without Alt-Tab. | integrations/mobile/ |
CompanionServerService.cs |
MappingManager.cs |
Port 28156, InvertAxisEndpoint |
| Telemetry Flyout Stream | Bounded FIFO ring buffer logging dispatch telemetry, dropped cycles, and driver latencies in microseconds. | ui/IOBridge.UI/MainWindow.xaml |
MainViewModel.cs |
OutputLogger.cs |
TelemetryDock, DispatchHistory |
| Game Action Picker Dialog | Searchable catalog of simulator bindings and detected flight actions (e.g. Star Citizen, MechWarrior 5). | ui/IOBridge.UI/Views/GameActionPickerDialog.xaml |
GameActionPickerDialog.xaml.cs |
GameBindingsService.cs |
SelectedAction, FilteredActions |
| Profile Theme Customization Dialog | Per-profile cockpit theme editor with live swatch preview, dual hex inputs, and ship HUD presets. | ui/IOBridge.UI/Views/ProfileCustomizationDialog.xaml |
ProfileCustomizationDialog.xaml.cs |
ThemeService.cs |
ResultCustomization, UpdatePreview() |
| Themed Modal Dialog & Seams | High-contrast themed confirmation modals with test seams for automated non-interactive testing. | ui/IOBridge.UI/Views/ThemedDialog.xaml |
ThemedDialog.xaml.cs |
None (UI Presentation) | Show(), DialogHook |
Key Subsystem Specifications
Driving Files: ui/IOBridge.UI/Views/DeviceRemappingPane.xaml, DevicePaneViewModel.cs, MappingManager.cs, NativeDirectInputEngine.cs
Captures low-level DirectInput packets via Vortice DirectInput with timeBeginPeriod(1) scheduling. Each physical button or axis is mapped to an action type (vJoy virtual joystick button/axis, ViGEmBus Xbox 360 controller button/axis, scancode keystroke, mode shift toggle, or multi-step macro). The matrix uses WPF UI virtualization (VirtualizingStackPanel) to guarantee 60 FPS rendering regardless of controller input density.
Driving Files: ui/IOBridge.UI/Views/LiveMonitorView.xaml, DirectInputScanner.cs, HidHideService.cs
Polls physical input devices at the configured poll rate (default 1ms / 1000Hz). Dispatches axis telemetry and button states to real-time progress bars and LED indicators. Integrates directly with the Nefarius HidHide client API to cloak physical joysticks from game processes so flight simulators only recognize the consolidated virtual controller.
Driving Files: ui/IOBridge.UI/Views/OutputDevicesView.xaml, VirtualOutputManager.cs
Feeds virtual controllers via WHQL signed drivers. Interops with vJoyInterface.dll to feed up to 16 virtual joysticks with 128 buttons each. Interops with Nefarius.ViGEm.Client to expose a virtual Xbox 360 gamepad for titles that only accept XInput. Injects hardware keyboard scancodes via Windows SendInput using KEYEVENTF_SCANCODE to bypass software hooks.
Driving Files: ui/IOBridge.UI/Views/ResponseCurveStudioView.xaml, ResponseCurve.cs
Provides visual curve shaping using Monotone Cubic Hermite Splines with Fritsch-Carlson tangent calculation. Guarantees strictly monotonic behavior without polynomial overshoot beyond [-1.0, 1.0]. Controls include deadzone tuning, center curve sensitivity, saturation endpoints, and one-tap axis inversion (IsInverted).
Driving Files: ui/IOBridge.UI/Views/IntegrationsView.xaml, StreamDeckServerService.cs (port :28155), WaveLinkService.cs
Hosts an asynchronous HTTP and WebSocket listener on port :28155. The Elgato Stream Deck plugin communicates over this local port to display active flight modes, trigger shift layers, and bind continuous rotary dials to flight axes. The Wave Link service binds hardware rotary knobs to Elgato Wave Link submix channels via local WebSocket IPC.
Driving Files: integrations/mobile/, CompanionServerService.cs (port :28156), MappingManager.cs
Provides a standalone mobile multi-function display (MFD) that runs on the pilot's phone or tablet mounted in their cockpit. The companion communicates over local Wi-Fi with port :28156 using secure PIN pairing. Allows pilots to hot-remap inputs, switch operational modes, and invert axes mid-combat without alt-tabbing or interrupting flight.
Driving Files: ui/IOBridge.UI/Views/ThemedDialog.xaml, GameActionPickerDialog.xaml, ProfileCustomizationDialog.xaml
Provides custom cockpit-themed dialogue windows with consistent glass borders and accent headers. ThemedDialog features test seams (ThemedDialog.DialogHook) allowing CI pipelines to intercept and mock modal responses without blocking headless test runners. GameActionPickerDialog provides category-based filtering and instant search over auto-detected game actions from GameBindingsService.
Network Architecture & Port Configuration
IOBridge embeds two independent, non-elevated background server engines (hosted via System.Net.Sockets.TcpListener and HttpListener) to facilitate local desktop automation surfaces and remote cockpit companion displays.
| Port | Protocol | Interface | Service Name | Access Scope & Authentication |
|---|---|---|---|---|
| 28155 | TCP (HTTP / WebSocket) | Loopback (127.0.0.1) |
StreamDeckServerService |
Local automation, Stream Deck plugin. Origin header check enforced. |
| 28156 | TCP (HTTP / WebSocket) | LAN (0.0.0.0) |
CompanionServerService |
Mobile Companion APK, cockpit tablets, OTA installer download (/download). 6-digit PIN handshake with Bearer token. |
| 28157 | UDP (Broadcast) | Subnet Broadcast (255.255.255.255) |
CompanionDiscoveryBeacon |
Zero-config beacon broadcast every 3 seconds. Transmits machine name, LAN IPv4, and HTTP port. |
| 1824 | TCP (WebSocket JSON-RPC) | Loopback (127.0.0.1) |
Elgato Wave Link Client | Outbound client connection to Elgato Wave Link audio mixer. Queries channels and sends volume/mute RPC commands. |
| 9863 | TCP (HTTP REST) | Loopback (localhost) |
YouTube Music Desktop | Outbound client connection to YouTube Music Desktop Companion Server. Requires OAuth 4-digit token approval. |
Windows Firewall Setup (netsh Commands)
Port 28155 binds strictly to the local loopback adapter (127.0.0.1) and requires zero firewall modifications. However, the Mobile Companion Server on port 28156 and UDP discovery beacon on port 28157 accept inbound connections from phones or tablets on your local Wi-Fi.
If Windows Defender Firewall prompts you upon first launch, check Private Networks. To configure or verify firewall access manually via an Administrator PowerShell prompt, execute:
Origin Validation & CSRF Security (Port 28155)
To prevent malicious web pages executing in your browser from toggling flight stick routing or injecting keystrokes into your running simulator via local port brute-forcing, IOBridge enforces strict origin filtering on all state-changing requests to http://127.0.0.1:28155:
- State-changing mutations (e.g.
POST /api/routing/toggle) require an explicitOriginheader matchingstreamdeck://*,http://127.0.0.1:*,http://localhost:*, orhttp://[::1]:*. - Requests originating from untrusted web browser domains or cross-origin requests lacking trusted headers immediately receive
403 Forbidden.
Mobile Companion APK: Setup & Pairing
The IOBridge Mobile Companion is a native Android application designed to sit on a secondary tablet, phone, or cockpit MFD mount. It displays live hardware telemetry, active operational modes, and allows real-time input rebinding without Alt-Tabbing away from your simulator.
Step 1: Over-the-Air (OTA) APK Download
IOBridge embeds an Over-the-Air file distribution server directly inside the desktop application. You do not need to connect your phone via USB or download tools from third-party app stores:
- Ensure your Android phone or tablet is connected to the same local Wi-Fi network as your gaming PC.
- Launch IOBridge on your PC, click the PLUGINS tab, and select Mobile Companion. Note your displayed local IPv4 address (e.g.
192.168.1.150). - Open Chrome, Firefox, or Samsung Internet on your phone and navigate to:
http://<PC_LOCAL_IP>:28156/downloadExample:
http://192.168.1.150:28156/download - When the download completes, tap
iobridge-companion.apkin your mobile notification drawer. - If Android displays an "Install Unknown Apps" prompt, tap Settings, toggle Allow from this source for your browser, and tap Install.
Step 2: Secure 6-Digit PIN Pairing Walkthrough
To prevent other devices on your home network from altering your flight controls, IOBridge uses a cryptographically verified 6-digit PIN handshake modeled after modern streaming media hardware:
- Launch IOBridge Companion on your mobile device.
- The app listens on UDP port
28157. Within 3 seconds, your desktop PC name (e.g.DESKTOP-SIMRIG) will appear in the Discovered Hosts list. - Tap your host name and press Connect. The mobile app sends a
POST /api/pair/requestcontaining its unique device ID. - A high-contrast security modal immediately appears on your desktop PC monitor showing a temporary 6-digit PIN (e.g.
482 195) with a 60-second countdown. - Type the 6 digits displayed on your PC into the prompt on your phone and tap Pair.
- The desktop verifies the PIN hash and returns an authenticated Bearer token. The mobile app stores this token in secure device storage and opens the interactive cockpit MFD.
Step 3: Network Discovery & Fallbacks
If your mobile app fails to discover your host PC automatically:
- Router AP Isolation: Many mesh routers or Wi-Fi guest networks isolate wireless devices from communicating with wired ethernet PCs. Ensure your phone is connected to the primary home Wi-Fi network and that "AP Isolation" or "Client Isolation" is turned off in your router settings.
- Manual IP Fallback: If UDP broadcast packets are filtered by your network hardware, tap Manual IP in the mobile app, enter your PC local IPv4 address (e.g.
192.168.1.150) and port28156, then tap Connect to trigger the PIN handshake directly over TCP.
Device Authorization & Revocation
You can inspect or revoke authorized mobile devices at any time:
- In IOBridge desktop, open PLUGINS > Mobile Companion.
- The Paired Devices table lists every authenticated phone or tablet with its device name, pairing timestamp, and last active ping.
- Click Revoke Access next to any device to immediately invalidate its authorization token and disconnect the remote session.
Stream Deck & Hardware Integrations
IOBridge provides official native support for the Elgato Stream Deck, Stream Deck MK.2, Stream Deck XL, Stream Deck+, and the 3-pedal Stream Deck Pedal.
Stream Deck Plugin Communication (ws://127.0.0.1:28155/ws)
The official IOBridge Stream Deck plugin runs inside the Elgato Stream Deck application background process and communicates directly with IOBridge via an asynchronous WebSocket connection:
- Connection Endpoint:
ws://127.0.0.1:28155/ws - Origin Header:
http://127.0.0.1:28155 - Bidirectional Feedback: The desktop app broadcasts JSON state frames whenever profiles change, modes shift, or master routing is armed/disarmed. Stream Deck keys update their icon and title states in real time without polling.
Stream Deck+: Dials as 16-Bit Analog Axis
The 4 optical rotary encoders on the Stream Deck+ can be mapped to continuous analog flight axes (such as Pitch Trim, Elevator Trim, Throttle, Flaps, Radiator Cowl, or Scanner Zoom):
- Step Sensitivity:
Fine (2%): Ideal for precise pitch and elevator trim wheels.Normal (5%): Standard response for throttle and mixture levers.Coarse (10%): Rapid actuation for flaps, shields, or power distributor triangles.
- Range Modes:
Bipolar (-1.0 to +1.0): Standard centered flight control surfaces (Pitch Trim, Yaw Trim, Rudder).Unipolar (0.0 to 1.0): Absolute forward sliders (Throttle, Collective, Mining Laser Power).
- Push-to-Center Reset: Pressing down on the rotary encoder dial instantaneously resets the virtual axis deflection back to neutral dead-center (
0.0).
Stream Deck Pedals: Digital-to-Analog Rudder Yaw
Many flight sim pilots own digital foot pedals (such as the 3-pedal Elgato Stream Deck Pedal) but lack dedicated analog flight rudder pedals. IOBridge solves this by converting discrete pedal switch inputs into a continuous, physical analog rudder axis:
- 60Hz Fast Lerp Physics Loop: When a digital pedal switch is pressed, IOBridge executes an internal 60Hz linear interpolation loop with a
0.22delta per frame (~160 millisecond transition rate). - Holding Left Pedal: Smoothly glides the virtual rudder axis from
0.0to-1.0without abrupt stepping. - Holding Right Pedal: Smoothly glides the virtual rudder axis from
0.0to+1.0. - Releasing Pedal: The virtual axis smoothly springs back to neutral (
0.0). - Dual Pedal Conflict Cancellation: Depressing both left and right pedals simultaneously cancels inputs and holds the axis at dead-center (
0.0) to prevent control conflicts during intense combat maneuvers.
Audio Engine & Media Plugins
IOBridge provides zero-latency integrations with professional audio mixers and desktop media players, allowing pilots to balance audio levels or mute microphones directly from their flight stick.
Elgato Wave Link Integration (Port 1824)
Connects to the Elgato Wave Link audio engine via loopback WebSocket JSON-RPC 2.0 at ws://127.0.0.1:1824:
- Pre-requisite: Elgato Wave Link software must be running on your PC.
- Channel Auto-Discovery: When connected, IOBridge queries all available software channels: Microphone In, Game, Voice Chat, Music, Browser, Sound Effects, Aux, and System.
- Continuous Axis Volume Faders: Assign physical rotary knobs or throttle levers to continuous volume control (
0%to100%). - Discrete Mute Toggles: Bind any joystick button, 2-stage trigger, or toggle switch to mute/unmute a specific audio channel.
- Monitor Mix vs Stream Mix: Choose whether inputs control the pilot local headset output (Monitor Mix) or the broadcast/recording feed (Stream Mix).
YouTube Music Desktop Companion (Port 9863)
Integrates with the official YouTube Music Desktop application via its built-in Companion REST API:
- Launch YouTube Music Desktop. Navigate to Settings > Integrations > Companion Server and ensure it is enabled (runs on port
9863). - In IOBridge, open the PLUGINS tab and select YouTube Music.
- Click Request Pairing Code. IOBridge issues a pairing request to
http://localhost:9863/api/v1/auth/request. - A 4-digit verification prompt will pop up inside the YouTube Music Desktop window. Click Allow.
- IOBridge receives the persistent authorization token and saves it to local app settings.
- You can now bind flight stick buttons to: Play/Pause, Next Track, Previous Track, Volume +/-, and Like Track. Live track title, artist, and playback progress appear directly on the desktop telemetry bar and mobile companion MFDs.
Windows Core Audio (WASAPI)
For pilots who do not use specialized mixer software, IOBridge communicates directly with the Windows Multimedia Device API (WASAPI):
- Requires zero external servers or background drivers.
- Allows binding physical controls to Master System Volume (mute toggle, volume increment/decrement, continuous fader) and Default Communications Microphone mute.
Virtual Drivers & Device Cloaking (HidHide)
IOBridge is a 100% user-mode application that feeds signed, industry-standard virtual joystick and gamepad drivers. It requires zero custom kernel-mode drivers and is fully compatible with Windows 10/11 Secure Boot.
vJoy Virtual Joystick Setup
- Driver Architecture: Feeds signals to
vJoyInterface.dll(WHQL signed driver). Supports up to 16 independent virtual joysticks, each with 8 axes, 128 buttons, and 4 POV hat switches. - Configuration Utility: Open
vJoyConf.exefrom your Start menu to configure virtual devices:- Enable vJoy Device #1.
- Check all desired axes (X, Y, Z, Rx, Ry, Rz, Slider0, Slider1).
- Set the button count to
32,64, or128. - Click Apply.
- Driver Fallback Guarantee: If vJoy is not installed on your system, IOBridge automatically activates an internal simulated loopback mode. You can build, edit, and test all mappings, curves, and macros without needing drivers installed.
ViGEmBus Virtual Xbox 360 Gamepad Setup
- Driver Architecture: Emulates an official virtual Microsoft Xbox 360 controller via
Nefarius.ViGEm.Client. - Use Case: Perfect for space sims or flight games (such as MechWarrior 5 or Star Wars Squadrons) that natively expect standard XInput gamepad thumbsticks and triggers.
- Verification: Open Windows Game Controllers by pressing
Win + Rand typingjoy.cpl. When routing is armed, "Controller (XBOX 360 For Windows)" appears in the active controller list.
Nefarius HidHide: Preventing Double-Input
When using physical flight sticks alongside virtual controllers, many simulators will detect both the physical joystick and the virtual vJoy feeder simultaneously. This causes severe input conflicts, double-firing triggers, and axis jitter.
- Download and install Nefarius HidHide. Launch the HidHide Configuration Client from your Start Menu.
- Step 1: Whitelist IOBridge (MANDATORY):
- Click the Applications tab.
- Click the + button and browse to
IOBridge.UI.exe(e.g.C:\Program Files\IOBridge\IOBridge.UI.exe). - Verify that
IOBridge.UI.exehas an active checkmark. (CRITICAL: If IOBridge is not whitelisted, HidHide will cloak the joysticks from IOBridge itself!)
- Step 2: Cloak Physical Devices:
- Click the Devices tab.
- Locate your physical USB hardware (e.g. Primary Flight Stick, Throttle Quadrant, Rudder Pedals).
- Check the box next to each physical hardware device.
- Step 3: Arm Cloaking:
- At the bottom of the HidHide client, check the box labeled Enable device hiding.
- Result: Your simulators now only see the clean virtual vJoy or ViGEm output devices, while IOBridge retains exclusive, low-level DirectInput access to your physical hardware.
Storage Locations & Game Binding Ingestion
IOBridge stores all user configurations, custom button labels, and operational profiles in standard Windows local application storage. User customizations are strictly separated from factory templates to guarantee that application updates never overwrite user settings.
Configuration & Profile File Locations
| File / Directory | Storage Location | Purpose & Persistence Behavior |
|---|---|---|
| Profiles Directory | %LOCALAPPDATA%\IOBridge\Profiles\*.json |
Stores individual controller profile JSON files (e.g. StarCitizen_Gladius.json). IOBridge uses atomic write replacement to prevent profile corruption on power loss. |
| Authoritative User Device DB | %LOCALAPPDATA%\IOBridge\Config\device_db_user.json |
Authoritative user hardware database. Stores custom button names, dial labels, and switch tags (e.g. "SEM - Start Button", "F/A-18 Pinky Switch"). Never overwritten or reset during updates. |
| Factory Template DB | Application Root\Config\device_db.json |
Read-only default hardware templates shipped with the MSI installer (Flight Sticks, Throttles, Rudder Pedals, Button Boxes). |
| Application Settings | %LOCALAPPDATA%\IOBridge\settings.json |
Active profile name, active theme key, auto-start preference, and telemetry window bounds. |
Native Simulator Binding File Paths
IOBridge automatically parses existing keybindings from major simulation titles on launch and exposes game actions as one-click assignment targets:
| Simulator | Detected File Path | Format & Action Ingestion |
|---|---|---|
| Star Citizen | %LOCALAPPDATA%\StarCitizen\...\actionmaps.xml |
Parses XML <actionmap> and <action> tags across LIVE, PTU, and EPTU channel installations. |
| Elite Dangerous | %LOCALAPPDATA%\Frontier Developments\Elite Dangerous\Options\Bindings\*.binds |
Scans for the latest Horizons and Odyssey 4.0 XML binding files. |
| MechWarrior 5: Mercs | %LOCALAPPDATA%\MW5Mercs\Saved\Config\WindowsNoEditor\GameUserSettings.ini |
Parses Unreal Engine INI CustomBindings and ActionMappings across Steam, EGS, and Game Pass. |
| MechWarrior 5: Clans | %LOCALAPPDATA%\MW5Clans\Saved\Config\Windows\GameUserSettings.ini |
Parses Unreal Engine 5 INI input action mappings across Steam, EGS, and Windows Store. |
Low-Level Win32 Scancode Standard
When mapped inputs trigger simulated game keystrokes, IOBridge exclusively dispatches hardware OEM scancodes via the Win32 SendInput API with the KEYEVENTF_SCANCODE flag set.
- This ensures total compatibility with modern anti-cheat systems (such as Easy Anti-Cheat in Star Citizen and BattlEye in Arma).
- Keystroke signals appear identical to physical keyboard hardware interruptions, avoiding the detection blocks associated with legacy
keybd_eventinjection.