fix(udp): WSJT-X QSOs were missing the solar data and the distance

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.
This commit is contained in:
2026-08-11 22:11:29 +02:00
parent d4f23a52af
commit 8b66030c89
2 changed files with 25 additions and 2 deletions
+19
View File
@@ -2721,6 +2721,15 @@ func (a *App) applySolar(q *qso.QSO) {
if a.solar == nil { if a.solar == nil {
return 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() d := a.solar.Get()
if !d.OK { if !d.OK {
return return
@@ -11823,6 +11832,16 @@ func (a *App) LogUDPLoggedADIF(adifText string) (int64, error) {
a.refineDistrictZones(&q) // W6 → CQ3/ITU6 for zone-split countries a.refineDistrictZones(&q) // W6 → CQ3/ITU6 for zone-split countries
a.applyQSLDefaults(&q) 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) ── // ── Dedup (serialised) ──
// Match by call + band + mode within a ±2-minute window: a QSO logged // 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 // manually in OpsLog and re-broadcast by Log4OM over UDP often differs by
+6 -2
View File
@@ -2,8 +2,12 @@
{ {
"version": "0.24.7", "version": "0.24.7",
"date": "", "date": "",
"en": [], "en": [
"fr": [] "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", "version": "0.24.6",