* fix: inject-only slot contention, monitor events, and UA timer display
Per-peer slot contention for inject-only multi-hotspot: REPEAT and bridge
downlink respect each hotspot's busy slot instead of blocking the whole
MASTER. REPEAT monitor reports and companion TX fan-out are filtered when
the target peer would not accept the downlink.
Monitor topology remap reads MASTER STATUS via bootstrap callback and
suppresses OBP/companion voice events for peers with an active QSO on
another TG in the same slot. START,RX is emitted only on a new stream id.
UA TIMER=0 (legacy no-expiry): domain sentinel, topology omits infinite
ua_timer_min, SINGLE sessions store expires=0 instead of ~68-year offsets,
and export omits absurd expires_at values.
* feat: dynamic TG restore, OBP cross-slot downlink, and DB migration 005
- Export ua_multi_tgs in topology for monitor chip restore after server restart
- Defer OBP→HBP slot contention on inject-only proxies; clear other-slot SINGLE session on new TX
- Fix infinite UA timer persistence (expires_at NULL) and restore from DB (expires_at=0 sentinel)
- Push CONFIG to monitor after async dynamic-TG restore on RPTC
- Migration 005_peer_dynamic_tgs_expires_null (shared with adn-monitor)
Validate TS1/TS2 static tokens as numeric TG ids so comma-separated
garbage (e.g. TS2=730444,VOICE=0) is ignored in topology, downlink,
and static bridge refresh.
Block concurrent group voice on the same slot during active QSO; apply
GROUP_HANGTIME only after VTERM. Derive simplex/duplex from RPTC, force
simplex downlink to TS2, export rf_mode in topology, and drop duplicate
static TGs from TS2 when TS1 already lists them.
Add release-pr-check workflow and clarify post-release sync logs so develop
fast-forwards to master after each release without force-push or phantom
commits on the next develop→master PR.
Emit REPEAT downlink END,TX when the stream had START even if slot RX already
idle, and finalize bridge VTERM legs without contention blocking teardown when
another TG is active on the other timeslot of the same MASTER.
* chore(ci): sync develop via merge instead of force-push
Merge master into develop after release so local checkouts can git pull
without reset --hard. Try fast-forward first; merge commit after squash releases.
* fix: restore cross-slot downlink and REPEAT monitor activity
Cross-slot TG downlink, DMRA index parity, and REPEAT monitor START/TX reporting.
* fix: remap REPEAT DMRD slot to peer OPTIONS for cross-slot downlink (#17)
Flip the DMRD timeslot bit per receiver so hotspots hear group voice on
the TS where the TG is configured (static OPTIONS or dynamic UA), and
emit inject-proxy BRDG field 7 on that same slot for monitor TE parity.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Flip the DMRD timeslot bit per receiver so hotspots hear group voice on
the TS where the TG is configured (static OPTIONS or dynamic UA), and
emit inject-proxy BRDG field 7 on that same slot for monitor TE parity.
Merge master into develop after release so local checkouts can git pull
without reset --hard. Try fast-forward first; merge commit after squash releases.
* chore: run releases on master only, not develop
Integrate on develop without versioning; PSR and GitHub Release trigger on master push.
* fix: keep YAML SINGLE_MODE on multi-peer masters for dynamic TGs (#11)
Peer OPTIONS SINGLE=1 was overwriting system-wide SINGLE_MODE, which
forced single-TG in-band deactivation and broke multi-dynamic (SINGLE=0)
and OBP bridge legs. Per-peer SINGLE still applies to downlink.
Also coerce SINGLE_MODE booleans from YAML/OPTIONS (true/True/0/1) and
apply DEFAULT_UA_TIMER / SINGLE_MODE defaults when missing from OPTIONS.
* chore: run releases on master only, not develop
Integrate on develop without versioning; PSR and GitHub Release trigger on master push.
* fix: filter standalone DMRA downlink by TG subscription
Apply peer_should_receive_group_voice to DMRA UDP (same rules as DMRD).
Debug branch for hotspot TA leak on unrelated static TGs.
* version bump
* docs: expand server guide and add report-proxy for legacy dashboards
Document ADN-report-proxy so adn-server 2.x can feed v1 legacy monitors,
and sync EN/ES MkDocs with DATABASE, dynamic TGs, monitoring, and related topics.
* docs: add bridges vs subscriptions, performance guide, and Mermaid diagrams (#6)
Document 2.x routing model with a concrete TG 52090 example, operator-focused
performance gains (indexes, reporting, integrated proxy), and MkDocs Mermaid
support across server and monitor architecture pages.
* fix: echo TG 9990 monitor parity and UA session exclusions (#7)
Exclude 9990–9999 from SINGLE/UA locks, remap inject-only echo TX events,
resolve bridge TX peer_id for monitor display, and fix dynamic TG restore callback.
* chore: bump version to 2.0.0-rc.4
Document 2.x routing model with a concrete TG 52090 example, operator-focused
performance gains (indexes, reporting, integrated proxy), and MkDocs Mermaid
support across server and monitor architecture pages.
Document ADN-report-proxy so adn-server 2.x can feed v1 legacy monitors,
and sync EN/ES MkDocs with DATABASE, dynamic TGs, monitoring, and related topics.
* feat: persist peer dynamic TGs in MariaDB across reconnects
Add DATABASE config, async DynamicTgStore, and restore on RPTC so
SINGLE=0/1 dynamics survive hotspot disconnects and server restarts
without blocking the DMRD voice path.
* fix: ensure peer_dynamic_tgs table on server startup
Apply migration 004 idempotently at boot so the server does not depend
on adn-monitor db_bootstrap when peer_dynamic_tgs is missing.
* fix: import DynamicTgEntry for ruff F821 in subscription_table
* fix: log clear MariaDB startup failures to file and stderr
Validate DATABASE at config load and on connect; map common MySQL
errors to actionable messages so the server does not fail silently.
* fix: TG 4000 clears STATUS and bridge legs after dynamic reset
Clear RX slot state to stop RPTO re-seeding cleared sessions, run
in-band 4000 deactivation on inject-only paths, and mark downlink dirty.
* fix: complete TG 4000 reset for monitor and dynamic TG persistence
Emit INGRESS BRDG_EVENT so SINGLE=0 UA chips clear without stuck TX;
wipe all peer dynamic rows from memory and MariaDB on reset. Never store
TG 4000 as a UA session. Require DATABASE only for full peer-server configs.
When voice arrives on TS2 but the hotspot lists the TG on TS1 (or vice
versa), flip the slot bit on send_peer so duplex radios RX on the
configured timeslot.