Skip to content

Add SSA (Sweden) band plan with PTSFS 2025:1 national constraints #2801

Description

@TnxQSO-Admin

Request preparation

  • I used an AI assistant to help structure this request
  • I checked for existing issues covering the same feature

What would you like?

What

Add a new band plan file resources/bandplans/ssa-sweden.json that provides a Swedish national overlay on top of IARU Region 1, with Swedish segment labels, correct 6 m band edge for Sweden (52 MHz, not 54 MHz), and inline power-limit annotations on the bands where Swedish PTSFS 2025:1 differs significantly from default.

The file follows the existing JSON schema (name, description, version, segments[], spots[]) used by iaru-region1.json, arrl-us.json, rac-canada.json etc. No code changes are required. BandPlanManager::loadPlans() discovers :/bandplans/*.json automatically; the only build-time step is registering the new file in resources.qrc.

Why

Swedish amateur radio operators run AetherSDR with FlexRadio transceivers. The bundled iaru-region1.json is a reasonable baseline but has three operational gaps for Swedish use:

  1. 6 m band edge is wrong for Sweden (and for all European R1 countries). The existing IARU R1 file extends 6 m to 54.000 MHz. Per PTSFS 2025:1 §98, Sweden's amateur allocation on 6 m is 50.000–52.000 MHz. The 52–54 MHz segment in iaru-region1.json applies only to some African R1 countries with historical wider allocations (e.g. South Africa). All CEPT/European R1 countries have 50–52 MHz at most after WRC-19. This is a separate bug in the IARU R1 file that I plan to file in a follow-up issue once verified end to end — for now, the Swedish file simply gets the edge right.

  2. No visibility into national power constraints where they matter. Sweden's default amateur limit is 200 W p.e.p. per PTSFS 2025:1, but two bands have dramatically lower national caps:

    • 60 m (5,3515–5,3665 MHz): 15 W e.i.r.p. — over 11 dB below default.
    • 30 m (10,100–10,150 MHz): 150 W p.e.p. — lower than default and lower than the IARU recommendation.

    Baking these limits into the segment label (e.g. ALLA 15W, CW 150W) gives Swedish operators an immediate visual reminder on the panadapter overlay. They are not annotated on bands where the default 200 W limit applies, to keep the overlay uncluttered.

  3. Segment labels in Swedish make the overlay more useful for Swedish operators (e.g. ALLA for all-mode, FYRAR for beacons, SMAL DIGI for narrow-bandwidth digital modes). Established international abbreviations like CW, DIGI, RPT IN, SAT are kept as-is.

  4. Finer 6 m segmentation matching SSA's published v3.0 bandplan: separate beacon-only segment 50.400–50.500, separate FM/DV repeater input segment 51.210–51.390, separate FM/DV repeater output segment 51.810–51.990. The base IARU R1 file lumps 51.000–52.000 as one big FM/RPT block.

This follows the established pattern in the project: rac-canada.json and arrl-us.json are national overlays on top of their regional IARU plans.

How Other Clients Do It

  • SmartSDR (Windows): No country-specific band plan support. Only the ARRL US plan ships, no extension mechanism.
  • GQRX, SDR++, SDR#: Operators download community-maintained bandplan files. There is no upstream-shipped Swedish file in any of these clients. Third-party Swedish XML files exist for SDR# but quality varies.
  • AetherSDR: Already supports multiple regional bandplans via the resources/bandplans/*.json mechanism. This proposal adds Sweden to the existing set.

Suggested Behavior

  1. Add resources/bandplans/ssa-sweden.json (full file content below).
  2. Add an entry for the file in resources.qrc matching the existing bandplan entries (same prefix/alias convention).
  3. After rebuild, the plan appears as a checkable entry "SSA (Sweden)" in the View → Band Plan menu (src/gui/MainWindow.cpp:7018–7030), in the existing mutually-exclusive QActionGroup.
  4. Selecting it writes "SSA (Sweden)" to AppSettings::BandPlanName (read in BandPlanManager.cpp:31, written in BandPlanManager.cpp:49) and the panadapter overlay re-renders with the new segments and spots.
  5. No other UI changes are needed.

Protocol Hints

Not applicable. This is a static resource file. No FlexLib/SmartSDR protocol commands involved. The existing BandPlanManager::loadPlanFromJson() (BandPlanManager.cpp:65–107) handles parsing.

Acceptance Criteria

  • resources/bandplans/ssa-sweden.json exists and parses with QJsonDocument::fromJson() without errors.
  • The file is registered in resources.qrc so it ships in the Qt resource bundle and is discovered by the :/bandplans/*.json glob.
  • "SSA (Sweden)" appears as a selectable, checkable entry in the View → Band Plan submenu.
  • Selecting it persists "SSA (Sweden)" to AppSettings::BandPlanName and the panadapter overlay re-renders.
  • 6 m overlay ends at 52.000 MHz, with the FM/DV repeater input segment visible at 51.210–51.390 and output at 51.810–51.990.
  • 60 m segments display the 15W suffix in their labels; 30 m segments display the 150W suffix.

Notes for Maintainer

  • Scope: HF (160 m through 10 m) + 6 m only, matching the coverage of the existing iaru-region1.json. VHF/UHF bandplan content is not included.
  • The four-segment PTSFS 2025:1 power split on 160 m (10/100/10 W in the 1850–2000 kHz range) is deliberately not annotated in labels — adding it would clutter the overlay with marginal operational value for the high-power-restricted subsegments that are rarely used.
  • 2200 m and 600 m (137 kHz / 472 kHz) are not in the file because they are not in iaru-region1.json. If they get added upstream later, the Swedish file should follow with 1W EIRP notes.
  • Swedish "instegscertifikat" (entry-level certificate) is intentionally not modeled. The license field stays empty matching the IARU R1 file.
  • I noticed two minor discrepancies between iaru-region1.json and the current IARU R1 plan text (7,050–7,060 classified as DIGI instead of all-mode with auto-digi; 24,931–24,940 same issue). These are independent of the Swedish file and will be filed as a separate bug + upstream issue once I have verified the current IARU R1 source 100%.

Sources

  • SSA HF Bandplan v3.0 (2023-08-26, baserad på IARU Region 1 2016-06-01 och PTS frekvensplan PTSFS 2019:1; v3.3 referencing PTSFS 2025 follows the same structure)
  • SSA VHF/UHF Bandplan v3.0 (2023-08-26, IARU Region 1 dec 2020 med NRAU tillägg)
  • PTSFS 2025:1 (effective 2025-03-17), §27–§99 covering amateur allocations
  • IARU Region 1 HF Bandplan (effective 2020-10-16, Novi Sad VGC)
  • IARU Region 1 VHF Bandplan (Dec 2020, Novi Sad VGC)

File Content

resources/bandplans/ssa-sweden.json:

{
  "name": "SSA (Sweden)",
  "description": "Swedish band plan: IARU Region 1 with PTSFS 2025:1 national constraints. 6 m capped at 52 MHz, power notes on 30 m and 60 m, Swedish segment labels.",
  "version": 1,
  "segments": [
    {"low": 1.810, "high": 1.838, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 1.838, "high": 1.840, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 1.840, "high": 1.843, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 1.843, "high": 2.000, "label": "ALLA", "license": "", "color": "#ff8000"},

    {"low": 3.500, "high": 3.510, "label": "CW DX", "license": "", "color": "#3060ff"},
    {"low": 3.510, "high": 3.560, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 3.560, "high": 3.570, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 3.570, "high": 3.600, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 3.600, "high": 3.620, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 3.620, "high": 3.800, "label": "ALLA", "license": "", "color": "#ff8000"},

    {"low": 5.3515, "high": 5.354, "label": "CW 15W", "license": "", "color": "#3060ff"},
    {"low": 5.354, "high": 5.366, "label": "ALLA 15W", "license": "", "color": "#ffd000"},
    {"low": 5.366, "high": 5.3665, "label": "QRSS 15W", "license": "", "color": "#c03030"},

    {"low": 7.000, "high": 7.040, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 7.040, "high": 7.050, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 7.050, "high": 7.060, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 7.060, "high": 7.200, "label": "ALLA", "license": "", "color": "#ff8000"},

    {"low": 10.100, "high": 10.130, "label": "CW 150W", "license": "", "color": "#3060ff"},
    {"low": 10.130, "high": 10.150, "label": "SMAL DIGI 150W", "license": "", "color": "#c03030"},

    {"low": 14.000, "high": 14.060, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 14.060, "high": 14.070, "label": "CW QRP", "license": "", "color": "#3060ff"},
    {"low": 14.070, "high": 14.099, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 14.099, "high": 14.101, "label": "FYRAR", "license": "", "color": "#00d0d0"},
    {"low": 14.101, "high": 14.112, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 14.112, "high": 14.350, "label": "ALLA", "license": "", "color": "#ff8000"},

    {"low": 18.068, "high": 18.095, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 18.095, "high": 18.109, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 18.109, "high": 18.111, "label": "FYRAR", "license": "", "color": "#00d0d0"},
    {"low": 18.111, "high": 18.120, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 18.120, "high": 18.168, "label": "ALLA", "license": "", "color": "#ff8000"},

    {"low": 21.000, "high": 21.070, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 21.070, "high": 21.110, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 21.110, "high": 21.120, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 21.120, "high": 21.149, "label": "SMAL", "license": "", "color": "#c03030"},
    {"low": 21.149, "high": 21.151, "label": "FYRAR", "license": "", "color": "#00d0d0"},
    {"low": 21.151, "high": 21.450, "label": "ALLA", "license": "", "color": "#ff8000"},

    {"low": 24.890, "high": 24.915, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 24.915, "high": 24.929, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 24.929, "high": 24.931, "label": "FYRAR", "license": "", "color": "#00d0d0"},
    {"low": 24.931, "high": 24.940, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 24.940, "high": 24.990, "label": "ALLA", "license": "", "color": "#ff8000"},

    {"low": 28.000, "high": 28.070, "label": "CW", "license": "", "color": "#3060ff"},
    {"low": 28.070, "high": 28.190, "label": "SMAL DIGI", "license": "", "color": "#c03030"},
    {"low": 28.190, "high": 28.225, "label": "FYRAR", "license": "", "color": "#00d0d0"},
    {"low": 28.225, "high": 28.320, "label": "FYRAR/DIGI", "license": "", "color": "#00d0d0"},
    {"low": 28.320, "high": 29.000, "label": "ALLA", "license": "", "color": "#ff8000"},
    {"low": 29.000, "high": 29.200, "label": "ALLA/FM", "license": "", "color": "#ffd000"},
    {"low": 29.200, "high": 29.300, "label": "DIGI", "license": "", "color": "#c03030"},
    {"low": 29.300, "high": 29.510, "label": "SAT", "license": "", "color": "#9030c0"},
    {"low": 29.520, "high": 29.590, "label": "RPT IN", "license": "", "color": "#ffd000"},
    {"low": 29.600, "high": 29.601, "label": "FM ANROP", "license": "", "color": "#ffd000"},
    {"low": 29.620, "high": 29.700, "label": "RPT UT", "license": "", "color": "#ffd000"},

    {"low": 50.000, "high": 50.100, "label": "CW/FYRAR", "license": "", "color": "#3060ff"},
    {"low": 50.100, "high": 50.400, "label": "SSB/DIGI", "license": "", "color": "#30b030"},
    {"low": 50.400, "high": 50.500, "label": "FYRAR", "license": "", "color": "#00d0d0"},
    {"low": 50.500, "high": 51.210, "label": "ALLA", "license": "", "color": "#ffd000"},
    {"low": 51.210, "high": 51.390, "label": "RPT IN", "license": "", "color": "#ffd000"},
    {"low": 51.390, "high": 51.810, "label": "ALLA", "license": "", "color": "#ffd000"},
    {"low": 51.810, "high": 51.990, "label": "RPT UT", "license": "", "color": "#ffd000"},
    {"low": 51.990, "high": 52.000, "label": "ALLA", "license": "", "color": "#ffd000"}
  ],
  "spots": [
    {"freq": 1.836, "label": "CW QRP aktivitetscentrum"},
    {"freq": 1.8366, "label": "WSPR"},
    {"freq": 1.840, "label": "FT8"},
    {"freq": 1.842, "label": "JS8Call"},
    {"freq": 1.843, "label": "SSB QRP aktivitetscentrum"},

    {"freq": 3.555, "label": "CW QRS aktivitetscentrum"},
    {"freq": 3.560, "label": "CW QRP aktivitetscentrum"},
    {"freq": 3.5686, "label": "WSPR"},
    {"freq": 3.573, "label": "FT8"},
    {"freq": 3.575, "label": "FT4"},
    {"freq": 3.578, "label": "JS8Call"},
    {"freq": 3.630, "label": "Digital Voice aktivitetscentrum"},
    {"freq": 3.690, "label": "SSB QRP aktivitetscentrum"},
    {"freq": 3.735, "label": "Image aktivitetscentrum"},
    {"freq": 3.760, "label": "Katastrofsamband"},

    {"freq": 7.030, "label": "CW QRP aktivitetscentrum"},
    {"freq": 7.0386, "label": "WSPR"},
    {"freq": 7.0475, "label": "FT4"},
    {"freq": 7.070, "label": "Digital Voice aktivitetscentrum"},
    {"freq": 7.074, "label": "FT8"},
    {"freq": 7.078, "label": "JS8Call"},
    {"freq": 7.090, "label": "SSB QRP aktivitetscentrum"},
    {"freq": 7.110, "label": "Katastrofsamband"},
    {"freq": 7.165, "label": "Image aktivitetscentrum"},

    {"freq": 10.116, "label": "CW QRP aktivitetscentrum"},
    {"freq": 10.130, "label": "JS8Call"},
    {"freq": 10.136, "label": "FT8"},
    {"freq": 10.1387, "label": "WSPR"},
    {"freq": 10.140, "label": "FT4"},

    {"freq": 14.055, "label": "CW QRS aktivitetscentrum"},
    {"freq": 14.060, "label": "CW QRP aktivitetscentrum"},
    {"freq": 14.074, "label": "FT8"},
    {"freq": 14.078, "label": "JS8Call"},
    {"freq": 14.080, "label": "FT4"},
    {"freq": 14.0956, "label": "WSPR"},
    {"freq": 14.100, "label": "IBP/NCDXF-fyrar"},
    {"freq": 14.130, "label": "Digital Voice aktivitetscentrum"},
    {"freq": 14.195, "label": "DX-prioritet"},
    {"freq": 14.230, "label": "Image aktivitetscentrum"},
    {"freq": 14.285, "label": "SSB QRP aktivitetscentrum"},
    {"freq": 14.300, "label": "Internationellt katastrofsamband"},

    {"freq": 18.086, "label": "CW QRP aktivitetscentrum"},
    {"freq": 18.100, "label": "FT8"},
    {"freq": 18.104, "label": "FT4 / JS8Call"},
    {"freq": 18.1046, "label": "WSPR"},
    {"freq": 18.110, "label": "IBP/NCDXF-fyrar"},
    {"freq": 18.130, "label": "SSB QRP aktivitetscentrum"},
    {"freq": 18.150, "label": "Digital Voice aktivitetscentrum"},
    {"freq": 18.160, "label": "Katastrofsamband"},

    {"freq": 21.055, "label": "CW QRS aktivitetscentrum"},
    {"freq": 21.060, "label": "CW QRP aktivitetscentrum"},
    {"freq": 21.074, "label": "FT8"},
    {"freq": 21.078, "label": "JS8Call"},
    {"freq": 21.0946, "label": "WSPR"},
    {"freq": 21.140, "label": "FT4"},
    {"freq": 21.150, "label": "IBP/NCDXF-fyrar"},
    {"freq": 21.180, "label": "Digital Voice aktivitetscentrum"},
    {"freq": 21.285, "label": "SSB QRP aktivitetscentrum"},
    {"freq": 21.340, "label": "Image aktivitetscentrum"},
    {"freq": 21.360, "label": "Katastrofsamband"},

    {"freq": 24.906, "label": "CW QRP aktivitetscentrum"},
    {"freq": 24.915, "label": "FT8"},
    {"freq": 24.919, "label": "FT4"},
    {"freq": 24.9246, "label": "WSPR"},
    {"freq": 24.930, "label": "IBP/NCDXF-fyrar"},
    {"freq": 24.950, "label": "SSB QRP aktivitetscentrum"},
    {"freq": 24.960, "label": "Digital Voice aktivitetscentrum"},

    {"freq": 28.055, "label": "CW QRS aktivitetscentrum"},
    {"freq": 28.060, "label": "CW QRP aktivitetscentrum"},
    {"freq": 28.074, "label": "FT8"},
    {"freq": 28.078, "label": "JS8Call"},
    {"freq": 28.1246, "label": "WSPR"},
    {"freq": 28.180, "label": "FT4"},
    {"freq": 28.200, "label": "IBP/NCDXF-fyrar"},
    {"freq": 28.330, "label": "Digital Voice aktivitetscentrum"},
    {"freq": 28.360, "label": "SSB QRP aktivitetscentrum"},
    {"freq": 28.680, "label": "Image aktivitetscentrum"},
    {"freq": 29.600, "label": "FM-anropskanal"},

    {"freq": 50.050, "label": "CW aktivitetscentrum"},
    {"freq": 50.090, "label": "CW DX aktivitetscentrum"},
    {"freq": 50.110, "label": "DX-anrop (exklusivt)"},
    {"freq": 50.150, "label": "SSB aktivitetscentrum"},
    {"freq": 50.285, "label": "Crossband"},
    {"freq": 50.2936, "label": "WSPR"},
    {"freq": 50.305, "label": "PSK aktivitetscentrum"},
    {"freq": 50.313, "label": "FT8"},
    {"freq": 50.318, "label": "FT4 / JS8Call"},
    {"freq": 50.401, "label": "WSPR-fyrar"},
    {"freq": 51.510, "label": "FM-anrop"}
  ]
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    GUIUser interfaceNew FeatureNew feature requestaetherclaude-eligibleIssue approved for AetherClaude automated agentenhancementImprovement to existing featuregood first issueGood for newcomersmaintainer-reviewRequires maintainer review before any action is takenspectrumPanadapter and waterfall

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions