package main import ( "fmt" "os" "os/exec" "path/filepath" "time" "github.com/theater/picomap/lib/client" "github.com/theater/picomap/lib/picoserial" "github.com/theater/picomap/lib/picotool" ) func main() { wd, err := os.Getwd() if err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } buildDir := filepath.Join(wd, "build") if err := run(buildDir); err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } } func run(buildDir string) error { fmt.Println("Building...") cmd := exec.Command("make", "-C", buildDir) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { return fmt.Errorf("build failed: %w", err) } dev, err := picoserial.FindDevice() if err != nil { return err } if dev != "" { fmt.Printf("Sending PICOBOOT request to %s...\n", dev) t, err := picoserial.Open(dev) if err != nil { return err } c := client.New(t, 2*time.Second) err = c.PICOBOOT() c.Close() if err != nil { fmt.Fprintf(os.Stderr, "warning: PICOBOOT request failed: %v\n", err) } else { fmt.Println("Device confirmed reboot into PICOBOOT mode.") } time.Sleep(2 * time.Second) } uf2 := filepath.Join(buildDir, "picomap.uf2") fmt.Println("Loading firmware...") if err := picotool.Load(uf2); err != nil { return err } fmt.Println("Rebooting...") _ = picotool.Reboot() time.Sleep(3 * time.Second) dev, err = picoserial.FindDevice() if err != nil { return err } if dev != "" { t, err := picoserial.Open(dev) if err != nil { return err } c := client.New(t, 2*time.Second) info, err := c.Info() c.Close() if err != nil { fmt.Fprintf(os.Stderr, "warning: Info request failed: %v\n", err) } else { fmt.Printf("Board ID: %02X%02X%02X%02X%02X%02X%02X%02X\n", info.BoardID[0], info.BoardID[1], info.BoardID[2], info.BoardID[3], info.BoardID[4], info.BoardID[5], info.BoardID[6], info.BoardID[7]) fmt.Printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", info.MAC[0], info.MAC[1], info.MAC[2], info.MAC[3], info.MAC[4], info.MAC[5]) } } fmt.Println("Done.") return nil }