Compare commits

..

No commits in common. "5fb1d3103bf93215410919c3530e1c8f1fa84350" and "16f23f36bbfd84c8821be1353ab6761aa85ef979" have entirely different histories.

97 changed files with 33 additions and 8672 deletions

View File

@ -7,7 +7,6 @@ project(fire_gimbal_control LANGUAGES C CXX)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
option(WITH_VIMBA "Build with Allied Vision Vimba X camera support" ON) option(WITH_VIMBA "Build with Allied Vision Vimba X camera support" ON)
option(WITH_MQTT "Build with Eclipse Paho MQTT 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) option(BUILD_TESTING "Build unit tests" OFF)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
@ -50,10 +49,6 @@ add_library(fgc_core STATIC
src/core/TelemetryParser.cpp src/core/TelemetryParser.cpp
src/core/CaptureScheduler.cpp src/core/CaptureScheduler.cpp
src/core/CommandParser.cpp src/core/CommandParser.cpp
src/core/HelpText.cpp
src/core/DumpParser.cpp
src/ui/UiSnapshot.cpp
src/ui/HeadlessUi.cpp
ini.c ini.c
) )
target_include_directories(fgc_core PUBLIC target_include_directories(fgc_core PUBLIC
@ -117,21 +112,6 @@ else()
message(STATUS "WITH_VIMBA=OFF: building without Vimba X camera support (mock cameras only)") message(STATUS "WITH_VIMBA=OFF: building without Vimba X camera support (mock cameras only)")
endif() 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 # Tests
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@ -148,6 +128,5 @@ message(STATUS "fire_gimbal_control configuration")
message(STATUS " build type : ${CMAKE_BUILD_TYPE}") message(STATUS " build type : ${CMAKE_BUILD_TYPE}")
message(STATUS " WITH_VIMBA : ${WITH_VIMBA}") message(STATUS " WITH_VIMBA : ${WITH_VIMBA}")
message(STATUS " WITH_MQTT : ${WITH_MQTT}") message(STATUS " WITH_MQTT : ${WITH_MQTT}")
message(STATUS " WITH_TUI : ${WITH_TUI}")
message(STATUS " tests : ${BUILD_TESTING}") message(STATUS " tests : ${BUILD_TESTING}")
message(STATUS "------------------------------------------------------------") message(STATUS "------------------------------------------------------------")

View File

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

View File

@ -1,7 +0,0 @@
# 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")

View File

@ -1,688 +0,0 @@
# 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

@ -1,37 +0,0 @@
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

@ -1,759 +0,0 @@
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

@ -1,6 +0,0 @@
# 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

@ -1,242 +0,0 @@
# 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

@ -1,6 +0,0 @@
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

@ -1,65 +0,0 @@
# 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()

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

View File

@ -1,42 +0,0 @@
# 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

@ -1,162 +0,0 @@
# 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

@ -1,15 +0,0 @@
# 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

@ -1,15 +0,0 @@
# 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

@ -1,6 +0,0 @@
# 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

@ -1,7 +0,0 @@
# 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

@ -1,87 +0,0 @@
# 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

@ -1,317 +0,0 @@
# 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

@ -1,27 +0,0 @@
# 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()

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +0,0 @@
# 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")

View File

@ -1,485 +0,0 @@
# 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

Binary file not shown.

View File

@ -1,5 +0,0 @@
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

@ -1,73 +0,0 @@
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]==])

View File

@ -1,669 +0,0 @@
# 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

@ -1,140 +0,0 @@
# 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

@ -1,140 +0,0 @@
# 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

@ -1,101 +0,0 @@
# 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)

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

View File

@ -1,42 +0,0 @@
# 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

@ -1,162 +0,0 @@
# 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

@ -1,15 +0,0 @@
# 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

@ -1,15 +0,0 @@
# 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

@ -1,6 +0,0 @@
# 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

@ -1,7 +0,0 @@
# 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

@ -1,87 +0,0 @@
# 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

@ -1,317 +0,0 @@
# 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

@ -1,27 +0,0 @@
# 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()

Binary file not shown.

Binary file not shown.

View File

@ -1,31 +0,0 @@
# 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,12 +79,6 @@ enable_serial = true
mock_camera = false mock_camera = false
mock_serial = 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] [Logging]
; level: trace|debug|info|warn|error|off (default info). --log-level overrides. ; level: trace|debug|info|warn|error|off (default info). --log-level overrides.
level = info level = info

View File

@ -39,20 +39,15 @@ The design separates **policy** (the control logic) from **mechanism** (the I/O
| Thread | Where | Role | | Thread | Where | Role |
|--------|-------|------| |--------|-------|------|
| Main / control loop | `Application::run` | 10 ms tick: drain UI commands, `scheduler.tick()`, publish a `UiSnapshot` | | Main / control loop | `Application::run` | 10 ms tick: drain console commands, `scheduler.tick()` |
| UI input (headless) | `HeadlessUi` | reads stdin lines into the command sink | | stdin reader | `Application` | reads command lines into a queue |
| 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 | | Serial I/O | `SerialMotorController` | Boost.Asio `io_context`; async read-until parses telemetry |
| Image worker | `ImagePipeline` | drains the frame queue: rotate → encode → write → publish | | Image worker | `ImagePipeline` | drains the frame queue: rotate → encode → write → publish |
| MQTT client | Paho (internal) | delivers callbacks; auto-reconnects (no busy-wait loop) | | MQTT client | Paho (internal) | delivers callbacks; auto-reconnects (no busy-wait loop) |
| Camera acquisition | Vimba X (internal) | delivers frames via the observer (real source) | | 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 Shared state is mutex-guarded: latest `MotorTelemetry` (serial), `ControlCommand` (channel), the frame queue
(pipeline), the console command queue, and the latest `UiSnapshot`. The `CaptureScheduler` runs only on the (pipeline), and the console command queue. The `CaptureScheduler` runs only on the main thread.
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 ## Data flow

View File

@ -42,7 +42,6 @@ Parsed and validated by `ConfigLoader` ([src/core/Config.cpp](../src/core/Config
| `Features` | `mock_serial` | bool | `false` | Use the simulated motor controller | | `Features` | `mock_serial` | bool | `false` | Use the simulated motor controller |
| `Logging` | `level` | enum | `info` | Linear log level (`--log-level` overrides) | | `Logging` | `level` | enum | `info` | Linear log level (`--log-level` overrides) |
| `Logging` | `trace` | csv | — | Wire-trace categories, off by default (`--trace` 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_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_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 | | `Motor` | `yaw_min_deg`/`yaw_max_deg`/`pitch_*` | float | `-90`/`90`/… | Soft clamp on commanded degrees |
@ -83,8 +82,6 @@ Parsed by Boost.Program_options ([main.cpp](../main.cpp)). Flags override `[Feat
| `--no-mqtt` | Disable MQTT (use the null channel) | | `--no-mqtt` | Disable MQTT (use the null channel) |
| `--mock-camera` | Use the simulated camera | | `--mock-camera` | Use the simulated camera |
| `--mock-serial` | Use the simulated motor controller | | `--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` | | `--log-level <lvl>` | `trace`/`debug`/`info`/`warn`/`error`/`off` |
| `--trace <cats>` | Verbatim wire trace; comma list `serial,mqtt,camera,control,all,none` | | `--trace <cats>` | Verbatim wire trace; comma list `serial,mqtt,camera,control,all,none` |
@ -117,33 +114,6 @@ Handled in `Application::Impl::handleCommand`.
| `set motorctl <cmd>` | Forward a raw command to the motor controller (e.g. `set motorctl MOVE Y 20000`) | | `set motorctl <cmd>` | Forward a raw command to the motor controller (e.g. `set motorctl MOVE Y 20000`) |
| `exit` | Quit (Ctrl-D also works) | | `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 ## Logging: level vs. wire-trace categories
Two **independent** controls, each settable via config (`[Logging]`), CLI, and a console command: Two **independent** controls, each settable via config (`[Logging]`), CLI, and a console command:

View File

@ -14,9 +14,7 @@ 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/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/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/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, headless vs TUI), wiring, control loop, console commands, `buildSnapshot()` | | [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/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 | | [ini.c](../ini.c), [ini.h](../ini.h) | Bundled third-party inih INI parser |
## Interfaces ## Interfaces
@ -26,7 +24,6 @@ Per-file reference for the refactored tree, plus the shared data structures.
| [include/fgc/IMotorController.h](../include/fgc/IMotorController.h) | `IMotorController` | `MotorTelemetry` | | [include/fgc/IMotorController.h](../include/fgc/IMotorController.h) | `IMotorController` | `MotorTelemetry` |
| [include/fgc/IControlChannel.h](../include/fgc/IControlChannel.h) | `IControlChannel` | `ControlCommand`, `CamEvent` | | [include/fgc/IControlChannel.h](../include/fgc/IControlChannel.h) | `IControlChannel` | `ControlCommand`, `CamEvent` |
| [include/fgc/ICameraSource.h](../include/fgc/ICameraSource.h) | `ICameraSource` | `Frame` | | [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) ## Real implementations (SDK-gated)
@ -34,7 +31,6 @@ 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/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/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/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/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 | | [src/camera/ImagePipeline.cpp](../src/camera/ImagePipeline.cpp) | frame → rotate → encode → write → CamEvent (worker thread) | always |

View File

@ -18,7 +18,6 @@ struct RuntimeOptions {
std::optional<bool> use_mqtt; std::optional<bool> use_mqtt;
std::optional<bool> mock_camera; std::optional<bool> mock_camera;
std::optional<bool> mock_serial; 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 log_level; // empty => default
std::string trace_categories; // comma list (serial,mqtt,camera,control,all); empty => unset std::string trace_categories; // comma list (serial,mqtt,camera,control,all); empty => unset

View File

@ -52,10 +52,6 @@ struct LoggingConfig {
std::string trace; // verbatim wire-trace categories: serial,mqtt,camera,control,all,none 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 // [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; // 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). // otherwise a grid is generated from the parameters below (see ScanGrid).
@ -75,7 +71,6 @@ struct AppConfig {
PathsConfig paths; PathsConfig paths;
FeaturesConfig features; FeaturesConfig features;
LoggingConfig logging; LoggingConfig logging;
UiConfig ui; // [UI] terminal dashboard toggle
Geometry geometry; // [Motor] degrees<->counts maps (yaw + pitch) Geometry geometry; // [Motor] degrees<->counts maps (yaw + pitch)
ScanConfig scan; // [Scan] grid source ScanConfig scan; // [Scan] grid source

View File

@ -1,56 +0,0 @@
#pragma once
#include <map>
#include <string>
#include <vector>
namespace fgc {
// Structured decode of a firmware DUMP block (the text between "DUMP BEGIN" and
// "DUMP END"). Mirrors firmware/tools/decode_dump.py, which is authoritative for
// the on-wire field names and the TMC status-register bit tables.
struct DumpAxis {
char axis = '?'; // 'Y' (yaw) / 'P' (pitch)
std::string state_name = "?"; // BOOT/RESET/HOMING/READY/ERROR
bool enabled = false;
bool eeprom_restored = false;
bool has_encoder = false;
long lim_neg = 0;
long lim_pos = 0;
long hold_target = 0;
long speed = 0;
int hsub = 0;
// Raw register hex strings as received, keyed by name (GCONF, DRV_STATUS...).
std::map<std::string, std::string> regs;
// Decoded status registers + their set-bit names.
unsigned drv_status = 0;
unsigned gstat = 0;
unsigned ramp_stat = 0;
int cs_actual = 0; // (DRV_STATUS >> 16) & 0x1F
int sg_result = 0; // DRV_STATUS & 0x3FF
std::vector<std::string> drv_flags;
std::vector<std::string> gstat_flags;
std::vector<std::string> ramp_flags;
};
struct DumpData {
bool valid = false;
std::string build;
long uptime_ms = 0;
unsigned mcusr = 0;
long free_ram = 0;
std::vector<std::string> reset_flags;
std::vector<DumpAxis> axes;
};
// Parse a raw DUMP block. Returns {valid=false} for empty/malformed input (no
// "DUMP BEGIN .. DUMP END" pair).
DumpData parseDump(const std::string& block);
// Human-readable lines for a decoded dump (console-reusable pretty print).
std::vector<std::string> formatDump(const DumpData& d);
} // namespace fgc

View File

@ -1,35 +0,0 @@
#pragma once
#include <string>
#include <vector>
namespace fgc {
// Operator command reference, modelled as data so the headless console and the
// TUI render from one source of truth (avoids the two drifting apart). The
// console prints renderHelp(); the TUI walks helpCatalog() to draw its inline
// help pane.
struct HelpEntry {
std::string syntax; // e.g. "goto <yaw_deg> <pitch_deg>"
std::string summary; // one-line description
std::vector<std::string> detail; // expanded lines: examples, units, notes
};
struct HelpSection {
std::string title; // e.g. "Positioning"
std::string blurb; // one line under the title
std::vector<HelpEntry> entries;
};
// The full catalog (static, built once).
const std::vector<HelpSection>& helpCatalog();
// Flatten the catalog to printable lines for the console.
// topic == "" -> every section's title/blurb + one summary line per entry.
// topic == "<x>" -> the matching section(s)/entry(ies) with their detail lines.
// Matching is case-insensitive against section titles and the first token of
// each entry's syntax (the command verb).
std::vector<std::string> renderHelp(const std::string& topic = "");
} // namespace fgc

View File

@ -53,11 +53,6 @@ public:
// Latest telemetry snapshot (thread-safe in implementations). // Latest telemetry snapshot (thread-safe in implementations).
virtual MotorTelemetry telemetry() = 0; virtual MotorTelemetry telemetry() = 0;
// The most recently completed firmware DUMP block (the text between
// "DUMP BEGIN" and "DUMP END", inclusive), or "" if none has been captured.
// Thread-safe in implementations.
virtual std::string lastDump() = 0;
// Whether the underlying link is usable. // Whether the underlying link is usable.
virtual bool connected() const = 0; virtual bool connected() const = 0;
}; };

View File

@ -7,7 +7,6 @@
#include <condition_variable> #include <condition_variable>
#include <functional> #include <functional>
#include <mutex> #include <mutex>
#include <optional>
#include <queue> #include <queue>
#include <string> #include <string>
#include <thread> #include <thread>
@ -54,10 +53,6 @@ public:
void setEffort(int e) { params_.jxl_effort = e; } void setEffort(int e) { params_.jxl_effort = e; }
void setDisplay(bool on) { params_.display = on; } 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: private:
void run(); void run();
void process(const Frame& frame); void process(const Frame& frame);
@ -72,9 +67,6 @@ private:
std::condition_variable cv_; std::condition_variable cv_;
std::atomic<bool> running_{false}; std::atomic<bool> running_{false};
std::thread worker_; std::thread worker_;
mutable std::mutex last_event_mutex_;
std::optional<CamEvent> last_event_;
}; };
} // namespace fgc } // namespace fgc

View File

@ -1,6 +1,5 @@
#pragma once #pragma once
#include <functional>
#include <ostream> #include <ostream>
#include <sstream> #include <sstream>
#include <string> #include <string>
@ -53,15 +52,6 @@ public:
// Map a single category name to its enum value. Unknown => LogCat::None and // Map a single category name to its enum value. Unknown => LogCat::None and
// *ok=false (when ok != nullptr). // *ok=false (when ok != nullptr).
static LogCat catFromString(const std::string& name, bool* 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(). // RAII helper that buffers one log line and flushes it on commit().

View File

@ -20,7 +20,6 @@ public:
void stop() override; void stop() override;
void sendCommand(const std::string& cmd) override; void sendCommand(const std::string& cmd) override;
MotorTelemetry telemetry() override; MotorTelemetry telemetry() override;
std::string lastDump() override;
bool connected() const override; bool connected() const override;
private: private:

View File

@ -46,33 +46,6 @@ public:
} else if (verb == "STOP") { } else if (verb == "STOP") {
yaw_target_ = yaw_.xenc; yaw_target_ = yaw_.xenc;
pitch_target_ = pitch_.xenc; pitch_target_ = pitch_.xenc;
} else if (verb == "DUMP") {
// Mirror the real firmware DUMP wire format (see firmware/src/motor.cpp
// and main.cpp) so the host-side DumpParser is exercised without
// hardware. Register values are illustrative, not simulated; the
// encoder positions track the mock's live state.
const int st = homed_ ? 3 : 1; // READY : RESET
std::ostringstream d;
d << "DUMP BEGIN build=mock uptime=0 mcusr=0x01 free_ram=4096\n";
auto axis = [&](char L, const AxisTelemetry& a) {
d << "DUMP " << L << " state=" << st
<< " hsub=0 enabled=" << (homed_ ? 1 : 0)
<< " lim_neg=0 lim_pos=1000000 hold_target=" << a.xenc
<< " speed=200000 eeprom_restored=1 has_encoder=1\n";
d << "DUMP " << L << " TMC GCONF=0x00000004 GSTAT=0x00000000"
<< " IOIN=0x30000008 TSTEP=0x000fffff RAMPMODE=0x00000000"
<< " XACTUAL=0x" << std::hex << (a.xactual & 0xffffffff)
<< " VACTUAL=0x00000000 XTARGET=0x" << (a.xenc & 0xffffffff) << std::dec
<< " SW_MODE=0x00000000 RAMP_STAT=0x00000300 X_ENC=0x" << std::hex
<< (a.xenc & 0xffffffff) << std::dec
<< " ENC_STATUS=0x00000000 CHOPCONF=0x10410150"
<< " DRV_STATUS=0x80084000 PWM_SCALE=0x00000008 PWM_AUTO=0x00000000\n";
};
axis('Y', yaw_);
axis('P', pitch_);
d << "DUMP END\n";
dump_ = d.str();
LOG_INFO << "firmware dump:\n" << dump_;
} }
// ENABLE/DISABLE/SPEED/SETPOS/RESET: accepted, no simulation effect. // ENABLE/DISABLE/SPEED/SETPOS/RESET: accepted, no simulation effect.
} }
@ -88,11 +61,6 @@ public:
return t; return t;
} }
std::string lastDump() override {
std::lock_guard<std::mutex> lock(mutex_);
return dump_;
}
bool connected() const override { return true; } bool connected() const override { return true; }
private: private:
@ -123,7 +91,6 @@ private:
long yaw_target_ = 0; long yaw_target_ = 0;
long pitch_target_ = 0; long pitch_target_ = 0;
bool homed_ = false; bool homed_ = false;
std::string dump_;
}; };
} // namespace fgc } // namespace fgc

View File

@ -1,29 +0,0 @@
#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

@ -1,35 +0,0 @@
#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

View File

@ -1,54 +0,0 @@
#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

View File

@ -1,142 +0,0 @@
#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
int sg = 0; // SG_RESULT (live, from ST line)
int cs = 0; // CS_ACTUAL
int pwm = 0; // PWM_SCALE_SUM
unsigned drv_status = 0; // DRV_STATUS register
bool moving = false;
bool standstill = false;
bool stall = false;
bool overtemp = false;
bool endstop_l = false;
bool endstop_r = false;
// Homing travel limits (from the last firmware dump): the endstop positions
// found during homing, in encoder counts and converted to degrees.
bool has_limits = false;
long lim_neg = 0;
long lim_pos = 0;
double lim_neg_deg = 0.0;
double lim_pos_deg = 0.0;
};
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)
};
// Most recent firmware DUMP block (raw text), surfaced in the TUI help pane.
struct DumpView {
bool has = false;
std::string text;
};
struct UiSnapshot {
HeaderView header;
GimbalView gimbal;
SensorsView sensors;
CaptureView capture;
ConnView conn;
std::vector<LogLine> log;
DumpView dump;
};
// ---- 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,8 +21,6 @@ int main(int argc, char* argv[]) {
("no-mqtt", po::bool_switch(), "disable MQTT (use a null control channel)") ("no-mqtt", po::bool_switch(), "disable MQTT (use a null control channel)")
("mock-camera", po::bool_switch(), "use a simulated camera (no hardware)") ("mock-camera", po::bool_switch(), "use a simulated camera (no hardware)")
("mock-serial", po::bool_switch(), "use a simulated motor controller (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") ("log-level", po::value<std::string>(), "trace|debug|info|warn|error|off")
("trace", po::value<std::string>(), ("trace", po::value<std::string>(),
"verbatim wire trace, comma list: serial,mqtt,camera,control,all,none"); "verbatim wire trace, comma list: serial,mqtt,camera,control,all,none");
@ -66,8 +64,6 @@ int main(int argc, char* argv[]) {
if (vm["no-mqtt"].as<bool>()) opts.use_mqtt = false; if (vm["no-mqtt"].as<bool>()) opts.use_mqtt = false;
if (vm["mock-camera"].as<bool>()) opts.mock_camera = true; if (vm["mock-camera"].as<bool>()) opts.mock_camera = true;
if (vm["mock-serial"].as<bool>()) opts.mock_serial = 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("log-level")) opts.log_level = vm["log-level"].as<std::string>();
if (vm.count("trace")) opts.trace_categories = vm["trace"].as<std::string>(); if (vm.count("trace")) opts.trace_categories = vm["trace"].as<std::string>();

View File

@ -101,17 +101,8 @@ void ImagePipeline::process(const Frame& frame) {
ev.pitch_decideg = static_cast<int>(o.pitch_deg * 10); ev.pitch_decideg = static_cast<int>(o.pitch_deg * 10);
ev.timestamp_ms = frame.timestamp_ms; ev.timestamp_ms = frame.timestamp_ms;
channel_.publishCamEvent(ev); 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 << ")"; 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 } // namespace fgc

View File

@ -2,8 +2,6 @@
#include "fgc/CaptureScheduler.h" #include "fgc/CaptureScheduler.h"
#include "fgc/CommandParser.h" #include "fgc/CommandParser.h"
#include "fgc/DumpParser.h"
#include "fgc/HelpText.h"
#include "fgc/ICameraSource.h" #include "fgc/ICameraSource.h"
#include "fgc/IControlChannel.h" #include "fgc/IControlChannel.h"
#include "fgc/IMotorController.h" #include "fgc/IMotorController.h"
@ -14,17 +12,13 @@
#include "fgc/mock/MockCameraSource.h" #include "fgc/mock/MockCameraSource.h"
#include "fgc/mock/MockMotorController.h" #include "fgc/mock/MockMotorController.h"
#include "fgc/mock/NullControlChannel.h" #include "fgc/mock/NullControlChannel.h"
#include "fgc/ui/HeadlessUi.h"
#include "fgc/ui/IUserInterface.h"
#include "fgc/ui/UiSnapshot.h"
#include <atomic> #include <atomic>
#include <chrono> #include <chrono>
#include <iostream>
#include <memory> #include <memory>
#include <mutex> #include <mutex>
#include <queue> #include <queue>
#include <sstream>
#include <string>
#include <thread> #include <thread>
#if FGC_WITH_MQTT #if FGC_WITH_MQTT
@ -33,9 +27,6 @@
#if FGC_WITH_VIMBA #if FGC_WITH_VIMBA
#include "fgc/VimbaCameraSource.h" #include "fgc/VimbaCameraSource.h"
#endif #endif
#if FGC_WITH_TUI
#include "fgc/ui/TuiUi.h"
#endif
namespace fgc { namespace fgc {
@ -71,16 +62,12 @@ struct Application::Impl {
std::unique_ptr<ICameraSource> camera; std::unique_ptr<ICameraSource> camera;
std::unique_ptr<ImagePipeline> pipeline; std::unique_ptr<ImagePipeline> pipeline;
std::unique_ptr<CaptureScheduler> scheduler; std::unique_ptr<CaptureScheduler> scheduler;
std::unique_ptr<IUserInterface> ui;
ScanGrid grid; // outlives scheduler (holds a reference to it) ScanGrid grid; // outlives scheduler (holds a reference to it)
std::atomic<bool> running{true}; std::atomic<bool> running{true};
std::mutex cmd_mutex; std::mutex cmd_mutex;
std::queue<std::string> cmd_queue; 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; } std::string statusTopicTower() const { return cfg.general.tower_name; }
@ -124,114 +111,6 @@ struct Application::Impl {
#endif #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.sg = a.sg;
v.cs = a.cs;
v.pwm = a.pwm;
v.drv_status = a.drv_status;
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);
// Homing travel limits come from the last firmware dump (lim_neg/lim_pos);
// convert the endstop counts to degrees via the per-axis geometry.
DumpData dd = parseDump(motor->lastDump());
if (dd.valid) {
auto fillLimits = [](AxisView& v, const DumpAxis& a, const AxisMap& map) {
v.has_limits = true;
v.lim_neg = a.lim_neg;
v.lim_pos = a.lim_pos;
v.lim_neg_deg = map.toDeg(a.lim_neg);
v.lim_pos_deg = map.toDeg(a.lim_pos);
};
for (const auto& a : dd.axes) {
if (a.axis == 'Y') fillLimits(s.gimbal.yaw, a, cfg.geometry.yaw);
else if (a.axis == 'P') fillLimits(s.gimbal.pitch, a, cfg.geometry.pitch);
}
}
// --- 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
// --- Diagnostics (last firmware DUMP) ---
s.dump.text = motor->lastDump();
s.dump.has = !s.dump.text.empty();
return s;
}
void publishSnapshot() {
UiSnapshot s = buildSnapshot();
std::lock_guard<std::mutex> lock(snapshot_mutex);
latest_snapshot = std::move(s);
}
void runInitSequence() { void runInitSequence() {
using namespace std::chrono_literals; using namespace std::chrono_literals;
LOG_INFO << "Running gimbal init sequence (enable + home)"; LOG_INFO << "Running gimbal init sequence (enable + home)";
@ -249,7 +128,6 @@ struct Application::Impl {
const auto t0 = std::chrono::steady_clock::now(); const auto t0 = std::chrono::steady_clock::now();
while (running && std::chrono::steady_clock::now() < t0 + 3s) { while (running && std::chrono::steady_clock::now() < t0 + 3s) {
std::this_thread::sleep_for(100ms); std::this_thread::sleep_for(100ms);
publishSnapshot(); // keep the TUI's gimbal panel live during homing
if (!allReady(motor->telemetry())) break; // homing started if (!allReady(motor->telemetry())) break; // homing started
} }
@ -257,7 +135,6 @@ struct Application::Impl {
const auto deadline = std::chrono::steady_clock::now() + 65s; const auto deadline = std::chrono::steady_clock::now() + 65s;
while (running && std::chrono::steady_clock::now() < deadline) { while (running && std::chrono::steady_clock::now() < deadline) {
std::this_thread::sleep_for(250ms); std::this_thread::sleep_for(250ms);
publishSnapshot(); // keep the TUI's gimbal panel live during homing
MotorTelemetry t = motor->telemetry(); MotorTelemetry t = motor->telemetry();
if (t.yaw.state == AxisState::Error || if (t.yaw.state == AxisState::Error ||
(t.pitch_present && t.pitch.state == AxisState::Error)) { (t.pitch_present && t.pitch.state == AxisState::Error)) {
@ -307,39 +184,12 @@ struct Application::Impl {
LOG_INFO << "trace categories: " << traceNames(Logger::categories()); LOG_INFO << "trace categories: " << traceNames(Logger::categories());
} }
// `goto <yaw_deg> <pitch_deg>` — aim the gimbal at an absolute heading and
// elevation in degrees. Converts to encoder counts via the operator-calibrated
// Geometry maps (which soft-clamp to the travel limits) and issues a two-axis
// MOVE so both axes start together.
void handleGoto(const std::string& line) {
std::istringstream iss(line);
std::string verb;
double yaw_deg = 0.0, pitch_deg = 0.0;
if (!(iss >> verb >> yaw_deg >> pitch_deg)) {
LOG_WARN << "usage: goto <yaw_deg> <pitch_deg> (e.g. goto 30 -10)";
return;
}
long yc = cfg.geometry.yaw.toCounts(yaw_deg);
long pc = cfg.geometry.pitch.toCounts(pitch_deg);
LOG_INFO << "goto yaw=" << yaw_deg << "deg pitch=" << pitch_deg
<< "deg -> MOVE " << yc << "," << pc;
motor->sendCommand("MOVE " + std::to_string(yc) + "," + std::to_string(pc));
}
void handleCommand(const std::string& line) { void handleCommand(const std::string& line) {
Command c = parseCommand(line); Command c = parseCommand(line);
if (c.empty()) return; if (c.empty()) return;
LOG_TRACE_CAT(LogCat::Control) << "cmd " << line; LOG_TRACE_CAT(LogCat::Control) << "cmd " << line;
if (c.verb == "help") { if (c.verb == "exit") {
// c.device holds the optional topic (first token after "help").
for (const auto& l : renderHelp(c.device)) LOG_INFO << l;
} else if (c.verb == "goto") {
handleGoto(line);
} else if (c.verb == "dump") {
LOG_INFO << "requesting firmware dump...";
motor->sendCommand("DUMP");
} else if (c.verb == "exit") {
running = false; running = false;
} else if (c.verb == "start") { } else if (c.verb == "start") {
startCapture(); startCapture();
@ -371,6 +221,19 @@ 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() { void drainCommands() {
std::queue<std::string> local; std::queue<std::string> local;
{ {
@ -384,8 +247,6 @@ struct Application::Impl {
} }
int run() { int run() {
start_time = std::chrono::steady_clock::now();
// Log level: config first, CLI overrides. // Log level: config first, CLI overrides.
if (!cfg.logging.level.empty() && !Logger::setLevelFromString(cfg.logging.level)) if (!cfg.logging.level.empty() && !Logger::setLevelFromString(cfg.logging.level))
LOG_WARN << "unknown Logging.level '" << cfg.logging.level << "', keeping default"; LOG_WARN << "unknown Logging.level '" << cfg.logging.level << "', keeping default";
@ -447,37 +308,20 @@ struct Application::Impl {
pipeline->start(); pipeline->start();
channel->publishStatus(0); 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.init) runInitSequence();
if (opts.start) startCapture(); if (opts.start) startCapture();
input_thread = std::thread(&Impl::inputLoop, this);
LOG_INFO << "Entering control loop (type 'exit' to quit)"; LOG_INFO << "Entering control loop (type 'exit' to quit)";
while (running) { while (running) {
drainCommands(); drainCommands();
scheduler->tick(); scheduler->tick();
publishSnapshot();
std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::sleep_for(std::chrono::milliseconds(10));
} }
LOG_INFO << "Shutting down"; LOG_INFO << "Shutting down";
if (ui) ui->stop(); if (input_thread.joinable()) input_thread.join();
pipeline->stop(); pipeline->stop();
camera->stop(); camera->stop();
camera->close(); camera->close();

View File

@ -112,8 +112,6 @@ AppConfig ConfigLoader::fromMap(const std::map<std::string, std::string>& kv) {
cfg.logging.level = get(kv, "Logging.level", cfg.logging.level); cfg.logging.level = get(kv, "Logging.level", cfg.logging.level);
cfg.logging.trace = get(kv, "Logging.trace", cfg.logging.trace); 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). // [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.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); cfg.geometry.yaw.zero_count = getLong(kv, "Motor.yaw_zero_count", cfg.geometry.yaw.zero_count);

View File

@ -1,216 +0,0 @@
#include "fgc/DumpParser.h"
#include <array>
#include <sstream>
#include <utility>
namespace fgc {
namespace {
// Bit tables, copied verbatim from firmware/tools/decode_dump.py (keep in sync).
const char* stateName(int s) {
switch (s) {
case 0: return "BOOT";
case 1: return "RESET";
case 2: return "HOMING";
case 3: return "READY";
case 4: return "ERROR";
default: return "?";
}
}
struct Bit { int shift; const char* name; };
const std::array<Bit, 5> kMcusr = {{
{0, "PORF (power-on)"}, {1, "EXTRF (external)"}, {2, "BORF (brown-out)"},
{3, "WDRF (watchdog)"}, {4, "JTRF (jtag)"},
}};
const std::array<Bit, 12> kDrv = {{
{31, "stst"}, {30, "olb"}, {29, "ola"}, {28, "s2gb"}, {27, "s2ga"},
{26, "otpw"}, {25, "ot"}, {24, "stallguard"}, {15, "fsactive"},
{14, "stealth"}, {12, "s2vsb"}, {11, "s2vsa"},
}};
const std::array<Bit, 3> kGstat = {{
{0, "reset"}, {1, "drv_err"}, {2, "uv_cp"},
}};
const std::array<Bit, 10> kRamp = {{
{0, "stop_l"}, {1, "stop_r"}, {4, "event_stop_l"}, {5, "event_stop_r"},
{6, "event_stop_sg"}, {7, "event_pos_reached"}, {8, "velocity_reached"},
{9, "position_reached"}, {10, "vzero"}, {13, "status_sg"},
}};
template <size_t N>
std::vector<std::string> bitsSet(unsigned val, const std::array<Bit, N>& table) {
std::vector<std::string> out;
for (const auto& b : table)
if (val & (1u << b.shift)) out.emplace_back(b.name);
if (out.empty()) out.emplace_back("-");
return out;
}
// Parse "key=value key=value ..." into a map.
std::map<std::string, std::string> kvPairs(const std::string& s) {
std::map<std::string, std::string> m;
std::istringstream iss(s);
std::string tok;
while (iss >> tok) {
auto eq = tok.find('=');
if (eq != std::string::npos) m[tok.substr(0, eq)] = tok.substr(eq + 1);
}
return m;
}
// Integer from a decimal or "0x"-prefixed hex string; `fallback` on failure.
long asInt(const std::string& s, long fallback = 0) {
if (s.empty()) return fallback;
try {
size_t pos = 0;
bool hex = s.size() > 1 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X');
long v = std::stol(s, &pos, hex ? 16 : 10);
return v;
} catch (const std::exception&) {
return fallback;
}
}
std::string get(const std::map<std::string, std::string>& m, const std::string& k,
const std::string& fallback = "") {
auto it = m.find(k);
return it == m.end() ? fallback : it->second;
}
std::string join(const std::vector<std::string>& v) {
std::string out;
for (size_t i = 0; i < v.size(); ++i) out += (i ? " " : "") + v[i];
return out;
}
} // namespace
DumpData parseDump(const std::string& block) {
DumpData d;
if (block.empty()) return d;
// Split into lines, locate the BEGIN..END envelope.
std::vector<std::string> lines;
{
std::istringstream iss(block);
std::string l;
while (std::getline(iss, l)) {
if (!l.empty() && l.back() == '\r') l.pop_back();
lines.push_back(l);
}
}
size_t begin = lines.size(), end = lines.size();
for (size_t i = 0; i < lines.size(); ++i) {
if (begin == lines.size() && lines[i].rfind("DUMP BEGIN", 0) == 0) begin = i;
if (lines[i].rfind("DUMP END", 0) == 0) { end = i; break; }
}
if (begin == lines.size() || end <= begin) return d;
// Header.
auto hdr = kvPairs(lines[begin].substr(std::string("DUMP BEGIN").size()));
d.build = get(hdr, "build");
d.uptime_ms = asInt(get(hdr, "uptime", "0"));
d.mcusr = static_cast<unsigned>(asInt(get(hdr, "mcusr", "0")));
d.free_ram = asInt(get(hdr, "free_ram", "0"));
d.reset_flags = bitsSet(d.mcusr, kMcusr);
// Per-axis lines: "DUMP <Y|P> state=.." and "DUMP <Y|P> TMC ..".
auto axisFor = [&d](char a) -> DumpAxis& {
for (auto& ax : d.axes)
if (ax.axis == a) return ax;
d.axes.push_back(DumpAxis{});
d.axes.back().axis = a;
return d.axes.back();
};
for (size_t i = begin + 1; i < end; ++i) {
const std::string& l = lines[i];
if (l.rfind("DUMP ", 0) != 0 || l.size() < 7) continue;
char a = l[5];
if (a != 'Y' && a != 'P') continue;
// Skip past "DUMP X" and any whitespace; the payload is either
// "state=.." or "TMC GCONF=..". (substr(6) alone leaves a leading space,
// which would make the "TMC" prefix check below miss.)
std::string rest = l.substr(6);
size_t nb = rest.find_first_not_of(" \t");
rest = (nb == std::string::npos) ? "" : rest.substr(nb);
DumpAxis& ax = axisFor(a);
if (rest.rfind("TMC", 0) == 0) {
auto m = kvPairs(rest.substr(3));
ax.regs = m;
ax.drv_status = static_cast<unsigned>(asInt(get(m, "DRV_STATUS", "0")));
ax.gstat = static_cast<unsigned>(asInt(get(m, "GSTAT", "0")));
ax.ramp_stat = static_cast<unsigned>(asInt(get(m, "RAMP_STAT", "0")));
ax.cs_actual = static_cast<int>((ax.drv_status >> 16) & 0x1F);
ax.sg_result = static_cast<int>(ax.drv_status & 0x3FF);
ax.drv_flags = bitsSet(ax.drv_status, kDrv);
ax.gstat_flags = bitsSet(ax.gstat, kGstat);
ax.ramp_flags = bitsSet(ax.ramp_stat, kRamp);
} else {
auto m = kvPairs(rest);
ax.state_name = stateName(static_cast<int>(asInt(get(m, "state", "-1"))));
ax.hsub = static_cast<int>(asInt(get(m, "hsub", "0")));
ax.enabled = asInt(get(m, "enabled", "0")) != 0;
ax.eeprom_restored = asInt(get(m, "eeprom_restored", "0")) != 0;
ax.has_encoder = asInt(get(m, "has_encoder", "0")) != 0;
ax.lim_neg = asInt(get(m, "lim_neg", "0"));
ax.lim_pos = asInt(get(m, "lim_pos", "0"));
ax.hold_target = asInt(get(m, "hold_target", "0"));
ax.speed = asInt(get(m, "speed", "0"));
}
}
d.valid = true;
return d;
}
std::vector<std::string> formatDump(const DumpData& d) {
std::vector<std::string> out;
if (!d.valid) {
out.emplace_back("(no firmware dump captured)");
return out;
}
{
std::ostringstream os;
os << "build=" << d.build << " uptime=" << d.uptime_ms << " ms free_ram="
<< d.free_ram << " bytes";
out.push_back(os.str());
}
{
std::ostringstream os;
os << "reset cause (mcusr=0x" << std::hex << d.mcusr << std::dec << "): "
<< join(d.reset_flags);
out.push_back(os.str());
}
for (const auto& ax : d.axes) {
out.emplace_back("");
{
std::ostringstream os;
os << "[" << ax.axis << "] state=" << ax.state_name
<< " enabled=" << (ax.enabled ? 1 : 0)
<< " limits=[" << ax.lim_neg << ".." << ax.lim_pos << "]"
<< " hold_target=" << ax.hold_target
<< " eeprom_restored=" << (ax.eeprom_restored ? 1 : 0)
<< " has_encoder=" << (ax.has_encoder ? 1 : 0);
out.push_back(os.str());
}
for (const char* k : {"GCONF", "CHOPCONF", "XACTUAL", "X_ENC", "XTARGET", "VACTUAL"}) {
auto it = ax.regs.find(k);
if (it != ax.regs.end()) out.push_back(std::string(" ") + k + " = " + it->second);
}
out.push_back(" DRV_STATUS = " + get(ax.regs, "DRV_STATUS", "?") + " [" +
join(ax.drv_flags) + "] CS_ACTUAL=" + std::to_string(ax.cs_actual) +
" SG_RESULT=" + std::to_string(ax.sg_result));
out.push_back(" GSTAT = " + get(ax.regs, "GSTAT", "?") + " [" +
join(ax.gstat_flags) + "]");
out.push_back(" RAMP_STAT = " + get(ax.regs, "RAMP_STAT", "?") + " [" +
join(ax.ramp_flags) + "]");
}
return out;
}
} // namespace fgc

View File

@ -1,118 +0,0 @@
#include "fgc/HelpText.h"
#include <algorithm>
#include <cctype>
namespace fgc {
namespace {
std::string lower(std::string s) {
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c) { return static_cast<char>(std::tolower(c)); });
return s;
}
// First whitespace-delimited token of a syntax string (the command verb), lowercased.
std::string verbOf(const std::string& syntax) {
auto end = syntax.find_first_of(" \t");
return lower(syntax.substr(0, end == std::string::npos ? syntax.size() : end));
}
} // namespace
const std::vector<HelpSection>& helpCatalog() {
// clang-format off
static const std::vector<HelpSection> catalog = {
{"Positioning", "Aim the gimbal. 'goto' is degrees; raw MOVE is encoder counts.", {
{"goto <yaw_deg> <pitch_deg>",
"Point the gimbal at an absolute heading/elevation in degrees.", {
"Converts degrees to encoder counts (operator-calibrated) and sends a",
"two-axis MOVE so both axes start together. Degrees are soft-clamped to",
"the configured travel limits.",
"Example: goto 30 -10 (yaw 30 deg, pitch -10 deg)"}},
{"set motorctl MOVE <yaw>,<pitch>",
"Move both axes to absolute encoder counts (no degree conversion).", {
"Example: set motorctl MOVE 100000,250000",
"Single axis: set motorctl MOVE Y 100000 / set motorctl MOVE P 250000"}},
{"set motorctl HOME [Y|P]",
"Run the endstop-finding home sequence (both axes, or one).", {
"Example: set motorctl HOME / set motorctl HOME Y"}},
{"set motorctl STOP <Y|P|ALL>",
"Stop motion immediately on an axis or both.", {}},
{"set motorctl SPEED <Y|P> <vel>",
"Set the max slew speed (counts/s) for an axis.", {}},
}},
{"Diagnostics", "Inspect the firmware/driver state for debugging.", {
{"dump",
"Request a full firmware state dump and show it here.", {
"Sends DUMP to the firmware; the captured DUMP BEGIN..END block (build,",
"uptime, reset cause, and per-axis TMC5160 registers) is logged and, in",
"the TUI, shown in the Diagnostics help section.",
"Equivalent offline tool: ./firmware/dump.sh"}},
{"set motorctl DIAG [Y|P|ALL]",
"Run the motor self-test (emits DG lines, ends with DG DONE).", {
"Each axis is swept at several speeds/directions; results stream as DG",
"lines in the log. Axis must be homed first."}},
{"set motorctl STATUS",
"Ask the firmware to emit one telemetry (ST) line now.", {}},
}},
{"Capture", "Control image capture and encoding.", {
{"start", "Begin the capture scan.", {}},
{"stop", "Halt the capture scan.", {}},
{"set fps <rate>", "Set capture rate in images/second.", {}},
{"set camera fps <rate>", "Set the camera sensor frame rate.", {}},
{"set camera jxlq <dist>", "Set JPEG-XL distance (lower = higher quality).", {}},
{"set camera jxle <effort>", "Set JPEG-XL encode effort.", {}},
{"set camera display <0|1>", "Toggle the local display window.", {}},
}},
{"Logging", "Control console/log verbosity.", {
{"debug", "Toggle debug-level logging on/off.", {}},
{"trace <serial|mqtt|camera|control|all|off> [on|off]",
"Toggle verbatim wire-trace categories.", {
"Example: trace serial on / trace off"}},
}},
{"Session", "Help and exit.", {
{"help [topic]",
"Show this reference; 'help <topic>' expands one section.", {
"Example: help positioning / help dump"}},
{"exit", "Shut down and quit.", {}},
}},
};
// clang-format on
return catalog;
}
std::vector<std::string> renderHelp(const std::string& topic) {
std::vector<std::string> out;
const std::string q = lower(topic);
if (q.empty()) {
out.emplace_back("Available commands (type 'help <topic>' for detail, e.g. 'help goto'):");
for (const auto& sec : helpCatalog()) {
out.emplace_back("");
out.emplace_back("== " + sec.title + " == " + sec.blurb);
for (const auto& e : sec.entries)
out.emplace_back(" " + e.syntax + " - " + e.summary);
}
return out;
}
// Topic mode: match a section by title, or an entry by command verb.
bool matched = false;
for (const auto& sec : helpCatalog()) {
const bool sec_match = lower(sec.title).find(q) != std::string::npos;
for (const auto& e : sec.entries) {
if (!sec_match && verbOf(e.syntax) != q) continue;
matched = true;
out.emplace_back(e.syntax);
out.emplace_back(" " + e.summary);
for (const auto& d : e.detail) out.emplace_back(" " + d);
out.emplace_back("");
}
}
if (!matched) out.emplace_back("No help topic matching '" + topic + "'. Try 'help'.");
return out;
}
} // namespace fgc

View File

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

View File

@ -1,11 +1,9 @@
#include "fgc/SerialMotorController.h" #include "fgc/SerialMotorController.h"
#include "fgc/DumpParser.h"
#include "fgc/Logger.h" #include "fgc/Logger.h"
#include "fgc/TelemetryParser.h" #include "fgc/TelemetryParser.h"
#include <atomic> #include <atomic>
#include <cctype>
#include <istream> #include <istream>
#include <mutex> #include <mutex>
#include <thread> #include <thread>
@ -14,38 +12,6 @@
namespace fgc { namespace fgc {
namespace {
// A firmware register value is always "0x" + exactly 8 hex digits (printHex8).
bool isHex8(const std::string& v) {
if (v.size() != 10 || v[0] != '0' || (v[1] != 'x' && v[1] != 'X')) return false;
for (size_t i = 2; i < 10; ++i)
if (!std::isxdigit(static_cast<unsigned char>(v[i]))) return false;
return true;
}
// True only if a captured DUMP block decodes cleanly: each axis present must
// carry all 16 TMC registers with well-formed 8-hex values. The USB read is
// occasionally lossy, so this gates whether a block is trustworthy or must be
// re-requested (see captureDump).
bool dumpComplete(const std::string& block) {
static const char* kRegs[] = {
"GCONF", "GSTAT", "IOIN", "TSTEP", "RAMPMODE", "XACTUAL", "VACTUAL", "XTARGET",
"SW_MODE", "RAMP_STAT", "X_ENC", "ENC_STATUS", "CHOPCONF", "DRV_STATUS",
"PWM_SCALE", "PWM_AUTO"};
DumpData d = parseDump(block);
if (!d.valid || d.axes.empty()) return false;
for (const auto& ax : d.axes) {
for (const char* r : kRegs) {
auto it = ax.regs.find(r);
if (it == ax.regs.end() || !isHex8(it->second)) return false;
}
}
return true;
}
} // namespace
struct SerialMotorController::Impl { struct SerialMotorController::Impl {
Impl(std::string dev, unsigned int b) : device(std::move(dev)), baud(b), serial(io) {} Impl(std::string dev, unsigned int b) : device(std::move(dev)), baud(b), serial(io) {}
@ -59,38 +25,6 @@ struct SerialMotorController::Impl {
MotorTelemetry latest; MotorTelemetry latest;
std::atomic<bool> connected{false}; std::atomic<bool> connected{false};
// DUMP capture: the firmware emits a "DUMP BEGIN" ... "DUMP END" block in
// response to a DUMP command. We accumulate it line-by-line and publish the
// completed block (latest_dump) for the UI / `dump` command. The USB read is
// occasionally lossy on the big dump burst, so an incomplete block is
// auto-re-requested up to dump_attempts times before we give up.
static constexpr int kMaxDumpAttempts = 8;
bool dumping = false;
int dump_attempts = 0; // remaining tries for the in-flight dump
std::string dump_buf;
std::string latest_dump;
// Write one command line (newline-terminated) to the controller. Used by
// sendCommand and by the internal DUMP re-request.
//
// The write is initiated on the io_context thread (via post), NOT the
// caller's thread. asio I/O objects are not thread-safe for concurrent
// operations: issuing async_write from the main thread (e.g. the capture
// scheduler's MOVEs, or a TUI command) while the io_thread runs async_read
// on the same serial_port races the reader and corrupts inbound data — this
// was shredding the DUMP burst whenever the link was busy.
void sendLine(const std::string& cmd) {
auto data = std::make_shared<std::string>(cmd + "\n");
auto trace = std::make_shared<std::string>(cmd);
boost::asio::post(io, [this, data, trace] {
LOG_TRACE_CAT(LogCat::Serial) << "TX " << *trace;
boost::asio::async_write(serial, boost::asio::buffer(*data),
[data](const boost::system::error_code& ec, std::size_t) {
if (ec) LOG_WARN << "Serial write failed: " << ec.message();
});
});
}
void doRead() { void doRead() {
boost::asio::async_read_until( boost::asio::async_read_until(
serial, buffer, '\n', serial, buffer, '\n',
@ -113,11 +47,6 @@ struct SerialMotorController::Impl {
// else (DG/DUMP/BOOT/IOIN/GSTAT...) is async output we just trace. // else (DG/DUMP/BOOT/IOIN/GSTAT...) is async output we just trace.
void dispatchLine(const std::string& line) { void dispatchLine(const std::string& line) {
if (line.rfind("ST ", 0) == 0 || line == "ST") { if (line.rfind("ST ", 0) == 0 || line == "ST") {
// A status line means the firmware has finished any dump in progress.
// If we were still assembling one, its DUMP END was lost on the wire —
// finalize now so the block is validated and (if incomplete) retried,
// rather than hanging forever waiting for an END that never arrives.
if (dumping) finalizeDump();
if (auto t = parseTelemetryLine(line)) { if (auto t = parseTelemetryLine(line)) {
LOG_TRACE_CAT(LogCat::Serial) << "RX " << line; LOG_TRACE_CAT(LogCat::Serial) << "RX " << line;
std::lock_guard<std::mutex> lock(mutex); std::lock_guard<std::mutex> lock(mutex);
@ -131,48 +60,8 @@ struct SerialMotorController::Impl {
} else if (!line.empty()) { } else if (!line.empty()) {
// OK acks and other async output (DG/DUMP/BOOT/...). // OK acks and other async output (DG/DUMP/BOOT/...).
LOG_TRACE_CAT(LogCat::Serial) << "RX " << line; LOG_TRACE_CAT(LogCat::Serial) << "RX " << line;
captureDump(line);
} }
} }
// Assemble the multi-line DUMP block. Detection of BEGIN/END must tolerate
// corruption: on a lossy read a dropped newline merges "DUMP END" onto the
// tail of the previous line (e.g. "...PWM_AUTO=0x...DUMP END"), so we search
// for the markers anywhere in the line, not just at the start. A merged/short
// block then fails dumpComplete() and is re-requested (see finalizeDump).
void captureDump(const std::string& line) {
size_t begin = line.find("DUMP BEGIN");
if (begin != std::string::npos) {
dumping = true;
dump_buf = line.substr(begin) + "\n"; // drop any junk before BEGIN
if (line.find("DUMP END", begin) != std::string::npos) finalizeDump();
return;
}
if (!dumping) return;
dump_buf += line + "\n";
if (line.find("DUMP END") != std::string::npos) finalizeDump();
}
void finalizeDump() {
dumping = false;
if (!dumpComplete(dump_buf) && dump_attempts > 1) {
// Lossy read — re-request rather than publish a corrupt block.
--dump_attempts;
LOG_WARN << "firmware dump incomplete (lossy read); re-requesting ("
<< dump_attempts << " attempt(s) left)";
sendLine("DUMP");
} else {
{
std::lock_guard<std::mutex> lock(mutex);
latest_dump = dump_buf;
}
if (dumpComplete(dump_buf)) LOG_INFO << "firmware dump:\n" << dump_buf;
else LOG_WARN << "firmware dump still incomplete after retries; showing best effort:\n"
<< dump_buf;
dump_attempts = 0;
}
dump_buf.clear();
}
}; };
SerialMotorController::SerialMotorController(std::string device, unsigned int baud) SerialMotorController::SerialMotorController(std::string device, unsigned int baud)
@ -213,23 +102,15 @@ void SerialMotorController::stop() {
impl_->connected = false; impl_->connected = false;
} }
// Case-insensitive check for a bare "DUMP" command (optionally trailing ws).
static bool isDumpCommand(const std::string& cmd) {
size_t i = 0, n = cmd.size();
while (n > 0 && std::isspace(static_cast<unsigned char>(cmd[n - 1]))) --n;
while (i < n && std::isspace(static_cast<unsigned char>(cmd[i]))) ++i;
std::string t = cmd.substr(i, n - i);
if (t.size() != 4) return false;
return (t[0] == 'D' || t[0] == 'd') && (t[1] == 'U' || t[1] == 'u') &&
(t[2] == 'M' || t[2] == 'm') && (t[3] == 'P' || t[3] == 'p');
}
void SerialMotorController::sendCommand(const std::string& cmd) { void SerialMotorController::sendCommand(const std::string& cmd) {
if (!impl_->connected) return; if (!impl_->connected) return;
// Arm dump-integrity retries when the operator requests a dump (the internal LOG_TRACE_CAT(LogCat::Serial) << "TX " << cmd;
// re-request goes through Impl::sendLine, which does not re-arm). // The firmware requires a newline terminator on every command.
if (isDumpCommand(cmd)) impl_->dump_attempts = Impl::kMaxDumpAttempts; auto data = std::make_shared<std::string>(cmd + "\n");
impl_->sendLine(cmd); boost::asio::async_write(impl_->serial, boost::asio::buffer(*data),
[data](const boost::system::error_code& ec, std::size_t) {
if (ec) LOG_WARN << "Serial write failed: " << ec.message();
});
} }
MotorTelemetry SerialMotorController::telemetry() { MotorTelemetry SerialMotorController::telemetry() {
@ -237,11 +118,6 @@ MotorTelemetry SerialMotorController::telemetry() {
return impl_->latest; return impl_->latest;
} }
std::string SerialMotorController::lastDump() {
std::lock_guard<std::mutex> lock(impl_->mutex);
return impl_->latest_dump;
}
bool SerialMotorController::connected() const { return impl_->connected; } bool SerialMotorController::connected() const { return impl_->connected; }
} // namespace fgc } // namespace fgc

View File

@ -1,41 +0,0 @@
#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

View File

@ -1,487 +0,0 @@
#include "fgc/ui/TuiUi.h"
#include "fgc/DumpParser.h"
#include "fgc/HelpText.h"
#include "fgc/Logger.h"
#include <chrono>
#include <cstdio>
#include <map>
#include <sstream>
#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);
}
// Inline help pane (toggled with '?'). Lists every command section; the
// `sel`-th section is expanded to show each entry's detail. The Diagnostics
// section additionally renders the last captured firmware DUMP block.
Element helpPanel(int sel, const DumpView& dump) {
const auto& cat = helpCatalog();
std::vector<Element> rows;
for (int i = 0; i < static_cast<int>(cat.size()); ++i) {
const HelpSection& sec = cat[i];
const bool open = (i == sel);
Element title = hbox({
text(open ? " v " : " > "),
text(sec.title) | bold,
text(" " + sec.blurb) | dim,
});
rows.push_back(open ? (title | inverted) : title);
if (!open) continue;
for (const auto& e : sec.entries) {
rows.push_back(hbox({text(" "), text(e.syntax) | color(Color::Cyan) | bold}));
rows.push_back(hbox({text(" "), text(e.summary) | dim}));
for (const auto& d : e.detail)
rows.push_back(hbox({text(" "), text(d) | dim}));
}
// Diagnostics: show the most recent firmware dump inline.
if (sec.title == "Diagnostics") {
rows.push_back(text(" --- last firmware dump ---") | bold);
if (dump.has) {
std::istringstream iss(dump.text);
std::string l;
while (std::getline(iss, l))
rows.push_back(hbox({text(" "), text(l) | color(Color::Green)}));
} else {
rows.push_back(hbox({text(" "),
text("(none captured yet - run 'dump')") | dim}));
}
}
rows.push_back(text(""));
}
return window(text(" HELP (?:close Up/Down:section) ") | bold | color(Color::Cyan),
vbox(std::move(rows)) | yframe);
}
// Aligned "label: value" row for the detail view.
Element kvRow(const std::string& k, const std::string& v, Color vc = Color::Default) {
return hbox({text(k) | dim | size(WIDTH, EQUAL, 12), text(v) | color(vc)});
}
std::string hex8(unsigned v) {
char buf[11];
std::snprintf(buf, sizeof(buf), "0x%08X", v);
return buf;
}
std::string get_or(const std::map<std::string, std::string>& m, const std::string& k) {
auto it = m.find(k);
return it == m.end() ? "?" : it->second;
}
// Live per-axis block: everything we get from the ST telemetry line.
Element axisLiveDetail(const AxisView& a) {
Element state = text(std::string(" ") + axisStateLabel(a.state) + " ")
| color(toColor(axisStateColor(a.state))) | bold;
std::vector<Element> rows = {
hbox({text(a.label + " ") | bold, state, filler(),
text(formatDegrees(a.deg) + " -> " + formatDegrees(a.target_deg)) | bold}),
kvRow("xactual", std::to_string(a.xactual)),
kvRow("xenc", std::to_string(a.xenc)),
kvRow("SG_RESULT", std::to_string(a.sg)),
kvRow("CS_ACTUAL", std::to_string(a.cs)),
kvRow("PWM", std::to_string(a.pwm)),
kvRow("DRV_STATUS", hex8(a.drv_status), Color::Cyan),
hbox({text("flags") | dim | size(WIDTH, EQUAL, 12),
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)}),
};
// Homing limits (endstops found at homing), degrees then raw counts.
if (a.has_limits) {
rows.push_back(hbox({
text("homing lim") | dim | size(WIDTH, EQUAL, 12),
text(formatDegrees(a.lim_neg_deg) + " .. " + formatDegrees(a.lim_pos_deg)) | bold,
text(" (" + std::to_string(a.lim_neg) + ".." + std::to_string(a.lim_pos) + ")") | dim,
}));
}
return vbox(std::move(rows));
}
// Decoded register block for one axis from a parsed firmware dump.
Element axisDumpDetail(const DumpAxis& ax) {
auto reg = [&](const char* k) -> Element {
auto it = ax.regs.find(k);
return kvRow(k, it == ax.regs.end() ? "-" : it->second);
};
auto flags = [](const std::vector<std::string>& f) {
std::string s;
for (size_t i = 0; i < f.size(); ++i) s += (i ? " " : "") + f[i];
return s;
};
auto statusRow = [&](const char* name, const std::string& raw,
const std::vector<std::string>& f) {
return hbox({text(name) | dim | size(WIDTH, EQUAL, 12),
text(raw + " ") | color(Color::Cyan),
text("[" + flags(f) + "]") | dim});
};
return vbox({
hbox({text(std::string(1, ax.axis) + " ") | bold,
text(ax.state_name) | color(Color::Green) | bold,
text(" enabled=" + std::to_string(ax.enabled ? 1 : 0)) | dim,
text(" enc=" + std::to_string(ax.has_encoder ? 1 : 0)) | dim,
text(" eeprom=" + std::to_string(ax.eeprom_restored ? 1 : 0)) | dim}),
kvRow("limits", "[" + std::to_string(ax.lim_neg) + ".." + std::to_string(ax.lim_pos) + "]"),
kvRow("hold_tgt", std::to_string(ax.hold_target)),
reg("GCONF"), reg("CHOPCONF"), reg("XACTUAL"), reg("X_ENC"),
reg("XTARGET"), reg("VACTUAL"),
statusRow("DRV_STATUS", get_or(ax.regs, "DRV_STATUS"), ax.drv_flags),
hbox({text("") | size(WIDTH, EQUAL, 12),
text("CS_ACTUAL=" + std::to_string(ax.cs_actual) +
" SG_RESULT=" + std::to_string(ax.sg_result)) | dim}),
statusRow("GSTAT", get_or(ax.regs, "GSTAT"), ax.gstat_flags),
statusRow("RAMP_STAT", get_or(ax.regs, "RAMP_STAT"), ax.ramp_flags),
});
}
// One axis's full panel: live telemetry on top, then its decoded firmware
// registers. Rendered per axis so the two axes sit side by side and every row
// (incl. RAMP_STAT, the last one) is visible without scrolling.
Element axisColumn(const std::string& title, const AxisView& live, const DumpData& d,
char letter) {
std::vector<Element> col;
col.push_back(axisLiveDetail(live));
col.push_back(separator());
const DumpAxis* ax = nullptr;
if (d.valid)
for (const auto& a : d.axes)
if (a.axis == letter) ax = &a;
if (ax)
col.push_back(axisDumpDetail(*ax));
else
col.push_back(text(d.valid ? "(axis absent from dump)"
: "(awaiting dump - press 'd')") | dim);
return panel(title, Color::Cyan, vbox(std::move(col)) | yframe);
}
// Full-screen gimbal view (toggled with 'g'): one column per axis, each with
// live telemetry above its decoded firmware register dump.
Element gimbalDetailPanel(const GimbalView& g, const DumpView& dump) {
DumpData d = parseDump(dump.text);
std::string reset;
for (size_t i = 0; i < d.reset_flags.size(); ++i)
reset += (i ? " " : "") + d.reset_flags[i];
Element header = hbox({
(g.present ? text(" link up ") | color(Color::Green)
: text(" link down ") | color(Color::Red) | bold),
filler(),
text(d.valid ? ("build " + d.build + " up " + std::to_string(d.uptime_ms) +
"ms reset:" + reset)
: std::string("no dump yet")) | dim,
});
std::vector<Element> cols;
cols.push_back(axisColumn("YAW", g.yaw, d, 'Y'));
if (g.pitch_present) cols.push_back(axisColumn("PITCH", g.pitch, d, 'P'));
return window(text(" GIMBAL (g/Esc:close d:refresh dump) ") | bold | color(Color::Cyan),
vbox({header, separator(), hbox(std::move(cols)) | flex}));
}
} // 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;
enum class Overlay { None, Help, Gimbal };
Overlay overlay = Overlay::None; // which takeover panel owns the main area
int help_sel = 0;
bool gimbal_dump_requested = false; // auto-pull a dump the first time
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("g", "Gimbal"), keyHint(":", "Cmd"),
keyHint("?", "Help"), filler(), keyHint("q", "Quit"),
});
}
// An open overlay takes over the whole body (the dashboard panels are
// hidden) so it has the full height — otherwise tall content like the
// gimbal register dump overflows the small log-sized area and clips.
switch (overlay) {
case Overlay::Help:
return vbox({header, separator(), helpPanel(help_sel, s.dump) | flex, bottom});
case Overlay::Gimbal:
return vbox({header, separator(),
gimbalDetailPanel(s.gimbal, s.dump) | flex, bottom});
default:
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
}
const int n = static_cast<int>(helpCatalog().size());
if (overlay == Overlay::Help) { // help pane navigation
if (e == Event::ArrowDown) { help_sel = (help_sel + 1) % n; return true; }
if (e == Event::ArrowUp) { help_sel = (help_sel - 1 + n) % n; return true; }
}
if (overlay != Overlay::None && e == Event::Escape) { overlay = Overlay::None; return true; }
if (!e.is_character()) return false;
const std::string& c = e.character();
if (c == "?") {
overlay = (overlay == Overlay::Help) ? Overlay::None : Overlay::Help;
return true;
}
if (c == "g") {
if (overlay == Overlay::Gimbal) {
overlay = Overlay::None;
} else {
overlay = Overlay::Gimbal;
if (!gimbal_dump_requested) { // auto-pull a dump the first time
if (sink_) sink_("dump");
gimbal_dump_requested = true;
}
}
return true;
}
if (overlay == Overlay::Gimbal && c == "d") { // manual dump refresh
if (sink_) sink_("dump");
return true;
}
if (overlay == Overlay::Help) { // vim-style section nav while help is open
if (c == "j") { help_sel = (help_sel + 1) % n; return true; }
if (c == "k") { help_sel = (help_sel - 1 + n) % n; return true; }
}
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

View File

@ -1,65 +0,0 @@
#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,7 +27,6 @@ add_executable(fgc_tests
test_logger.cpp test_logger.cpp
test_geometry.cpp test_geometry.cpp
test_scangrid.cpp test_scangrid.cpp
test_uisnapshot.cpp
) )
target_link_libraries(fgc_tests PRIVATE fgc_core doctest::doctest) target_link_libraries(fgc_tests PRIVATE fgc_core doctest::doctest)

View File

@ -16,7 +16,6 @@ struct FakeMotor : IMotorController {
void stop() override {} void stop() override {}
void sendCommand(const std::string& c) override { cmds.push_back(c); } void sendCommand(const std::string& c) override { cmds.push_back(c); }
MotorTelemetry telemetry() override { return tel; } MotorTelemetry telemetry() override { return tel; }
std::string lastDump() override { return ""; }
bool connected() const override { return true; } bool connected() const override { return true; }
}; };

View File

@ -1,48 +0,0 @@
#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());
}
}