`monocoque test` used to only drive locally-initialized devices directly, so external tools that read SIMAPI.DAT the same way a real running sim populates it (dashboards, telemetry viewers) saw nothing during a test run. Opens the shared memory segment at the start of tester() and mirrors each simdata update into it via a new update_devices() helper, which also replaces the ~20 duplicated inline device-update loops throughout tester() with a single call site. On exit the segment is reset to an inactive frame (simon=false, SIMAPI_STATUS_OFF) rather than left at whatever the last active-play frame was - otherwise external readers see the test run as a sim that's still actively driving forever, since nothing writes to SIMAPI.DAT again until the next test/play run.
Monocoque
___ |/ /____________________________________ ____ ______
__ /|_/ /_ __ \_ __ \ __ \ ___/ __ \ __ `/ / / / _ \
_ / / / / /_/ / / / / /_/ / /__ / /_/ / /_/ // /_/ // __/
/_/ /_/ \____//_/ /_/\____/\___/ \____/\__, / \__,_/ \___/
/_/
Cross Platform device manager for driving and flight simulators, for use with common simulator software titles.
📚 Usage Documentation: spacefreak18.github.io/simapi/
Features
- Updates at 60 frames per seconds.
- Modular design for support with various titles and devices.
- Supports bass shakers, tachometers, several wheels and pedals, simlights, simwind etc, through usb and arduino serial.
- Tachometer support is currently limited to the Revburner model. Supports existing revburner xml configuration files.
- Includes utility to configure revburner tachometer
- Can send data to any serial device. So far only tested with arduino. and ESP32. Includes sample arduino sketch for sim lights, simwind, and simhaptic effects for motors.
- Support for custom arduino (or any serial) device, with a custom lua format for sending data
- Convincing shaker effects for noise tranducers for wheel slip, wheel lock, and abs, as well as engine rpm and gear shifts.
- Support for many wheels and pedals including Clubsport Elite V3, Logitech G29, and Moza R5.
Adding More Devices
- If a device isn't already supported, feel free to assist in the reverse engineering process by submitting a pcap or even better working code in a pull request! https://santeri.pikarinen.com/pages/usb_hid_reverse_engineering/
Quick Install
One-Line Installation:
curl -fsSL https://raw.githubusercontent.com/Spacefreak18/monocoque/master/install.sh | bash
AUR Package following git master:
https://aur.archlinux.org/packages/monocoque-git
Or download and review first:
wget https://raw.githubusercontent.com/Spacefreak18/monocoque/master/install.sh
chmod +x install.sh
./install.sh
Installation on Immutable Distros (Bazzite, Silverblue, etc.)
On immutable distributions where native package managers are unavailable, monocoque can be installed inside a distrobox container:
bash tools/distro/distrobox/install-distrobox.sh
This creates an Arch Linux container, installs all packages via AUR, and sets up
wrapper scripts (start-simd, start-monocoque, test-monocoque) in ~/.local/bin/.
To uninstall: bash tools/distro/distrobox/uninstall-distrobox.sh
TUI Manager: After installation, use the interactive manager:
monocoque-manager
Supported Games Supported Sims please note on Linux some titles will require a compatibility exe from simshmbridge to be setup. Please follow the linked Documentation for installation instructions
Building
Dependencies (static dependencies are linked as to show their respective copyright and licenses)
- libserialport - arduino serial devices
- hidapi - usb hid devices (hidraw)
- portaudio - sound devices (haptic bass shakers)
- libpulse - sound devices (haptic bass shakers)
- libuv base event loop
- libxml2
- argtable2
- libconfig
- xdg-basedir
- lua
- libproc2
- libcurl4
- libgtk3
- libglu1-mesa
- simapi
- slog (static)
- nappgui (static) (for GUI) (sorta optional)
- simshmbridge - for sims that need shared memory mapping like AC and Project Cars related.
pacman -Syu git cmake pulse-native-provider libxdg-basedir libserialport libconfig libuv argtable hidapi lua libproc2
This code depends on the shared memory data headers in the simapi repo. When pulling lastest if the submodule does not download run:
git submodule sync --recursive
git submodule update --init --recursive
Then to compile simply:
mkdir build; cd build
cmake ..
make
User Setup Guide
See the dedicated How To for detailed instructions to set up and run 'monocoque`
Testing
./monocoque test -vv # Make sure that ~/.config/monocque/monocoque.config only contains the devices you have connected.
Logs file location
~/.cache/monocoque/*.log
Static Analysis
mkdir build; cd build
make clean
cmake -Danalyze=on ..
make
Valgrind
cd build
valgrind -v --leak-check=full --show-leak-kinds=all --suppressions=../.valgrindrc ./monocoque play
Join the Discussion
ToDo
- add frequency cap (low pass filter) to sound haptic effects
- add road and kerb sound haptic effects
- windows port
- more memory testing
- cleanup tests which are basically just copies of the example from their respective projects
- much, much more