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