Systems: P25 trunked / conventional / analog mode + channel editor (node-26#24) #205

Merged
logan merged 1 commits from feat/24-p25-conventional into main 2026-10-04 17:24:30 -04:00
Owner

Server half of node-26#24 (P25 conventional). Do not merge until it has been reviewed — merging to main auto-deploys prod.

  • internal/system_config.py: P25 config.mode is trunked (the default when missing, and those systems pass through untouched, no migration) or conventional.
    • A conventional system has channels: [{freq MHz, name, nac?}]: 1-2 channels, within 1.5 MHz, NAC in hex.
    • It cannot carry control_channels; saving one returns a 422.
    • An analog channels[0] is mirrored into control_channels so older nodes keep working.
  • talkgroups.name_from_system names the node's synthetic per-channel id (freq/100 Hz) after the channel.
  • The checkin persists radio_channels: the node's conventional channels and their encryption state.
  • Systems editor: the Type select is P25 trunked / P25 conventional / Analog (NBFM) / DMR. There is a conventional channel-row editor and a one-frequency analog form.
  • Node page: a Conventional Channels section with an encryption notice.

Verified: c2-core 525 pass (includes the new test_system_config.py). drb-qa-review findings are fixed.
Unverified: frontend typecheck/build, because this box has no Node toolchain. Please check the Gitea build before merging.

🤖 Generated with Claude Code

Server half of node-26#24 (P25 conventional). **Do not merge until it has been reviewed — merging to main auto-deploys prod.** - `internal/system_config.py`: P25 `config.mode` is `trunked` (the default when missing, and those systems pass through untouched, no migration) or `conventional`. - A conventional system has `channels: [{freq MHz, name, nac?}]`: 1-2 channels, within 1.5 MHz, NAC in hex. - It cannot carry `control_channels`; saving one returns a 422. - An analog `channels[0]` is mirrored into `control_channels` so older nodes keep working. - `talkgroups.name_from_system` names the node's synthetic per-channel id (freq/100 Hz) after the channel. - The checkin persists `radio_channels`: the node's conventional channels and their encryption state. - Systems editor: the Type select is P25 trunked / P25 conventional / Analog (NBFM) / DMR. There is a conventional channel-row editor and a one-frequency analog form. - Node page: a Conventional Channels section with an encryption notice. **Verified:** c2-core 525 pass (includes the new `test_system_config.py`). drb-qa-review findings are fixed. **Unverified:** frontend typecheck/build, because this box has no Node toolchain. Please check the Gitea build before merging. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
logan added 1 commit 2026-10-04 15:57:36 -04:00
- system_config.normalize(): a P25 system with config.mode "conventional"
  carries config.channels [{freq MHz, name, nac?}] (1-2, within 1.5 MHz) and
  can no longer carry control channels (422). A missing mode is trunked and
  passes through untouched, so there is no migration. An analog channel is
  mirrored into control_channels for older nodes.
- talkgroups.name_from_system resolves the edge node's synthetic per-channel
  id (freq in 100 Hz units) to the channel name.
- The checkin persists radio_channels (conventional channels + encryption).
- Systems editor: Type = P25 trunked / P25 conventional / Analog (NBFM) /
  DMR, plus a channel-row editor for conventional and a one-frequency form for
  analog. The node page shows conventional channels and an encryption notice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
logan merged commit d57738a8f6 into main 2026-10-04 17:24:30 -04:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: logan/server-26#205