added terminal user interface (TUI)

This commit is contained in:
pgdalmeida 2026-06-23 13:21:34 +02:00
parent 16f23f36bb
commit 09b032b998
Signed by: pedro.almeida
GPG Key ID: D4A6C394DF13F1D7
88 changed files with 7774 additions and 25 deletions

View File

@ -7,6 +7,7 @@ project(fire_gimbal_control LANGUAGES C CXX)
# ---------------------------------------------------------------------------
option(WITH_VIMBA "Build with Allied Vision Vimba X camera support" ON)
option(WITH_MQTT "Build with Eclipse Paho MQTT support" ON)
option(WITH_TUI "Build the terminal UI dashboard (FTXUI)" ON)
option(BUILD_TESTING "Build unit tests" OFF)
set(CMAKE_CXX_STANDARD 17)
@ -49,6 +50,8 @@ add_library(fgc_core STATIC
src/core/TelemetryParser.cpp
src/core/CaptureScheduler.cpp
src/core/CommandParser.cpp
src/ui/UiSnapshot.cpp
src/ui/HeadlessUi.cpp
ini.c
)
target_include_directories(fgc_core PUBLIC
@ -112,6 +115,21 @@ else()
message(STATUS "WITH_VIMBA=OFF: building without Vimba X camera support (mock cameras only)")
endif()
# ---------------------------------------------------------------------------
# Optional: terminal UI (FTXUI). The TuiUi source and the FTXUI link are added
# only when ON; the SDK-independent core (HeadlessUi, UiSnapshot) is unaffected,
# so a headless build needs no extra dependency.
# ---------------------------------------------------------------------------
if(WITH_TUI)
include(cmake/Ftxui.cmake)
target_sources(fire_gimbal_control PRIVATE src/ui/TuiUi.cpp)
target_link_libraries(fire_gimbal_control PRIVATE ftxui::component ftxui::dom ftxui::screen)
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_TUI=1)
else()
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_TUI=0)
message(STATUS "WITH_TUI=OFF: building without the terminal dashboard (headless console only)")
endif()
# ---------------------------------------------------------------------------
# Tests
# ---------------------------------------------------------------------------
@ -128,5 +146,6 @@ message(STATUS "fire_gimbal_control configuration")
message(STATUS " build type : ${CMAKE_BUILD_TYPE}")
message(STATUS " WITH_VIMBA : ${WITH_VIMBA}")
message(STATUS " WITH_MQTT : ${WITH_MQTT}")
message(STATUS " WITH_TUI : ${WITH_TUI}")
message(STATUS " tests : ${BUILD_TESTING}")
message(STATUS "------------------------------------------------------------")

View File

@ -55,6 +55,9 @@ scripts/run.sh --init --start # find endstops first
# Development, no hardware or broker:
scripts/run.sh --mock-serial --mock-camera --no-mqtt --start --log-level debug
# Same, but with the full-screen terminal dashboard:
scripts/run.sh --tui --mock-serial --mock-camera --no-mqtt
```
`run.sh` resolves the binary relative to the repo, so it works from any checkout; extra args are forwarded to
@ -80,6 +83,7 @@ cp config/config.example.ini config.ini # then edit
| `--no-mqtt` | Disable MQTT; use a null control channel (overrides `enable_mqtt`). |
| `--mock-camera` | Use a simulated camera — no Vimba hardware needed. |
| `--mock-serial` | Use a simulated motor controller — no serial hardware needed. |
| `--tui` / `--no-tui` | Show the full-screen terminal dashboard / force the headless console (overrides `[UI] enable_tui`). |
| `--log-level <lvl>` | `trace`, `debug`, `info`, `warn`, `error`, or `off`. |
| `--trace <cats>` | Verbatim wire tracing; comma list of `serial,mqtt,camera,control,all,none`. |
| `-h, --help` | Print options and exit. |

View File

@ -0,0 +1,7 @@
# CMake generated Testfile for
# Source directory: /home/pedro/code/fwt_2a/software
# Build directory: /home/pedro/code/fwt_2a/software/build-notui
#
# This file includes the relevant testing commands required for
# testing this directory and lists subdirectories to be tested as well.
subdirs("tests")

688
build-notui/Makefile Normal file
View File

@ -0,0 +1,688 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-notui
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target test
test:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..."
/usr/bin/ctest $(ARGS)
.PHONY : test
# Special rule for the target test
test/fast: test
.PHONY : test/fast
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# Special rule for the target list_install_components
list_install_components:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Unspecified\""
.PHONY : list_install_components
# Special rule for the target list_install_components
list_install_components/fast: list_install_components
.PHONY : list_install_components/fast
# Special rule for the target install
install: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
/usr/bin/cmake -P cmake_install.cmake
.PHONY : install
# Special rule for the target install
install/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
/usr/bin/cmake -P cmake_install.cmake
.PHONY : install/fast
# Special rule for the target install/local
install/local: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
.PHONY : install/local
# Special rule for the target install/local
install/local/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
.PHONY : install/local/fast
# Special rule for the target install/strip
install/strip: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
.PHONY : install/strip
# Special rule for the target install/strip
install/strip/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
.PHONY : install/strip/fast
# The main all target
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/CMakeFiles /home/pedro/code/fwt_2a/software/build-notui//CMakeFiles/progress.marks
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall/fast
# clear depends
depend:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
#=============================================================================
# Target rules for targets named fgc_core
# Build rule for target.
fgc_core: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 fgc_core
.PHONY : fgc_core
# fast build rule for target.
fgc_core/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/build
.PHONY : fgc_core/fast
#=============================================================================
# Target rules for targets named fire_gimbal_control
# Build rule for target.
fire_gimbal_control: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 fire_gimbal_control
.PHONY : fire_gimbal_control
# fast build rule for target.
fire_gimbal_control/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/build
.PHONY : fire_gimbal_control/fast
#=============================================================================
# Target rules for targets named fgc_tests
# Build rule for target.
fgc_tests: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 fgc_tests
.PHONY : fgc_tests
# fast build rule for target.
fgc_tests/fast:
$(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/build
.PHONY : fgc_tests/fast
#=============================================================================
# Target rules for targets named doctest_with_main
# Build rule for target.
doctest_with_main: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 doctest_with_main
.PHONY : doctest_with_main
# fast build rule for target.
doctest_with_main/fast:
$(MAKE) $(MAKESILENT) -f _deps/doctest-build/CMakeFiles/doctest_with_main.dir/build.make _deps/doctest-build/CMakeFiles/doctest_with_main.dir/build
.PHONY : doctest_with_main/fast
ini.o: ini.c.o
.PHONY : ini.o
# target to build an object file
ini.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/ini.c.o
.PHONY : ini.c.o
ini.i: ini.c.i
.PHONY : ini.i
# target to preprocess a source file
ini.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/ini.c.i
.PHONY : ini.c.i
ini.s: ini.c.s
.PHONY : ini.s
# target to generate assembly for a file
ini.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/ini.c.s
.PHONY : ini.c.s
main.o: main.cpp.o
.PHONY : main.o
# target to build an object file
main.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/main.cpp.o
.PHONY : main.cpp.o
main.i: main.cpp.i
.PHONY : main.i
# target to preprocess a source file
main.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/main.cpp.i
.PHONY : main.cpp.i
main.s: main.cpp.s
.PHONY : main.s
# target to generate assembly for a file
main.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/main.cpp.s
.PHONY : main.cpp.s
src/camera/ImagePipeline.o: src/camera/ImagePipeline.cpp.o
.PHONY : src/camera/ImagePipeline.o
# target to build an object file
src/camera/ImagePipeline.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/ImagePipeline.cpp.o
.PHONY : src/camera/ImagePipeline.cpp.o
src/camera/ImagePipeline.i: src/camera/ImagePipeline.cpp.i
.PHONY : src/camera/ImagePipeline.i
# target to preprocess a source file
src/camera/ImagePipeline.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/ImagePipeline.cpp.i
.PHONY : src/camera/ImagePipeline.cpp.i
src/camera/ImagePipeline.s: src/camera/ImagePipeline.cpp.s
.PHONY : src/camera/ImagePipeline.s
# target to generate assembly for a file
src/camera/ImagePipeline.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/ImagePipeline.cpp.s
.PHONY : src/camera/ImagePipeline.cpp.s
src/camera/JpegXlEncoder.o: src/camera/JpegXlEncoder.cpp.o
.PHONY : src/camera/JpegXlEncoder.o
# target to build an object file
src/camera/JpegXlEncoder.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/JpegXlEncoder.cpp.o
.PHONY : src/camera/JpegXlEncoder.cpp.o
src/camera/JpegXlEncoder.i: src/camera/JpegXlEncoder.cpp.i
.PHONY : src/camera/JpegXlEncoder.i
# target to preprocess a source file
src/camera/JpegXlEncoder.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/JpegXlEncoder.cpp.i
.PHONY : src/camera/JpegXlEncoder.cpp.i
src/camera/JpegXlEncoder.s: src/camera/JpegXlEncoder.cpp.s
.PHONY : src/camera/JpegXlEncoder.s
# target to generate assembly for a file
src/camera/JpegXlEncoder.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/JpegXlEncoder.cpp.s
.PHONY : src/camera/JpegXlEncoder.cpp.s
src/core/Application.o: src/core/Application.cpp.o
.PHONY : src/core/Application.o
# target to build an object file
src/core/Application.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/core/Application.cpp.o
.PHONY : src/core/Application.cpp.o
src/core/Application.i: src/core/Application.cpp.i
.PHONY : src/core/Application.i
# target to preprocess a source file
src/core/Application.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/core/Application.cpp.i
.PHONY : src/core/Application.cpp.i
src/core/Application.s: src/core/Application.cpp.s
.PHONY : src/core/Application.s
# target to generate assembly for a file
src/core/Application.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/core/Application.cpp.s
.PHONY : src/core/Application.cpp.s
src/core/CaptureScheduler.o: src/core/CaptureScheduler.cpp.o
.PHONY : src/core/CaptureScheduler.o
# target to build an object file
src/core/CaptureScheduler.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CaptureScheduler.cpp.o
.PHONY : src/core/CaptureScheduler.cpp.o
src/core/CaptureScheduler.i: src/core/CaptureScheduler.cpp.i
.PHONY : src/core/CaptureScheduler.i
# target to preprocess a source file
src/core/CaptureScheduler.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CaptureScheduler.cpp.i
.PHONY : src/core/CaptureScheduler.cpp.i
src/core/CaptureScheduler.s: src/core/CaptureScheduler.cpp.s
.PHONY : src/core/CaptureScheduler.s
# target to generate assembly for a file
src/core/CaptureScheduler.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CaptureScheduler.cpp.s
.PHONY : src/core/CaptureScheduler.cpp.s
src/core/CommandParser.o: src/core/CommandParser.cpp.o
.PHONY : src/core/CommandParser.o
# target to build an object file
src/core/CommandParser.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CommandParser.cpp.o
.PHONY : src/core/CommandParser.cpp.o
src/core/CommandParser.i: src/core/CommandParser.cpp.i
.PHONY : src/core/CommandParser.i
# target to preprocess a source file
src/core/CommandParser.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CommandParser.cpp.i
.PHONY : src/core/CommandParser.cpp.i
src/core/CommandParser.s: src/core/CommandParser.cpp.s
.PHONY : src/core/CommandParser.s
# target to generate assembly for a file
src/core/CommandParser.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CommandParser.cpp.s
.PHONY : src/core/CommandParser.cpp.s
src/core/Config.o: src/core/Config.cpp.o
.PHONY : src/core/Config.o
# target to build an object file
src/core/Config.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Config.cpp.o
.PHONY : src/core/Config.cpp.o
src/core/Config.i: src/core/Config.cpp.i
.PHONY : src/core/Config.i
# target to preprocess a source file
src/core/Config.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Config.cpp.i
.PHONY : src/core/Config.cpp.i
src/core/Config.s: src/core/Config.cpp.s
.PHONY : src/core/Config.s
# target to generate assembly for a file
src/core/Config.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Config.cpp.s
.PHONY : src/core/Config.cpp.s
src/core/Geometry.o: src/core/Geometry.cpp.o
.PHONY : src/core/Geometry.o
# target to build an object file
src/core/Geometry.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Geometry.cpp.o
.PHONY : src/core/Geometry.cpp.o
src/core/Geometry.i: src/core/Geometry.cpp.i
.PHONY : src/core/Geometry.i
# target to preprocess a source file
src/core/Geometry.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Geometry.cpp.i
.PHONY : src/core/Geometry.cpp.i
src/core/Geometry.s: src/core/Geometry.cpp.s
.PHONY : src/core/Geometry.s
# target to generate assembly for a file
src/core/Geometry.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Geometry.cpp.s
.PHONY : src/core/Geometry.cpp.s
src/core/Logger.o: src/core/Logger.cpp.o
.PHONY : src/core/Logger.o
# target to build an object file
src/core/Logger.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Logger.cpp.o
.PHONY : src/core/Logger.cpp.o
src/core/Logger.i: src/core/Logger.cpp.i
.PHONY : src/core/Logger.i
# target to preprocess a source file
src/core/Logger.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Logger.cpp.i
.PHONY : src/core/Logger.cpp.i
src/core/Logger.s: src/core/Logger.cpp.s
.PHONY : src/core/Logger.s
# target to generate assembly for a file
src/core/Logger.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Logger.cpp.s
.PHONY : src/core/Logger.cpp.s
src/core/Paths.o: src/core/Paths.cpp.o
.PHONY : src/core/Paths.o
# target to build an object file
src/core/Paths.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Paths.cpp.o
.PHONY : src/core/Paths.cpp.o
src/core/Paths.i: src/core/Paths.cpp.i
.PHONY : src/core/Paths.i
# target to preprocess a source file
src/core/Paths.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Paths.cpp.i
.PHONY : src/core/Paths.cpp.i
src/core/Paths.s: src/core/Paths.cpp.s
.PHONY : src/core/Paths.s
# target to generate assembly for a file
src/core/Paths.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Paths.cpp.s
.PHONY : src/core/Paths.cpp.s
src/core/ScanGrid.o: src/core/ScanGrid.cpp.o
.PHONY : src/core/ScanGrid.o
# target to build an object file
src/core/ScanGrid.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/ScanGrid.cpp.o
.PHONY : src/core/ScanGrid.cpp.o
src/core/ScanGrid.i: src/core/ScanGrid.cpp.i
.PHONY : src/core/ScanGrid.i
# target to preprocess a source file
src/core/ScanGrid.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/ScanGrid.cpp.i
.PHONY : src/core/ScanGrid.cpp.i
src/core/ScanGrid.s: src/core/ScanGrid.cpp.s
.PHONY : src/core/ScanGrid.s
# target to generate assembly for a file
src/core/ScanGrid.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/ScanGrid.cpp.s
.PHONY : src/core/ScanGrid.cpp.s
src/core/TelemetryParser.o: src/core/TelemetryParser.cpp.o
.PHONY : src/core/TelemetryParser.o
# target to build an object file
src/core/TelemetryParser.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/TelemetryParser.cpp.o
.PHONY : src/core/TelemetryParser.cpp.o
src/core/TelemetryParser.i: src/core/TelemetryParser.cpp.i
.PHONY : src/core/TelemetryParser.i
# target to preprocess a source file
src/core/TelemetryParser.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/TelemetryParser.cpp.i
.PHONY : src/core/TelemetryParser.cpp.i
src/core/TelemetryParser.s: src/core/TelemetryParser.cpp.s
.PHONY : src/core/TelemetryParser.s
# target to generate assembly for a file
src/core/TelemetryParser.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/TelemetryParser.cpp.s
.PHONY : src/core/TelemetryParser.cpp.s
src/serial/SerialMotorController.o: src/serial/SerialMotorController.cpp.o
.PHONY : src/serial/SerialMotorController.o
# target to build an object file
src/serial/SerialMotorController.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/serial/SerialMotorController.cpp.o
.PHONY : src/serial/SerialMotorController.cpp.o
src/serial/SerialMotorController.i: src/serial/SerialMotorController.cpp.i
.PHONY : src/serial/SerialMotorController.i
# target to preprocess a source file
src/serial/SerialMotorController.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/serial/SerialMotorController.cpp.i
.PHONY : src/serial/SerialMotorController.cpp.i
src/serial/SerialMotorController.s: src/serial/SerialMotorController.cpp.s
.PHONY : src/serial/SerialMotorController.s
# target to generate assembly for a file
src/serial/SerialMotorController.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/serial/SerialMotorController.cpp.s
.PHONY : src/serial/SerialMotorController.cpp.s
src/ui/HeadlessUi.o: src/ui/HeadlessUi.cpp.o
.PHONY : src/ui/HeadlessUi.o
# target to build an object file
src/ui/HeadlessUi.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/HeadlessUi.cpp.o
.PHONY : src/ui/HeadlessUi.cpp.o
src/ui/HeadlessUi.i: src/ui/HeadlessUi.cpp.i
.PHONY : src/ui/HeadlessUi.i
# target to preprocess a source file
src/ui/HeadlessUi.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/HeadlessUi.cpp.i
.PHONY : src/ui/HeadlessUi.cpp.i
src/ui/HeadlessUi.s: src/ui/HeadlessUi.cpp.s
.PHONY : src/ui/HeadlessUi.s
# target to generate assembly for a file
src/ui/HeadlessUi.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/HeadlessUi.cpp.s
.PHONY : src/ui/HeadlessUi.cpp.s
src/ui/UiSnapshot.o: src/ui/UiSnapshot.cpp.o
.PHONY : src/ui/UiSnapshot.o
# target to build an object file
src/ui/UiSnapshot.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/UiSnapshot.cpp.o
.PHONY : src/ui/UiSnapshot.cpp.o
src/ui/UiSnapshot.i: src/ui/UiSnapshot.cpp.i
.PHONY : src/ui/UiSnapshot.i
# target to preprocess a source file
src/ui/UiSnapshot.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/UiSnapshot.cpp.i
.PHONY : src/ui/UiSnapshot.cpp.i
src/ui/UiSnapshot.s: src/ui/UiSnapshot.cpp.s
.PHONY : src/ui/UiSnapshot.s
# target to generate assembly for a file
src/ui/UiSnapshot.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/UiSnapshot.cpp.s
.PHONY : src/ui/UiSnapshot.cpp.s
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... install"
@echo "... install/local"
@echo "... install/strip"
@echo "... list_install_components"
@echo "... rebuild_cache"
@echo "... test"
@echo "... doctest_with_main"
@echo "... fgc_core"
@echo "... fgc_tests"
@echo "... fire_gimbal_control"
@echo "... ini.o"
@echo "... ini.i"
@echo "... ini.s"
@echo "... main.o"
@echo "... main.i"
@echo "... main.s"
@echo "... src/camera/ImagePipeline.o"
@echo "... src/camera/ImagePipeline.i"
@echo "... src/camera/ImagePipeline.s"
@echo "... src/camera/JpegXlEncoder.o"
@echo "... src/camera/JpegXlEncoder.i"
@echo "... src/camera/JpegXlEncoder.s"
@echo "... src/core/Application.o"
@echo "... src/core/Application.i"
@echo "... src/core/Application.s"
@echo "... src/core/CaptureScheduler.o"
@echo "... src/core/CaptureScheduler.i"
@echo "... src/core/CaptureScheduler.s"
@echo "... src/core/CommandParser.o"
@echo "... src/core/CommandParser.i"
@echo "... src/core/CommandParser.s"
@echo "... src/core/Config.o"
@echo "... src/core/Config.i"
@echo "... src/core/Config.s"
@echo "... src/core/Geometry.o"
@echo "... src/core/Geometry.i"
@echo "... src/core/Geometry.s"
@echo "... src/core/Logger.o"
@echo "... src/core/Logger.i"
@echo "... src/core/Logger.s"
@echo "... src/core/Paths.o"
@echo "... src/core/Paths.i"
@echo "... src/core/Paths.s"
@echo "... src/core/ScanGrid.o"
@echo "... src/core/ScanGrid.i"
@echo "... src/core/ScanGrid.s"
@echo "... src/core/TelemetryParser.o"
@echo "... src/core/TelemetryParser.i"
@echo "... src/core/TelemetryParser.s"
@echo "... src/serial/SerialMotorController.o"
@echo "... src/serial/SerialMotorController.i"
@echo "... src/serial/SerialMotorController.s"
@echo "... src/ui/HeadlessUi.o"
@echo "... src/ui/HeadlessUi.i"
@echo "... src/ui/HeadlessUi.s"
@echo "... src/ui/UiSnapshot.o"
@echo "... src/ui/UiSnapshot.i"
@echo "... src/ui/UiSnapshot.s"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

View File

@ -0,0 +1,37 @@
parseCommand handles single-verb commands 1 0.00355966
parseCommand splits device and trailing numeric value 1 0.00445292
parseCommand keeps option plus value 1 0.00346469
parseCommand keeps non-numeric option (raw motor command) 1 0.00475817
parseCommand on empty input 1 0.00347597
ConfigLoader maps and defaults typed values 1 0.00270282
environment overrides file credentials 1 0.00221621
ConfigLoader validates input 1 0.00298553
AxisMap converts degrees and counts with an offset 1 0.00230693
AxisMap clamps to the soft range on the way out 1 0.002558
AxisMap supports a negative (flipped) direction 1 0.00332187
AxisMap toDeg guards against a zero scale 1 0.00316496
parseCategories maps names, all/none, and flags unknown tokens 1 0.0029767
catFromString round-trips and flags unknown 1 0.00489377
category enable/disable/set round-trip 1 0.00363933
LOG_TRACE_CAT gating is independent of the linear level 1 0.00382581
expandUser expands ~ and environment variables 1 0.00350332
configSearchPaths honours the CLI argument first 1 0.00459609
parseScanCsv reads waypoints and skips comments/blanks 1 0.0033773
parseScanCsv throws on a malformed line 1 0.00301251
generateScanGrid produces yaw_intervals x pitch_levels points 1 0.00422159
ScanGrid cursor ping-pongs at both ends 1 0.00240321
ScanGrid single point and empty are safe 1 0.00278729
CaptureScheduler sweeps the scan grid with MOVE + settle + trigger 1 0.00287004
CaptureScheduler ControlCode 1 drives yaw to the target heading 1 0.00311307
CaptureScheduler clamps the target heading to the soft range 1 0.00324622
CaptureScheduler stays idle when capture inactive 1 0.00263608
parseTelemetryLine reads a two-axis ST line 1 0.00286897
parseTelemetryLine reads a yaw-only ST line (no flags field) 1 0.00273373
parseTelemetryLine rejects non-ST and malformed lines 1 0.0025402
parseTelemetryLine tolerates trailing CR 1 0.00300437
axisStateLabel maps every state 1 0.00241024
axisStateColor signals health 1 0.00260139
formatDegrees: one decimal, sign preserved, degree sign appended 1 0.00250799
formatTimeAgo: buckets and the never case 1 0.00247251
pendingSensorsView: all fields absent until drivers land 1 0.00252874
---

View File

@ -0,0 +1,759 @@
Start testing: Jun 23 12:12 CEST
----------------------------------------------------------
1/36 Testing: parseCommand handles single-verb commands
1/36 Test: parseCommand handles single-verb commands
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseCommand handles single-verb commands"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseCommand handles single-verb commands" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 3 | 3 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseCommand handles single-verb commands" end time: Jun 23 12:12 CEST
"parseCommand handles single-verb commands" time elapsed: 00:00:00
----------------------------------------------------------
2/36 Testing: parseCommand splits device and trailing numeric value
2/36 Test: parseCommand splits device and trailing numeric value
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseCommand splits device and trailing numeric value"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseCommand splits device and trailing numeric value" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 5 | 5 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseCommand splits device and trailing numeric value" end time: Jun 23 12:12 CEST
"parseCommand splits device and trailing numeric value" time elapsed: 00:00:00
----------------------------------------------------------
3/36 Testing: parseCommand keeps option plus value
3/36 Test: parseCommand keeps option plus value
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseCommand keeps option plus value"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseCommand keeps option plus value" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 3 | 3 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseCommand keeps option plus value" end time: Jun 23 12:12 CEST
"parseCommand keeps option plus value" time elapsed: 00:00:00
----------------------------------------------------------
4/36 Testing: parseCommand keeps non-numeric option (raw motor command)
4/36 Test: parseCommand keeps non-numeric option (raw motor command)
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseCommand keeps non-numeric option (raw motor command)"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseCommand keeps non-numeric option (raw motor command)" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 3 | 3 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseCommand keeps non-numeric option (raw motor command)" end time: Jun 23 12:12 CEST
"parseCommand keeps non-numeric option (raw motor command)" time elapsed: 00:00:00
----------------------------------------------------------
5/36 Testing: parseCommand on empty input
5/36 Test: parseCommand on empty input
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseCommand on empty input"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseCommand on empty input" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 2 | 2 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseCommand on empty input" end time: Jun 23 12:12 CEST
"parseCommand on empty input" time elapsed: 00:00:00
----------------------------------------------------------
6/36 Testing: ConfigLoader maps and defaults typed values
6/36 Test: ConfigLoader maps and defaults typed values
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=ConfigLoader maps and defaults typed values"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"ConfigLoader maps and defaults typed values" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 10 | 10 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"ConfigLoader maps and defaults typed values" end time: Jun 23 12:12 CEST
"ConfigLoader maps and defaults typed values" time elapsed: 00:00:00
----------------------------------------------------------
7/36 Testing: environment overrides file credentials
7/36 Test: environment overrides file credentials
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=environment overrides file credentials"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"environment overrides file credentials" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 1 | 1 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"environment overrides file credentials" end time: Jun 23 12:12 CEST
"environment overrides file credentials" time elapsed: 00:00:00
----------------------------------------------------------
8/36 Testing: ConfigLoader validates input
8/36 Test: ConfigLoader validates input
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=ConfigLoader validates input"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"ConfigLoader validates input" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 3 | 3 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"ConfigLoader validates input" end time: Jun 23 12:12 CEST
"ConfigLoader validates input" time elapsed: 00:00:00
----------------------------------------------------------
9/36 Testing: AxisMap converts degrees and counts with an offset
9/36 Test: AxisMap converts degrees and counts with an offset
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=AxisMap converts degrees and counts with an offset"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"AxisMap converts degrees and counts with an offset" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 4 | 4 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"AxisMap converts degrees and counts with an offset" end time: Jun 23 12:12 CEST
"AxisMap converts degrees and counts with an offset" time elapsed: 00:00:00
----------------------------------------------------------
10/36 Testing: AxisMap clamps to the soft range on the way out
10/36 Test: AxisMap clamps to the soft range on the way out
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=AxisMap clamps to the soft range on the way out"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"AxisMap clamps to the soft range on the way out" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 3 | 3 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"AxisMap clamps to the soft range on the way out" end time: Jun 23 12:12 CEST
"AxisMap clamps to the soft range on the way out" time elapsed: 00:00:00
----------------------------------------------------------
11/36 Testing: AxisMap supports a negative (flipped) direction
11/36 Test: AxisMap supports a negative (flipped) direction
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=AxisMap supports a negative (flipped) direction"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"AxisMap supports a negative (flipped) direction" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 2 | 2 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"AxisMap supports a negative (flipped) direction" end time: Jun 23 12:12 CEST
"AxisMap supports a negative (flipped) direction" time elapsed: 00:00:00
----------------------------------------------------------
12/36 Testing: AxisMap toDeg guards against a zero scale
12/36 Test: AxisMap toDeg guards against a zero scale
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=AxisMap toDeg guards against a zero scale"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"AxisMap toDeg guards against a zero scale" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 1 | 1 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"AxisMap toDeg guards against a zero scale" end time: Jun 23 12:12 CEST
"AxisMap toDeg guards against a zero scale" time elapsed: 00:00:00
----------------------------------------------------------
13/36 Testing: parseCategories maps names, all/none, and flags unknown tokens
13/36 Test: parseCategories maps names, all/none, and flags unknown tokens
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseCategories maps names\, all/none\, and flags unknown tokens"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseCategories maps names, all/none, and flags unknown tokens" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 12 | 12 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseCategories maps names, all/none, and flags unknown tokens" end time: Jun 23 12:12 CEST
"parseCategories maps names, all/none, and flags unknown tokens" time elapsed: 00:00:00
----------------------------------------------------------
14/36 Testing: catFromString round-trips and flags unknown
14/36 Test: catFromString round-trips and flags unknown
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=catFromString round-trips and flags unknown"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"catFromString round-trips and flags unknown" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 4 | 4 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"catFromString round-trips and flags unknown" end time: Jun 23 12:12 CEST
"catFromString round-trips and flags unknown" time elapsed: 00:00:00
----------------------------------------------------------
15/36 Testing: category enable/disable/set round-trip
15/36 Test: category enable/disable/set round-trip
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=category enable/disable/set round-trip"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"category enable/disable/set round-trip" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 9 | 9 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"category enable/disable/set round-trip" end time: Jun 23 12:12 CEST
"category enable/disable/set round-trip" time elapsed: 00:00:00
----------------------------------------------------------
16/36 Testing: LOG_TRACE_CAT gating is independent of the linear level
16/36 Test: LOG_TRACE_CAT gating is independent of the linear level
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=LOG_TRACE_CAT gating is independent of the linear level"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"LOG_TRACE_CAT gating is independent of the linear level" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 5 | 5 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"LOG_TRACE_CAT gating is independent of the linear level" end time: Jun 23 12:12 CEST
"LOG_TRACE_CAT gating is independent of the linear level" time elapsed: 00:00:00
----------------------------------------------------------
17/36 Testing: expandUser expands ~ and environment variables
17/36 Test: expandUser expands ~ and environment variables
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=expandUser expands ~ and environment variables"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"expandUser expands ~ and environment variables" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 6 | 6 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"expandUser expands ~ and environment variables" end time: Jun 23 12:12 CEST
"expandUser expands ~ and environment variables" time elapsed: 00:00:00
----------------------------------------------------------
18/36 Testing: configSearchPaths honours the CLI argument first
18/36 Test: configSearchPaths honours the CLI argument first
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=configSearchPaths honours the CLI argument first"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"configSearchPaths honours the CLI argument first" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 2 | 2 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"configSearchPaths honours the CLI argument first" end time: Jun 23 12:12 CEST
"configSearchPaths honours the CLI argument first" time elapsed: 00:00:00
----------------------------------------------------------
19/36 Testing: parseScanCsv reads waypoints and skips comments/blanks
19/36 Test: parseScanCsv reads waypoints and skips comments/blanks
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseScanCsv reads waypoints and skips comments/blanks"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseScanCsv reads waypoints and skips comments/blanks" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 4 | 4 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseScanCsv reads waypoints and skips comments/blanks" end time: Jun 23 12:12 CEST
"parseScanCsv reads waypoints and skips comments/blanks" time elapsed: 00:00:00
----------------------------------------------------------
20/36 Testing: parseScanCsv throws on a malformed line
20/36 Test: parseScanCsv throws on a malformed line
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseScanCsv throws on a malformed line"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseScanCsv throws on a malformed line" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 2 | 2 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseScanCsv throws on a malformed line" end time: Jun 23 12:12 CEST
"parseScanCsv throws on a malformed line" time elapsed: 00:00:00
----------------------------------------------------------
21/36 Testing: generateScanGrid produces yaw_intervals x pitch_levels points
21/36 Test: generateScanGrid produces yaw_intervals x pitch_levels points
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=generateScanGrid produces yaw_intervals x pitch_levels points"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"generateScanGrid produces yaw_intervals x pitch_levels points" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 6 | 6 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"generateScanGrid produces yaw_intervals x pitch_levels points" end time: Jun 23 12:12 CEST
"generateScanGrid produces yaw_intervals x pitch_levels points" time elapsed: 00:00:00
----------------------------------------------------------
22/36 Testing: ScanGrid cursor ping-pongs at both ends
22/36 Test: ScanGrid cursor ping-pongs at both ends
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=ScanGrid cursor ping-pongs at both ends"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"ScanGrid cursor ping-pongs at both ends" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 6 | 6 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"ScanGrid cursor ping-pongs at both ends" end time: Jun 23 12:12 CEST
"ScanGrid cursor ping-pongs at both ends" time elapsed: 00:00:00
----------------------------------------------------------
23/36 Testing: ScanGrid single point and empty are safe
23/36 Test: ScanGrid single point and empty are safe
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=ScanGrid single point and empty are safe"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"ScanGrid single point and empty are safe" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 2 | 2 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"ScanGrid single point and empty are safe" end time: Jun 23 12:12 CEST
"ScanGrid single point and empty are safe" time elapsed: 00:00:00
----------------------------------------------------------
24/36 Testing: CaptureScheduler sweeps the scan grid with MOVE + settle + trigger
24/36 Test: CaptureScheduler sweeps the scan grid with MOVE + settle + trigger
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=CaptureScheduler sweeps the scan grid with MOVE + settle + trigger"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"CaptureScheduler sweeps the scan grid with MOVE + settle + trigger" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 9 | 9 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"CaptureScheduler sweeps the scan grid with MOVE + settle + trigger" end time: Jun 23 12:12 CEST
"CaptureScheduler sweeps the scan grid with MOVE + settle + trigger" time elapsed: 00:00:00
----------------------------------------------------------
25/36 Testing: CaptureScheduler ControlCode 1 drives yaw to the target heading
25/36 Test: CaptureScheduler ControlCode 1 drives yaw to the target heading
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=CaptureScheduler ControlCode 1 drives yaw to the target heading"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"CaptureScheduler ControlCode 1 drives yaw to the target heading" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 3 | 3 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"CaptureScheduler ControlCode 1 drives yaw to the target heading" end time: Jun 23 12:12 CEST
"CaptureScheduler ControlCode 1 drives yaw to the target heading" time elapsed: 00:00:00
----------------------------------------------------------
26/36 Testing: CaptureScheduler clamps the target heading to the soft range
26/36 Test: CaptureScheduler clamps the target heading to the soft range
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=CaptureScheduler clamps the target heading to the soft range"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"CaptureScheduler clamps the target heading to the soft range" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 1 | 1 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"CaptureScheduler clamps the target heading to the soft range" end time: Jun 23 12:12 CEST
"CaptureScheduler clamps the target heading to the soft range" time elapsed: 00:00:00
----------------------------------------------------------
27/36 Testing: CaptureScheduler stays idle when capture inactive
27/36 Test: CaptureScheduler stays idle when capture inactive
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=CaptureScheduler stays idle when capture inactive"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"CaptureScheduler stays idle when capture inactive" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 2 | 2 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"CaptureScheduler stays idle when capture inactive" end time: Jun 23 12:12 CEST
"CaptureScheduler stays idle when capture inactive" time elapsed: 00:00:00
----------------------------------------------------------
28/36 Testing: parseTelemetryLine reads a two-axis ST line
28/36 Test: parseTelemetryLine reads a two-axis ST line
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseTelemetryLine reads a two-axis ST line"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseTelemetryLine reads a two-axis ST line" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 15 | 15 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseTelemetryLine reads a two-axis ST line" end time: Jun 23 12:12 CEST
"parseTelemetryLine reads a two-axis ST line" time elapsed: 00:00:00
----------------------------------------------------------
29/36 Testing: parseTelemetryLine reads a yaw-only ST line (no flags field)
29/36 Test: parseTelemetryLine reads a yaw-only ST line (no flags field)
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseTelemetryLine reads a yaw-only ST line (no flags field)"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseTelemetryLine reads a yaw-only ST line (no flags field)" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 5 | 5 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseTelemetryLine reads a yaw-only ST line (no flags field)" end time: Jun 23 12:12 CEST
"parseTelemetryLine reads a yaw-only ST line (no flags field)" time elapsed: 00:00:00
----------------------------------------------------------
30/36 Testing: parseTelemetryLine rejects non-ST and malformed lines
30/36 Test: parseTelemetryLine rejects non-ST and malformed lines
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseTelemetryLine rejects non-ST and malformed lines"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseTelemetryLine rejects non-ST and malformed lines" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 7 | 7 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseTelemetryLine rejects non-ST and malformed lines" end time: Jun 23 12:12 CEST
"parseTelemetryLine rejects non-ST and malformed lines" time elapsed: 00:00:00
----------------------------------------------------------
31/36 Testing: parseTelemetryLine tolerates trailing CR
31/36 Test: parseTelemetryLine tolerates trailing CR
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=parseTelemetryLine tolerates trailing CR"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"parseTelemetryLine tolerates trailing CR" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 2 | 2 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"parseTelemetryLine tolerates trailing CR" end time: Jun 23 12:12 CEST
"parseTelemetryLine tolerates trailing CR" time elapsed: 00:00:00
----------------------------------------------------------
32/36 Testing: axisStateLabel maps every state
32/36 Test: axisStateLabel maps every state
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=axisStateLabel maps every state"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"axisStateLabel maps every state" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 6 | 6 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"axisStateLabel maps every state" end time: Jun 23 12:12 CEST
"axisStateLabel maps every state" time elapsed: 00:00:00
----------------------------------------------------------
33/36 Testing: axisStateColor signals health
33/36 Test: axisStateColor signals health
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=axisStateColor signals health"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"axisStateColor signals health" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 6 | 6 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"axisStateColor signals health" end time: Jun 23 12:12 CEST
"axisStateColor signals health" time elapsed: 00:00:00
----------------------------------------------------------
34/36 Testing: formatDegrees: one decimal, sign preserved, degree sign appended
34/36 Test: formatDegrees: one decimal, sign preserved, degree sign appended
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=formatDegrees: one decimal\, sign preserved\, degree sign appended"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"formatDegrees: one decimal, sign preserved, degree sign appended" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 3 | 3 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"formatDegrees: one decimal, sign preserved, degree sign appended" end time: Jun 23 12:12 CEST
"formatDegrees: one decimal, sign preserved, degree sign appended" time elapsed: 00:00:00
----------------------------------------------------------
35/36 Testing: formatTimeAgo: buckets and the never case
35/36 Test: formatTimeAgo: buckets and the never case
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=formatTimeAgo: buckets and the never case"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"formatTimeAgo: buckets and the never case" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 5 | 5 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"formatTimeAgo: buckets and the never case" end time: Jun 23 12:12 CEST
"formatTimeAgo: buckets and the never case" time elapsed: 00:00:00
----------------------------------------------------------
36/36 Testing: pendingSensorsView: all fields absent until drivers land
36/36 Test: pendingSensorsView: all fields absent until drivers land
Command: "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests" "--test-case=pendingSensorsView: all fields absent until drivers land"
Directory: /home/pedro/code/fwt_2a/software/build-notui/tests
"pendingSensorsView: all fields absent until drivers land" start time: Jun 23 12:12 CEST
Output:
----------------------------------------------------------
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
[doctest] test cases: 1 | 1 passed | 0 failed | 35 skipped
[doctest] assertions: 15 | 15 passed | 0 failed |
[doctest] Status: SUCCESS!
<end of output>
Test time = 0.00 sec
----------------------------------------------------------
Test Passed.
"pendingSensorsView: all fields absent until drivers land" end time: Jun 23 12:12 CEST
"pendingSensorsView: all fields absent until drivers land" time elapsed: 00:00:00
----------------------------------------------------------
End testing: Jun 23 12:12 CEST

View File

@ -0,0 +1,6 @@
# CMake generated Testfile for
# Source directory: /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src
# Build directory: /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-build
#
# This file includes the relevant testing commands required for
# testing this directory and lists subdirectories to be tested as well.

View File

@ -0,0 +1,242 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-notui
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target test
test:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..."
/usr/bin/ctest $(ARGS)
.PHONY : test
# Special rule for the target test
test/fast: test
.PHONY : test/fast
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# Special rule for the target list_install_components
list_install_components:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Unspecified\""
.PHONY : list_install_components
# Special rule for the target list_install_components
list_install_components/fast: list_install_components
.PHONY : list_install_components/fast
# Special rule for the target install
install: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
/usr/bin/cmake -P cmake_install.cmake
.PHONY : install
# Special rule for the target install
install/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
/usr/bin/cmake -P cmake_install.cmake
.PHONY : install/fast
# Special rule for the target install/local
install/local: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
.PHONY : install/local
# Special rule for the target install/local
install/local/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
.PHONY : install/local/fast
# Special rule for the target install/strip
install/strip: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
.PHONY : install/strip
# Special rule for the target install/strip
install/strip/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
.PHONY : install/strip/fast
# The main all target
all: cmake_check_build_system
cd /home/pedro/code/fwt_2a/software/build-notui && $(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/CMakeFiles /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-build//CMakeFiles/progress.marks
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/doctest-build/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/doctest-build/clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/doctest-build/preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/doctest-build/preinstall
.PHONY : preinstall/fast
# clear depends
depend:
cd /home/pedro/code/fwt_2a/software/build-notui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
# Convenience name for target.
_deps/doctest-build/CMakeFiles/doctest_with_main.dir/rule:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/doctest-build/CMakeFiles/doctest_with_main.dir/rule
.PHONY : _deps/doctest-build/CMakeFiles/doctest_with_main.dir/rule
# Convenience name for target.
doctest_with_main: _deps/doctest-build/CMakeFiles/doctest_with_main.dir/rule
.PHONY : doctest_with_main
# fast build rule for target.
doctest_with_main/fast:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f _deps/doctest-build/CMakeFiles/doctest_with_main.dir/build.make _deps/doctest-build/CMakeFiles/doctest_with_main.dir/build
.PHONY : doctest_with_main/fast
doctest/parts/doctest.o: doctest/parts/doctest.cpp.o
.PHONY : doctest/parts/doctest.o
# target to build an object file
doctest/parts/doctest.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f _deps/doctest-build/CMakeFiles/doctest_with_main.dir/build.make _deps/doctest-build/CMakeFiles/doctest_with_main.dir/doctest/parts/doctest.cpp.o
.PHONY : doctest/parts/doctest.cpp.o
doctest/parts/doctest.i: doctest/parts/doctest.cpp.i
.PHONY : doctest/parts/doctest.i
# target to preprocess a source file
doctest/parts/doctest.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f _deps/doctest-build/CMakeFiles/doctest_with_main.dir/build.make _deps/doctest-build/CMakeFiles/doctest_with_main.dir/doctest/parts/doctest.cpp.i
.PHONY : doctest/parts/doctest.cpp.i
doctest/parts/doctest.s: doctest/parts/doctest.cpp.s
.PHONY : doctest/parts/doctest.s
# target to generate assembly for a file
doctest/parts/doctest.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f _deps/doctest-build/CMakeFiles/doctest_with_main.dir/build.make _deps/doctest-build/CMakeFiles/doctest_with_main.dir/doctest/parts/doctest.cpp.s
.PHONY : doctest/parts/doctest.cpp.s
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... install"
@echo "... install/local"
@echo "... install/strip"
@echo "... list_install_components"
@echo "... rebuild_cache"
@echo "... test"
@echo "... doctest_with_main"
@echo "... doctest/parts/doctest.o"
@echo "... doctest/parts/doctest.i"
@echo "... doctest/parts/doctest.s"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
cd /home/pedro/code/fwt_2a/software/build-notui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

View File

@ -0,0 +1,6 @@
if(NOT TARGET doctest::doctest)
# Provide path for scripts
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
include("${CMAKE_CURRENT_LIST_DIR}/doctestTargets.cmake")
endif()

View File

@ -0,0 +1,65 @@
# This is a basic version file for the Config-mode of find_package().
# It is used by write_basic_package_version_file() as input file for configure_file()
# to create a version-file which can be installed along a config.cmake file.
#
# The created file sets PACKAGE_VERSION_EXACT if the current version string and
# the requested version string are exactly the same and it sets
# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,
# but only if the requested major version is the same as the current one.
# The variable CVF_VERSION must be set before calling configure_file().
set(PACKAGE_VERSION "2.4.11")
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
if("2.4.11" MATCHES "^([0-9]+)\\.")
set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
endif()
else()
set(CVF_VERSION_MAJOR "2.4.11")
endif()
if(PACKAGE_FIND_VERSION_RANGE)
# both endpoints of the range must have the expected major version
math (EXPR CVF_VERSION_MAJOR_NEXT "${CVF_VERSION_MAJOR} + 1")
if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR)
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT)))
set(PACKAGE_VERSION_COMPATIBLE FALSE)
elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX)
OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX)))
set(PACKAGE_VERSION_COMPATIBLE TRUE)
else()
set(PACKAGE_VERSION_COMPATIBLE FALSE)
endif()
else()
if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR)
set(PACKAGE_VERSION_COMPATIBLE TRUE)
else()
set(PACKAGE_VERSION_COMPATIBLE FALSE)
endif()
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()
endif()
# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "" STREQUAL "")
return()
endif()
# check that the installed version has the same 32/64bit-ness as the one which is currently searching:
if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "")
math(EXPR installedBits " * 8")
set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
set(PACKAGE_VERSION_UNSUITABLE TRUE)
endif()

@ -0,0 +1 @@
Subproject commit ae7a13539fb71f270b87eb2e874fbac80bc8dda2

View File

@ -0,0 +1,42 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION 4.3.3)
# Reject any attempt to use a toolchain file. We must not use one because
# we could be downloading it here. If the CMAKE_TOOLCHAIN_FILE environment
# variable is set, the cache variable will have been initialized from it.
unset(CMAKE_TOOLCHAIN_FILE CACHE)
unset(ENV{CMAKE_TOOLCHAIN_FILE})
# We name the project and the target for the ExternalProject_Add() call
# to something that will highlight to the user what we are working on if
# something goes wrong and an error message is produced.
project(doctest-populate NONE)
# Pass through things we've already detected in the main project to avoid
# paying the cost of redetecting them again in ExternalProject_Add()
set(GIT_EXECUTABLE [==[/usr/bin/git]==])
set(Git_VERSION [==[2.54.0]==])
set_property(GLOBAL PROPERTY _CMAKE_FindGit_GIT_EXECUTABLE_VERSION
[==[/usr/bin/git;2.54.0]==]
)
include(ExternalProject)
ExternalProject_Add(doctest-populate
"UPDATE_DISCONNECTED" "False" "GIT_REPOSITORY" "https://github.com/doctest/doctest.git" "EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR" "GIT_TAG" "v2.4.11" "GIT_SHALLOW" "TRUE"
SOURCE_DIR "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
BINARY_DIR "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-build"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
USES_TERMINAL_DOWNLOAD YES
USES_TERMINAL_UPDATE YES
USES_TERMINAL_PATCH YES
)

View File

@ -0,0 +1,162 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# The main all target
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/CMakeFiles /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild//CMakeFiles/progress.marks
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/CMakeFiles 0
.PHONY : all
# The main codegen target
codegen: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/CMakeFiles /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild//CMakeFiles/progress.marks
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 codegen
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/CMakeFiles 0
.PHONY : codegen
# The main clean target
clean:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall/fast
# clear depends
depend:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
#=============================================================================
# Target rules for targets named doctest-populate
# Build rule for target.
doctest-populate: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 doctest-populate
.PHONY : doctest-populate
# fast build rule for target.
doctest-populate/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/doctest-populate.dir/build.make CMakeFiles/doctest-populate.dir/build
.PHONY : doctest-populate/fast
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... codegen"
@echo "... edit_cache"
@echo "... rebuild_cache"
@echo "... doctest-populate"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

View File

@ -0,0 +1,15 @@
# This is a generated file and its contents are an internal implementation detail.
# The download step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
method=git
command=/usr/bin/cmake;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/tmp/doctest-populate-gitclone.cmake
source_dir=/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src
work_dir=/home/pedro/code/fwt_2a/software/build-notui/_deps
repository=https://github.com/doctest/doctest.git
remote=origin
init_submodules=TRUE
recurse_submodules=--recursive
submodules=
CMP0097=NEW

View File

@ -0,0 +1,15 @@
# This is a generated file and its contents are an internal implementation detail.
# The download step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
method=git
command=/usr/bin/cmake;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/tmp/doctest-populate-gitclone.cmake
source_dir=/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src
work_dir=/home/pedro/code/fwt_2a/software/build-notui/_deps
repository=https://github.com/doctest/doctest.git
remote=origin
init_submodules=TRUE
recurse_submodules=--recursive
submodules=
CMP0097=NEW

View File

@ -0,0 +1,6 @@
# This is a generated file and its contents are an internal implementation detail.
# The update step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
command=
work_dir=

View File

@ -0,0 +1,7 @@
# This is a generated file and its contents are an internal implementation detail.
# The patch step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
command (connected)=/usr/bin/cmake;-Dcan_fetch=YES;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/tmp/doctest-populate-gitupdate.cmake
command (disconnected)=/usr/bin/cmake;-Dcan_fetch=NO;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/tmp/doctest-populate-gitupdate.cmake
work_dir=/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src

View File

@ -0,0 +1,87 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION ${CMAKE_VERSION}) # this file comes with cmake
if(EXISTS "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitclone-lastrun.txt" AND EXISTS "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitinfo.txt" AND
"/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitclone-lastrun.txt" IS_NEWER_THAN "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitinfo.txt")
message(VERBOSE
"Avoiding repeated git clone, stamp file is up to date: "
"'/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitclone-lastrun.txt'"
)
return()
endif()
# Even at VERBOSE level, we don't want to see the commands executed, but
# enabling them to be shown for DEBUG may be useful to help diagnose problems.
cmake_language(GET_MESSAGE_LOG_LEVEL active_log_level)
if(active_log_level MATCHES "DEBUG|TRACE")
set(maybe_show_command COMMAND_ECHO STDOUT)
else()
set(maybe_show_command "")
endif()
execute_process(
COMMAND ${CMAKE_COMMAND} -E rm -rf "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
message(FATAL_ERROR "Failed to remove directory: '/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src'")
endif()
# try the clone 3 times in case there is an odd git clone issue
set(error_code 1)
set(number_of_tries 0)
while(error_code AND number_of_tries LESS 3)
execute_process(
COMMAND "/usr/bin/git"
clone --no-checkout --depth 1 --no-single-branch --config "advice.detachedHead=false" "https://github.com/doctest/doctest.git" "doctest-src"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps"
RESULT_VARIABLE error_code
${maybe_show_command}
)
math(EXPR number_of_tries "${number_of_tries} + 1")
endwhile()
if(number_of_tries GREATER 1)
message(NOTICE "Had to git clone more than once: ${number_of_tries} times.")
endif()
if(error_code)
message(FATAL_ERROR "Failed to clone repository: 'https://github.com/doctest/doctest.git'")
endif()
execute_process(
COMMAND "/usr/bin/git"
checkout "v2.4.11" --
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
message(FATAL_ERROR "Failed to checkout tag: 'v2.4.11'")
endif()
set(init_submodules TRUE)
if(init_submodules)
execute_process(
COMMAND "/usr/bin/git"
submodule update --recursive --init
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
endif()
if(error_code)
message(FATAL_ERROR "Failed to update submodules in: '/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src'")
endif()
# Complete success, update the script-last-run stamp file:
#
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitinfo.txt" "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitclone-lastrun.txt"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
message(FATAL_ERROR "Failed to copy script-last-run stamp file: '/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/doctest-populate-gitclone-lastrun.txt'")
endif()

View File

@ -0,0 +1,317 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION ${CMAKE_VERSION}) # this file comes with cmake
# Even at VERBOSE level, we don't want to see the commands executed, but
# enabling them to be shown for DEBUG may be useful to help diagnose problems.
cmake_language(GET_MESSAGE_LOG_LEVEL active_log_level)
if(active_log_level MATCHES "DEBUG|TRACE")
set(maybe_show_command COMMAND_ECHO STDOUT)
else()
set(maybe_show_command "")
endif()
function(do_fetch)
message(VERBOSE "Fetching latest from the remote origin")
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git fetch --tags --force "origin"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
COMMAND_ERROR_IS_FATAL LAST
${maybe_show_command}
)
endfunction()
function(get_hash_for_ref ref out_var err_var)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git rev-parse "${ref}^0"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE ref_hash
ERROR_VARIABLE error_msg
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(error_code)
set(${out_var} "" PARENT_SCOPE)
else()
set(${out_var} "${ref_hash}" PARENT_SCOPE)
endif()
set(${err_var} "${error_msg}" PARENT_SCOPE)
endfunction()
get_hash_for_ref(HEAD head_sha error_msg)
if(head_sha STREQUAL "")
message(FATAL_ERROR "Failed to get the hash for HEAD:\n${error_msg}")
endif()
if("${can_fetch}" STREQUAL "")
set(can_fetch "YES")
endif()
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git show-ref "v2.4.11"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
OUTPUT_VARIABLE show_ref_output
)
if(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/remotes/")
# Given a full remote/branch-name and we know about it already. Since
# branches can move around, we should always fetch, if permitted.
if(can_fetch)
do_fetch()
endif()
set(checkout_name "v2.4.11")
elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/tags/")
# Given a tag name that we already know about. We don't know if the tag we
# have matches the remote though (tags can move), so we should fetch. As a
# special case to preserve backward compatibility, if we are already at the
# same commit as the tag we hold locally, don't do a fetch and assume the tag
# hasn't moved on the remote.
# FIXME: We should provide an option to always fetch for this case
get_hash_for_ref("v2.4.11" tag_sha error_msg)
if(tag_sha STREQUAL head_sha)
message(VERBOSE "Already at requested tag: v2.4.11")
return()
endif()
if(can_fetch)
do_fetch()
endif()
set(checkout_name "v2.4.11")
elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/heads/")
# Given a branch name without any remote and we already have a branch by that
# name. We might already have that branch checked out or it might be a
# different branch. It isn't fully safe to use a bare branch name without the
# remote, so do a fetch (if allowed) and replace the ref with one that
# includes the remote.
if(can_fetch)
do_fetch()
endif()
set(checkout_name "origin/v2.4.11")
else()
get_hash_for_ref("v2.4.11" tag_sha error_msg)
if(tag_sha STREQUAL head_sha)
# Have the right commit checked out already
message(VERBOSE "Already at requested ref: ${tag_sha}")
return()
elseif(tag_sha STREQUAL "")
# We don't know about this ref yet, so we have no choice but to fetch.
if(NOT can_fetch)
message(FATAL_ERROR
"Requested git ref \"v2.4.11\" is not present locally, and not "
"allowed to contact remote due to UPDATE_DISCONNECTED setting."
)
endif()
# We deliberately swallow any error message at the default log level
# because it can be confusing for users to see a failed git command.
# That failure is being handled here, so it isn't an error.
if(NOT error_msg STREQUAL "")
message(DEBUG "${error_msg}")
endif()
do_fetch()
set(checkout_name "v2.4.11")
else()
# We have the commit, so we know we were asked to find a commit hash
# (otherwise it would have been handled further above), but we don't
# have that commit checked out yet. We don't need to fetch from the remote.
set(checkout_name "v2.4.11")
if(NOT error_msg STREQUAL "")
message(WARNING "${error_msg}")
endif()
endif()
endif()
set(git_update_strategy "REBASE")
if(git_update_strategy STREQUAL "")
# Backward compatibility requires REBASE as the default behavior
set(git_update_strategy REBASE)
endif()
if(git_update_strategy MATCHES "^REBASE(_CHECKOUT)?$")
# Asked to potentially try to rebase first, maybe with fallback to checkout.
# We can't if we aren't already on a branch and we shouldn't if that local
# branch isn't tracking the one we want to checkout.
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git symbolic-ref -q HEAD
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
OUTPUT_VARIABLE current_branch
OUTPUT_STRIP_TRAILING_WHITESPACE
# Don't test for an error. If this isn't a branch, we get a non-zero error
# code but empty output.
)
if(current_branch STREQUAL "")
# Not on a branch, checkout is the only sensible option since any rebase
# would always fail (and backward compatibility requires us to checkout in
# this situation)
set(git_update_strategy CHECKOUT)
else()
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git for-each-ref "--format=%(upstream:short)" "${current_branch}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
OUTPUT_VARIABLE upstream_branch
OUTPUT_STRIP_TRAILING_WHITESPACE
COMMAND_ERROR_IS_FATAL ANY # There is no error if no upstream is set
)
if(NOT upstream_branch STREQUAL checkout_name)
# Not safe to rebase when asked to checkout a different branch to the one
# we are tracking. If we did rebase, we could end up with arbitrary
# commits added to the ref we were asked to checkout if the current local
# branch happens to be able to rebase onto the target branch. There would
# be no error message and the user wouldn't know this was occurring.
set(git_update_strategy CHECKOUT)
endif()
endif()
elseif(NOT git_update_strategy STREQUAL "CHECKOUT")
message(FATAL_ERROR "Unsupported git update strategy: ${git_update_strategy}")
endif()
# Check if stash is needed
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git status --porcelain
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE repo_status
)
if(error_code)
message(FATAL_ERROR "Failed to get the status")
endif()
string(LENGTH "${repo_status}" need_stash)
# If not in clean state, stash changes in order to be able to perform a
# rebase or checkout without losing those changes permanently
if(need_stash)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash save --quiet;--include-untracked
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
endif()
if(git_update_strategy STREQUAL "CHECKOUT")
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git checkout "${checkout_name}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
else()
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git rebase "${checkout_name}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE rebase_output
ERROR_VARIABLE rebase_output
)
if(error_code)
# Rebase failed, undo the rebase attempt before continuing
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git rebase --abort
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
${maybe_show_command}
)
if(NOT git_update_strategy STREQUAL "REBASE_CHECKOUT")
# Not allowed to do a checkout as a fallback, so cannot proceed
if(need_stash)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --index --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
${maybe_show_command}
)
endif()
message(FATAL_ERROR "\nFailed to rebase in: '/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src'."
"\nOutput from the attempted rebase follows:"
"\n${rebase_output}"
"\n\nYou will have to resolve the conflicts manually")
endif()
# Fall back to checkout. We create an annotated tag so that the user
# can manually inspect the situation and revert if required.
# We can't log the failed rebase output because MSVC sees it and
# intervenes, causing the build to fail even though it completes.
# Write it to a file instead.
string(TIMESTAMP tag_timestamp "%Y%m%dT%H%M%S" UTC)
set(tag_name _cmake_ExternalProject_moved_from_here_${tag_timestamp}Z)
set(error_log_file ${CMAKE_CURRENT_LIST_DIR}/rebase_error_${tag_timestamp}Z.log)
file(WRITE ${error_log_file} "${rebase_output}")
message(WARNING "Rebase failed, output has been saved to ${error_log_file}"
"\nFalling back to checkout, previous commit tagged as ${tag_name}")
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git tag -a
-m "ExternalProject attempting to move from here to ${checkout_name}"
${tag_name}
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git checkout "${checkout_name}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
endif()
endif()
if(need_stash)
# Put back the stashed changes
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --index --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
# Stash pop --index failed: Try again dropping the index
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git reset --hard --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
${maybe_show_command}
)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
# Stash pop failed: Restore previous state.
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git reset --hard --quiet ${head_sha}
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
${maybe_show_command}
)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --index --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
${maybe_show_command}
)
message(FATAL_ERROR "\nFailed to unstash changes in: '/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src'."
"\nYou will have to resolve the conflicts manually")
endif()
endif()
endif()
set(init_submodules "TRUE")
if(init_submodules)
execute_process(
COMMAND "/usr/bin/git"
--git-dir=.git
submodule update --recursive --init
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
endif()

View File

@ -0,0 +1,27 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION ${CMAKE_VERSION}) # this file comes with cmake
# If CMAKE_DISABLE_SOURCE_CHANGES is set to true and the source directory is an
# existing directory in our source tree, calling file(MAKE_DIRECTORY) on it
# would cause a fatal error, even though it would be a no-op.
if(NOT EXISTS "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src")
file(MAKE_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-src")
endif()
file(MAKE_DIRECTORY
"/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-build"
"/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix"
"/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/tmp"
"/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp"
"/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src"
"/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp"
)
set(configSubDirs )
foreach(subDir IN LISTS configSubDirs)
file(MAKE_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp/${subDir}")
endforeach()
if(cfgdir)
file(MAKE_DIRECTORY "/home/pedro/code/fwt_2a/software/build-notui/_deps/doctest-subbuild/doctest-populate-prefix/src/doctest-populate-stamp${cfgdir}") # cfgdir has leading slash
endif()

BIN
build-notui/fire_gimbal_control Executable file

Binary file not shown.

BIN
build-notui/libfgc_core.a Normal file

Binary file not shown.

View File

@ -0,0 +1,8 @@
# CMake generated Testfile for
# Source directory: /home/pedro/code/fwt_2a/software/tests
# Build directory: /home/pedro/code/fwt_2a/software/build-notui/tests
#
# This file includes the relevant testing commands required for
# testing this directory and lists subdirectories to be tested as well.
include("/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests_include-b858cb2.cmake")
subdirs("../_deps/doctest-build")

485
build-notui/tests/Makefile Normal file
View File

@ -0,0 +1,485 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-notui
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target test
test:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running tests..."
/usr/bin/ctest $(ARGS)
.PHONY : test
# Special rule for the target test
test/fast: test
.PHONY : test/fast
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# Special rule for the target list_install_components
list_install_components:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Available install components are: \"Unspecified\""
.PHONY : list_install_components
# Special rule for the target list_install_components
list_install_components/fast: list_install_components
.PHONY : list_install_components/fast
# Special rule for the target install
install: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
/usr/bin/cmake -P cmake_install.cmake
.PHONY : install
# Special rule for the target install
install/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Install the project..."
/usr/bin/cmake -P cmake_install.cmake
.PHONY : install/fast
# Special rule for the target install/local
install/local: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
.PHONY : install/local
# Special rule for the target install/local
install/local/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing only the local directory..."
/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
.PHONY : install/local/fast
# Special rule for the target install/strip
install/strip: preinstall
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
.PHONY : install/strip
# Special rule for the target install/strip
install/strip/fast: preinstall/fast
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Installing the project stripped..."
/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
.PHONY : install/strip/fast
# The main all target
all: cmake_check_build_system
cd /home/pedro/code/fwt_2a/software/build-notui && $(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/CMakeFiles /home/pedro/code/fwt_2a/software/build-notui/tests//CMakeFiles/progress.marks
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-notui/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/preinstall
.PHONY : preinstall/fast
# clear depends
depend:
cd /home/pedro/code/fwt_2a/software/build-notui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
# Convenience name for target.
tests/CMakeFiles/fgc_tests.dir/rule:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 tests/CMakeFiles/fgc_tests.dir/rule
.PHONY : tests/CMakeFiles/fgc_tests.dir/rule
# Convenience name for target.
fgc_tests: tests/CMakeFiles/fgc_tests.dir/rule
.PHONY : fgc_tests
# fast build rule for target.
fgc_tests/fast:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/build
.PHONY : fgc_tests/fast
doctest_main.o: doctest_main.cpp.o
.PHONY : doctest_main.o
# target to build an object file
doctest_main.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/doctest_main.cpp.o
.PHONY : doctest_main.cpp.o
doctest_main.i: doctest_main.cpp.i
.PHONY : doctest_main.i
# target to preprocess a source file
doctest_main.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/doctest_main.cpp.i
.PHONY : doctest_main.cpp.i
doctest_main.s: doctest_main.cpp.s
.PHONY : doctest_main.s
# target to generate assembly for a file
doctest_main.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/doctest_main.cpp.s
.PHONY : doctest_main.cpp.s
test_command.o: test_command.cpp.o
.PHONY : test_command.o
# target to build an object file
test_command.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_command.cpp.o
.PHONY : test_command.cpp.o
test_command.i: test_command.cpp.i
.PHONY : test_command.i
# target to preprocess a source file
test_command.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_command.cpp.i
.PHONY : test_command.cpp.i
test_command.s: test_command.cpp.s
.PHONY : test_command.s
# target to generate assembly for a file
test_command.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_command.cpp.s
.PHONY : test_command.cpp.s
test_config.o: test_config.cpp.o
.PHONY : test_config.o
# target to build an object file
test_config.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_config.cpp.o
.PHONY : test_config.cpp.o
test_config.i: test_config.cpp.i
.PHONY : test_config.i
# target to preprocess a source file
test_config.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_config.cpp.i
.PHONY : test_config.cpp.i
test_config.s: test_config.cpp.s
.PHONY : test_config.s
# target to generate assembly for a file
test_config.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_config.cpp.s
.PHONY : test_config.cpp.s
test_geometry.o: test_geometry.cpp.o
.PHONY : test_geometry.o
# target to build an object file
test_geometry.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_geometry.cpp.o
.PHONY : test_geometry.cpp.o
test_geometry.i: test_geometry.cpp.i
.PHONY : test_geometry.i
# target to preprocess a source file
test_geometry.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_geometry.cpp.i
.PHONY : test_geometry.cpp.i
test_geometry.s: test_geometry.cpp.s
.PHONY : test_geometry.s
# target to generate assembly for a file
test_geometry.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_geometry.cpp.s
.PHONY : test_geometry.cpp.s
test_logger.o: test_logger.cpp.o
.PHONY : test_logger.o
# target to build an object file
test_logger.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_logger.cpp.o
.PHONY : test_logger.cpp.o
test_logger.i: test_logger.cpp.i
.PHONY : test_logger.i
# target to preprocess a source file
test_logger.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_logger.cpp.i
.PHONY : test_logger.cpp.i
test_logger.s: test_logger.cpp.s
.PHONY : test_logger.s
# target to generate assembly for a file
test_logger.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_logger.cpp.s
.PHONY : test_logger.cpp.s
test_paths.o: test_paths.cpp.o
.PHONY : test_paths.o
# target to build an object file
test_paths.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_paths.cpp.o
.PHONY : test_paths.cpp.o
test_paths.i: test_paths.cpp.i
.PHONY : test_paths.i
# target to preprocess a source file
test_paths.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_paths.cpp.i
.PHONY : test_paths.cpp.i
test_paths.s: test_paths.cpp.s
.PHONY : test_paths.s
# target to generate assembly for a file
test_paths.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_paths.cpp.s
.PHONY : test_paths.cpp.s
test_scangrid.o: test_scangrid.cpp.o
.PHONY : test_scangrid.o
# target to build an object file
test_scangrid.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_scangrid.cpp.o
.PHONY : test_scangrid.cpp.o
test_scangrid.i: test_scangrid.cpp.i
.PHONY : test_scangrid.i
# target to preprocess a source file
test_scangrid.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_scangrid.cpp.i
.PHONY : test_scangrid.cpp.i
test_scangrid.s: test_scangrid.cpp.s
.PHONY : test_scangrid.s
# target to generate assembly for a file
test_scangrid.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_scangrid.cpp.s
.PHONY : test_scangrid.cpp.s
test_scheduler.o: test_scheduler.cpp.o
.PHONY : test_scheduler.o
# target to build an object file
test_scheduler.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_scheduler.cpp.o
.PHONY : test_scheduler.cpp.o
test_scheduler.i: test_scheduler.cpp.i
.PHONY : test_scheduler.i
# target to preprocess a source file
test_scheduler.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_scheduler.cpp.i
.PHONY : test_scheduler.cpp.i
test_scheduler.s: test_scheduler.cpp.s
.PHONY : test_scheduler.s
# target to generate assembly for a file
test_scheduler.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_scheduler.cpp.s
.PHONY : test_scheduler.cpp.s
test_telemetry.o: test_telemetry.cpp.o
.PHONY : test_telemetry.o
# target to build an object file
test_telemetry.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_telemetry.cpp.o
.PHONY : test_telemetry.cpp.o
test_telemetry.i: test_telemetry.cpp.i
.PHONY : test_telemetry.i
# target to preprocess a source file
test_telemetry.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_telemetry.cpp.i
.PHONY : test_telemetry.cpp.i
test_telemetry.s: test_telemetry.cpp.s
.PHONY : test_telemetry.s
# target to generate assembly for a file
test_telemetry.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_telemetry.cpp.s
.PHONY : test_telemetry.cpp.s
test_uisnapshot.o: test_uisnapshot.cpp.o
.PHONY : test_uisnapshot.o
# target to build an object file
test_uisnapshot.cpp.o:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_uisnapshot.cpp.o
.PHONY : test_uisnapshot.cpp.o
test_uisnapshot.i: test_uisnapshot.cpp.i
.PHONY : test_uisnapshot.i
# target to preprocess a source file
test_uisnapshot.cpp.i:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_uisnapshot.cpp.i
.PHONY : test_uisnapshot.cpp.i
test_uisnapshot.s: test_uisnapshot.cpp.s
.PHONY : test_uisnapshot.s
# target to generate assembly for a file
test_uisnapshot.cpp.s:
cd /home/pedro/code/fwt_2a/software/build-notui && $(MAKE) $(MAKESILENT) -f tests/CMakeFiles/fgc_tests.dir/build.make tests/CMakeFiles/fgc_tests.dir/test_uisnapshot.cpp.s
.PHONY : test_uisnapshot.cpp.s
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... install"
@echo "... install/local"
@echo "... install/strip"
@echo "... list_install_components"
@echo "... rebuild_cache"
@echo "... test"
@echo "... fgc_tests"
@echo "... doctest_main.o"
@echo "... doctest_main.i"
@echo "... doctest_main.s"
@echo "... test_command.o"
@echo "... test_command.i"
@echo "... test_command.s"
@echo "... test_config.o"
@echo "... test_config.i"
@echo "... test_config.s"
@echo "... test_geometry.o"
@echo "... test_geometry.i"
@echo "... test_geometry.s"
@echo "... test_logger.o"
@echo "... test_logger.i"
@echo "... test_logger.s"
@echo "... test_paths.o"
@echo "... test_paths.i"
@echo "... test_paths.s"
@echo "... test_scangrid.o"
@echo "... test_scangrid.i"
@echo "... test_scangrid.s"
@echo "... test_scheduler.o"
@echo "... test_scheduler.i"
@echo "... test_scheduler.s"
@echo "... test_telemetry.o"
@echo "... test_telemetry.i"
@echo "... test_telemetry.s"
@echo "... test_uisnapshot.o"
@echo "... test_uisnapshot.i"
@echo "... test_uisnapshot.s"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
cd /home/pedro/code/fwt_2a/software/build-notui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

BIN
build-notui/tests/fgc_tests Executable file

Binary file not shown.

View File

@ -0,0 +1,5 @@
if(EXISTS "/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests_tests-b858cb2.cmake")
include("/home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests_tests-b858cb2.cmake")
else()
add_test(fgc_tests_NOT_BUILT-b858cb2 fgc_tests_NOT_BUILT-b858cb2)
endif()

View File

@ -0,0 +1,73 @@
add_test( [==[parseCommand handles single-verb commands]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseCommand handles single-verb commands]==])
set_tests_properties( [==[parseCommand handles single-verb commands]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseCommand splits device and trailing numeric value]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseCommand splits device and trailing numeric value]==])
set_tests_properties( [==[parseCommand splits device and trailing numeric value]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseCommand keeps option plus value]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseCommand keeps option plus value]==])
set_tests_properties( [==[parseCommand keeps option plus value]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseCommand keeps non-numeric option (raw motor command)]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseCommand keeps non-numeric option (raw motor command)]==])
set_tests_properties( [==[parseCommand keeps non-numeric option (raw motor command)]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseCommand on empty input]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseCommand on empty input]==])
set_tests_properties( [==[parseCommand on empty input]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[ConfigLoader maps and defaults typed values]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=ConfigLoader maps and defaults typed values]==])
set_tests_properties( [==[ConfigLoader maps and defaults typed values]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[environment overrides file credentials]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=environment overrides file credentials]==])
set_tests_properties( [==[environment overrides file credentials]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[ConfigLoader validates input]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=ConfigLoader validates input]==])
set_tests_properties( [==[ConfigLoader validates input]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[AxisMap converts degrees and counts with an offset]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=AxisMap converts degrees and counts with an offset]==])
set_tests_properties( [==[AxisMap converts degrees and counts with an offset]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[AxisMap clamps to the soft range on the way out]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=AxisMap clamps to the soft range on the way out]==])
set_tests_properties( [==[AxisMap clamps to the soft range on the way out]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[AxisMap supports a negative (flipped) direction]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=AxisMap supports a negative (flipped) direction]==])
set_tests_properties( [==[AxisMap supports a negative (flipped) direction]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[AxisMap toDeg guards against a zero scale]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=AxisMap toDeg guards against a zero scale]==])
set_tests_properties( [==[AxisMap toDeg guards against a zero scale]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseCategories maps names, all/none, and flags unknown tokens]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseCategories maps names\, all/none\, and flags unknown tokens]==])
set_tests_properties( [==[parseCategories maps names, all/none, and flags unknown tokens]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[catFromString round-trips and flags unknown]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=catFromString round-trips and flags unknown]==])
set_tests_properties( [==[catFromString round-trips and flags unknown]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[category enable/disable/set round-trip]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=category enable/disable/set round-trip]==])
set_tests_properties( [==[category enable/disable/set round-trip]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[LOG_TRACE_CAT gating is independent of the linear level]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=LOG_TRACE_CAT gating is independent of the linear level]==])
set_tests_properties( [==[LOG_TRACE_CAT gating is independent of the linear level]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[expandUser expands ~ and environment variables]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=expandUser expands ~ and environment variables]==])
set_tests_properties( [==[expandUser expands ~ and environment variables]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[configSearchPaths honours the CLI argument first]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=configSearchPaths honours the CLI argument first]==])
set_tests_properties( [==[configSearchPaths honours the CLI argument first]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseScanCsv reads waypoints and skips comments/blanks]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseScanCsv reads waypoints and skips comments/blanks]==])
set_tests_properties( [==[parseScanCsv reads waypoints and skips comments/blanks]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseScanCsv throws on a malformed line]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseScanCsv throws on a malformed line]==])
set_tests_properties( [==[parseScanCsv throws on a malformed line]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[generateScanGrid produces yaw_intervals x pitch_levels points]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=generateScanGrid produces yaw_intervals x pitch_levels points]==])
set_tests_properties( [==[generateScanGrid produces yaw_intervals x pitch_levels points]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[ScanGrid cursor ping-pongs at both ends]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=ScanGrid cursor ping-pongs at both ends]==])
set_tests_properties( [==[ScanGrid cursor ping-pongs at both ends]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[ScanGrid single point and empty are safe]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=ScanGrid single point and empty are safe]==])
set_tests_properties( [==[ScanGrid single point and empty are safe]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[CaptureScheduler sweeps the scan grid with MOVE + settle + trigger]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=CaptureScheduler sweeps the scan grid with MOVE + settle + trigger]==])
set_tests_properties( [==[CaptureScheduler sweeps the scan grid with MOVE + settle + trigger]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[CaptureScheduler ControlCode 1 drives yaw to the target heading]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=CaptureScheduler ControlCode 1 drives yaw to the target heading]==])
set_tests_properties( [==[CaptureScheduler ControlCode 1 drives yaw to the target heading]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[CaptureScheduler clamps the target heading to the soft range]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=CaptureScheduler clamps the target heading to the soft range]==])
set_tests_properties( [==[CaptureScheduler clamps the target heading to the soft range]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[CaptureScheduler stays idle when capture inactive]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=CaptureScheduler stays idle when capture inactive]==])
set_tests_properties( [==[CaptureScheduler stays idle when capture inactive]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseTelemetryLine reads a two-axis ST line]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseTelemetryLine reads a two-axis ST line]==])
set_tests_properties( [==[parseTelemetryLine reads a two-axis ST line]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseTelemetryLine reads a yaw-only ST line (no flags field)]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseTelemetryLine reads a yaw-only ST line (no flags field)]==])
set_tests_properties( [==[parseTelemetryLine reads a yaw-only ST line (no flags field)]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseTelemetryLine rejects non-ST and malformed lines]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseTelemetryLine rejects non-ST and malformed lines]==])
set_tests_properties( [==[parseTelemetryLine rejects non-ST and malformed lines]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[parseTelemetryLine tolerates trailing CR]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=parseTelemetryLine tolerates trailing CR]==])
set_tests_properties( [==[parseTelemetryLine tolerates trailing CR]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[axisStateLabel maps every state]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=axisStateLabel maps every state]==])
set_tests_properties( [==[axisStateLabel maps every state]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[axisStateColor signals health]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=axisStateColor signals health]==])
set_tests_properties( [==[axisStateColor signals health]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[formatDegrees: one decimal, sign preserved, degree sign appended]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=formatDegrees: one decimal\, sign preserved\, degree sign appended]==])
set_tests_properties( [==[formatDegrees: one decimal, sign preserved, degree sign appended]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[formatTimeAgo: buckets and the never case]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=formatTimeAgo: buckets and the never case]==])
set_tests_properties( [==[formatTimeAgo: buckets and the never case]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
add_test( [==[pendingSensorsView: all fields absent until drivers land]==] /home/pedro/code/fwt_2a/software/build-notui/tests/fgc_tests [==[--test-case=pendingSensorsView: all fields absent until drivers land]==])
set_tests_properties( [==[pendingSensorsView: all fields absent until drivers land]==] PROPERTIES WORKING_DIRECTORY /home/pedro/code/fwt_2a/software/build-notui/tests LABELS)
set( fgc_tests_TESTS [==[parseCommand handles single-verb commands]==] [==[parseCommand splits device and trailing numeric value]==] [==[parseCommand keeps option plus value]==] [==[parseCommand keeps non-numeric option (raw motor command)]==] [==[parseCommand on empty input]==] [==[ConfigLoader maps and defaults typed values]==] [==[environment overrides file credentials]==] [==[ConfigLoader validates input]==] [==[AxisMap converts degrees and counts with an offset]==] [==[AxisMap clamps to the soft range on the way out]==] [==[AxisMap supports a negative (flipped) direction]==] [==[AxisMap toDeg guards against a zero scale]==] [==[parseCategories maps names, all/none, and flags unknown tokens]==] [==[catFromString round-trips and flags unknown]==] [==[category enable/disable/set round-trip]==] [==[LOG_TRACE_CAT gating is independent of the linear level]==] [==[expandUser expands ~ and environment variables]==] [==[configSearchPaths honours the CLI argument first]==] [==[parseScanCsv reads waypoints and skips comments/blanks]==] [==[parseScanCsv throws on a malformed line]==] [==[generateScanGrid produces yaw_intervals x pitch_levels points]==] [==[ScanGrid cursor ping-pongs at both ends]==] [==[ScanGrid single point and empty are safe]==] [==[CaptureScheduler sweeps the scan grid with MOVE + settle + trigger]==] [==[CaptureScheduler ControlCode 1 drives yaw to the target heading]==] [==[CaptureScheduler clamps the target heading to the soft range]==] [==[CaptureScheduler stays idle when capture inactive]==] [==[parseTelemetryLine reads a two-axis ST line]==] [==[parseTelemetryLine reads a yaw-only ST line (no flags field)]==] [==[parseTelemetryLine rejects non-ST and malformed lines]==] [==[parseTelemetryLine tolerates trailing CR]==] [==[axisStateLabel maps every state]==] [==[axisStateColor signals health]==] [==[formatDegrees: one decimal, sign preserved, degree sign appended]==] [==[formatTimeAgo: buckets and the never case]==] [==[pendingSensorsView: all fields absent until drivers land]==])

669
build-tui/Makefile Normal file
View File

@ -0,0 +1,669 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-tui
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# The main all target
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/CMakeFiles /home/pedro/code/fwt_2a/software/build-tui//CMakeFiles/progress.marks
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall/fast
# clear depends
depend:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
#=============================================================================
# Target rules for targets named fgc_core
# Build rule for target.
fgc_core: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 fgc_core
.PHONY : fgc_core
# fast build rule for target.
fgc_core/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/build
.PHONY : fgc_core/fast
#=============================================================================
# Target rules for targets named fire_gimbal_control
# Build rule for target.
fire_gimbal_control: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 fire_gimbal_control
.PHONY : fire_gimbal_control
# fast build rule for target.
fire_gimbal_control/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/build
.PHONY : fire_gimbal_control/fast
#=============================================================================
# Target rules for targets named screen
# Build rule for target.
screen: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 screen
.PHONY : screen
# fast build rule for target.
screen/fast:
$(MAKE) $(MAKESILENT) -f _deps/ftxui-build/CMakeFiles/screen.dir/build.make _deps/ftxui-build/CMakeFiles/screen.dir/build
.PHONY : screen/fast
#=============================================================================
# Target rules for targets named dom
# Build rule for target.
dom: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 dom
.PHONY : dom
# fast build rule for target.
dom/fast:
$(MAKE) $(MAKESILENT) -f _deps/ftxui-build/CMakeFiles/dom.dir/build.make _deps/ftxui-build/CMakeFiles/dom.dir/build
.PHONY : dom/fast
#=============================================================================
# Target rules for targets named component
# Build rule for target.
component: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 component
.PHONY : component
# fast build rule for target.
component/fast:
$(MAKE) $(MAKESILENT) -f _deps/ftxui-build/CMakeFiles/component.dir/build.make _deps/ftxui-build/CMakeFiles/component.dir/build
.PHONY : component/fast
ini.o: ini.c.o
.PHONY : ini.o
# target to build an object file
ini.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/ini.c.o
.PHONY : ini.c.o
ini.i: ini.c.i
.PHONY : ini.i
# target to preprocess a source file
ini.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/ini.c.i
.PHONY : ini.c.i
ini.s: ini.c.s
.PHONY : ini.s
# target to generate assembly for a file
ini.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/ini.c.s
.PHONY : ini.c.s
main.o: main.cpp.o
.PHONY : main.o
# target to build an object file
main.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/main.cpp.o
.PHONY : main.cpp.o
main.i: main.cpp.i
.PHONY : main.i
# target to preprocess a source file
main.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/main.cpp.i
.PHONY : main.cpp.i
main.s: main.cpp.s
.PHONY : main.s
# target to generate assembly for a file
main.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/main.cpp.s
.PHONY : main.cpp.s
src/camera/ImagePipeline.o: src/camera/ImagePipeline.cpp.o
.PHONY : src/camera/ImagePipeline.o
# target to build an object file
src/camera/ImagePipeline.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/ImagePipeline.cpp.o
.PHONY : src/camera/ImagePipeline.cpp.o
src/camera/ImagePipeline.i: src/camera/ImagePipeline.cpp.i
.PHONY : src/camera/ImagePipeline.i
# target to preprocess a source file
src/camera/ImagePipeline.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/ImagePipeline.cpp.i
.PHONY : src/camera/ImagePipeline.cpp.i
src/camera/ImagePipeline.s: src/camera/ImagePipeline.cpp.s
.PHONY : src/camera/ImagePipeline.s
# target to generate assembly for a file
src/camera/ImagePipeline.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/ImagePipeline.cpp.s
.PHONY : src/camera/ImagePipeline.cpp.s
src/camera/JpegXlEncoder.o: src/camera/JpegXlEncoder.cpp.o
.PHONY : src/camera/JpegXlEncoder.o
# target to build an object file
src/camera/JpegXlEncoder.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/JpegXlEncoder.cpp.o
.PHONY : src/camera/JpegXlEncoder.cpp.o
src/camera/JpegXlEncoder.i: src/camera/JpegXlEncoder.cpp.i
.PHONY : src/camera/JpegXlEncoder.i
# target to preprocess a source file
src/camera/JpegXlEncoder.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/JpegXlEncoder.cpp.i
.PHONY : src/camera/JpegXlEncoder.cpp.i
src/camera/JpegXlEncoder.s: src/camera/JpegXlEncoder.cpp.s
.PHONY : src/camera/JpegXlEncoder.s
# target to generate assembly for a file
src/camera/JpegXlEncoder.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/camera/JpegXlEncoder.cpp.s
.PHONY : src/camera/JpegXlEncoder.cpp.s
src/core/Application.o: src/core/Application.cpp.o
.PHONY : src/core/Application.o
# target to build an object file
src/core/Application.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/core/Application.cpp.o
.PHONY : src/core/Application.cpp.o
src/core/Application.i: src/core/Application.cpp.i
.PHONY : src/core/Application.i
# target to preprocess a source file
src/core/Application.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/core/Application.cpp.i
.PHONY : src/core/Application.cpp.i
src/core/Application.s: src/core/Application.cpp.s
.PHONY : src/core/Application.s
# target to generate assembly for a file
src/core/Application.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/core/Application.cpp.s
.PHONY : src/core/Application.cpp.s
src/core/CaptureScheduler.o: src/core/CaptureScheduler.cpp.o
.PHONY : src/core/CaptureScheduler.o
# target to build an object file
src/core/CaptureScheduler.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CaptureScheduler.cpp.o
.PHONY : src/core/CaptureScheduler.cpp.o
src/core/CaptureScheduler.i: src/core/CaptureScheduler.cpp.i
.PHONY : src/core/CaptureScheduler.i
# target to preprocess a source file
src/core/CaptureScheduler.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CaptureScheduler.cpp.i
.PHONY : src/core/CaptureScheduler.cpp.i
src/core/CaptureScheduler.s: src/core/CaptureScheduler.cpp.s
.PHONY : src/core/CaptureScheduler.s
# target to generate assembly for a file
src/core/CaptureScheduler.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CaptureScheduler.cpp.s
.PHONY : src/core/CaptureScheduler.cpp.s
src/core/CommandParser.o: src/core/CommandParser.cpp.o
.PHONY : src/core/CommandParser.o
# target to build an object file
src/core/CommandParser.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CommandParser.cpp.o
.PHONY : src/core/CommandParser.cpp.o
src/core/CommandParser.i: src/core/CommandParser.cpp.i
.PHONY : src/core/CommandParser.i
# target to preprocess a source file
src/core/CommandParser.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CommandParser.cpp.i
.PHONY : src/core/CommandParser.cpp.i
src/core/CommandParser.s: src/core/CommandParser.cpp.s
.PHONY : src/core/CommandParser.s
# target to generate assembly for a file
src/core/CommandParser.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/CommandParser.cpp.s
.PHONY : src/core/CommandParser.cpp.s
src/core/Config.o: src/core/Config.cpp.o
.PHONY : src/core/Config.o
# target to build an object file
src/core/Config.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Config.cpp.o
.PHONY : src/core/Config.cpp.o
src/core/Config.i: src/core/Config.cpp.i
.PHONY : src/core/Config.i
# target to preprocess a source file
src/core/Config.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Config.cpp.i
.PHONY : src/core/Config.cpp.i
src/core/Config.s: src/core/Config.cpp.s
.PHONY : src/core/Config.s
# target to generate assembly for a file
src/core/Config.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Config.cpp.s
.PHONY : src/core/Config.cpp.s
src/core/Geometry.o: src/core/Geometry.cpp.o
.PHONY : src/core/Geometry.o
# target to build an object file
src/core/Geometry.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Geometry.cpp.o
.PHONY : src/core/Geometry.cpp.o
src/core/Geometry.i: src/core/Geometry.cpp.i
.PHONY : src/core/Geometry.i
# target to preprocess a source file
src/core/Geometry.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Geometry.cpp.i
.PHONY : src/core/Geometry.cpp.i
src/core/Geometry.s: src/core/Geometry.cpp.s
.PHONY : src/core/Geometry.s
# target to generate assembly for a file
src/core/Geometry.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Geometry.cpp.s
.PHONY : src/core/Geometry.cpp.s
src/core/Logger.o: src/core/Logger.cpp.o
.PHONY : src/core/Logger.o
# target to build an object file
src/core/Logger.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Logger.cpp.o
.PHONY : src/core/Logger.cpp.o
src/core/Logger.i: src/core/Logger.cpp.i
.PHONY : src/core/Logger.i
# target to preprocess a source file
src/core/Logger.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Logger.cpp.i
.PHONY : src/core/Logger.cpp.i
src/core/Logger.s: src/core/Logger.cpp.s
.PHONY : src/core/Logger.s
# target to generate assembly for a file
src/core/Logger.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Logger.cpp.s
.PHONY : src/core/Logger.cpp.s
src/core/Paths.o: src/core/Paths.cpp.o
.PHONY : src/core/Paths.o
# target to build an object file
src/core/Paths.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Paths.cpp.o
.PHONY : src/core/Paths.cpp.o
src/core/Paths.i: src/core/Paths.cpp.i
.PHONY : src/core/Paths.i
# target to preprocess a source file
src/core/Paths.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Paths.cpp.i
.PHONY : src/core/Paths.cpp.i
src/core/Paths.s: src/core/Paths.cpp.s
.PHONY : src/core/Paths.s
# target to generate assembly for a file
src/core/Paths.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/Paths.cpp.s
.PHONY : src/core/Paths.cpp.s
src/core/ScanGrid.o: src/core/ScanGrid.cpp.o
.PHONY : src/core/ScanGrid.o
# target to build an object file
src/core/ScanGrid.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/ScanGrid.cpp.o
.PHONY : src/core/ScanGrid.cpp.o
src/core/ScanGrid.i: src/core/ScanGrid.cpp.i
.PHONY : src/core/ScanGrid.i
# target to preprocess a source file
src/core/ScanGrid.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/ScanGrid.cpp.i
.PHONY : src/core/ScanGrid.cpp.i
src/core/ScanGrid.s: src/core/ScanGrid.cpp.s
.PHONY : src/core/ScanGrid.s
# target to generate assembly for a file
src/core/ScanGrid.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/ScanGrid.cpp.s
.PHONY : src/core/ScanGrid.cpp.s
src/core/TelemetryParser.o: src/core/TelemetryParser.cpp.o
.PHONY : src/core/TelemetryParser.o
# target to build an object file
src/core/TelemetryParser.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/TelemetryParser.cpp.o
.PHONY : src/core/TelemetryParser.cpp.o
src/core/TelemetryParser.i: src/core/TelemetryParser.cpp.i
.PHONY : src/core/TelemetryParser.i
# target to preprocess a source file
src/core/TelemetryParser.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/TelemetryParser.cpp.i
.PHONY : src/core/TelemetryParser.cpp.i
src/core/TelemetryParser.s: src/core/TelemetryParser.cpp.s
.PHONY : src/core/TelemetryParser.s
# target to generate assembly for a file
src/core/TelemetryParser.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/core/TelemetryParser.cpp.s
.PHONY : src/core/TelemetryParser.cpp.s
src/serial/SerialMotorController.o: src/serial/SerialMotorController.cpp.o
.PHONY : src/serial/SerialMotorController.o
# target to build an object file
src/serial/SerialMotorController.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/serial/SerialMotorController.cpp.o
.PHONY : src/serial/SerialMotorController.cpp.o
src/serial/SerialMotorController.i: src/serial/SerialMotorController.cpp.i
.PHONY : src/serial/SerialMotorController.i
# target to preprocess a source file
src/serial/SerialMotorController.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/serial/SerialMotorController.cpp.i
.PHONY : src/serial/SerialMotorController.cpp.i
src/serial/SerialMotorController.s: src/serial/SerialMotorController.cpp.s
.PHONY : src/serial/SerialMotorController.s
# target to generate assembly for a file
src/serial/SerialMotorController.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/serial/SerialMotorController.cpp.s
.PHONY : src/serial/SerialMotorController.cpp.s
src/ui/HeadlessUi.o: src/ui/HeadlessUi.cpp.o
.PHONY : src/ui/HeadlessUi.o
# target to build an object file
src/ui/HeadlessUi.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/HeadlessUi.cpp.o
.PHONY : src/ui/HeadlessUi.cpp.o
src/ui/HeadlessUi.i: src/ui/HeadlessUi.cpp.i
.PHONY : src/ui/HeadlessUi.i
# target to preprocess a source file
src/ui/HeadlessUi.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/HeadlessUi.cpp.i
.PHONY : src/ui/HeadlessUi.cpp.i
src/ui/HeadlessUi.s: src/ui/HeadlessUi.cpp.s
.PHONY : src/ui/HeadlessUi.s
# target to generate assembly for a file
src/ui/HeadlessUi.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/HeadlessUi.cpp.s
.PHONY : src/ui/HeadlessUi.cpp.s
src/ui/TuiUi.o: src/ui/TuiUi.cpp.o
.PHONY : src/ui/TuiUi.o
# target to build an object file
src/ui/TuiUi.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/ui/TuiUi.cpp.o
.PHONY : src/ui/TuiUi.cpp.o
src/ui/TuiUi.i: src/ui/TuiUi.cpp.i
.PHONY : src/ui/TuiUi.i
# target to preprocess a source file
src/ui/TuiUi.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/ui/TuiUi.cpp.i
.PHONY : src/ui/TuiUi.cpp.i
src/ui/TuiUi.s: src/ui/TuiUi.cpp.s
.PHONY : src/ui/TuiUi.s
# target to generate assembly for a file
src/ui/TuiUi.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fire_gimbal_control.dir/build.make CMakeFiles/fire_gimbal_control.dir/src/ui/TuiUi.cpp.s
.PHONY : src/ui/TuiUi.cpp.s
src/ui/UiSnapshot.o: src/ui/UiSnapshot.cpp.o
.PHONY : src/ui/UiSnapshot.o
# target to build an object file
src/ui/UiSnapshot.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/UiSnapshot.cpp.o
.PHONY : src/ui/UiSnapshot.cpp.o
src/ui/UiSnapshot.i: src/ui/UiSnapshot.cpp.i
.PHONY : src/ui/UiSnapshot.i
# target to preprocess a source file
src/ui/UiSnapshot.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/UiSnapshot.cpp.i
.PHONY : src/ui/UiSnapshot.cpp.i
src/ui/UiSnapshot.s: src/ui/UiSnapshot.cpp.s
.PHONY : src/ui/UiSnapshot.s
# target to generate assembly for a file
src/ui/UiSnapshot.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/fgc_core.dir/build.make CMakeFiles/fgc_core.dir/src/ui/UiSnapshot.cpp.s
.PHONY : src/ui/UiSnapshot.cpp.s
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... rebuild_cache"
@echo "... component"
@echo "... dom"
@echo "... fgc_core"
@echo "... fire_gimbal_control"
@echo "... screen"
@echo "... ini.o"
@echo "... ini.i"
@echo "... ini.s"
@echo "... main.o"
@echo "... main.i"
@echo "... main.s"
@echo "... src/camera/ImagePipeline.o"
@echo "... src/camera/ImagePipeline.i"
@echo "... src/camera/ImagePipeline.s"
@echo "... src/camera/JpegXlEncoder.o"
@echo "... src/camera/JpegXlEncoder.i"
@echo "... src/camera/JpegXlEncoder.s"
@echo "... src/core/Application.o"
@echo "... src/core/Application.i"
@echo "... src/core/Application.s"
@echo "... src/core/CaptureScheduler.o"
@echo "... src/core/CaptureScheduler.i"
@echo "... src/core/CaptureScheduler.s"
@echo "... src/core/CommandParser.o"
@echo "... src/core/CommandParser.i"
@echo "... src/core/CommandParser.s"
@echo "... src/core/Config.o"
@echo "... src/core/Config.i"
@echo "... src/core/Config.s"
@echo "... src/core/Geometry.o"
@echo "... src/core/Geometry.i"
@echo "... src/core/Geometry.s"
@echo "... src/core/Logger.o"
@echo "... src/core/Logger.i"
@echo "... src/core/Logger.s"
@echo "... src/core/Paths.o"
@echo "... src/core/Paths.i"
@echo "... src/core/Paths.s"
@echo "... src/core/ScanGrid.o"
@echo "... src/core/ScanGrid.i"
@echo "... src/core/ScanGrid.s"
@echo "... src/core/TelemetryParser.o"
@echo "... src/core/TelemetryParser.i"
@echo "... src/core/TelemetryParser.s"
@echo "... src/serial/SerialMotorController.o"
@echo "... src/serial/SerialMotorController.i"
@echo "... src/serial/SerialMotorController.s"
@echo "... src/ui/HeadlessUi.o"
@echo "... src/ui/HeadlessUi.i"
@echo "... src/ui/HeadlessUi.s"
@echo "... src/ui/TuiUi.o"
@echo "... src/ui/TuiUi.i"
@echo "... src/ui/TuiUi.s"
@echo "... src/ui/UiSnapshot.o"
@echo "... src/ui/UiSnapshot.i"
@echo "... src/ui/UiSnapshot.s"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,140 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-tui
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# The main all target
all: cmake_check_build_system
cd /home/pedro/code/fwt_2a/software/build-tui && $(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/CMakeFiles /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-build/doc//CMakeFiles/progress.marks
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/doc/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/doc/clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/doc/preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/doc/preinstall
.PHONY : preinstall/fast
# clear depends
depend:
cd /home/pedro/code/fwt_2a/software/build-tui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... rebuild_cache"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
cd /home/pedro/code/fwt_2a/software/build-tui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

View File

@ -0,0 +1,140 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-tui
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# The main all target
all: cmake_check_build_system
cd /home/pedro/code/fwt_2a/software/build-tui && $(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/CMakeFiles /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-build/examples//CMakeFiles/progress.marks
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/examples/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/examples/clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/examples/preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
cd /home/pedro/code/fwt_2a/software/build-tui && $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 _deps/ftxui-build/examples/preinstall
.PHONY : preinstall/fast
# clear depends
depend:
cd /home/pedro/code/fwt_2a/software/build-tui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... rebuild_cache"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
cd /home/pedro/code/fwt_2a/software/build-tui && $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

View File

@ -0,0 +1,101 @@
# Generated by CMake
if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8)
message(FATAL_ERROR "CMake >= 2.8.3 required")
endif()
if(CMAKE_VERSION VERSION_LESS "2.8.3")
message(FATAL_ERROR "CMake >= 2.8.3 required")
endif()
cmake_policy(PUSH)
cmake_policy(VERSION 2.8.3...4.1)
#----------------------------------------------------------------
# Generated CMake target import file.
#----------------------------------------------------------------
# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)
# Protect against multiple inclusion, which would fail when already imported targets are added once more.
set(_cmake_targets_defined "")
set(_cmake_targets_not_defined "")
set(_cmake_expected_targets "")
foreach(_cmake_expected_target IN ITEMS ftxui::screen ftxui::dom ftxui::component)
list(APPEND _cmake_expected_targets "${_cmake_expected_target}")
if(TARGET "${_cmake_expected_target}")
list(APPEND _cmake_targets_defined "${_cmake_expected_target}")
else()
list(APPEND _cmake_targets_not_defined "${_cmake_expected_target}")
endif()
endforeach()
unset(_cmake_expected_target)
if(_cmake_targets_defined STREQUAL _cmake_expected_targets)
unset(_cmake_targets_defined)
unset(_cmake_targets_not_defined)
unset(_cmake_expected_targets)
unset(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)
return()
endif()
if(NOT _cmake_targets_defined STREQUAL "")
string(REPLACE ";" ", " _cmake_targets_defined_text "${_cmake_targets_defined}")
string(REPLACE ";" ", " _cmake_targets_not_defined_text "${_cmake_targets_not_defined}")
message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_cmake_targets_defined_text}\nTargets not yet defined: ${_cmake_targets_not_defined_text}\n")
endif()
unset(_cmake_targets_defined)
unset(_cmake_targets_not_defined)
unset(_cmake_expected_targets)
# Create imported target ftxui::screen
add_library(ftxui::screen STATIC IMPORTED)
set_target_properties(ftxui::screen PROPERTIES
INTERFACE_COMPILE_FEATURES "cxx_std_17"
INTERFACE_INCLUDE_DIRECTORIES "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src/include"
)
# Create imported target ftxui::dom
add_library(ftxui::dom STATIC IMPORTED)
set_target_properties(ftxui::dom PROPERTIES
INTERFACE_COMPILE_FEATURES "cxx_std_17"
INTERFACE_INCLUDE_DIRECTORIES "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src/include"
INTERFACE_LINK_LIBRARIES "ftxui::screen"
)
# Create imported target ftxui::component
add_library(ftxui::component STATIC IMPORTED)
set_target_properties(ftxui::component PROPERTIES
INTERFACE_COMPILE_FEATURES "cxx_std_17"
INTERFACE_INCLUDE_DIRECTORIES "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src/include"
INTERFACE_LINK_LIBRARIES "ftxui::dom;Threads::Threads"
)
# Import target "ftxui::screen" for configuration "Release"
set_property(TARGET ftxui::screen APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(ftxui::screen PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
IMPORTED_LOCATION_RELEASE "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-build/libftxui-screen.a"
)
# Import target "ftxui::dom" for configuration "Release"
set_property(TARGET ftxui::dom APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(ftxui::dom PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
IMPORTED_LOCATION_RELEASE "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-build/libftxui-dom.a"
)
# Import target "ftxui::component" for configuration "Release"
set_property(TARGET ftxui::component APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(ftxui::component PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
IMPORTED_LOCATION_RELEASE "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-build/libftxui-component.a"
)
# This file does not depend on other imported targets which have
# been exported from the same project but in a separate export set.
# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1 @@
Subproject commit cdf28903a7781f97ba94d30b79c3a4b0c97ccce7

View File

@ -0,0 +1,42 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION 4.3.3)
# Reject any attempt to use a toolchain file. We must not use one because
# we could be downloading it here. If the CMAKE_TOOLCHAIN_FILE environment
# variable is set, the cache variable will have been initialized from it.
unset(CMAKE_TOOLCHAIN_FILE CACHE)
unset(ENV{CMAKE_TOOLCHAIN_FILE})
# We name the project and the target for the ExternalProject_Add() call
# to something that will highlight to the user what we are working on if
# something goes wrong and an error message is produced.
project(ftxui-populate NONE)
# Pass through things we've already detected in the main project to avoid
# paying the cost of redetecting them again in ExternalProject_Add()
set(GIT_EXECUTABLE [==[/usr/bin/git]==])
set(Git_VERSION [==[2.54.0]==])
set_property(GLOBAL PROPERTY _CMAKE_FindGit_GIT_EXECUTABLE_VERSION
[==[/usr/bin/git;2.54.0]==]
)
include(ExternalProject)
ExternalProject_Add(ftxui-populate
"UPDATE_DISCONNECTED" "False" "GIT_REPOSITORY" "https://github.com/ArthurSonzogni/FTXUI.git" "EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR" "GIT_TAG" "v5.0.0" "GIT_SHALLOW" "TRUE"
SOURCE_DIR "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
BINARY_DIR "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-build"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
USES_TERMINAL_DOWNLOAD YES
USES_TERMINAL_UPDATE YES
USES_TERMINAL_PATCH YES
)

View File

@ -0,0 +1,162 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake cache editor..."
/usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# The main all target
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/CMakeFiles /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild//CMakeFiles/progress.marks
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/CMakeFiles 0
.PHONY : all
# The main codegen target
codegen: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/CMakeFiles /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild//CMakeFiles/progress.marks
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 codegen
$(CMAKE_COMMAND) -E cmake_progress_start /home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/CMakeFiles 0
.PHONY : codegen
# The main clean target
clean:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall/fast
# clear depends
depend:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
#=============================================================================
# Target rules for targets named ftxui-populate
# Build rule for target.
ftxui-populate: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 ftxui-populate
.PHONY : ftxui-populate
# fast build rule for target.
ftxui-populate/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/ftxui-populate.dir/build.make CMakeFiles/ftxui-populate.dir/build
.PHONY : ftxui-populate/fast
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... codegen"
@echo "... edit_cache"
@echo "... rebuild_cache"
@echo "... ftxui-populate"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

View File

@ -0,0 +1,15 @@
# This is a generated file and its contents are an internal implementation detail.
# The download step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
method=git
command=/usr/bin/cmake;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/tmp/ftxui-populate-gitclone.cmake
source_dir=/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src
work_dir=/home/pedro/code/fwt_2a/software/build-tui/_deps
repository=https://github.com/ArthurSonzogni/FTXUI.git
remote=origin
init_submodules=TRUE
recurse_submodules=--recursive
submodules=
CMP0097=NEW

View File

@ -0,0 +1,15 @@
# This is a generated file and its contents are an internal implementation detail.
# The download step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
method=git
command=/usr/bin/cmake;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/tmp/ftxui-populate-gitclone.cmake
source_dir=/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src
work_dir=/home/pedro/code/fwt_2a/software/build-tui/_deps
repository=https://github.com/ArthurSonzogni/FTXUI.git
remote=origin
init_submodules=TRUE
recurse_submodules=--recursive
submodules=
CMP0097=NEW

View File

@ -0,0 +1,6 @@
# This is a generated file and its contents are an internal implementation detail.
# The update step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
command=
work_dir=

View File

@ -0,0 +1,7 @@
# This is a generated file and its contents are an internal implementation detail.
# The patch step will be re-executed if anything in this file changes.
# No other meaning or use of this file is supported.
command (connected)=/usr/bin/cmake;-Dcan_fetch=YES;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/tmp/ftxui-populate-gitupdate.cmake
command (disconnected)=/usr/bin/cmake;-Dcan_fetch=NO;-DCMAKE_MESSAGE_LOG_LEVEL=VERBOSE;-P;/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/tmp/ftxui-populate-gitupdate.cmake
work_dir=/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src

View File

@ -0,0 +1,87 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION ${CMAKE_VERSION}) # this file comes with cmake
if(EXISTS "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitclone-lastrun.txt" AND EXISTS "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitinfo.txt" AND
"/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitclone-lastrun.txt" IS_NEWER_THAN "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitinfo.txt")
message(VERBOSE
"Avoiding repeated git clone, stamp file is up to date: "
"'/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitclone-lastrun.txt'"
)
return()
endif()
# Even at VERBOSE level, we don't want to see the commands executed, but
# enabling them to be shown for DEBUG may be useful to help diagnose problems.
cmake_language(GET_MESSAGE_LOG_LEVEL active_log_level)
if(active_log_level MATCHES "DEBUG|TRACE")
set(maybe_show_command COMMAND_ECHO STDOUT)
else()
set(maybe_show_command "")
endif()
execute_process(
COMMAND ${CMAKE_COMMAND} -E rm -rf "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
message(FATAL_ERROR "Failed to remove directory: '/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src'")
endif()
# try the clone 3 times in case there is an odd git clone issue
set(error_code 1)
set(number_of_tries 0)
while(error_code AND number_of_tries LESS 3)
execute_process(
COMMAND "/usr/bin/git"
clone --no-checkout --depth 1 --no-single-branch --config "advice.detachedHead=false" "https://github.com/ArthurSonzogni/FTXUI.git" "ftxui-src"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps"
RESULT_VARIABLE error_code
${maybe_show_command}
)
math(EXPR number_of_tries "${number_of_tries} + 1")
endwhile()
if(number_of_tries GREATER 1)
message(NOTICE "Had to git clone more than once: ${number_of_tries} times.")
endif()
if(error_code)
message(FATAL_ERROR "Failed to clone repository: 'https://github.com/ArthurSonzogni/FTXUI.git'")
endif()
execute_process(
COMMAND "/usr/bin/git"
checkout "v5.0.0" --
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
message(FATAL_ERROR "Failed to checkout tag: 'v5.0.0'")
endif()
set(init_submodules TRUE)
if(init_submodules)
execute_process(
COMMAND "/usr/bin/git"
submodule update --recursive --init
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
endif()
if(error_code)
message(FATAL_ERROR "Failed to update submodules in: '/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src'")
endif()
# Complete success, update the script-last-run stamp file:
#
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitinfo.txt" "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitclone-lastrun.txt"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
message(FATAL_ERROR "Failed to copy script-last-run stamp file: '/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/ftxui-populate-gitclone-lastrun.txt'")
endif()

View File

@ -0,0 +1,317 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION ${CMAKE_VERSION}) # this file comes with cmake
# Even at VERBOSE level, we don't want to see the commands executed, but
# enabling them to be shown for DEBUG may be useful to help diagnose problems.
cmake_language(GET_MESSAGE_LOG_LEVEL active_log_level)
if(active_log_level MATCHES "DEBUG|TRACE")
set(maybe_show_command COMMAND_ECHO STDOUT)
else()
set(maybe_show_command "")
endif()
function(do_fetch)
message(VERBOSE "Fetching latest from the remote origin")
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git fetch --tags --force "origin"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
COMMAND_ERROR_IS_FATAL LAST
${maybe_show_command}
)
endfunction()
function(get_hash_for_ref ref out_var err_var)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git rev-parse "${ref}^0"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE ref_hash
ERROR_VARIABLE error_msg
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(error_code)
set(${out_var} "" PARENT_SCOPE)
else()
set(${out_var} "${ref_hash}" PARENT_SCOPE)
endif()
set(${err_var} "${error_msg}" PARENT_SCOPE)
endfunction()
get_hash_for_ref(HEAD head_sha error_msg)
if(head_sha STREQUAL "")
message(FATAL_ERROR "Failed to get the hash for HEAD:\n${error_msg}")
endif()
if("${can_fetch}" STREQUAL "")
set(can_fetch "YES")
endif()
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git show-ref "v5.0.0"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
OUTPUT_VARIABLE show_ref_output
)
if(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/remotes/")
# Given a full remote/branch-name and we know about it already. Since
# branches can move around, we should always fetch, if permitted.
if(can_fetch)
do_fetch()
endif()
set(checkout_name "v5.0.0")
elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/tags/")
# Given a tag name that we already know about. We don't know if the tag we
# have matches the remote though (tags can move), so we should fetch. As a
# special case to preserve backward compatibility, if we are already at the
# same commit as the tag we hold locally, don't do a fetch and assume the tag
# hasn't moved on the remote.
# FIXME: We should provide an option to always fetch for this case
get_hash_for_ref("v5.0.0" tag_sha error_msg)
if(tag_sha STREQUAL head_sha)
message(VERBOSE "Already at requested tag: v5.0.0")
return()
endif()
if(can_fetch)
do_fetch()
endif()
set(checkout_name "v5.0.0")
elseif(show_ref_output MATCHES "^[a-z0-9]+[ \\t]+refs/heads/")
# Given a branch name without any remote and we already have a branch by that
# name. We might already have that branch checked out or it might be a
# different branch. It isn't fully safe to use a bare branch name without the
# remote, so do a fetch (if allowed) and replace the ref with one that
# includes the remote.
if(can_fetch)
do_fetch()
endif()
set(checkout_name "origin/v5.0.0")
else()
get_hash_for_ref("v5.0.0" tag_sha error_msg)
if(tag_sha STREQUAL head_sha)
# Have the right commit checked out already
message(VERBOSE "Already at requested ref: ${tag_sha}")
return()
elseif(tag_sha STREQUAL "")
# We don't know about this ref yet, so we have no choice but to fetch.
if(NOT can_fetch)
message(FATAL_ERROR
"Requested git ref \"v5.0.0\" is not present locally, and not "
"allowed to contact remote due to UPDATE_DISCONNECTED setting."
)
endif()
# We deliberately swallow any error message at the default log level
# because it can be confusing for users to see a failed git command.
# That failure is being handled here, so it isn't an error.
if(NOT error_msg STREQUAL "")
message(DEBUG "${error_msg}")
endif()
do_fetch()
set(checkout_name "v5.0.0")
else()
# We have the commit, so we know we were asked to find a commit hash
# (otherwise it would have been handled further above), but we don't
# have that commit checked out yet. We don't need to fetch from the remote.
set(checkout_name "v5.0.0")
if(NOT error_msg STREQUAL "")
message(WARNING "${error_msg}")
endif()
endif()
endif()
set(git_update_strategy "REBASE")
if(git_update_strategy STREQUAL "")
# Backward compatibility requires REBASE as the default behavior
set(git_update_strategy REBASE)
endif()
if(git_update_strategy MATCHES "^REBASE(_CHECKOUT)?$")
# Asked to potentially try to rebase first, maybe with fallback to checkout.
# We can't if we aren't already on a branch and we shouldn't if that local
# branch isn't tracking the one we want to checkout.
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git symbolic-ref -q HEAD
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
OUTPUT_VARIABLE current_branch
OUTPUT_STRIP_TRAILING_WHITESPACE
# Don't test for an error. If this isn't a branch, we get a non-zero error
# code but empty output.
)
if(current_branch STREQUAL "")
# Not on a branch, checkout is the only sensible option since any rebase
# would always fail (and backward compatibility requires us to checkout in
# this situation)
set(git_update_strategy CHECKOUT)
else()
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git for-each-ref "--format=%(upstream:short)" "${current_branch}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
OUTPUT_VARIABLE upstream_branch
OUTPUT_STRIP_TRAILING_WHITESPACE
COMMAND_ERROR_IS_FATAL ANY # There is no error if no upstream is set
)
if(NOT upstream_branch STREQUAL checkout_name)
# Not safe to rebase when asked to checkout a different branch to the one
# we are tracking. If we did rebase, we could end up with arbitrary
# commits added to the ref we were asked to checkout if the current local
# branch happens to be able to rebase onto the target branch. There would
# be no error message and the user wouldn't know this was occurring.
set(git_update_strategy CHECKOUT)
endif()
endif()
elseif(NOT git_update_strategy STREQUAL "CHECKOUT")
message(FATAL_ERROR "Unsupported git update strategy: ${git_update_strategy}")
endif()
# Check if stash is needed
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git status --porcelain
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE repo_status
)
if(error_code)
message(FATAL_ERROR "Failed to get the status")
endif()
string(LENGTH "${repo_status}" need_stash)
# If not in clean state, stash changes in order to be able to perform a
# rebase or checkout without losing those changes permanently
if(need_stash)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash save --quiet;--include-untracked
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
endif()
if(git_update_strategy STREQUAL "CHECKOUT")
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git checkout "${checkout_name}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
else()
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git rebase "${checkout_name}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
OUTPUT_VARIABLE rebase_output
ERROR_VARIABLE rebase_output
)
if(error_code)
# Rebase failed, undo the rebase attempt before continuing
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git rebase --abort
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
${maybe_show_command}
)
if(NOT git_update_strategy STREQUAL "REBASE_CHECKOUT")
# Not allowed to do a checkout as a fallback, so cannot proceed
if(need_stash)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --index --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
${maybe_show_command}
)
endif()
message(FATAL_ERROR "\nFailed to rebase in: '/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src'."
"\nOutput from the attempted rebase follows:"
"\n${rebase_output}"
"\n\nYou will have to resolve the conflicts manually")
endif()
# Fall back to checkout. We create an annotated tag so that the user
# can manually inspect the situation and revert if required.
# We can't log the failed rebase output because MSVC sees it and
# intervenes, causing the build to fail even though it completes.
# Write it to a file instead.
string(TIMESTAMP tag_timestamp "%Y%m%dT%H%M%S" UTC)
set(tag_name _cmake_ExternalProject_moved_from_here_${tag_timestamp}Z)
set(error_log_file ${CMAKE_CURRENT_LIST_DIR}/rebase_error_${tag_timestamp}Z.log)
file(WRITE ${error_log_file} "${rebase_output}")
message(WARNING "Rebase failed, output has been saved to ${error_log_file}"
"\nFalling back to checkout, previous commit tagged as ${tag_name}")
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git tag -a
-m "ExternalProject attempting to move from here to ${checkout_name}"
${tag_name}
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git checkout "${checkout_name}"
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
endif()
endif()
if(need_stash)
# Put back the stashed changes
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --index --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
# Stash pop --index failed: Try again dropping the index
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git reset --hard --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
${maybe_show_command}
)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
RESULT_VARIABLE error_code
${maybe_show_command}
)
if(error_code)
# Stash pop failed: Restore previous state.
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git reset --hard --quiet ${head_sha}
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
${maybe_show_command}
)
execute_process(
COMMAND "/usr/bin/git" --git-dir=.git stash pop --index --quiet
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
${maybe_show_command}
)
message(FATAL_ERROR "\nFailed to unstash changes in: '/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src'."
"\nYou will have to resolve the conflicts manually")
endif()
endif()
endif()
set(init_submodules "TRUE")
if(init_submodules)
execute_process(
COMMAND "/usr/bin/git"
--git-dir=.git
submodule update --recursive --init
WORKING_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src"
COMMAND_ERROR_IS_FATAL ANY
${maybe_show_command}
)
endif()

View File

@ -0,0 +1,27 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
cmake_minimum_required(VERSION ${CMAKE_VERSION}) # this file comes with cmake
# If CMAKE_DISABLE_SOURCE_CHANGES is set to true and the source directory is an
# existing directory in our source tree, calling file(MAKE_DIRECTORY) on it
# would cause a fatal error, even though it would be a no-op.
if(NOT EXISTS "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src")
file(MAKE_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-src")
endif()
file(MAKE_DIRECTORY
"/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-build"
"/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix"
"/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/tmp"
"/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp"
"/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src"
"/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp"
)
set(configSubDirs )
foreach(subDir IN LISTS configSubDirs)
file(MAKE_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp/${subDir}")
endforeach()
if(cfgdir)
file(MAKE_DIRECTORY "/home/pedro/code/fwt_2a/software/build-tui/_deps/ftxui-subbuild/ftxui-populate-prefix/src/ftxui-populate-stamp${cfgdir}") # cfgdir has leading slash
endif()

BIN
build-tui/fire_gimbal_control Executable file

Binary file not shown.

BIN
build-tui/libfgc_core.a Normal file

Binary file not shown.

31
cmake/Ftxui.cmake Normal file
View File

@ -0,0 +1,31 @@
# Ftxui.cmake - provide FTXUI (https://github.com/ArthurSonzogni/FTXUI) via
# FetchContent, mirroring cmake/Paho.cmake. FTXUI powers the optional terminal
# dashboard (TuiUi); headless builds (-DWITH_TUI=OFF) never fetch it.
#
# HARDENING (recommended): the tag below is a mutable ref. For maximum integrity
# pin FTXUI_TAG to a full commit SHA (immutable), or switch to URL + URL_HASH
# (SHA256) of the signed release tarball and verify out-of-band. Bump the version
# deliberately, not silently.
include(FetchContent)
set(FTXUI_TAG "v5.0.0" CACHE STRING "FTXUI git tag/commit")
# Keep the dependency lean: we only need the libraries, not its examples/docs/tests.
set(FTXUI_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(FTXUI_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(FTXUI_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(FTXUI_ENABLE_INSTALL OFF CACHE BOOL "" FORCE)
# FTXUI's bundled CMakeLists declares a cmake_minimum_required below CMake 4's
# floor; allow it to configure under modern CMake (same shim used for Paho/doctest).
set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
FetchContent_Declare(ftxui
GIT_REPOSITORY https://github.com/ArthurSonzogni/FTXUI.git
GIT_TAG ${FTXUI_TAG}
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(ftxui)
unset(CMAKE_POLICY_VERSION_MINIMUM)

View File

@ -79,6 +79,12 @@ enable_serial = true
mock_camera = false
mock_serial = false
[UI]
; Full-screen terminal dashboard (sectioned, colored, live status + log pane).
; false => headless line console (default; stdin commands, stdout logs).
; CLI --tui / --no-tui override this. Requires a build with WITH_TUI=ON.
enable_tui = false
[Logging]
; level: trace|debug|info|warn|error|off (default info). --log-level overrides.
level = info

View File

@ -39,15 +39,20 @@ The design separates **policy** (the control logic) from **mechanism** (the I/O
| Thread | Where | Role |
|--------|-------|------|
| Main / control loop | `Application::run` | 10 ms tick: drain console commands, `scheduler.tick()` |
| stdin reader | `Application` | reads command lines into a queue |
| Main / control loop | `Application::run` | 10 ms tick: drain UI commands, `scheduler.tick()`, publish a `UiSnapshot` |
| UI input (headless) | `HeadlessUi` | reads stdin lines into the command sink |
| UI render + input (TUI) | `TuiUi` | FTXUI event loop + 10 Hz refresher; pulls snapshots, pushes commands |
| Serial I/O | `SerialMotorController` | Boost.Asio `io_context`; async read-until parses telemetry |
| Image worker | `ImagePipeline` | drains the frame queue: rotate → encode → write → publish |
| MQTT client | Paho (internal) | delivers callbacks; auto-reconnects (no busy-wait loop) |
| Camera acquisition | Vimba X (internal) | delivers frames via the observer (real source) |
Shared state is mutex-guarded: latest `MotorTelemetry` (serial), `ControlCommand` (channel), the frame queue
(pipeline), and the console command queue. The `CaptureScheduler` runs only on the main thread.
(pipeline), the console command queue, and the latest `UiSnapshot`. The `CaptureScheduler` runs only on the
main thread; the UI is a pure observer + command source (it copies a snapshot to render and pushes command
strings back through the same queue the console uses, so it never touches live logic objects). In TUI mode
all `Logger` output is diverted to an on-screen pane via a `Logger::setSink` callback so the screen is never
corrupted.
## Data flow

View File

@ -42,6 +42,7 @@ Parsed and validated by `ConfigLoader` ([src/core/Config.cpp](../src/core/Config
| `Features` | `mock_serial` | bool | `false` | Use the simulated motor controller |
| `Logging` | `level` | enum | `info` | Linear log level (`--log-level` overrides) |
| `Logging` | `trace` | csv | — | Wire-trace categories, off by default (`--trace` overrides) |
| `UI` | `enable_tui` | bool | `false` | Full-screen terminal dashboard (`--tui`/`--no-tui` override; needs `WITH_TUI=ON`) |
| `Motor` | `yaw_counts_per_deg` / `pitch_counts_per_deg` | float | `983.33` / — | Encoder counts per degree (**calibrate**; may be negative to flip) |
| `Motor` | `yaw_zero_count` / `pitch_zero_count` | int | `500000` / `0` | `xenc` value that = 0° |
| `Motor` | `yaw_min_deg`/`yaw_max_deg`/`pitch_*` | float | `-90`/`90`/… | Soft clamp on commanded degrees |
@ -82,6 +83,8 @@ Parsed by Boost.Program_options ([main.cpp](../main.cpp)). Flags override `[Feat
| `--no-mqtt` | Disable MQTT (use the null channel) |
| `--mock-camera` | Use the simulated camera |
| `--mock-serial` | Use the simulated motor controller |
| `--tui` | Show the full-screen terminal dashboard (overrides `[UI] enable_tui`) |
| `--no-tui` | Force the headless line console (overrides config; wins over `--tui`) |
| `--log-level <lvl>` | `trace`/`debug`/`info`/`warn`/`error`/`off` |
| `--trace <cats>` | Verbatim wire trace; comma list `serial,mqtt,camera,control,all,none` |
@ -114,6 +117,33 @@ Handled in `Application::Impl::handleCommand`.
| `set motorctl <cmd>` | Forward a raw command to the motor controller (e.g. `set motorctl MOVE Y 20000`) |
| `exit` | Quit (Ctrl-D also works) |
## Terminal dashboard (TUI)
An **optional** full-screen interface (`--tui`, or `[UI] enable_tui = true`) renders the tower
status as sectioned, colored panels updated in place, with a scrolling log pane and a nano-style
key bar. It is built on [FTXUI](https://github.com/ArthurSonzogni/FTXUI) (fetched via
[cmake/Ftxui.cmake](../cmake/Ftxui.cmake) when `WITH_TUI=ON`, the default) and is **fully decoupled
from application logic**: the control loop publishes a plain `UiSnapshot`
([include/fgc/ui/UiSnapshot.h](../include/fgc/ui/UiSnapshot.h)) that the UI renders, and the UI
forwards keystrokes/typed commands back through the same command queue the console uses. Headless
operation is unchanged and remains the default — the same binary runs under systemd/ssh/pipes with
logs on stdout.
Panels (MVP): **Gimbal** (per-axis state, heading, encoder counts, flag badges, target),
**Sensors** (DHT11 + Xsens MTi — shown as *pending integration* until those drivers land),
**Camera** (count, capture state, rate, last capture), **Connectivity** (MQTT state, broker, tower,
control mode, target heading). Adding a panel later (e.g. computer vision) is a struct in
`UiSnapshot.h` plus one node in [src/ui/TuiUi.cpp](../src/ui/TuiUi.cpp).
Keys (shown in the bottom bar): `s` start · `x` stop · `h` home · `r` reset · `:` open a command
line (any console/`set motorctl …` command) · `q` quit. Plain letters are used rather than Ctrl
chords so terminal flow-control (`Ctrl-S`/`Ctrl-Q` XON/XOFF) can't swallow them. In TUI mode all log
output is diverted from stdout into the on-screen log pane via a `Logger` sink, so the screen is
never corrupted.
Build without it (`-DWITH_TUI=OFF`) for a smaller, dependency-free binary; `--tui` then warns and
runs headless.
## Logging: level vs. wire-trace categories
Two **independent** controls, each settable via config (`[Logging]`), CLI, and a console command:

View File

@ -14,7 +14,9 @@ Per-file reference for the refactored tree, plus the shared data structures.
| [include/fgc/TelemetryParser.h](../include/fgc/TelemetryParser.h), [src/core/TelemetryParser.cpp](../src/core/TelemetryParser.cpp) | `parseTelemetryLine` (firmware `ST` line) → `std::optional<MotorTelemetry>` |
| [include/fgc/CommandParser.h](../include/fgc/CommandParser.h), [src/core/CommandParser.cpp](../src/core/CommandParser.cpp) | `parseCommand` whitespace tokenizer → `Command` |
| [include/fgc/CaptureScheduler.h](../include/fgc/CaptureScheduler.h), [src/core/CaptureScheduler.cpp](../src/core/CaptureScheduler.cpp) | Capture state machine over the interfaces; injectable clock |
| [include/fgc/Application.h](../include/fgc/Application.h), [src/core/Application.cpp](../src/core/Application.cpp) | Factory (real vs mock), wiring, control loop, console commands |
| [include/fgc/Application.h](../include/fgc/Application.h), [src/core/Application.cpp](../src/core/Application.cpp) | Factory (real vs mock, headless vs TUI), wiring, control loop, console commands, `buildSnapshot()` |
| [include/fgc/ui/UiSnapshot.h](../include/fgc/ui/UiSnapshot.h), [src/ui/UiSnapshot.cpp](../src/ui/UiSnapshot.cpp) | Plain-data view model + pure formatting helpers (state label/colour, degrees, time-ago, pending-sensors) |
| [include/fgc/ui/HeadlessUi.h](../include/fgc/ui/HeadlessUi.h), [src/ui/HeadlessUi.cpp](../src/ui/HeadlessUi.cpp) | Default line console: stdin → command sink; logs via the default stdout/stderr writer |
| [ini.c](../ini.c), [ini.h](../ini.h) | Bundled third-party inih INI parser |
## Interfaces
@ -24,6 +26,7 @@ Per-file reference for the refactored tree, plus the shared data structures.
| [include/fgc/IMotorController.h](../include/fgc/IMotorController.h) | `IMotorController` | `MotorTelemetry` |
| [include/fgc/IControlChannel.h](../include/fgc/IControlChannel.h) | `IControlChannel` | `ControlCommand`, `CamEvent` |
| [include/fgc/ICameraSource.h](../include/fgc/ICameraSource.h) | `ICameraSource` | `Frame` |
| [include/fgc/ui/IUserInterface.h](../include/fgc/ui/IUserInterface.h) | `IUserInterface` | `UiSnapshot` |
## Real implementations (SDK-gated)
@ -31,6 +34,7 @@ Per-file reference for the refactored tree, plus the shared data structures.
|------|-----------|-----------|
| [src/serial/SerialMotorController.cpp](../src/serial/SerialMotorController.cpp) | `IMotorController` over Boost.Asio serial (pImpl) | always |
| [src/mqtt/MqttControlChannel.cpp](../src/mqtt/MqttControlChannel.cpp) | `IControlChannel` over Eclipse Paho | `WITH_MQTT` |
| [src/ui/TuiUi.cpp](../src/ui/TuiUi.cpp) | `IUserInterface` over FTXUI: panels, key bar, log pane | `WITH_TUI` |
| [src/camera/VimbaCameraSource.cpp](../src/camera/VimbaCameraSource.cpp) | `ICameraSource` over Vimba X (pImpl) | `WITH_VIMBA` |
| [src/camera/JpegXlEncoder.cpp](../src/camera/JpegXlEncoder.cpp) | libjxl encode-to-file | always |
| [src/camera/ImagePipeline.cpp](../src/camera/ImagePipeline.cpp) | frame → rotate → encode → write → CamEvent (worker thread) | always |

View File

@ -18,6 +18,7 @@ struct RuntimeOptions {
std::optional<bool> use_mqtt;
std::optional<bool> mock_camera;
std::optional<bool> mock_serial;
std::optional<bool> use_tui; // --tui / --no-tui; unset => [UI] enable_tui
std::string log_level; // empty => default
std::string trace_categories; // comma list (serial,mqtt,camera,control,all); empty => unset

View File

@ -52,6 +52,10 @@ struct LoggingConfig {
std::string trace; // verbatim wire-trace categories: serial,mqtt,camera,control,all,none
};
struct UiConfig {
bool enable_tui = false; // false => headless line console (default); CLI --tui/--no-tui override
};
// [Scan]: source of the capture scan grid (the (yaw,pitch) waypoints the
// auto-sweep steps through). If grid_file is set, the CSV is loaded verbatim;
// otherwise a grid is generated from the parameters below (see ScanGrid).
@ -71,6 +75,7 @@ struct AppConfig {
PathsConfig paths;
FeaturesConfig features;
LoggingConfig logging;
UiConfig ui; // [UI] terminal dashboard toggle
Geometry geometry; // [Motor] degrees<->counts maps (yaw + pitch)
ScanConfig scan; // [Scan] grid source

View File

@ -7,6 +7,7 @@
#include <condition_variable>
#include <functional>
#include <mutex>
#include <optional>
#include <queue>
#include <string>
#include <thread>
@ -53,6 +54,10 @@ public:
void setEffort(int e) { params_.jxl_effort = e; }
void setDisplay(bool on) { params_.display = on; }
// Last CamEvent published (camera label, heading/pitch, timestamp), for the
// UI's camera panel. Thread-safe; nullopt until the first capture is saved.
std::optional<CamEvent> lastEvent() const;
private:
void run();
void process(const Frame& frame);
@ -67,6 +72,9 @@ private:
std::condition_variable cv_;
std::atomic<bool> running_{false};
std::thread worker_;
mutable std::mutex last_event_mutex_;
std::optional<CamEvent> last_event_;
};
} // namespace fgc

View File

@ -1,5 +1,6 @@
#pragma once
#include <functional>
#include <ostream>
#include <sstream>
#include <string>
@ -52,6 +53,15 @@ public:
// Map a single category name to its enum value. Unknown => LogCat::None and
// *ok=false (when ok != nullptr).
static LogCat catFromString(const std::string& name, bool* ok = nullptr);
// Output sink for finished log lines. The string is the fully formatted line
// (timestamp + "[LABEL]" + message, no trailing newline); `level` lets a sink
// colour or route by severity. Installing a sink REPLACES the default
// stdout/stderr writer entirely - used by the TUI to divert logs into an
// on-screen pane so they never corrupt the rendered screen. Pass an empty
// function to restore the default writer. Thread-safe.
using LogSink = std::function<void(LogLevel level, const std::string& line)>;
static void setSink(LogSink sink);
};
// RAII helper that buffers one log line and flushes it on commit().

View File

@ -0,0 +1,29 @@
#pragma once
#include "fgc/ui/IUserInterface.h"
#include <atomic>
#include <thread>
namespace fgc {
// The default, no-decoration interface: a stdin reader thread that forwards each
// line to the command sink, with logs going to stdout/stderr via the Logger's
// default writer. This is exactly the behaviour the app had before the TUI; it
// keeps headless deployment (systemd, ssh, pipes) working unchanged.
class HeadlessUi : public IUserInterface {
public:
~HeadlessUi() override;
void start(SnapshotFn snapshot, CommandSink sink) override;
void stop() override;
private:
void inputLoop();
CommandSink sink_;
std::atomic<bool> running_{false};
std::thread input_thread_;
};
} // namespace fgc

View File

@ -0,0 +1,35 @@
#pragma once
#include "fgc/ui/UiSnapshot.h"
#include <functional>
#include <string>
namespace fgc {
// Abstraction over the operator interface, wired into the Application the same
// way the motor/camera/channel backends are. It is a pure observer + command
// source: it pulls a UiSnapshot to render and pushes command strings back, but
// never touches the live logic objects.
//
// - HeadlessUi: today's line-based console (stdin -> commands, stdout logs).
// - TuiUi: FTXUI full-screen dashboard (built only when FGC_WITH_TUI).
//
// Both run on their own thread(s); start() must not block the control loop.
class IUserInterface {
public:
// Called by the UI thread when it wants the latest state to render.
using SnapshotFn = std::function<UiSnapshot()>;
// Called by the UI to enqueue a console/firmware command line.
using CommandSink = std::function<void(const std::string&)>;
virtual ~IUserInterface() = default;
// Begin interaction. Non-blocking: spawns the UI's own thread(s).
virtual void start(SnapshotFn snapshot, CommandSink sink) = 0;
// Stop and join the UI thread(s); restore the terminal if needed.
virtual void stop() = 0;
};
} // namespace fgc

54
include/fgc/ui/TuiUi.h Normal file
View File

@ -0,0 +1,54 @@
#pragma once
#include "fgc/ui/IUserInterface.h"
#include <atomic>
#include <deque>
#include <mutex>
#include <string>
#include <thread>
namespace ftxui {
class ScreenInteractive;
}
namespace fgc {
// Full-screen FTXUI dashboard: sectioned, colored panels (gimbal, sensors,
// camera, connectivity) updated in place, a scrolling log pane fed from a Logger
// sink, and a nano-style key bar. Pure observer + command source: it renders the
// UiSnapshot it pulls and forwards keystrokes/typed commands to the sink.
//
// Compiled only when FGC_WITH_TUI; the Application falls back to HeadlessUi
// otherwise.
class TuiUi : public IUserInterface {
public:
TuiUi();
~TuiUi() override;
void start(SnapshotFn snapshot, CommandSink sink) override;
void stop() override;
private:
void uiLoop(); // runs the FTXUI event loop (own thread)
void refreshLoop(); // posts redraw events at ~10 Hz (own thread)
void pushLog(LogLevel level, const std::string& line);
SnapshotFn snapshot_;
CommandSink sink_;
// Raw pointer to the loop thread's stack-local screen (ScreenInteractive is
// neither copyable nor movable, so it can't be a value/unique_ptr member).
// Set inside uiLoop(); read by stop()/refreshLoop() to Exit()/PostEvent().
std::atomic<ftxui::ScreenInteractive*> screen_{nullptr};
std::thread ui_thread_;
std::thread refresh_thread_;
std::atomic<bool> running_{false};
// Log ring buffer (newest last), filled by the Logger sink.
std::mutex log_mutex_;
std::deque<LogLine> log_;
static constexpr size_t kLogCap = 500;
};
} // namespace fgc

124
include/fgc/ui/UiSnapshot.h Normal file
View File

@ -0,0 +1,124 @@
#pragma once
#include "fgc/IMotorController.h" // AxisState
#include "fgc/Logger.h" // LogLevel
#include <string>
#include <vector>
namespace fgc {
// Plain-data view model handed from the control loop to a user interface. It is
// a pure snapshot: no references to the live motor/camera/channel objects, so
// the UI thread can copy and render it without touching (or racing) application
// logic. New subsystems become new structs here + a panel in the TUI.
// Colour intent, mapped to concrete terminal colours by the renderer.
enum class UiColor { Default, Dim, Green, Yellow, Red, Cyan };
// One gimbal axis.
struct AxisView {
std::string label; // "YAW" / "PITCH"
AxisState state = AxisState::Unknown;
double deg = 0.0; // heading/elevation, from xenc via Geometry
long xactual = 0;
long xenc = 0;
double target_deg = 0.0; // current scheduler target
bool moving = false;
bool standstill = false;
bool stall = false;
bool overtemp = false;
bool endstop_l = false;
bool endstop_r = false;
};
struct GimbalView {
bool present = false; // motor link usable
AxisView yaw;
AxisView pitch;
bool pitch_present = false;
};
// One labelled sensor reading. `present=false` => render the dim "pending" form.
struct SensorField {
std::string label; // "Temp", "Humid", "Roll"...
std::string value; // formatted value, or placeholder when absent
std::string unit; // "°C", "%RH", "°"...
bool present = false;
};
// DHT11 (temperature/humidity) + Xsens MTi (orientation). Neither is integrated
// yet, so the MVP fills `fields` with pending placeholders; flip the *_present
// flags and populate values when the drivers land.
struct SensorsView {
bool dht_present = false;
bool imu_present = false;
std::vector<SensorField> fields;
};
struct CaptureView {
bool present = false;
bool active = false;
double image_rate = 0.0; // img/s
int camera_count = 0;
std::vector<std::string> labels;
// Last published capture (from ImagePipeline::lastEvent()).
bool has_last = false;
std::string last_label;
double last_heading_deg = 0.0;
double last_pitch_deg = 0.0;
long long last_ts_ms = 0;
};
struct ConnView {
bool mqtt_enabled = false;
bool mqtt_connected = false;
std::string broker;
std::string tower;
int control_code = 0; // 0 = auto-sweep, 1 = directed
std::string target_heading;
int last_status_code = 0;
};
struct HeaderView {
std::string tower;
std::string build;
long long uptime_ms = 0;
bool live = true; // LIVE vs MOCK
};
struct LogLine {
LogLevel level = LogLevel::Info;
std::string text; // formatted line (no trailing newline)
};
struct UiSnapshot {
HeaderView header;
GimbalView gimbal;
SensorsView sensors;
CaptureView capture;
ConnView conn;
std::vector<LogLine> log;
};
// ---- Pure formatting helpers (unit-tested in tests/test_uisnapshot.cpp) ----
// Short state label for an axis state char (B/R/H/A/E -> these strings).
const char* axisStateLabel(AxisState s);
// Colour intent for an axis state (READY=green, HOMING=yellow, ERROR=red,
// BOOT/RESET=dim, Unknown=default).
UiColor axisStateColor(AxisState s);
// "12.3°" (one decimal, sign preserved).
std::string formatDegrees(double deg);
// Human "Ns ago" / "Nm ago" for an absolute ms timestamp relative to now_ms.
// Returns "—" when then_ms is 0 (never).
std::string formatTimeAgo(long long now_ms, long long then_ms);
// MVP placeholder: the Sensors panel fields shown before the DHT11/MTi drivers
// exist (all `present=false`). Centralised so the panel and tests agree.
SensorsView pendingSensorsView();
} // namespace fgc

View File

@ -21,6 +21,8 @@ int main(int argc, char* argv[]) {
("no-mqtt", po::bool_switch(), "disable MQTT (use a null control channel)")
("mock-camera", po::bool_switch(), "use a simulated camera (no hardware)")
("mock-serial", po::bool_switch(), "use a simulated motor controller (no hardware)")
("tui", po::bool_switch(), "show the full-screen terminal dashboard")
("no-tui", po::bool_switch(), "force the headless line console (overrides config)")
("log-level", po::value<std::string>(), "trace|debug|info|warn|error|off")
("trace", po::value<std::string>(),
"verbatim wire trace, comma list: serial,mqtt,camera,control,all,none");
@ -64,6 +66,8 @@ int main(int argc, char* argv[]) {
if (vm["no-mqtt"].as<bool>()) opts.use_mqtt = false;
if (vm["mock-camera"].as<bool>()) opts.mock_camera = true;
if (vm["mock-serial"].as<bool>()) opts.mock_serial = true;
if (vm["tui"].as<bool>()) opts.use_tui = true;
if (vm["no-tui"].as<bool>()) opts.use_tui = false; // --no-tui wins
if (vm.count("log-level")) opts.log_level = vm["log-level"].as<std::string>();
if (vm.count("trace")) opts.trace_categories = vm["trace"].as<std::string>();

View File

@ -101,8 +101,17 @@ void ImagePipeline::process(const Frame& frame) {
ev.pitch_decideg = static_cast<int>(o.pitch_deg * 10);
ev.timestamp_ms = frame.timestamp_ms;
channel_.publishCamEvent(ev);
{
std::lock_guard<std::mutex> lock(last_event_mutex_);
last_event_ = ev;
}
LOG_DEBUG << "Saved " << file.string() << " (" << img.cols << "x" << img.rows << ")";
}
std::optional<CamEvent> ImagePipeline::lastEvent() const {
std::lock_guard<std::mutex> lock(last_event_mutex_);
return last_event_;
}
} // namespace fgc

View File

@ -12,13 +12,16 @@
#include "fgc/mock/MockCameraSource.h"
#include "fgc/mock/MockMotorController.h"
#include "fgc/mock/NullControlChannel.h"
#include "fgc/ui/HeadlessUi.h"
#include "fgc/ui/IUserInterface.h"
#include "fgc/ui/UiSnapshot.h"
#include <atomic>
#include <chrono>
#include <iostream>
#include <memory>
#include <mutex>
#include <queue>
#include <string>
#include <thread>
#if FGC_WITH_MQTT
@ -27,6 +30,9 @@
#if FGC_WITH_VIMBA
#include "fgc/VimbaCameraSource.h"
#endif
#if FGC_WITH_TUI
#include "fgc/ui/TuiUi.h"
#endif
namespace fgc {
@ -62,12 +68,16 @@ struct Application::Impl {
std::unique_ptr<ICameraSource> camera;
std::unique_ptr<ImagePipeline> pipeline;
std::unique_ptr<CaptureScheduler> scheduler;
std::unique_ptr<IUserInterface> ui;
ScanGrid grid; // outlives scheduler (holds a reference to it)
std::atomic<bool> running{true};
std::mutex cmd_mutex;
std::queue<std::string> cmd_queue;
std::thread input_thread;
std::chrono::steady_clock::time_point start_time;
std::mutex snapshot_mutex;
UiSnapshot latest_snapshot;
std::string statusTopicTower() const { return cfg.general.tower_name; }
@ -111,6 +121,89 @@ struct Application::Impl {
#endif
}
std::unique_ptr<IUserInterface> makeUi() {
bool want = opts.use_tui.value_or(cfg.ui.enable_tui);
#if FGC_WITH_TUI
if (want) return std::make_unique<TuiUi>();
#else
if (want) LOG_WARN << "TUI requested but binary built without TUI support; using headless console";
#endif
return std::make_unique<HeadlessUi>();
}
// Read live state (on the control thread) into a plain snapshot the UI can
// copy and render without touching the logic objects. The log pane is filled
// by the UI from its own ring buffer, so it is left empty here.
UiSnapshot buildSnapshot() const {
UiSnapshot s;
const bool mock_serial = opts.mock_serial.value_or(cfg.features.mock_serial);
s.header.tower = cfg.general.tower_name;
s.header.build = "dev";
s.header.uptime_ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - start_time).count();
s.header.live = !mock_serial;
// --- Gimbal ---
MotorTelemetry t = motor->telemetry();
s.gimbal.present = motor->connected();
s.gimbal.pitch_present = t.pitch_present;
auto fillAxis = [](AxisView& v, const char* label, const AxisTelemetry& a,
const AxisMap& map, long target_counts) {
v.label = label;
v.state = a.state;
v.deg = map.toDeg(a.xenc);
v.xactual = a.xactual;
v.xenc = a.xenc;
v.target_deg = map.toDeg(target_counts);
v.moving = a.moving();
v.standstill = a.standstill;
v.stall = a.stall;
v.overtemp = a.overtemp;
v.endstop_l = a.endstop_l;
v.endstop_r = a.endstop_r;
};
long yaw_tgt = scheduler ? scheduler->yawTargetCounts() : 0;
long pitch_tgt = scheduler ? scheduler->pitchTargetCounts() : 0;
fillAxis(s.gimbal.yaw, "YAW", t.yaw, cfg.geometry.yaw, yaw_tgt);
fillAxis(s.gimbal.pitch, "PITCH", t.pitch, cfg.geometry.pitch, pitch_tgt);
// --- Sensors (DHT11 + MTi not integrated yet) ---
s.sensors = pendingSensorsView();
// --- Camera / capture ---
s.capture.present = true;
s.capture.active = scheduler && scheduler->captureActive();
s.capture.image_rate = scheduler ? scheduler->imageRate() : 0.0;
s.capture.camera_count = camera ? camera->cameraCount() : 0;
s.capture.labels = cfg.camera.labels;
if (pipeline) {
if (auto ev = pipeline->lastEvent()) {
s.capture.has_last = true;
s.capture.last_label = ev->camera;
s.capture.last_heading_deg = ev->heading_decideg / 10.0;
s.capture.last_pitch_deg = ev->pitch_decideg / 10.0;
s.capture.last_ts_ms = ev->timestamp_ms;
}
}
// --- Connectivity ---
s.conn.mqtt_enabled = opts.use_mqtt.value_or(cfg.features.enable_mqtt);
s.conn.mqtt_connected = channel && channel->connected();
s.conn.broker = cfg.network.broker_ip;
s.conn.tower = cfg.general.tower_name;
s.conn.control_code = scheduler ? scheduler->controlCode() : 0;
s.conn.target_heading = scheduler ? scheduler->targetHeading() : "0";
s.conn.last_status_code = s.conn.control_code; // echoed back as status
return s;
}
void publishSnapshot() {
UiSnapshot s = buildSnapshot();
std::lock_guard<std::mutex> lock(snapshot_mutex);
latest_snapshot = std::move(s);
}
void runInitSequence() {
using namespace std::chrono_literals;
LOG_INFO << "Running gimbal init sequence (enable + home)";
@ -221,19 +314,6 @@ struct Application::Impl {
}
}
void inputLoop() {
std::string line;
while (running) {
if (!std::getline(std::cin, line)) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
continue;
}
if (line.empty()) continue;
std::lock_guard<std::mutex> lock(cmd_mutex);
cmd_queue.push(line);
}
}
void drainCommands() {
std::queue<std::string> local;
{
@ -247,6 +327,8 @@ struct Application::Impl {
}
int run() {
start_time = std::chrono::steady_clock::now();
// Log level: config first, CLI overrides.
if (!cfg.logging.level.empty() && !Logger::setLevelFromString(cfg.logging.level))
LOG_WARN << "unknown Logging.level '" << cfg.logging.level << "', keeping default";
@ -308,20 +390,37 @@ struct Application::Impl {
pipeline->start();
channel->publishStatus(0);
// Seed an initial snapshot so the UI's first frame is populated, then
// start the interface (headless console or TUI) on its own thread. The
// UI is a pure observer: it pulls snapshots and pushes command strings
// into the same queue the console always used.
//
// The UI is brought up BEFORE the init/home sequence so the dashboard is
// visible during homing (which can take many seconds) and so the serial
// wire traces render in the TUI's log pane instead of scrolling raw —
// makeUi()/start() installs the TUI log sink, so anything logged after
// this point is captured by it.
publishSnapshot();
ui = makeUi();
ui->start([this] { std::lock_guard<std::mutex> lk(snapshot_mutex); return latest_snapshot; },
[this](const std::string& line) {
std::lock_guard<std::mutex> lk(cmd_mutex);
cmd_queue.push(line);
});
if (opts.init) runInitSequence();
if (opts.start) startCapture();
input_thread = std::thread(&Impl::inputLoop, this);
LOG_INFO << "Entering control loop (type 'exit' to quit)";
while (running) {
drainCommands();
scheduler->tick();
publishSnapshot();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
LOG_INFO << "Shutting down";
if (input_thread.joinable()) input_thread.join();
if (ui) ui->stop();
pipeline->stop();
camera->stop();
camera->close();

View File

@ -112,6 +112,8 @@ AppConfig ConfigLoader::fromMap(const std::map<std::string, std::string>& kv) {
cfg.logging.level = get(kv, "Logging.level", cfg.logging.level);
cfg.logging.trace = get(kv, "Logging.trace", cfg.logging.trace);
cfg.ui.enable_tui = getBool(kv, "UI.enable_tui", cfg.ui.enable_tui);
// [Motor]: operator-calibrated degrees<->counts maps (see Geometry).
cfg.geometry.yaw.counts_per_deg = getDouble(kv, "Motor.yaw_counts_per_deg", cfg.geometry.yaw.counts_per_deg);
cfg.geometry.yaw.zero_count = getLong(kv, "Motor.yaw_zero_count", cfg.geometry.yaw.zero_count);

View File

@ -14,6 +14,14 @@ namespace {
std::atomic<LogLevel> g_level{LogLevel::Info};
std::atomic<unsigned> g_cats{0}; // every wire-trace category OFF by default
std::mutex g_mutex;
Logger::LogSink g_sink; // empty => default stdout/stderr writer (below)
// Default writer: the stdout/stderr split this logger has always used.
void writeDefault(LogLevel level, const std::string& line) {
std::ostream& out = (level >= LogLevel::Warn) ? std::cerr : std::cout;
out << line << '\n';
out.flush();
}
const char* tag(LogLevel l) {
switch (l) {
@ -68,6 +76,11 @@ std::string timestamp() {
} // namespace
void Logger::setSink(LogSink sink) {
std::lock_guard<std::mutex> lock(g_mutex);
g_sink = std::move(sink);
}
void Logger::setLevel(LogLevel level) { g_level.store(level); }
LogLevel Logger::level() { return g_level.load(); }
bool Logger::enabled(LogLevel level) { return level >= g_level.load(); }
@ -133,11 +146,11 @@ LogStream::LogStream(LogLevel level, LogCat cat)
void LogStream::commit() {
done_ = true;
if (!enabled_) return;
std::ostream& sink = (level_ >= LogLevel::Warn) ? std::cerr : std::cout;
const char* label = (cat_ != LogCat::None) ? catTag(cat_) : tag(level_);
std::string line = timestamp() + " [" + label + "] " + buffer_.str();
std::lock_guard<std::mutex> lock(g_mutex);
sink << timestamp() << " [" << label << "] " << buffer_.str() << '\n';
sink.flush();
if (g_sink) g_sink(level_, line);
else writeDefault(level_, line);
}
} // namespace fgc

41
src/ui/HeadlessUi.cpp Normal file
View File

@ -0,0 +1,41 @@
#include "fgc/ui/HeadlessUi.h"
#include <chrono>
#include <iostream>
#include <string>
namespace fgc {
HeadlessUi::~HeadlessUi() { stop(); }
void HeadlessUi::start(SnapshotFn /*snapshot*/, CommandSink sink) {
sink_ = std::move(sink);
running_ = true;
input_thread_ = std::thread(&HeadlessUi::inputLoop, this);
}
void HeadlessUi::stop() {
if (!running_.exchange(false)) return;
// inputLoop blocks on getline; closing happens when stdin hits EOF or the
// process exits. Detach if it is still parked so shutdown does not hang.
if (input_thread_.joinable()) {
if (std::cin.eof()) input_thread_.join();
else input_thread_.detach();
}
}
// Lifted verbatim from the old Application::Impl::inputLoop: read lines and push
// them onto the command sink (formerly the cmd_queue).
void HeadlessUi::inputLoop() {
std::string line;
while (running_) {
if (!std::getline(std::cin, line)) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
continue;
}
if (line.empty()) continue;
if (sink_) sink_(line);
}
}
} // namespace fgc

263
src/ui/TuiUi.cpp Normal file
View File

@ -0,0 +1,263 @@
#include "fgc/ui/TuiUi.h"
#include "fgc/Logger.h"
#include <chrono>
#include <vector>
#include <ftxui/component/component.hpp>
#include <ftxui/component/event.hpp>
#include <ftxui/component/screen_interactive.hpp>
#include <ftxui/dom/elements.hpp>
#include <ftxui/screen/color.hpp>
namespace fgc {
using namespace ftxui;
namespace {
Color toColor(UiColor c) {
switch (c) {
case UiColor::Green: return Color::Green;
case UiColor::Yellow: return Color::Yellow;
case UiColor::Red: return Color::Red;
case UiColor::Cyan: return Color::Cyan;
case UiColor::Dim: return Color::GrayDark;
case UiColor::Default:
default: return Color::Default;
}
}
// A bordered panel with a colored, bold title.
Element panel(const std::string& title, Color title_color, Element body) {
return window(text(" " + title + " ") | bold | color(title_color), std::move(body)) | flex;
}
// "key" + label pair for the nano-style bottom bar.
Element keyHint(const std::string& key, const std::string& label) {
return hbox({text(" " + key + " ") | inverted, text(" " + label + " ")});
}
Element badge(const std::string& s, bool on, Color on_color) {
auto e = text(" " + s + " ");
return on ? (e | color(on_color) | bold) : (e | dim);
}
Element axisRow(const AxisView& a) {
Element state = text(std::string(" ") + axisStateLabel(a.state) + " ")
| color(toColor(axisStateColor(a.state))) | bold;
Element heading = text(formatDegrees(a.deg)) | bold;
return vbox({
hbox({text(a.label + " ") | bold, state, filler(),
text("" + formatDegrees(a.target_deg)) | dim}),
hbox({text(" "), heading,
text(" x=" + std::to_string(a.xactual)) | dim,
text(" enc=" + std::to_string(a.xenc)) | dim}),
hbox({text(" "),
badge("STILL", a.standstill, Color::GrayLight),
badge("MOVE", a.moving, Color::Cyan),
badge("STALL", a.stall, Color::Red),
badge("OT", a.overtemp, Color::Red),
badge("L", a.endstop_l, Color::Yellow),
badge("R", a.endstop_r, Color::Yellow)}),
});
}
Element gimbalPanel(const GimbalView& g) {
std::vector<Element> rows;
if (!g.present) rows.push_back(text("link down") | color(Color::Red) | bold);
rows.push_back(axisRow(g.yaw));
if (g.pitch_present) {
rows.push_back(separator());
rows.push_back(axisRow(g.pitch));
}
return panel("GIMBAL", Color::Cyan, vbox(std::move(rows)));
}
Element sensorsPanel(const SensorsView& s) {
std::vector<Element> rows;
rows.push_back(text("pending integration") | dim);
rows.push_back(separator());
for (const auto& f : s.fields) {
Element val = text(f.value + (f.unit.empty() ? "" : " " + f.unit));
val = f.present ? (val | bold) : (val | dim);
rows.push_back(hbox({text(f.label) | dim, filler(), val}));
}
return panel("SENSORS (DHT11 · MTi)", Color::Magenta, vbox(std::move(rows)));
}
Element cameraPanel(const CaptureView& c) {
std::string labels;
for (size_t i = 0; i < c.labels.size(); ++i)
labels += (i ? "," : "") + c.labels[i];
Element active = c.active ? (text(" CAPTURING ") | color(Color::Green) | bold)
: (text(" idle ") | dim);
std::vector<Element> rows = {
hbox({text("cameras ") | dim, text(std::to_string(c.camera_count) + " "),
text(labels) | dim}),
hbox({text("capture ") | dim, active, filler(),
text(std::to_string(c.image_rate) + " img/s") | dim}),
};
if (c.has_last) {
long long now = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()).count();
rows.push_back(hbox({text("last ") | dim,
text(c.last_label + " "),
text(formatDegrees(c.last_heading_deg) + " / " +
formatDegrees(c.last_pitch_deg) + " ") | dim,
text(formatTimeAgo(now, c.last_ts_ms)) | dim}));
} else {
rows.push_back(hbox({text("last ") | dim, text("") | dim}));
}
return panel("CAMERA", Color::Blue, vbox(std::move(rows)));
}
Element connPanel(const ConnView& v) {
Element mqtt = !v.mqtt_enabled ? (text(" disabled ") | dim)
: v.mqtt_connected ? (text(" connected ") | color(Color::Green) | bold)
: (text(" disconnected ") | color(Color::Red) | bold);
std::string mode = v.control_code == 0 ? "0 auto-sweep" : "1 directed";
return panel("CONNECTIVITY", Color::Green, vbox({
hbox({text("MQTT ") | dim, mqtt, filler(), text(v.broker) | dim}),
hbox({text("tower ") | dim, text(v.tower)}),
hbox({text("control ") | dim, text(mode),
filler(), text("hdg " + v.target_heading) | dim}),
hbox({text("status ") | dim, text(std::to_string(v.last_status_code))}),
}));
}
Element logPanel(const std::vector<LogLine>& lines) {
std::vector<Element> rows;
for (const auto& l : lines) {
Color c = Color::Default;
switch (l.level) {
case LogLevel::Error: c = Color::Red; break;
case LogLevel::Warn: c = Color::Yellow; break;
case LogLevel::Debug:
case LogLevel::Trace: c = Color::GrayDark; break;
default: break;
}
rows.push_back(text(l.text) | color(c));
}
if (rows.empty()) rows.push_back(text("(no log output yet)") | dim);
return window(text(" LOG ") | bold | color(Color::GrayLight),
vbox(std::move(rows)) | focusPositionRelative(0, 1) | yframe);
}
} // namespace
TuiUi::TuiUi() = default;
TuiUi::~TuiUi() { stop(); }
void TuiUi::start(SnapshotFn snapshot, CommandSink sink) {
snapshot_ = std::move(snapshot);
sink_ = std::move(sink);
running_ = true;
// Divert log output into the on-screen pane so it never corrupts the screen.
Logger::setSink([this](LogLevel lvl, const std::string& line) { pushLog(lvl, line); });
ui_thread_ = std::thread(&TuiUi::uiLoop, this);
refresh_thread_ = std::thread(&TuiUi::refreshLoop, this);
}
void TuiUi::stop() {
if (!running_.exchange(false)) return;
if (auto* s = screen_.load()) s->Exit(); // breaks the FTXUI Loop
if (ui_thread_.joinable()) ui_thread_.join();
if (refresh_thread_.joinable()) refresh_thread_.join();
Logger::setSink({}); // restore the default stdout/stderr writer
}
void TuiUi::pushLog(LogLevel level, const std::string& line) {
std::lock_guard<std::mutex> lock(log_mutex_);
log_.push_back({level, line});
while (log_.size() > kLogCap) log_.pop_front();
}
void TuiUi::refreshLoop() {
using namespace std::chrono_literals;
while (running_) {
std::this_thread::sleep_for(100ms);
if (!running_) break;
if (auto* s = screen_.load()) s->PostEvent(Event::Custom); // force a redraw
}
}
void TuiUi::uiLoop() {
std::string cmd_buffer;
bool command_mode = false;
auto input = Input(&cmd_buffer, "type a command, Enter to run, Esc to cancel");
auto renderer = Renderer(input, [&] {
UiSnapshot s = snapshot_ ? snapshot_() : UiSnapshot{};
{
std::lock_guard<std::mutex> lock(log_mutex_);
s.log.assign(log_.begin(), log_.end());
}
std::string mode = s.header.live ? "LIVE" : "MOCK";
Element header = hbox({
text(" FIREWATCH TOWER ") | bold | inverted,
text(" " + s.header.tower + " ") | bold,
text("build " + s.header.build) | dim,
filler(),
text(" " + mode + " ") | (s.header.live ? color(Color::Green) : color(Color::Yellow)) | bold,
text(" up " + std::to_string(s.header.uptime_ms / 1000) + "s ") | dim,
});
Element top = hbox({gimbalPanel(s.gimbal), sensorsPanel(s.sensors)});
Element middle = hbox({cameraPanel(s.capture), connPanel(s.conn)});
Element bottom;
if (command_mode) {
bottom = hbox({text(" : ") | inverted, input->Render() | flex}) | border;
} else {
bottom = hbox({
keyHint("s", "Start"), keyHint("x", "Stop"), keyHint("h", "Home"),
keyHint("r", "Reset"), keyHint(":", "Cmd"), filler(), keyHint("q", "Quit"),
});
}
return vbox({header, separator(), top, middle, logPanel(s.log) | flex, bottom});
});
auto root = CatchEvent(renderer, [&](Event e) {
if (command_mode) {
if (e == Event::Return) {
if (!cmd_buffer.empty() && sink_) sink_(cmd_buffer);
cmd_buffer.clear();
command_mode = false;
return true;
}
if (e == Event::Escape) {
cmd_buffer.clear();
command_mode = false;
return true;
}
return false; // let the Input edit the buffer
}
if (!e.is_character()) return false;
const std::string& c = e.character();
if (c == "q") { if (sink_) sink_("exit"); return true; }
if (c == "s") { if (sink_) sink_("start"); return true; }
if (c == "x") { if (sink_) sink_("stop"); return true; }
if (c == "h") { if (sink_) sink_("set motorctl HOME"); return true; }
if (c == "r") { if (sink_) sink_("set motorctl RESET"); return true; }
if (c == ":") { command_mode = true; return true; }
return false;
});
// ScreenInteractive can't be moved, so it lives on this thread's stack; the
// atomic pointer lets stop()/refreshLoop() reach it.
ScreenInteractive screen = ScreenInteractive::Fullscreen();
screen_.store(&screen);
if (running_) screen.Loop(root);
screen_.store(nullptr);
}
} // namespace fgc

65
src/ui/UiSnapshot.cpp Normal file
View File

@ -0,0 +1,65 @@
#include "fgc/ui/UiSnapshot.h"
#include <cmath>
#include <cstdio>
namespace fgc {
const char* axisStateLabel(AxisState s) {
switch (s) {
case AxisState::Boot: return "BOOT";
case AxisState::Reset: return "RESET";
case AxisState::Homing: return "HOMING";
case AxisState::Ready: return "READY";
case AxisState::Error: return "ERROR";
case AxisState::Unknown:
default: return "----";
}
}
UiColor axisStateColor(AxisState s) {
switch (s) {
case AxisState::Ready: return UiColor::Green;
case AxisState::Homing: return UiColor::Yellow;
case AxisState::Error: return UiColor::Red;
case AxisState::Boot:
case AxisState::Reset: return UiColor::Dim;
case AxisState::Unknown:
default: return UiColor::Default;
}
}
std::string formatDegrees(double deg) {
char buf[32];
std::snprintf(buf, sizeof(buf), "%.1f\xC2\xB0", deg); // UTF-8 degree sign
return buf;
}
std::string formatTimeAgo(long long now_ms, long long then_ms) {
if (then_ms <= 0) return "\xE2\x80\x94"; // em dash: never
long long d = now_ms - then_ms;
if (d < 0) d = 0;
long long s = d / 1000;
char buf[32];
if (s < 60) std::snprintf(buf, sizeof(buf), "%llds ago", s);
else if (s < 3600) std::snprintf(buf, sizeof(buf), "%lldm ago", s / 60);
else std::snprintf(buf, sizeof(buf), "%lldh ago", s / 3600);
return buf;
}
SensorsView pendingSensorsView() {
SensorsView v;
v.dht_present = false;
v.imu_present = false;
// DHT11 temperature & humidity (Aosong): 0-50 °C ±2 °C, 20-90 %RH ±5 %.
v.fields.push_back({"Temp", "--.-", "\xC2\xB0""C", false});
v.fields.push_back({"Humid", "--", "%RH", false});
// Xsens MTi-28 AHRS: drift-free Euler orientation (roll/pitch/yaw).
v.fields.push_back({"Roll", "--.-", "\xC2\xB0", false});
v.fields.push_back({"Pitch", "--.-", "\xC2\xB0", false});
v.fields.push_back({"Yaw", "--.-", "\xC2\xB0", false});
v.fields.push_back({"IMU", "pending", "", false});
return v;
}
} // namespace fgc

View File

@ -27,6 +27,7 @@ add_executable(fgc_tests
test_logger.cpp
test_geometry.cpp
test_scangrid.cpp
test_uisnapshot.cpp
)
target_link_libraries(fgc_tests PRIVATE fgc_core doctest::doctest)

48
tests/test_uisnapshot.cpp Normal file
View File

@ -0,0 +1,48 @@
#include <doctest/doctest.h>
#include "fgc/ui/UiSnapshot.h"
using namespace fgc;
TEST_CASE("axisStateLabel maps every state") {
CHECK(std::string(axisStateLabel(AxisState::Boot)) == "BOOT");
CHECK(std::string(axisStateLabel(AxisState::Reset)) == "RESET");
CHECK(std::string(axisStateLabel(AxisState::Homing)) == "HOMING");
CHECK(std::string(axisStateLabel(AxisState::Ready)) == "READY");
CHECK(std::string(axisStateLabel(AxisState::Error)) == "ERROR");
CHECK(std::string(axisStateLabel(AxisState::Unknown)) == "----");
}
TEST_CASE("axisStateColor signals health") {
CHECK(axisStateColor(AxisState::Ready) == UiColor::Green);
CHECK(axisStateColor(AxisState::Homing) == UiColor::Yellow);
CHECK(axisStateColor(AxisState::Error) == UiColor::Red);
CHECK(axisStateColor(AxisState::Boot) == UiColor::Dim);
CHECK(axisStateColor(AxisState::Reset) == UiColor::Dim);
CHECK(axisStateColor(AxisState::Unknown) == UiColor::Default);
}
TEST_CASE("formatDegrees: one decimal, sign preserved, degree sign appended") {
CHECK(formatDegrees(12.34) == "12.3\xC2\xB0");
CHECK(formatDegrees(-4.0) == "-4.0\xC2\xB0");
CHECK(formatDegrees(0.0) == "0.0\xC2\xB0");
}
TEST_CASE("formatTimeAgo: buckets and the never case") {
CHECK(formatTimeAgo(10'000, 0) == "\xE2\x80\x94"); // never
CHECK(formatTimeAgo(10'000, 7'000) == "3s ago"); // seconds
CHECK(formatTimeAgo(200'000, 10'000) == "3m ago"); // minutes
CHECK(formatTimeAgo(10'000'000, 1'000'000) == "2h ago"); // hours
CHECK(formatTimeAgo(5'000, 9'000) == "0s ago"); // future clamps to 0
}
TEST_CASE("pendingSensorsView: all fields absent until drivers land") {
SensorsView v = pendingSensorsView();
CHECK_FALSE(v.dht_present);
CHECK_FALSE(v.imu_present);
CHECK(v.fields.size() >= 2);
for (const auto& f : v.fields) {
CHECK_FALSE(f.present);
CHECK_FALSE(f.label.empty());
}
}