docs: Document web interface and clarify API server startup

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
Chris Frankland-Wright 2025-08-12 16:00:43 +01:00
parent 95fcb6f26a
commit af0a512187
2 changed files with 22 additions and 4 deletions

View file

@ -26,6 +26,17 @@ Created by Chris Frankland-Wright and John Rogers
- Broadcasts time via local NTP server - Broadcasts time via local NTP server
- Supports configurable time offsets (hours, minutes, seconds, frames or milliseconds) - Supports configurable time offsets (hours, minutes, seconds, frames or milliseconds)
- Systemd service support for headless operation - Systemd service support for headless operation
- Web-based UI for monitoring and control when running as a daemon
---
## 🖥️ Web Interface & API
When running as a background daemon, TimeTurner provides a web interface for monitoring and configuration.
- **Access**: The web UI is available at `http://<raspberry_pi_ip>:8080`.
- **Functionality**: You can view the real-time sync status, see logs, and change all configuration options directly from your browser.
- **API**: A JSON API is also exposed for programmatic access. See `docs/api.md` for full details.
--- ---

View file

@ -193,11 +193,13 @@ async fn main() {
}); });
} }
// 5⃣ Spawn UI or setup daemon logging // 5⃣ Spawn UI or setup daemon logging. The web service is only started
// when running as a daemon. The TUI is for interactive foreground use.
if args.command.is_none() { if args.command.is_none() {
// --- Interactive TUI Mode ---
log::info!("🔧 Watching config.yml..."); log::info!("🔧 Watching config.yml...");
log::info!("🚀 Serial thread launched"); log::info!("🚀 Serial thread launched");
log::info!("🖥️ UI thread launched"); log::info!("🖥️ UI thread launched");
let ui_state = ltc_state.clone(); let ui_state = ltc_state.clone();
let config_clone = config.clone(); let config_clone = config.clone();
let port = serial_port_path; let port = serial_port_path;
@ -205,8 +207,10 @@ async fn main() {
start_ui(ui_state, port, config_clone); start_ui(ui_state, port, config_clone);
}); });
} else { } else {
// --- Daemon Mode ---
// In daemon mode, logging is already set up to go to stderr. // In daemon mode, logging is already set up to go to stderr.
// The systemd service will capture it. // The systemd service will capture it. The web service (API and static files)
// is launched later in the main async block.
log::info!("🚀 Starting TimeTurner daemon..."); log::info!("🚀 Starting TimeTurner daemon...");
} }
@ -282,7 +286,10 @@ async fn main() {
let local = LocalSet::new(); let local = LocalSet::new();
local local
.run_until(async move { .run_until(async move {
// 8⃣ Spawn the API server thread // 8⃣ Spawn the API server task.
// This server provides the JSON API and serves the static web UI files
// from the `static/` directory. It runs in both TUI and daemon modes,
// but is primarily for the web UI used in daemon mode.
{ {
let api_state = ltc_state.clone(); let api_state = ltc_state.clone();
let config_clone = config.clone(); let config_clone = config.clone();