#pragma once #include "fgc/ui/UiSnapshot.h" #include #include 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; // Called by the UI to enqueue a console/firmware command line. using CommandSink = std::function; 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