package main import ( "flag" "fmt" "log" "strings" "forge.cadoles.com/Pyxis/orion/emlid" "forge.cadoles.com/Pyxis/orion/emlid/updater" ) const ( phaseConfigureWifi = "configure-wifi" phaseUpdateThenReboot = "update-then-reboot" ) var ( phase = phaseConfigureWifi host = "192.168.42.1" ssid = "" security = string(updater.SecurityWPAPSK) password = "" ) func init() { phases := []string{phaseConfigureWifi, phaseUpdateThenReboot} flag.StringVar( &phase, "phase", phase, fmt.Sprintf("The configuration phase. Available: %v", strings.Join(phases, ", ")), ) flag.StringVar(&host, "host", host, "ReachRS module host") flag.StringVar(&ssid, "ssid", ssid, "The WiFi SSID to connect the module to") flag.StringVar(&security, "security", security, "The WiFi security algorithm") flag.StringVar(&password, "password", password, "The WiFi password") } func main() { flag.Parse() switch phase { case phaseConfigureWifi: configureWifi() case phaseUpdateThenReboot: updateThenReboot() default: log.Fatalf("unknown phase '%s'", phase) } log.Println("done") } func connect() *updater.Client { c := updater.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 configureWifi() { if ssid == "" { log.Fatal("you must provide a WiFi SSID with the -ssid flag") } c := connect() defer c.Close() log.Println("checking module status") results, err := c.TestResults() if err != nil { log.Fatal(err) } log.Printf("device: '%s'", results.Device) log.Printf("lora activated ? %v", results.Lora) log.Printf("mpu activated ? %v", results.MPU) log.Printf("stc activated ? %v", results.STC) log.Printf("ublox activated ? %v", results.UBlox) log.Printf("adding wifi network '%s'", ssid) done, err := c.AddWifiNetwork(ssid, updater.WifiSecurity(security), password) if err != nil { log.Fatal(err) } if !done { log.Fatal("couldnt add wifi network") } log.Println("connecting module to wifi network") if err := c.JoinWifiNetwork(ssid, true); err != nil { log.Fatal(err) } log.Printf("you can now switch to the wifi network and start phase '%s'", phaseUpdateThenReboot) } func updateThenReboot() { c := connect() defer c.Close() log.Println("checking time sync") synced, err := c.TimeSynced() if err != nil { log.Fatal(err) } log.Printf("time synced ? %v", synced) log.Println("checking reachview version") version, err := c.ReachViewVersion() if err != nil { log.Fatal(err) } log.Printf("reachview version ? '%s'", version) log.Println("checking for update") status, err := c.Update() if err != nil { log.Fatal(err) } log.Printf("is update running ? %v", status.Active) log.Printf("is update locked ? %v", status.Locked) log.Printf("last update state ? '%s'", status.State) if status.Active { log.Fatal("cannot reboot while an update is active") } log.Println("rebooting device") if err := c.RebootNow(true); err != nil { log.Fatal(err) } }