// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "RugnuxLiveStatus.h" double RugnuxLiveStatus::Now() const { return std::chrono::duration(std::chrono::steady_clock::now() - start).count(); } void RugnuxLiveStatus::CloseStep() { if (!s.steps.empty() && !s.steps.back().duration_s) s.steps.back().duration_s = Now() - s.steps.back().started_s; } void RugnuxLiveStatus::Start(int64_t images_expected) { std::unique_lock ul(m); s = RugnuxLiveSnapshot{}; s.state = RugnuxLiveState::Running; s.images_expected = images_expected; start = std::chrono::steady_clock::now(); } void RugnuxLiveStatus::ImageReceived() { std::unique_lock ul(m); ++s.images_received; } void RugnuxLiveStatus::Step(const std::string &title) { std::unique_lock ul(m); CloseStep(); s.steps.push_back(RugnuxLiveStep{.title = title, .started_s = Now()}); s.step_progress.reset(); } void RugnuxLiveStatus::Note(const std::string &text) { std::unique_lock ul(m); if (s.steps.empty()) s.steps.push_back(RugnuxLiveStep{.title = "", .started_s = Now()}); s.steps.back().notes.push_back(text); } void RugnuxLiveStatus::Progress(uint64_t done, uint64_t total) { std::unique_lock ul(m); if (total > 0) s.step_progress = static_cast(done) / static_cast(total); } void RugnuxLiveStatus::Finish(RugnuxLiveState state, const std::string &message) { std::unique_lock ul(m); CloseStep(); s.elapsed_s = Now(); s.state = state; s.message = message; s.step_progress.reset(); } void RugnuxLiveStatus::Result(const std::string &verdict, const std::string &verdict_text, const std::vector> &summary, const std::vector &warnings) { std::unique_lock ul(m); s.verdict = verdict; s.verdict_text = verdict_text; s.summary = summary; s.warnings = warnings; } void RugnuxLiveStatus::Latency(double last_image_to_written_s) { std::unique_lock ul(m); s.last_image_to_written_s = last_image_to_written_s; } void RugnuxLiveStatus::LastImage() { std::unique_lock ul(m); s.last_image_s = Now(); } void RugnuxLiveStatus::Cut(const std::string &reason) { std::unique_lock ul(m); s.cut = reason; s.cut_s = Now(); } void RugnuxLiveStatus::Probe(const std::string &text) { std::unique_lock ul(m); s.probe = text; s.probe_s = Now(); } RugnuxLiveSnapshot RugnuxLiveStatus::Get() const { std::unique_lock ul(m); RugnuxLiveSnapshot ret = s; if (s.state == RugnuxLiveState::Running) ret.elapsed_s = Now(); return ret; }