Files
SatMaster/README.md
2026-03-24 23:24:36 +01:00

197 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SatMaster — F4BPO Satellite Tracker
Amateur satellite tracking application with Doppler correction for FlexRadio 8600 and rotor control via PstRotator.
**Stack:** Go + Wails v2 + Svelte
**Platform:** Windows (primary), Linux/macOS (compilable)
---
## Features
- 🗺️ **World map** — real-time satellite positions on Leaflet dark map, footprint overlay
- 📡 **Polar plot** — az/el pass track with AOS/LOS markers, current position animation
- 🕐 **Pass prediction** — 24h upcoming passes, Max El, duration, quality rating
- 📻 **Doppler correction** — automatic TX/RX frequency correction via FlexRadio 8600 TCP API
- 🔄 **Rotor control** — Az/El commands to PstRotator via UDP XML protocol
- 🛰️ **TLE management** — auto-fetch from tle.oscarwatch.org with local cache fallback
---
## Architecture
```
SatMaster/
├── main.go # Wails entry point
├── app.go # App struct, Wails bindings, position loop
├── wails.json # Wails project config
├── backend/
│ ├── tle/
│ │ └── manager.go # TLE fetch (oscarwatch.org), cache, parse, lookup
│ │
│ ├── propagator/
│ │ └── engine.go # SGP4 propagation, az/el, pass prediction
│ │
│ ├── doppler/
│ │ └── calculator.go # Doppler shift computation (range rate → Hz correction)
│ │
│ ├── flexradio/
│ │ └── client.go # FlexRadio SmartSDR TCP API (port 4992)
│ │
│ └── rotor/
│ └── pstrotator.go # PstRotator UDP XML protocol (port 12000)
└── frontend/src/
├── App.svelte # Root layout, Wails event subscriptions
├── stores/satstore.js # Svelte stores for all app state
├── lib/
│ ├── wails.js # Wails Go call bridge + dev stubs
│ └── utils.js # Formatting helpers (freq, az, el, etc.)
└── components/
├── StatusBar.svelte # Top bar: clock, sat data, Doppler, connections
├── SatSelector.svelte # Left sidebar: search + quick-select + full list
├── WorldMap.svelte # Leaflet map with sat markers + footprints
├── PolarPlot.svelte # SVG polar az/el plot
├── PassesPanel.svelte # Pass list + detail + embedded polar plot
└── SettingsPanel.svelte # QTH, frequencies, FlexRadio, rotor, TLE
```
---
## Prerequisites
```bash
# Go 1.21+
# Node.js 18+
# Wails v2
go install github.com/wailsapp/wails/v2/cmd/wails@latest
# Verify
wails doctor
```
---
## Setup & Build
```bash
# 1. Clone / copy project
cd SatMaster
# 2. Download Go dependencies
go mod tidy
# 3. Install frontend deps
cd frontend && npm install && cd ..
# 4. Development mode (hot reload)
wails dev
# 5. Production build (single .exe)
wails build
# → build/bin/SatMaster.exe
```
---
## FlexRadio 8600 — Protocol Notes
SatMaster uses the SmartSDR **TCP API** on port **4992**.
Commands sent:
```
C1|slice set 0 freq=145.800000 # Set RX frequency (MHz)
C2|transmit set freq=145.200000 # Set TX frequency (MHz)
```
- Connect: Settings → FlexRadio 8600 → enter IP → Connect
- The active slice index is 0 (Slice A) by default
- Doppler correction fires every second during active tracking
- Dead-band: updates only sent when shift exceeds ~10 Hz
---
## PstRotator — Protocol Notes
SatMaster sends **UDP XML** to PstRotator on port **12000** (default).
```xml
<PST><CMD>SET</CMD><AZ>180.0</AZ><EL>45.0</EL></PST>
```
- Configure in PstRotator: Setup → UDP Server → Port 12000
- Dead-band: 0.5° Az and El to prevent rotor hunting
- Elevation is clamped to [0°, 90°] — no negative elevation commands sent
---
## TLE Data
- **Primary source:** `https://tle.oscarwatch.org/nasabare.txt`
- **Fallback:** Celestrak SOCRATES
- **Cache:** `%LOCALAPPDATA%\SatMaster\satmaster_tle_cache.txt` (Windows)
- **Bundled fallback:** ISS, AO-7, AO-27, SO-50 (always available)
- TLE age shown in status bar; highlighted orange if > 48h
---
## Pass Prediction
- Step: 10s (30s when satellite below -15° elevation)
- AOS/LOS bisection precision: 1 second
- Horizon: passes below 5° Max El are filtered from the list
- 24-hour prediction window
---
## Doppler Formula
```
f_corrected_down = f_nominal × (1 - v_range / c)
f_corrected_up = f_nominal / (1 - v_range / c)
where:
v_range = range rate in km/s (+ = receding, - = approaching)
c = 299792.458 km/s
```
---
## Keyboard Shortcuts
| Key | Action |
|-----|--------|
| `M` | Switch to Map tab |
| `P` | Switch to Passes tab |
| `S` | Switch to Settings tab |
---
## Adding More Satellites
The app loads all satellites from the TLE feed (~2000+ amateur sats from OscarWatch).
Use the search box in the satellite selector to find any satellite by name or NORAD catalog number.
Common amateur satellites available:
- ISS (ZARYA) — 145.800 MHz FM voice
- AO-7 — 145.975 MHz / 29.502 MHz linear transponder
- AO-27 — 145.850 MHz FM
- SO-50 — 436.795 MHz FM
- RS-44 — 435.640 MHz / 145.935 MHz linear
- PO-101 (Diwata-2) — 437.500 MHz FM
- XW-2A/B/C/D — CW/linear transponders
- CAS-4A/B — linear transponders
---
## Future Enhancements
- [ ] Ground track on world map (lat/lon per pass point)
- [ ] Multiple satellite tracking (split-screen polar)
- [ ] Audio squelch mute between passes
- [ ] Log4OM integration for contact logging
- [ ] Satellite database with nominal frequencies auto-loaded
- [ ] AOS/LOS audio alert
- [ ] Export pass schedule to CSV/PDF