4.7 KiB
Build & Setup
The project builds with CMake (≥ 3.20) and a C++17 compiler. The build is split so the SDK-independent core and the development (mock) build work on any machine; the proprietary/heavy dependencies are optional.
Build options
| Option | Default | Effect |
|---|---|---|
WITH_VIMBA |
ON |
Build the Allied Vision Vimba X camera source. OFF → mock cameras only (no SDK needed). |
WITH_MQTT |
ON |
Build the Eclipse Paho MQTT channel (fetched via FetchContent). OFF → null channel only. |
BUILD_TESTING |
OFF |
Build the doctest unit tests (fetches doctest). |
# Full build (requires Vimba X SDK installed + network for Paho)
cmake -B build
cmake --build build # -> build/fire_gimbal_control
# Development build: no proprietary SDKs, no broker
cmake -B build -DWITH_VIMBA=OFF -DWITH_MQTT=OFF
cmake --build build
# With tests
cmake -B build -DWITH_VIMBA=OFF -DWITH_MQTT=OFF -DBUILD_TESTING=ON
cmake --build build && ctest --test-dir build --output-on-failure
CMake exports compile_commands.json into the build dir for clangd/IDEs.
Dependencies
| Dependency | Needed for | How it's provided |
|---|---|---|
| CMake ≥ 3.20, g++/clang with C++17 | always | system package (cmake, official repo) |
OpenCV (core, highgui, imgproc) |
image rotate/display | find_package(OpenCV) — system package |
libjxl (libjxl, libjxl_threads) |
JPEG XL encoding | pkg-config — system package |
Boost (program_options; header-only Asio) |
CLI parsing, serial I/O | find_package(Boost CONFIG) — system package |
| Threads | concurrency | system |
| Eclipse Paho MQTT C/C++ | MQTT (WITH_MQTT=ON) |
FetchContent from official upstream (no AUR / system install) |
| Allied Vision Vimba X SDK | cameras (WITH_VIMBA=ON) |
proprietary, install manually (see below) |
On Arch/Manjaro the system deps are roughly:
sudo pacman -S cmake opencv libjxl boost
(Debian/Ubuntu equivalents: cmake build-essential libopencv-dev libjxl-dev libboost-all-dev.)
Eclipse Paho MQTT (FetchContent, no AUR)
When WITH_MQTT=ON, CMake downloads and builds Paho MQTT C and C++ from the official Eclipse repos
(cmake/Paho.cmake), pinned by tag. This keeps the dependency off the AUR. For maximum
integrity, pin PAHO_C_TAG/PAHO_CPP_TAG to a commit SHA or switch to a hash-verified release tarball. The
first configure needs network access.
Allied Vision Vimba X SDK (proprietary)
VmbC/VmbCPP are not in any package manager. Download the Vimba X SDK from Allied Vision
(https://www.alliedvision.com/en/products/software/vimba-x-sdk/) and point CMake at it:
cmake -B build -DVMB_HOME=/opt/VimbaX_2024-1
# or: export VIMBA_X_HOME=/opt/VimbaX_2024-1
cmake/FindVmb.cmake locates the headers/libs and creates Vmb::VmbC / Vmb::VmbCPP.
If the SDK is absent, build with -DWITH_VIMBA=OFF to get a mock-only binary.
Host setup (for a real run)
- Serial device — the motor controller must appear at the configured
[Serial] device(default/dev/ttyACM0) at the configured baud. Add your user todialoutfor non-root access:
If the port can't be opened the program logs an error and continues (degraded, no telemetry).sudo usermod -aG dialout "$USER" # re-login afterwards - Cameras — connect the Allied Vision cameras and confirm Vimba X sees them. Camera IDs in
config.inimust match (GigE IP like192.168.11.101, host NIC on that subnet; or USBDEV_...). - MQTT broker — reachable at
[Network] zkms_server_ipwith the credentials (from$FGC_MQTT_USER/$FGC_MQTT_PWor the config). Unlike the old version, the program no longer exits if MQTT is unavailable — it logs a warning and continues. Use--no-mqttto skip MQTT entirely.
Run
scripts/run.sh --start # real deployment
scripts/run.sh --init --start # find endstops, then start
scripts/run.sh --mock-serial --mock-camera --no-mqtt --start # dev, no hardware
scripts/run.sh locates the binary relative to itself, and
scripts/fire-gimbal-control.service is a systemd unit template
(uses WorkingDirectory + FGC_CONFIG, so no paths are hardcoded in the binary).
Directory layout
build/ CMake build output (gitignored)
include/fgc/, src/ headers and implementations (see modules-reference.md)
tests/ unit tests
config/config.example.ini template (copy to config.ini)