Skip to content

feat(docs): additional bands (PMR, airband, marine, broadcast) #139

Description

@pskillen

Problem

Band classification today covers UK amateur licence allocations onlydocs/reference/bands.md and src/lib/bands.ts. bandFromFrequencyMhz() / BandPill / channel-list band filter / /#/reference/band-plan all use UK_BANDS.

Operators routinely programme non-amateur receive channels that never match a pill:

Service Typical use Example range (UK-oriented)
PMR446 Licence-free listen (often RX-only on ham rigs) ~446.0 – 446.2 MHz
Airband Aviation AM monitoring ~118 – 137 MHz
Marine VHF Coastal / harbour listen ~156 – 162 MHz (ITU marine band)
FM broadcast Broadcast FM ~87.5 – 108 MHz
AM broadcast LW / MW / SW broadcast LW ~148 – 285 kHz; MW ~526 – 1606 kHz; SW multiple HF segments

Frequencies outside amateur allocations show no band pill or a muted unknown — even when the channel is deliberately programmed (e.g. PMR446, Glasgow Tower). Worse, naive labelling could confuse broadcast LW with amateur 136 kHz (LW) — same colloquial “LW” wording, different services and licence rules.

Intended outcome

Extend band reference and lookup so non-amateur services classify with distinct IDs, labels, and colours, while keeping amateur bands authoritative where allocations overlap in operator mental models.

Documentation (tier-2 reference)

  • Extend docs/reference/bands.md or add a sibling doc (e.g. docs/reference/frequency-services.md) indexed from the reference hub — domain-neutral, not CPS wire tables.
  • Document each new service: MHz/kHz range(s), UK relevance, typical RX-only note, authoritative source link where practical.
  • Disambiguation table — explicit label rules, e.g.:
ID (proposed) UI label Not to be confused with
136khz 136 kHz Broadcast LW (broadcast-lw)
broadcast-lw LW broadcast Amateur 136 kHz
broadcast-mw MW broadcast 160 m amateur
broadcast-sw SW broadcast Amateur HF bands (document coarse SW segments or multiple rows — TBD in PR)
pmr446 PMR446 70 cm amateur (430 – 440 MHz — adjacent but non-overlapping)
airband Airband 2 m / 4 m amateur
marine Marine
fm-broadcast FM broadcast
  • Update docs/reference/display-conventions.md — band pill rules for amateur and non-amateur categories.
  • Disclaimer: programming convenience only; non-amateur TX restrictions; not authoritative for on-air operation.

Implementation (src/lib/bands.ts)

  • Add category (or equivalent) on BandDefinition, e.g. 'amateur' | 'pmr' | 'airband' | 'marine' | 'broadcast'.
  • Extend band table with new rows; preserve lookup rule (first match in frequency order) but order rows so non-overlapping ranges are unambiguous; where services are adjacent (amateur 136 kHz vs broadcast LW), tight min/max bounds and distinct labels prevent misclassification.
  • Consider exporting UK_AMATEUR_BANDS + ALL_BANDS (or FREQUENCY_BANDS) so channel-list filter can default to amateur-only while still classifying PMR/airband/etc. on pills.
  • New colours: visually distinct from amateur palette; broadcast family may share a hue family (LW/MW/SW) but must not reuse amateur 136 kHz violet.
  • Tests: boundary MHz values per row; PMR446 channel centre; airband tower freq; marine ch 16; FM R4; broadcast LW vs 136 kHz amateur; no false match on 2 m repeater for marine band.

UI

  • BandPill — render new bands (optionally subtle category styling, e.g. outline for non-amateur — TBD in PR).
  • BandPlanTable / /#/reference/band-plan — group or section: Amateur | PMR & services | Broadcast (or tabs).
  • Channel list band filter (ChannelsListSectionNav) — include new bands when present in codeplug; consider amateur-only default with opt-in “all services”.
  • Map / channel detail — pills appear for classified non-amateur RX-only channels.

Proposed frequency rows (starting point — verify in PR)

Ranges are indicative; PR author should cite Ofcom / ITU / ETSI sources and tighten bounds.

ID Label Min (MHz) Max (MHz) Category Notes
broadcast-lw LW broadcast 0.1485 0.285 broadcast Not amateur 136 kHz
broadcast-mw MW broadcast 0.5265 1.6065 broadcast
broadcast-sw SW broadcast TBD TBD broadcast One coarse row or multiple HF segments
fm-broadcast FM broadcast 87.5 108.0 broadcast UK FM band
airband Airband 118.0 137.0 airband Civil aviation VHF AM
marine Marine 156.0 162.05 marine ITU marine VHF
pmr446 PMR446 446.0 446.2 pmr Licence-free; RX-only typical on ham rigs

Existing amateur rows unchanged unless ordering adjustment needed for lookup.

Affected

  • docs/reference/bands.md (and/or new reference doc)
  • docs/reference/display-conventions.md
  • docs/features/README.md — reference index row
  • src/lib/bands.ts, src/lib/bands.test.ts
  • src/components/reference/BandPlanTable.tsx
  • src/components/crud/BandPill.tsx (+ .md component docs)
  • src/components/SectionNav/sections/ChannelsListSectionNav.tsx — filter options
  • src/routes/reference/band-plan.tsx — page copy if sections added

Related

Out of scope

  • Programming airband/PMR on OpenGD77 1701 (no AM airband on that radio per operator docs) — classification only; export limits stay in format adapters
  • CB (27 MHz), FRS/GMRS, or non-UK band plans unless added in follow-up
  • Storing band on Channel model — continue inferring from frequency at display time unless a separate ticket justifies persistence

Manual verify

  1. PMR446 channel (e.g. 446.05625 MHz) → PMR446 pill, not unknown.
  2. Airband (e.g. 121.5 MHz) → Airband pill.
  3. Marine ch 16 (156.8 MHz) → Marine pill.
  4. FM broadcast (e.g. 95.0 MHz) → FM broadcast pill.
  5. Broadcast LW (e.g. 198 kHz) → LW broadcastnot amateur 136 kHz.
  6. Amateur 136 kHz allocation still → 136 kHz amateur pill.
  7. Band plan page lists amateur and non-amateur sections with correct ranges.
  8. Channel list band filter includes PMR/airband/etc. when channels exist.
  9. npm run lint && npm run test && npm run build.

Workflow note

Branch from origin/main. Atomic commits — e.g. docs(reference): … then feat(bands): … then feat(ui): band plan sections. PR linking Closes #.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions