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/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/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/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/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/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';
}
diff --git a/src/utils/callsign.js b/src/utils/callsign.js
index 6c0f87e1..017d8ca3 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';
@@ -113,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' },
@@ -126,6 +126,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.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' },
@@ -145,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