Source code for gatenet.radio.sdr
"""
SDRRadio: Concrete implementation of RadioInterface for SDR devices.
Examples:
>>> from gatenet.radio.sdr import SDRRadio
>>> radio = SDRRadio()
>>> radio.scan_frequencies(433_000_000, 434_000_000, 10)
>>> radio.on_signal(lambda info: print(info))
"""
import numpy as np
from .base import RadioInterface
[docs]
class SDRRadio(RadioInterface):
[docs]
def get_samples(self, size: int = 1024) -> "np.ndarray":
"""Return simulated SDR samples as a NumPy array (for testing/visualization)."""
try:
import numpy as np
except ImportError:
raise RuntimeError("numpy is required for get_samples")
# Simulate random samples for testing using numpy's Generator
rng = np.random.default_rng(seed=42)
return rng.normal(0, 1, size)
[docs]
def detect_collisions(self) -> list:
"""Return a simulated list of RF collisions (for testing)."""
# Simulate two collisions for test coverage
return [
{"source": "deviceA", "strength": -65.0},
{"source": "deviceB", "strength": -70.5}
]
"""SDR-based radio interface for RF scanning and decoding."""
[docs]
def scan_frequencies(self, start_freq: int, end_freq: int, step_khz: int) -> None:
# Simulate SDR scan and mesh integration
for freq in range(start_freq, end_freq, step_khz * 1000):
info = {"freq": freq, "sdr": True, "power": 42}
self._signal_handler(info)
# Example: propagate to mesh if available
try:
from gatenet.mesh.radio import MeshRadio
mesh_radio = MeshRadio()
mesh_radio.log_rf_signal(info)
mesh_radio.send_message("RF event", "mesh", rf_signal=info)
except Exception:
pass
[docs]
def decode_adsb(self) -> None:
# Stub: Replace with actual ADS-B decoding logic
self._signal_handler({"type": "adsb", "data": "aircraft detected"})
[docs]
def decode_weather(self) -> None:
# Stub: Replace with actual weather decoding logic
self._signal_handler({"type": "weather", "data": "weather station signal"})