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 BOOTSEL request to %s...\n", dev) t, err := picoserial.Open(dev) if err != nil { return err } c := client.New(t, 2*time.Second) err = c.BOOTSEL() c.Close() if err != nil { fmt.Fprintf(os.Stderr, "warning: BOOTSEL request failed: %v\n", err) } else { fmt.Println("Device confirmed reboot into BOOTSEL 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() fmt.Println("Done.") return nil }