From 8b66030c89e5b1e6e7a752ebb41da3ff95595d73 Mon Sep 17 00:00:00 2001 From: Gregory Salaun Date: Tue, 11 Aug 2026 22:11:29 +0200 Subject: [PATCH] fix(udp): WSJT-X QSOs were missing the solar data and the distance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The UDP path applies the station profile, the DXCC number, the Club Log exceptions, the zone refinement and the QSL defaults — and its comment says "same as the manual AddQSO path", which it was not. applySolar and fillDistance were never called there. For an operator running digital, and that is most of the traffic on most stations, it meant SFI, A, K and distance were empty across the whole log while a hand-logged contact carried all four. It also quietly undermines the history-based propagation work, which needs those numbers to be there. applySolar now refuses a QSO more than a day old, whichever path it arrives by. The UDP feed and the ADIF monitor normally carry contacts seconds old but neither promises it — a logger re-broadcasting its backlog, or an operator typing last month's contact by hand, would be handed this morning's SFI as though it had been measured at the time. A wrong reading is worse than a missing one: afterwards nothing tells it apart from a real one. --- app.go | 19 +++++++++++++++++++ changelog.json | 8 ++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app.go b/app.go index ec3c0d4..e1e6957 100644 --- a/app.go +++ b/app.go @@ -2721,6 +2721,15 @@ func (a *App) applySolar(q *qso.QSO) { if a.solar == nil { return } + // Today's space weather belongs on today's QSO. The ADIF monitor and the UDP + // path both feed contacts that are normally seconds old, but neither promises + // it: a logger re-broadcasting its backlog, or an operator typing in last + // month's contact by hand, would otherwise be given this morning's SFI as if + // it had been measured at the time. A wrong number is worse than none — it + // cannot be told from a real reading afterwards. + if !q.QSODate.IsZero() && time.Since(q.QSODate) > 24*time.Hour { + return + } d := a.solar.Get() if !d.OK { return @@ -11823,6 +11832,16 @@ func (a *App) LogUDPLoggedADIF(adifText string) (int64, error) { a.refineDistrictZones(&q) // W6 → CQ3/ITU6 for zone-split countries a.applyQSLDefaults(&q) + // ── Space weather and path length ── + // Also "same as the manual path", and they were missed when that comment was + // written. A QSO auto-logged from WSJT-X went in with no SFI, no A, no K and + // no distance, so an operator running digital — which is most of the traffic + // on most stations — had those fields empty across the whole log while a + // hand-logged contact carried them. Both are stamped only where the record + // left them empty, so an ADIF that supplied its own still wins. + a.applySolar(&q) + fillDistance(&q) + // ── Dedup (serialised) ── // Match by call + band + mode within a ±2-minute window: a QSO logged // manually in OpsLog and re-broadcast by Log4OM over UDP often differs by diff --git a/changelog.json b/changelog.json index c8903d7..ef9ca92 100644 --- a/changelog.json +++ b/changelog.json @@ -2,8 +2,12 @@ { "version": "0.24.7", "date": "", - "en": [], - "fr": [] + "en": [ + "QSOs logged from WSJT-X now carry the space weather and the distance, like hand-logged ones. The UDP path stamped the station profile, the DXCC and the QSL defaults but not SFI, A, K or distance — so an operator running digital had those fields empty across the whole log. Space weather is only stamped on a contact less than a day old: a logger re-broadcasting its backlog would otherwise be handed this morning readings for last month contacts." + ], + "fr": [ + "Les QSO enregistrés depuis WSJT-X portent désormais la météo spatiale et la distance, comme ceux saisis à la main. Le chemin UDP posait le profil station, le DXCC et les défauts QSL mais ni SFI, ni A, ni K, ni distance — un opérateur en numérique avait donc ces champs vides sur tout son log. La météo spatiale n est posée que sur un contact de moins d un jour : sinon un logiciel qui rediffuse son historique se verrait attribuer les relevés de ce matin sur des contacts du mois dernier." + ] }, { "version": "0.24.6",