orion/cmd/configurator/main.go

229 lines
4.9 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"log"
"strings"
"time"
"forge.cadoles.com/Pyxis/orion/emlid"
"forge.cadoles.com/Pyxis/orion/emlid/reachview"
)
const (
modeRover = "rover"
modeBase = "base"
)
var (
mode = modeRover
host = "192.168.42.1"
)
func init() {
modes := []string{modeRover, modeBase}
flag.StringVar(
&mode, "mode", mode,
fmt.Sprintf("The configuration mode. Available: %v", strings.Join(modes, ", ")),
)
flag.StringVar(&host, "host", host, "ReachRS module host")
}
func main() {
flag.Parse()
switch mode {
case modeRover:
configureRover()
case modeBase:
configureBase()
default:
log.Fatalf("unknown mode '%s'", mode)
}
log.Println("done")
}
func connect() *reachview.Client {
c := reachview.NewClient(
emlid.WithEndpoint(host, 80),
)
log.Printf("connecting to module '%s'", host)
if err := c.Connect(); err != nil {
log.Fatal(err)
}
log.Println("connected")
return c
}
func configureRover() {
c := connect()
defer c.Close()
resetConfiguration(c)
config := getCommonConfiguration()
config.RTKSettings.GPSARMode = reachview.GPSARModeFixAndHold
config.RTKSettings.GLONASSARMode = reachview.On
config.RTKSettings.PositionningMode = reachview.PositionningModeKinematic
config.RTKSettings.UpdateRate = reachview.String("5")
config.CorrectionInput = &reachview.CorrectionInput{
Input2: &reachview.Input2{
Input: reachview.Input{
Enabled: reachview.True,
Format: reachview.IOFormatRTCM3,
Type: reachview.IOTypeLoRa,
Path: reachview.String("lora"),
},
SendPositionToBase: reachview.Off,
},
}
log.Println("configuring module as rover")
applyConfiguration(c, config)
}
func configureBase() {
c := connect()
defer c.Close()
resetConfiguration(c)
log.Println("configuring module as base")
config := getCommonConfiguration()
config.RTKSettings.UpdateRate = reachview.String("1")
config.BaseMode = &reachview.BaseMode{
Output: &reachview.Output{
Enabled: reachview.True,
Format: reachview.IOFormatRTCM3,
Type: reachview.IOTypeLoRa,
},
BaseCoordinates: &reachview.BaseCoordinates{
Accumulation: reachview.String("1"),
AntennaOffset: &reachview.AntennaOffset{
Up: reachview.String("2.20"),
},
Mode: reachview.BaseCoordinatesModeAverageSingle,
Format: reachview.BaseCoordinatesFormatLLH,
},
RTCM3Messages: &reachview.RTCM3Messages{
Type1002: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.1"),
},
Type1006: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.1"),
},
Type1010: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.5"),
},
Type1097: &reachview.RTCMMessageType{
Enabled: reachview.True,
Frequency: reachview.String("0.5"),
},
Type1008: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1019: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1020: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1107: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1117: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
Type1127: &reachview.RTCMMessageType{
Enabled: reachview.False,
},
},
}
applyConfiguration(c, config)
}
func applyConfiguration(c *reachview.Client, config *reachview.Configuration) {
ctx, applyConfCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer applyConfCancel()
result, _, err := c.ApplyConfiguration(ctx, config)
if err != nil {
log.Fatal(err)
}
if result != reachview.ConfigurationApplySuccess {
log.Fatal("configuration update failed !")
}
log.Println("restarting rtklib")
if err := c.RestartRTKLib(); err != nil {
log.Fatal(err)
}
}
func resetConfiguration(c *reachview.Client) {
log.Println("resetting module configuration")
ctx, resetCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer resetCancel()
result, _, err := c.ResetConfiguration(ctx)
if err != nil {
log.Fatal(err)
}
if result != reachview.ConfigurationApplySuccess {
log.Fatal("configuration reset failed !")
}
}
func getCommonConfiguration() *reachview.Configuration {
return &reachview.Configuration{
RTKSettings: &reachview.RTKSettings{
PositioningSystems: &reachview.PositionningSystems{
GPS: reachview.True,
GLONASS: reachview.True,
Galileo: reachview.True,
SBAS: reachview.True,
QZSS: reachview.True,
},
UpdateRate: reachview.String("5"),
},
LoRa: &reachview.LoRa{
AirRate: reachview.String("9.11"),
Frequency: reachview.Float(868000),
OutputPower: reachview.String("20"),
},
PositionOutput: &reachview.PositionOutput{
Output1: &reachview.Output{
Enabled: reachview.False,
},
Output2: &reachview.Output{
Enabled: reachview.False,
},
},
}
}