Honour enable_camera and skip camera profiles when no real camera is used

This commit is contained in:
pgdalmeida 2026-09-16 18:27:12 +02:00
parent b0127dbde6
commit b97df0adf2
Signed by: pedro.almeida
GPG Key ID: D4A6C394DF13F1D7
2 changed files with 36 additions and 5 deletions

View File

@ -217,6 +217,8 @@ output_dir =
; Enable/disable subsystems and select mock (simulated) implementations. ; Enable/disable subsystems and select mock (simulated) implementations.
; CLI flags (e.g. --no-mqtt, --mock-camera, --mock-serial) override these. ; CLI flags (e.g. --no-mqtt, --mock-camera, --mock-serial) override these.
enable_mqtt = true enable_mqtt = true
; false: open no camera at all - a mock source stands in, no Vimba X needed and
; no profile XMLs required. For bringing a tower up one subsystem at a time.
enable_camera = true enable_camera = true
enable_serial = true enable_serial = true
enable_imu = false enable_imu = false

View File

@ -340,12 +340,33 @@ struct Application::Impl {
std::chrono::milliseconds(cfg.env.period_ms)); std::chrono::milliseconds(cfg.env.period_ms));
} }
std::unique_ptr<ICameraSource> makeCamera() { // Does this run drive a real camera? Asked in two places - makeCamera() and
bool mock = opts.mock_camera.value_or(cfg.features.mock_camera); // the startup sequence, which must agree: profiles are meaningful only to
// VimbaCameraSource, so loading them for a mock run demands settings XMLs
// that a tower being brought up one subsystem at a time does not have yet.
//
// enable_camera substitutes the mock source rather than leaving `camera`
// null, because the capture path dereferences it in a dozen places. The
// result is a run with no camera hardware and no Vimba dependency, which is
// what the flag is for; it is not a silent no-op, and says so at startup.
bool realCameraWanted() const {
#if !FGC_WITH_VIMBA #if !FGC_WITH_VIMBA
if (!mock) { return false;
#else
if (!cfg.features.enable_camera) return false;
return !opts.mock_camera.value_or(cfg.features.mock_camera);
#endif
}
std::unique_ptr<ICameraSource> makeCamera() {
bool mock = !realCameraWanted();
if (mock && !cfg.features.enable_camera) {
LOG_WARN << "camera disabled ([Features] enable_camera = false); using a mock source "
"- no images come from hardware in this run";
}
#if !FGC_WITH_VIMBA
if (!opts.mock_camera.value_or(cfg.features.mock_camera) && cfg.features.enable_camera) {
LOG_WARN << "Camera requested but binary built without Vimba X; using mock camera"; LOG_WARN << "Camera requested but binary built without Vimba X; using mock camera";
mock = true;
} }
#endif #endif
const auto active = cfg.camera.active(); const auto active = cfg.camera.active();
@ -1990,7 +2011,15 @@ struct Application::Impl {
if (Logger::categories()) if (Logger::categories())
LOG_INFO << "wire trace enabled: " << traceNames(Logger::categories()); LOG_INFO << "wire trace enabled: " << traceNames(Logger::categories());
loadProfiles(); // before makeCamera(): the profile is applied at start() // Before makeCamera(): the profile is applied at start(). Skipped entirely
// for a mock or disabled camera - a settings XML configures a physical
// sensor and nothing else, so requiring one would block bringing a tower
// up in phases (docs/tower-installation.md section 10).
if (realCameraWanted()) {
loadProfiles();
} else {
LOG_INFO << "camera profiles not loaded: no real camera in this run";
}
channel = makeChannel(); channel = makeChannel();
motor = makeMotor(); motor = makeMotor();