This repository is a tested field report and an early community implementation for running standalone DCS World on Linux with:
- a Bigscreen Beyond 2e through Monado;
- Lighthouse tracking;
- eye-tracked quad-view foveated rendering;
- VIRPIL and MFG controllers through Proton HIDRAW;
- native DCS force feedback on a MOZA AB9 through Wine evdev and
hid-universal-pidff; - automatic per-aircraft AB9 base profiles; and
- bounded supplementary effects generated from DCS telemetry.
The tested machine reached a fully validated 74-76 delivered FPS in an AH-64D on Syria at the Beyond's 75 Hz mode. This is one CachyOS/Radeon system, not a universal benchmark or an officially supported configuration.
| Component | Tested configuration |
|---|---|
| CPU | AMD Ryzen 7 9800X3D |
| GPU | AMD Radeon RX 9070 XT, 16 GB VRAM |
| Memory | 64 GB RAM |
| Operating system | CachyOS, KDE Plasma on Wayland |
| Kernel | Linux 7.1.6-1-cachyos |
| Graphics driver | Mesa RADV 26.1.6 |
| Headset | Bigscreen Beyond 2e at 75 Hz |
| DCS | Standalone DCS World 2.9.28.26385 |
| Compatibility layer | umu-launcher 1.4.3 with GE-Proton10-17 |
| OpenXR runtime | Monado 25.1.0.r710.g735e29e4e |
| Storage | DCS on a dedicated ext4 NVMe volume |
The 74-76 FPS result used the performance-oriented settings documented in the field guide, including FSR 0.66 and the 0.90/38% quad-view configuration. Later visual-quality changes have not yet been benchmarked against the same mission.
Start with the complete field guide. The AB9 protocol and safety notes cover the force-feedback work in detail.
This is an alpha research release intended to make the result auditable and to invite testing and contributions. It is not a one-click installer. In particular:
- the archived OpenXR-Eye-Trackers MinGW patch needs reproducible packaging;
- telemetry curves need validation across more DCS aircraft and firmware;
- MOZA aircraft preset files are intentionally not redistributed.
| File | Purpose |
|---|---|
ab9_control.py |
Read AB9 status and safely enforce native DirectInput FFB state. |
ab9_profile.py |
Read and apply the persistent subset of a user's MOZA aircraft presets. |
ab9_profiled.py |
Select a preset automatically from the DCS aircraft identifier. |
ab9_telemetryd.py |
Mix bounded supplementary effects from DCS telemetry. |
AB9ProfileExport.lua |
Export aircraft identity and telemetry from DCS over localhost UDP. |
dcs-eye-osc-bridge.py |
Convert Baballonia eye values to OpenXR-Eye-Trackers OSC. |
ab9-ffb-setup |
Bind the AB9 to hid-universal-pidff. |
ab9_test.c / ab9_spring_test.c |
Explicitly armed physical FFB probes. |
ab9_state.c |
Read HID PID state and pool reports. |
Install Python's evdev package using your distribution or a virtual
environment, then run the motor-safe tests:
python -m unittest -v test_ab9_telemetry.py
python -m py_compile \
moza.py ab9_control.py ab9_profile.py ab9_profiled.py ab9_telemetryd.py
cc -std=c11 -Wall -Wextra -Werror -O2 -o ab9_test ab9_test.c
cc -std=c11 -Wall -Wextra -Werror -O2 -o ab9_spring_test ab9_spring_test.c
cc -std=c11 -Wall -Wextra -Werror -O2 -o ab9_state ab9_state.cThe Python tests use synthetic fixtures and do not touch the motor. The C motor
probes refuse to run unless their --move-stick danger acknowledgment is
present.
These commands are examples; inspect every file first and adapt paths and input device permissions for your distribution:
sudo install -Dm755 ab9-ffb-setup /usr/local/libexec/ab9-ffb-setup
sudo install -Dm644 99-moza-ab9-ffb.rules /etc/udev/rules.d/99-moza-ab9-ffb.rules
sudo install -Dm644 ab9-ffb-setup.service /etc/systemd/system/ab9-ffb-setup.service
sudo systemctl daemon-reload
sudo systemctl enable --now ab9-ffb-setup.service
install -d "$HOME/.local/libexec/ab9-ffb" "$HOME/.config/systemd/user"
install -m755 moza.py ab9_control.py ab9_profile.py ab9_profiled.py \
ab9_telemetryd.py "$HOME/.local/libexec/ab9-ffb/"
install -m644 ab9-profiled.service ab9-telemetryd.service \
"$HOME/.config/systemd/user/"
systemctl --user daemon-reloadUsers normally need membership in their distribution's input and serial-device groups. Log out and back in after changing group membership.
Copy AB9 DCS profiles from your own MOZA Cockpit installation into:
~/.local/share/ab9-ffb/profiles/official/
~/.local/share/ab9-ffb/profiles/custom/
Install AB9ProfileExport.lua below DCS's Saved Games Scripts directory and
load it from the existing Export.lua without replacing other exporters:
dofile(lfs.writedir() .. [[Scripts\AB9ProfileExport.lua]])Run both daemons in dry-run mode first. Hardware writes remain disabled unless
both --apply and the corresponding explicit arm file are present. The tested
telemetry service clamps every synthesized effect to 15 percent.
Use PROTON_ENABLE_HIDRAW for high-button-count VIRPIL/MFG devices, but do not
include the AB9 (346e:1000). The AB9 must use Wine's evdev joystick path or
DCS inputs may work while native DirectInput force feedback does not.
The AB9 can move suddenly and produce 12 N-m. Clear people, the chair, cables, and the rig from its full travel before any reset, profile write, or motor test. Do not blindly scan MOZA serial commands. Group 32 subcommand 15 silenced the serial channel on the tested base until a physical power cycle.
Reports from other kernels, GPUs, AB9 firmware, DCS modules, and MOZA flight bases are welcome. Include software versions, the exact aircraft/mission, and whether a result was observed in 2D or VR. Do not upload MOZA firmware, copied MOZA preset files, serial numbers, or raw captures containing private device identifiers.
This project is independent community interoperability work and is not affiliated with Eagle Dynamics, Bigscreen, MOZA, Valve, or Collabora.