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