31 Commits
Author SHA1 Message Date
Frédéric Druppel 2124c46ea4 added µCell Soapy driver support (#83) 2026-07-09 23:35:48 +02:00
wbokslag f9fc289247 Merge pull request #80 from MidnightBlueLabs/testing
* Energy economy, class_of_ms parsing. Still only StayAlive is supported, but now respond to MS in-spec.
* Reject migration location updates with D-LOCATION-UPDATE-REJECT instead of silently dropping (#71)
* Large refactor putting tx timeslot selection responsibility with LLC/UMAC
* Refactor on TetraAddress and SsiRanges
* Fix for logging; writing to reader that stops consuming (full buffer) now no longer blocks the calling thread
* Fix BS LLC to bundle pending ACK into BL-ADATA with outgoing TL-DATA (#78)
* Version 0.5.9, refactors, removed most TetraPack-specific ssi filtering code
2026-04-23 14:14:54 +02:00
Wouter Bokslag 4d83852b78 fix for logging; writing to reader that stops consuming (full buffer) now no longer blocks the calling thread 2026-04-18 10:56:17 +02:00
Nathan SandWouter Bokslag 395f96cbe2 Energy economy, class_of_ms parsing, configurable MS TX power (#42)
* Energy economy, class_of_ms parsing, configurable MS TX power
- Fix EnergySavingInformation bit widths: frame_number 2→5, multiframe_number 2→6 (clause 16.10.10)
- Accept MS-requested energy saving mode instead of always overriding with StayAlive
- Implement D-MM-STATUS response for ChangeOfEnergySavingModeRequest
- Parse class_of_ms into structured ClassOfMs (24-bit, clause 16.10.5) instead of raw u64
- Store energy_saving_mode and class_of_ms per-MS in client state
- Make ms_txpwr_max_cell configurable via config.toml (default 4 = 30 dBm)
- Rewrite DMmStatus to use StatusDownlink enum and EnergySavingInformation
- Fix rx_u_mm_status: wrong PDU name in error log, make handled flag mutable

* Override energy saving mode to StayAlive, DL scheduler lacks per-MS monitoring pattern support

---------

Co-authored-by: Wouter Bokslag <w.bokslag@midnightblue.nl>
2026-04-17 19:22:52 +02:00
wbokslag 9e057e7b15 Framework for Telemetry and Control APIs (#68)
Version 0.5.8:
* Added Telemetry and Control frameworks, running as separate threads in the stack.
  Telemetry can send event data to an external telemetry service, while Control allows the BS to receive Control commands from an external Control service.
* Currently, Telemetry events for MS (de)registration and group attach/detach are implemented. Control supports remote command for SDS sending. Try `sendsds 1 <your_ms_ssi> false 82042d014869`
* Provide sample systemd service file (#66) in /contrib/systemd

Further changes:
* Refactored brew jitter buffer into separate file
* Refactored websockets into a separate transport
* Removed obsolete tnmm example networked entity code
* Moved brew entity to net_brew entity to designate it's a networked component
* Renamed tetra-bluestation binary to bluestation-bs
* Added support for secret fields in config, that will not be printed through Display or Debug
2026-03-29 21:45:07 +02:00
Wouter Bokslag a73ed88fbc Version 0.5.6, final tweaks to new soapy config
Config file should now be version 0.6
Slight tweaks to example config
Program now prints version number on startup
Formatting changes
2026-03-25 19:19:30 +01:00
Tatu Peltolaandwbokslag 98cefd855f Add automatic selection of SDR device, remove device specific iocfg (#64)
* Try to make SDR device selection cleaner and more robust
* Automatically select a supported SDR device
* Handle missing timestamps, detect SoapyRemote
* Remove device specific iocfg, implement overrides in a more generic way
* Cleanup device opening, skip enumeration if device string is given
* Add config overrides for sample rate and channel numbers
* Fix SXceiver period size for overridden sample rates
* Show errors for unsupported SDR configuration fields

---------

Co-authored-by: wbokslag <w.bokslag@midnightblue.nl>
2026-03-25 16:33:48 +01:00
Tatu Peltola 6c958dfd38 Try to fix LimeSDR configuration issues (#62)
* Try to fix LimeSDR configuration issues, update soapysdr crate

* Make default gains consistent with configuration example

Also increase default PAD gain for LimeSDR a bit.
PAD gains below 19 dB gave TX calibration errors on my LimeSDR USB.

* Some SdrSettings cleanup
2026-03-20 17:01:30 +01:00
Manoel 7ddcd7a5f9 Pluto/Pluto+ config cleanup (#60) 2026-03-20 09:30:42 +01:00
wbokslag 1f15c00d85 Merge pull request #59 from wahlm/pluto-timestamp-pr
Support for original Pluto and Pluto+, refactoring of configuration code
2026-03-19 11:25:16 +01:00
Mark Wahl 0ec39150ff improve configuration doc 2026-03-16 16:41:16 +01:00
Mark Wahl affe333532 USB needs timestamp_every 1500 2026-03-14 18:20:11 +01:00
Mark Wahl fe4826cc7c more doc in example config 2026-03-14 18:20:11 +01:00
Mark Wahl 6b04797908 support for pluto+ with timestamp 2026-03-14 18:20:11 +01:00
proxiboi69 56c8882334 Add D-NWRK-BROADCAST time broadcasting (#38)
* Add D-NWRK-BROADCAST time broadcasting
- Broadcast UTC time and local offset once per hyperframe (~61s)
- Add configurable timezone setting to cell config
- Use GSSI 0xFFFFFF broadcast address per clause 23.4.1.2.1
- Include number_of_ca_neighbour_cells field with value 0
- Skip first broadcast at startup before any radios have registered
- Remove incorrect trailing M-bit from D-NWRK-BROADCAST PDU (MLE PDUs don't use M-bits, per Annex E.2.1)
- Validate timezone at config parse and offset D-NWRK-BROADCAST timing
2026-03-13 16:37:40 +01:00
Wouter Bokslag 75660c1fdc Added config options for enabling/disabling SDS over Brew 2026-03-13 15:52:50 +01:00
proxiboi69 e41b86c74c Update Brew default port to 443 and username to SSID (#43) 2026-03-10 08:45:08 +01:00
proxiboi69 62594acae4 Per-radio ISSIs with TetraPack safety filtering; MM improvements (#32)
* Per-radio ISSIs with TetraPack safety filtering; MM improvements

- Version to 0.4.9
- Send per-radio REGISTER/DEREGISTER/AFFILIATE/DEAFFILIATE with individual ISSIs
- Add TetraPack ISSI filter: only exactly 7-digit ISSIs sent over WS
- Restrict GSSI <= 90 filter to TetraPack only
- Filter GROUP_TX forwarding for non-routable source ISSIs
- Remove Brew ISSI config field and initial BTS registration
- Rename is_brew_routable to is_brew_gssi_routable
- MM: auto-register unknown MS on group attach
- MM: send D-LOCATION UPDATE COMMAND to returning radios for group report
- MM: fix group_identity_attachment_lifetime to ETSI default
- MM: rename TemporaryRegistration to MigratingLocationUpdating
2026-02-27 13:28:39 +01:00
Wouter Bokslag 9d16d5c300 Improved Stack <-> Brew gating, some refactors 2026-02-24 15:47:35 +01:00
Wouter Bokslag 6f3f6ca9a2 Added brew call ssi range restrictions
Added checks to restrict brew calls to whitelisted / non-blacklisted ssi ranges
Updated example config
2026-02-24 13:54:25 +01:00
misadeks cbfd50b79d Dynamic group attachment for Brew subscribers (#19) 2026-02-23 17:03:21 +01:00
misadeks 0284e48ca7 Signal Lone Site Trunking based on Brew connectivity (#25)
* implemented LST indication based on connection to Brew or enablement of Brew
With brew disabled, LST signalling follows optional user flag
With brew enabled, LST signalling dynamic, overriding user flag
* added Brew WebSocket ping/pong heartbeat
Co-authored-by: Wouter Bokslag <w.bokslag@midnightblue.nl>
2026-02-23 13:13:46 +01:00
Elliott Cooper ca97b70648 Feature: Adaptive JitterBuffer for Brew Originated Calls (#16)
* brew: replay adaptive jitter buffer and bump v0.4.3
2026-02-21 12:16:44 +01:00
Wouter Bokslag 78397cde8d Updated example config 2026-02-20 11:16:46 +01:00
proxiboi69 95f2cd61f6 Brew integration and local group calls
- Brew RX/TX: talkgroup subscription, DL voice routing, UL forwarding to TetraPack
- Local group calls: ETSI call setup, floor control, hangtime, late entry
- UL voice: TCH/S decode with continuous Viterbi, ACELP reorder, DL loopback
- Fix MAC fragmenter crash on header exceeding remaining slot capacity
- Fix MLE handle routing for individual call setup responses
- Fix Direction::Both in UMAC circuit manager
- Align circuit expiry with T5m call timeout

- Add DEAFFILIATE → DEREGISTER teardown on Brew worker disconnect
- Implement Drop for BrewEntity to trigger graceful shutdown
- Add Ctrl+C signal handler (ctrlc crate) so main loop exits cleanly
- Extract graceful_teardown() in worker, handle channel disconnect fallback
- Add build_subscriber_deaffiliate/deregister to protocol builders

- Pass target TS via chan_alloc in D-TX CEASED / D-TX GRANTED
- UMAC stealing path uses specified TS instead of always picking first active circuit
- Fixes missing PTT release signaling on TS3+ with multiple concurrent group calls
2026-02-17 18:51:32 +01:00
Wouter Bokslag 1b377fcee7 Work-in-progress stuff regarding channel allocations and voice calls 2026-02-06 14:01:21 +01:00
Wouter Bokslag a24666ec86 Indicate PPM error is a float value in example config 2026-01-10 22:17:17 +01:00
Wouter Bokslag c02e165345 Significant improvements, rewrites and restructuring
- Better support for uplink SCH/F
- More typed message parsing improvements and standardization
- MAC Scheduler bugfix, restructuring
- Improved stdout formatting
- Added debugging features; logging text and UL/DL RF samples to file
- Implemented various extra PDU types
- Added unit tests and test vectors for various PDU types
- Added near-full-stack tests for UMAC and above.
2026-01-07 16:35:37 +01:00
Wouter Bokslag 07ad483806 Added support for custom duplex spacings
You can now use the optional custom_duplex_spacing field to override the duplex spacing (distance between ul and dl) instead of using the values as specified by ETSI. This is useful if your radio uses a modified duplex spacing table.
2025-12-30 20:32:33 +01:00
Wouter Bokslag 872b58803d Updated example config file version 2025-12-28 17:09:36 +01:00
Wouter Bokslag 81c1f30bab Extensive work on Phy/SoapySDR layer and stack configuration options 2025-12-28 15:23:44 +01:00