Skip to content

[RFC] Net Reminder Scheduler — recurring net reminders with one-click tuning #3687

Description

@ten9876

Note on sequencing

Transparency up front: the reference implementation (PR #3684) already exists — built by @jensenpat. Per GOVERNANCE.md this is out of order (RFC should precede a new feature area). This RFC formalizes the design for maintainer sign-off, mirroring how #3613 (remote receive antennas) was handled. #3684 is held until this RFC is approved.

Problem

Operators regularly join recurring on-air nets — gatherings on a fixed frequency/band/mode at a regular local time (weekly traffic nets, daily club nets, monthly special-interest nets). Today AetherSDR has no way to remember those schedules or to be reminded before one starts; the operator tracks them out-of-band (calendar, memory) and manually tunes when it's time. Radio memory channels don't help: they're radio-authoritative, finite, have no recurrence, and no reminder.

Proposal

A personal Net Reminder Scheduler: the operator adds favorite recurring nets, gets a reminder shortly before each starts, and clicks Tune Now to jump straight to it with the saved mode/filter.

Conceptually a net is a memory-channel preset + a recurrence rule + a reminder:

  • Tuning reuses the existing MemoryEntry shape and MemoryRecallPolicy command builders (incl. the cross-band display pan set band= preselect) — no new radio protocol surface (Principle I).
  • Recurrence is stored as an RFC 5545 RRULE subset (Daily / Weekly / Monthly-nth-weekday + one-time) plus an IANA timezone and local time-of-day — never a precomputed instant — so "20:00 local" stays correct across DST. The firing instant is computed lazily via QTimeZone.
  • Operator-scoped client state (Principle XIII) — persists locally as versioned JSON, works with no radio connected, and never consumes a radio memory slot. Distinct from radio-authoritative memories.
  • Reminder delivery — a guaranteed in-app actionable banner ("Tune Now") plus a best-effort OS tray notification as the attention-getter.

Cross-platform impact

Platform Reminder Tuning
Linux / Windows / macOS In-app banner (guaranteed, identical everywhere) + best-effort QSystemTrayIcon balloon (guarded by isSystemTrayAvailable()) Shared MemoryRecallPolicy builders — identical

Pure QtCore core (headless, unit-tested); no new dependency; no platform-specific code. The in-app banner is independent of tray availability, so the actionable path works even on minimal Linux WMs / under Do-Not-Disturb.

Alternatives considered

  1. Use radio memory channels — radio-authoritative, finite slots, no recurrence, no reminder, requires a connected radio. Wrong tool. Rejected.
  2. External calendar / .ics reminders — no in-app tuning, no awareness of the radio. (.ics export is a fine future complement.)
  3. Desktop cron / notification daemons — platform-specific, no tuning integration, not discoverable in-app. Rejected.

Implementation scope (reference: PR #3684)

Headless core (NetEntry, NetRecurrence, NetSchedulePlanner, NetScheduleStore, NetScheduler) + UI (NetSchedulerDialog, NetReminderBanner, MainWindow_Nets) + a Settings menu entry. ~2,568 lines, 21 files, 3 unit-test targets (recurrence incl. DST, JSON round-trip, planner). Deep-reviewed: DST/recurrence correct, Principle I/V/XIII honored, cross-platform degradation clean, no blockers.

Requesting maintainer approval before merging #3684.

Metadata

Metadata

Assignees

No one assigned

    Labels

    GUIUser interfaceNew FeatureNew feature requestenhancementImprovement to existing featuremaintainer-reviewRequires maintainer review before any action is takenrfc

    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