From 05a275995e5fe6ecb78cae0aa7eefa7bb1775df8 Mon Sep 17 00:00:00 2001 From: Laura Batalha <5883822+lbatalha@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:38:25 +0100 Subject: [PATCH 1/4] feat: add FT2 mode support to PSKReporter/WSJT-X filter panels - Add 'FT2' to MODES arrays in PSKFilterManager and ActivateFilterManager - Add FT2 to callsign.js MODES, detectMode comment detection, and DIGITAL_ISLANDS frequencies - Add FT2 to VOACAP heatmap mode selector --- src/components/ActivateFilterManager.jsx | 1 + src/components/PSKFilterManager.jsx | 1 + src/plugins/layers/useVOACAPHeatmap.js | 2 +- src/utils/callsign.js | 14 +++++++++++++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/components/ActivateFilterManager.jsx b/src/components/ActivateFilterManager.jsx index 7d594d78..3b21fbfe 100644 --- a/src/components/ActivateFilterManager.jsx +++ b/src/components/ActivateFilterManager.jsx @@ -22,6 +22,7 @@ const MODES = [ 'FST4', 'FST4W', 'FST4W-90', + 'FT2', 'FT4', 'FT8', 'HELL', diff --git a/src/components/PSKFilterManager.jsx b/src/components/PSKFilterManager.jsx index 951a08e2..5a113f51 100644 --- a/src/components/PSKFilterManager.jsx +++ b/src/components/PSKFilterManager.jsx @@ -22,6 +22,7 @@ const MODES = [ 'FST4', 'FST4W', 'FST4W-90', + 'FT2', 'FT4', 'FT8', 'HELL', diff --git a/src/plugins/layers/useVOACAPHeatmap.js b/src/plugins/layers/useVOACAPHeatmap.js index 79802e46..cbdb85b2 100644 --- a/src/plugins/layers/useVOACAPHeatmap.js +++ b/src/plugins/layers/useVOACAPHeatmap.js @@ -213,7 +213,7 @@ export function useLayer({ map, enabled, opacity, locator }) { .map((g) => ``) .join(''); - const modeOptions = ['SSB', 'CW', 'FT8', 'FT4', 'RTTY', 'AM', 'FM'] + const modeOptions = ['SSB', 'CW', 'FT8', 'FT4', 'FT2', 'RTTY', 'AM', 'FM'] .map((m) => ``) .join(''); diff --git a/src/utils/callsign.js b/src/utils/callsign.js index 6c0f87e1..aca4208f 100644 --- a/src/utils/callsign.js +++ b/src/utils/callsign.js @@ -43,7 +43,7 @@ export const CONTINENTS = [ /** * Digital/Voice Modes */ -export const MODES = ['CW', 'SSB', 'FT8', 'FT4', 'RTTY', 'PSK', 'AM', 'FM']; +export const MODES = ['CW', 'SSB', 'FT8', 'FT4', 'FT2', 'RTTY', 'PSK', 'AM', 'FM']; /** * Get band from frequency (in kHz) @@ -93,6 +93,7 @@ export const detectMode = (comment, freq) => { const upper = comment.toUpperCase(); if (upper.includes('FT8')) return 'FT8'; if (upper.includes('FT4')) return 'FT4'; + if (upper.includes('FT2')) return 'FT2'; if (upper.includes('CW')) return 'CW'; if (upper.includes('SSB') || upper.includes('LSB') || upper.includes('USB')) return 'SSB'; if (upper.includes('RTTY')) return 'RTTY'; @@ -126,6 +127,17 @@ export const detectMode = (comment, freq) => { { mhz: 24.915, mode: 'FT8' }, { mhz: 28.074, mode: 'FT8' }, { mhz: 50.313, mode: 'FT8' }, + // FT2 calling frequencies + { mhz: 1.842, mode: 'FT2' }, + { mhz: 3.577, mode: 'FT2' }, + { mhz: 7.077, mode: 'FT2' }, + { mhz: 10.141, mode: 'FT2' }, + { mhz: 14.077, mode: 'FT2' }, + { mhz: 18.107, mode: 'FT2' }, + { mhz: 21.077, mode: 'FT2' }, + { mhz: 24.92, mode: 'FT2' }, + { mhz: 28.077, mode: 'FT2' }, + { mhz: 50.317, mode: 'FT2' }, // FT4 calling frequencies { mhz: 3.575, mode: 'FT4' }, { mhz: 7.0475, mode: 'FT4' }, From cae50f901eb1c85497f59e24fb5916172f5f9d79 Mon Sep 17 00:00:00 2001 From: Laura Batalha <5883822+lbatalha@users.noreply.github.com> Date: Thu, 9 Jul 2026 18:34:44 +0100 Subject: [PATCH 2/4] fix: correct FT2 calling frequencies in callsign and band health modules Use the official FT2 calling frequencies: 160m: 1.843, 80m: 3.578, 60m: 5.360, 40m: 7.052, 30m: 10.144, 20m: 14.084, 17m: 18.108, 15m: 21.144, 12m: 24.923, 10m: 28.184 --- src/hooks/useBandHealth.js | 11 +++++++++++ src/utils/callsign.js | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/hooks/useBandHealth.js b/src/hooks/useBandHealth.js index 0d7cda77..d477350d 100644 --- a/src/hooks/useBandHealth.js +++ b/src/hooks/useBandHealth.js @@ -62,6 +62,17 @@ const ISLANDS = [ { mhz: 21.074, mode: 'FT8' }, { mhz: 24.915, mode: 'FT8' }, { mhz: 28.074, mode: 'FT8' }, + // FT2 + { mhz: 1.843, mode: 'FT2' }, + { mhz: 3.578, mode: 'FT2' }, + { mhz: 5.36, mode: 'FT2' }, + { mhz: 7.052, mode: 'FT2' }, + { mhz: 10.144, mode: 'FT2' }, + { mhz: 14.084, mode: 'FT2' }, + { mhz: 18.108, mode: 'FT2' }, + { mhz: 21.144, mode: 'FT2' }, + { mhz: 24.923, mode: 'FT2' }, + { mhz: 28.184, mode: 'FT2' }, // FT4 { mhz: 3.575, mode: 'FT4' }, { mhz: 7.0475, mode: 'FT4' }, diff --git a/src/utils/callsign.js b/src/utils/callsign.js index aca4208f..62fb5408 100644 --- a/src/utils/callsign.js +++ b/src/utils/callsign.js @@ -128,16 +128,16 @@ export const detectMode = (comment, freq) => { { mhz: 28.074, mode: 'FT8' }, { mhz: 50.313, mode: 'FT8' }, // FT2 calling frequencies - { mhz: 1.842, mode: 'FT2' }, - { mhz: 3.577, mode: 'FT2' }, - { mhz: 7.077, mode: 'FT2' }, - { mhz: 10.141, mode: 'FT2' }, - { mhz: 14.077, mode: 'FT2' }, - { mhz: 18.107, mode: 'FT2' }, - { mhz: 21.077, mode: 'FT2' }, - { mhz: 24.92, mode: 'FT2' }, - { mhz: 28.077, mode: 'FT2' }, - { mhz: 50.317, mode: 'FT2' }, + { mhz: 1.843, mode: 'FT2' }, + { mhz: 3.578, mode: 'FT2' }, + { mhz: 5.36, mode: 'FT2' }, + { mhz: 7.052, mode: 'FT2' }, + { mhz: 10.144, mode: 'FT2' }, + { mhz: 14.084, mode: 'FT2' }, + { mhz: 18.108, mode: 'FT2' }, + { mhz: 21.144, mode: 'FT2' }, + { mhz: 24.923, mode: 'FT2' }, + { mhz: 28.184, mode: 'FT2' }, // FT4 calling frequencies { mhz: 3.575, mode: 'FT4' }, { mhz: 7.0475, mode: 'FT4' }, From 741913c0f78375f5f129356044a380fd8a115ccb Mon Sep 17 00:00:00 2001 From: Laura Batalha <5883822+lbatalha@users.noreply.github.com> Date: Thu, 9 Jul 2026 19:41:19 +0100 Subject: [PATCH 3/4] feat: add FT2 to DX Cluster filter modes and rig band plan digital modes --- src/components/DXFilterManager.jsx | 2 +- src/utils/bandPlan.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DXFilterManager.jsx b/src/components/DXFilterManager.jsx index 293c5e5a..70c6d651 100644 --- a/src/components/DXFilterManager.jsx +++ b/src/components/DXFilterManager.jsx @@ -45,7 +45,7 @@ export const DXFilterManager = ({ filters, onFilterChange, isOpen, onClose, onCl '2m', '70cm', ]; - const modes = ['CW', 'SSB', 'FT8', 'FT4', 'RTTY', 'PSK', 'JT65', 'JS8', 'SSTV', 'AM', 'FM']; + const modes = ['CW', 'SSB', 'FT8', 'FT4', 'FT2', 'RTTY', 'PSK', 'JT65', 'JS8', 'SSTV', 'AM', 'FM']; // noinspection DuplicatedCode const toggleArrayItem = (key, item) => { diff --git a/src/utils/bandPlan.js b/src/utils/bandPlan.js index 839df5ca..eccb1753 100644 --- a/src/utils/bandPlan.js +++ b/src/utils/bandPlan.js @@ -74,7 +74,7 @@ export const mapModeToRig = (mode, freq) => { if (m === 'DATA-USB' || m === 'DATA-LSB') return m; // Digital/data modes → DATA-USB or DATA-LSB based on band convention - const digitalModes = ['DATA', 'FT8', 'FT4', 'JS8', 'WSPR', 'JT65', 'JT9', 'PSK31', 'PSK63', 'RTTY', 'PKT']; + const digitalModes = ['DATA', 'FT8', 'FT4', 'FT2', 'JS8', 'WSPR', 'JT65', 'JT9', 'PSK31', 'PSK63', 'RTTY', 'PKT']; if (digitalModes.includes(m)) { return sb === 'USB' ? 'DATA-USB' : 'DATA-LSB'; } From 29e93c71c3aa7d3f619fb0896fc8b4aefed6c769 Mon Sep 17 00:00:00 2001 From: Laura Batalha <5883822+lbatalha@users.noreply.github.com> Date: Fri, 10 Jul 2026 16:53:55 +0100 Subject: [PATCH 4/4] move to asymmetric window for spot mode calc --- src/utils/callsign.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/utils/callsign.js b/src/utils/callsign.js index 62fb5408..017d8ca3 100644 --- a/src/utils/callsign.js +++ b/src/utils/callsign.js @@ -114,7 +114,6 @@ export const detectMode = (comment, freq) => { // DX cluster spots may report slightly off-frequency depending on the spotter's // rig readout or the audio offset of the specific signal they clicked on. // 3 kHz was too tight — 24.911 for 12m FT8 (dial 24.915) was being missed. - const TOLERANCE = 0.005; const DIGITAL_ISLANDS = [ // FT8 calling frequencies { mhz: 1.84, mode: 'FT8' }, @@ -157,9 +156,8 @@ export const detectMode = (comment, freq) => { ]; for (const island of DIGITAL_ISLANDS) { - if (Math.abs(mhz - island.mhz) <= TOLERANCE) { - return island.mode; - } + const offset = mhz - island.mhz; + if (offset >= -0.0005 && offset <= 0.0031) return island.mode; } // Band plan segments — CW vs SSB by frequency range