From 04c188843f6188fe9fc4660fdbab13267434fab3 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Sat, 21 Mar 2026 20:49:37 +0100 Subject: [PATCH] feat: add decision summary to refinement API --- cmd/sdrd/decision_summary.go | 29 +++++++++++++++++++++++++++++ cmd/sdrd/http_handlers.go | 15 ++++++++------- 2 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 cmd/sdrd/decision_summary.go diff --git a/cmd/sdrd/decision_summary.go b/cmd/sdrd/decision_summary.go new file mode 100644 index 0000000..9ffdab5 --- /dev/null +++ b/cmd/sdrd/decision_summary.go @@ -0,0 +1,29 @@ +package main + +import "sdr-wideband-suite/internal/pipeline" + +type decisionSummary struct { + Total int `json:"total"` + RecordEnabled int `json:"record_enabled"` + DecodeEnabled int `json:"decode_enabled"` + Reasons map[string]int `json:"reasons,omitempty"` +} + +func summarizeDecisions(decisions []pipeline.SignalDecision) decisionSummary { + summary := decisionSummary{Reasons: map[string]int{}} + summary.Total = len(decisions) + for _, d := range decisions { + if d.ShouldRecord { + summary.RecordEnabled++ + } + if d.ShouldAutoDecode { + summary.DecodeEnabled++ + } + reason := d.Reason + if reason == "" { + reason = "unspecified" + } + summary.Reasons[reason]++ + } + return summary +} diff --git a/cmd/sdrd/http_handlers.go b/cmd/sdrd/http_handlers.go index 9667750..ef0fbd2 100644 --- a/cmd/sdrd/http_handlers.go +++ b/cmd/sdrd/http_handlers.go @@ -156,13 +156,14 @@ func registerAPIHandlers(mux *http.ServeMux, cfgPath string, cfgManager *runtime snap := phaseSnap.Snapshot() windowStats := buildWindowStats(snap.refinementInput.Windows) out := map[string]any{ - "plan": snap.refinementInput.Plan, - "windows": snap.refinementInput.Windows, - "window_stats": windowStats, - "candidates": len(snap.refinementInput.Candidates), - "scheduled": len(snap.refinementInput.Scheduled), - "signals": len(snap.refinement.Signals), - "decisions": len(snap.refinement.Decisions), + "plan": snap.refinementInput.Plan, + "windows": snap.refinementInput.Windows, + "window_stats": windowStats, + "candidates": len(snap.refinementInput.Candidates), + "scheduled": len(snap.refinementInput.Scheduled), + "signals": len(snap.refinement.Signals), + "decisions": len(snap.refinement.Decisions), + "decision_summary": summarizeDecisions(snap.refinement.Decisions), } _ = json.NewEncoder(w).Encode(out) })