feat: add Ground Station UART baseline

This commit is contained in:
2026-09-29 11:25:59 +02:00
commit 515c3bae69
7 changed files with 279 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
package main
import (
"context"
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
"os/signal"
"syscall"
"git.piksar.eu/piotr/groundstation/internal/protocol"
"git.piksar.eu/piotr/groundstation/internal/serialport"
)
func main() {
serialPath := flag.String("serial", "", "GX12 AUX1 UART device, e.g. /dev/ttyS1")
stdin := flag.Bool("stdin", false, "read framed data from standard input")
startVideo := flag.Bool("start-video", false, "start fpv-video with Ground Station")
flag.Parse()
if *stdin == (*serialPath != "") {
log.Fatal("select exactly one of -stdin or -serial")
}
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
if *startVideo {
cmd := exec.CommandContext(ctx, "fpv-video")
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
if err := cmd.Start(); err != nil {
log.Fatalf("start fpv-video: %v", err)
}
defer func() { _ = cmd.Wait() }()
}
var input io.Reader = os.Stdin
var port *os.File
var err error
if *serialPath != "" {
port, err = serialport.Open115200(*serialPath)
if err != nil {
log.Fatal(err)
}
defer port.Close()
input = port
}
if err := run(ctx, input, os.Stdout); err != nil && err != context.Canceled {
log.Fatal(err)
}
}
func run(ctx context.Context, input io.Reader, output io.Writer) error {
buf := make([]byte, protocol.RCSize)
for {
if err := readFull(ctx, input, buf); err != nil {
return err
}
frame, err := protocol.DecodeRC(buf)
if err != nil {
log.Printf("discard frame: %v", err)
continue
}
fmt.Fprintf(output, "seq=%d t=%d ch1=%d ch2=%d ch3=%d ch4=%d aux1=%d aux2=%d\n",
frame.Sequence, frame.Timestamp,
frame.Channels[0], frame.Channels[1], frame.Channels[2], frame.Channels[3],
frame.Channels[4], frame.Channels[5])
}
}
func readFull(ctx context.Context, input io.Reader, dst []byte) error {
read := 0
for read < len(dst) {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
n, err := input.Read(dst[read:])
read += n
if err != nil {
return err
}
}
return nil
}