2.2 KiB
2.2 KiB
Winegard Trav'ler
Control a Winegard Trav'ler motorized satellite dish via RS-485 for amateur radio satellite tracking.
Project
- Package:
travler-rotor(installed viauv sync) - CLI entry point:
travler-rotor(init / serve / pos / move) - Source layout:
src/travler_rotor/(src-layout) - Original upstream:
Trav-ler-Rotor-For-HAL-2.05/— Gabe Emerson's scripts, kept as reference (do not modify)
Build & Lint
uv sync # Install deps + package
uv run ruff check src/ # Lint
uv run ruff format --check src/ # Format check
uv run travler-rotor --help # CLI smoke test
Architecture
protocol.py — FirmwareProtocol ABC + HAL205Protocol / HAL000Protocol
Serial I/O owned here. Each firmware version is a subclass.
leapfrog.py — Pure function: apply_leapfrog(target, current) -> adjusted
Predictive overshoot to compensate for mechanical motor lag.
antenna.py — TravlerAntenna: high-level control wrapping protocol + leapfrog
This is what consumers (CLI, rotctld, future MCP server) call.
rotctld.py — RotctldServer: Hamlib rotctld TCP protocol (p/P/S/_/q)
Bridges Gpredict to the antenna.
cli.py — Click CLI with init/serve/pos/move subcommands
Hardware Protocol Notes
- RS-485 serial, 57600 baud, 8N1
- Motor commands:
a <motor_id> <degrees>(0=azimuth, 1=elevation) - Position query:
areturnsAZ = <val> EL = <val> SK = <val> - HAL 2.05 motor submenu:
motorcommand; search kill viangsearch -> s -> q - HAL 0.0.00 motor submenu:
motcommand; search kill sequence undocumented - Boot signals (HAL 2.05): "NoGPS" or "No LNB Voltage" indicate homing complete
- Elevation floor: HAL 2.05 unreliable below 15 degrees with direct motor commands
Known Bugs (from upstream)
- Leap-frog elevation bug: original
travler_rotor.pylines 98-105 modifytarget_azinstead oftarget_el. Fixed inleapfrog.py. Seedocs/bugs.md.
Testing
No hardware-in-the-loop tests yet. Protocol implementations can be mocked for unit testing — FirmwareProtocol is an ABC with clear method contracts.