From a1a3bad682f952d8e96ac2912ee34b0f9dab2206 Mon Sep 17 00:00:00 2001 From: rouggy Date: Sun, 30 Aug 2026 03:14:21 +0200 Subject: [PATCH] fix(cluster): the FT8/FT4 watering holes exist on every band MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The inference tables knew FT8 on some bands and nothing on others: a 10.136 spot with a bare comment read as generic DATA — which is what every skimmerless spot of a DXpedition's 30 m FT8 slot did. The standard FT8/FT4 windows are added on 30 m, 60 m, 80 m (FT4), 17 m (FT4) and 12 m, in BOTH tables (backend band plan and frontend spot.ts), ahead of the wide segments they sit inside — order is the mechanism there. --- changelog.json | 6 ++++-- frontend/src/lib/spot.ts | 10 +++++----- internal/alerts/bandplan.go | 12 ++++++++---- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/changelog.json b/changelog.json index f6ae2f3..9b48d40 100644 --- a/changelog.json +++ b/changelog.json @@ -34,7 +34,8 @@ "Icom: any leftover waveform stream is switched off at connect — the scope flag lives in the radio and survived sessions, and its flood is what was killing the IC-7760’s CI-V link.", "Icom console: an ATU chip beside SPLIT engages or DISENGAGES the internal tuner — TUNE started a cycle but could never take the tuner back out of line.", "Icom console: the TX meters get needle inertia — power holds its peak instead of flickering to 0 W between syllables, SWR shows the real peak then returns to the live value — and the wattage readout no longer wraps at three digits.", - "Icom console: the meters use the same LED bars as the Flex and Elecraft consoles, and the mode badge says USB or LSB instead of an ambiguous SSB." + "Icom console: the meters use the same LED bars as the Flex and Elecraft consoles, and the mode badge says USB or LSB instead of an ambiguous SSB.", + "Cluster: spots on the standard FT8/FT4 frequencies of every band now read FT8/FT4 when the comment names no mode — 30 m, 60 m, 80 m FT4, 17 m FT4 and 12 m were falling into the generic DATA bucket." ], "fr": [ "Console Elecraft : le S-mètre est calibré sur un vrai K3 — S9 et les +dB correspondent désormais à l’affichage de la radio (il lisait environ deux points S trop bas).", @@ -68,7 +69,8 @@ "Icom : tout flux waveform résiduel est coupé à la connexion — le drapeau scope vit dans la radio et survivait aux sessions, et son flot est ce qui tuait le lien CI-V de l’IC-7760.", "Console Icom : une puce ATU à côté de SPLIT engage ou DÉSENGAGE le tuner interne — TUNE lançait un cycle mais ne pouvait jamais remettre le tuner hors ligne.", "Console Icom : les mètres TX gagnent une inertie d’aiguille — la puissance tient sa crête au lieu de retomber à 0 W entre les syllabes, le ROS montre la vraie crête puis revient à la valeur vive — et l’affichage en watts ne passe plus à la ligne à trois chiffres.", - "Console Icom : les mètres utilisent les mêmes barres LED que les consoles Flex et Elecraft, et le badge de mode dit USB ou LSB au lieu d’un SSB ambigu." + "Console Icom : les mètres utilisent les mêmes barres LED que les consoles Flex et Elecraft, et le badge de mode dit USB ou LSB au lieu d’un SSB ambigu.", + "Cluster : les spots sur les fréquences standard FT8/FT4 de chaque bande lisent désormais FT8/FT4 quand le commentaire ne nomme pas de mode — 30 m, 60 m, FT4 80 m, FT4 17 m et 12 m tombaient dans le bloc DATA générique." ] }, { diff --git a/frontend/src/lib/spot.ts b/frontend/src/lib/spot.ts index cf69536..534ac64 100644 --- a/frontend/src/lib/spot.ts +++ b/frontend/src/lib/spot.ts @@ -36,17 +36,17 @@ export function inferSpotMode(comment: string, freqHz: number): string { type Seg = [number, number, string]; const segs: Seg[] = [ [1.8, 1.838, 'CW'], [1.838, 1.84, 'FT8'], [1.84, 2.0, 'SSB'], - [3.5, 3.58, 'CW'], [3.573, 3.576, 'FT8'], [3.58, 3.6, 'DATA'], [3.6, 4.0, 'SSB'], - [5.3, 5.5, 'SSB'], + [3.573, 3.575, 'FT8'], [3.575, 3.578, 'FT4'], [3.5, 3.58, 'CW'], [3.58, 3.6, 'DATA'], [3.6, 4.0, 'SSB'], + [5.357, 5.36, 'FT8'], [5.3, 5.5, 'SSB'], [7.0, 7.04, 'CW'], [7.074, 7.077, 'FT8'], [7.0475, 7.0485, 'FT4'], [7.04, 7.1, 'DATA'], [7.1, 7.3, 'SSB'], - [10.1, 10.13, 'CW'], [10.13, 10.15, 'DATA'], + [10.136, 10.139, 'FT8'], [10.14, 10.143, 'FT4'], [10.1, 10.13, 'CW'], [10.13, 10.15, 'DATA'], [14.0, 14.07, 'CW'], [14.074, 14.077, 'FT8'], [14.08, 14.0815, 'FT4'], [14.07, 14.1, 'DATA'], [14.1, 14.35, 'SSB'], - [18.068, 18.095, 'CW'], [18.1, 18.103, 'FT8'], [18.095, 18.11, 'DATA'], [18.11, 18.168, 'SSB'], + [18.1, 18.103, 'FT8'], [18.104, 18.107, 'FT4'], [18.068, 18.095, 'CW'], [18.095, 18.11, 'DATA'], [18.11, 18.168, 'SSB'], [21.0, 21.07, 'CW'], [21.074, 21.077, 'FT8'], [21.14, 21.143, 'FT4'], [21.07, 21.15, 'DATA'], [21.15, 21.45, 'SSB'], - [24.89, 24.915, 'CW'], [24.915, 24.917, 'FT8'], [24.915, 24.94, 'DATA'], [24.94, 24.99, 'SSB'], + [24.915, 24.918, 'FT8'], [24.919, 24.922, 'FT4'], [24.89, 24.915, 'CW'], [24.915, 24.94, 'DATA'], [24.94, 24.99, 'SSB'], [28.0, 28.07, 'CW'], [28.074, 28.077, 'FT8'], [28.18, 28.183, 'FT4'], [28.07, 28.3, 'DATA'], [28.3, 29.7, 'SSB'], [50.0, 50.1, 'CW'], [50.313, 50.316, 'FT8'], [50.318, 50.321, 'FT4'], diff --git a/internal/alerts/bandplan.go b/internal/alerts/bandplan.go index 90d4197..0dfd204 100644 --- a/internal/alerts/bandplan.go +++ b/internal/alerts/bandplan.go @@ -27,27 +27,31 @@ type modeSeg struct { var bandPlan = []modeSeg{ {1_800_000, 1_838_000, "CW"}, {1_838_000, 1_840_000, "FT8"}, {1_840_000, 2_000_000, "SSB"}, - {3_573_000, 3_576_000, "FT8"}, {3_500_000, 3_580_000, "CW"}, + {3_573_000, 3_575_000, "FT8"}, {3_575_000, 3_578_000, "FT4"}, {3_500_000, 3_580_000, "CW"}, {3_580_000, 3_600_000, "DATA"}, {3_600_000, 4_000_000, "SSB"}, - {5_300_000, 5_500_000, "SSB"}, + {5_357_000, 5_360_000, "FT8"}, {5_300_000, 5_500_000, "SSB"}, {7_074_000, 7_077_000, "FT8"}, {7_047_500, 7_048_500, "FT4"}, {7_000_000, 7_040_000, "CW"}, {7_040_000, 7_100_000, "DATA"}, {7_100_000, 7_300_000, "SSB"}, // 30 m: CW to 10.130, data above it — and nothing else. No SSB on this band. + // The FT8/FT4 watering holes come first, or a 10.136 spot with a bare + // comment reads as generic DATA — which is what every skimmerless spot of a + // DXpedition's 30 m FT8 slot did. + {10_136_000, 10_139_000, "FT8"}, {10_140_000, 10_143_000, "FT4"}, {10_100_000, 10_130_000, "CW"}, {10_130_000, 10_150_000, "DATA"}, {14_074_000, 14_077_000, "FT8"}, {14_080_000, 14_081_500, "FT4"}, {14_000_000, 14_070_000, "CW"}, {14_070_000, 14_100_000, "DATA"}, {14_100_000, 14_350_000, "SSB"}, - {18_100_000, 18_103_000, "FT8"}, + {18_100_000, 18_103_000, "FT8"}, {18_104_000, 18_107_000, "FT4"}, {18_068_000, 18_095_000, "CW"}, {18_095_000, 18_110_000, "DATA"}, {18_110_000, 18_168_000, "SSB"}, {21_074_000, 21_077_000, "FT8"}, {21_140_000, 21_143_000, "FT4"}, {21_000_000, 21_070_000, "CW"}, {21_070_000, 21_150_000, "DATA"}, {21_150_000, 21_450_000, "SSB"}, - {24_915_000, 24_917_000, "FT8"}, + {24_915_000, 24_918_000, "FT8"}, {24_919_000, 24_922_000, "FT4"}, {24_890_000, 24_915_000, "CW"}, {24_915_000, 24_940_000, "DATA"}, {24_940_000, 24_990_000, "SSB"}, {28_074_000, 28_077_000, "FT8"}, {28_180_000, 28_183_000, "FT4"},