diff --git a/cmd/load/main.go b/cmd/load/main.go index 88d9c60..b2d6faa 100644 --- a/cmd/load/main.go +++ b/cmd/load/main.go @@ -1,6 +1,7 @@ package main import ( + "flag" "fmt" "log/slog" "os" @@ -13,7 +14,10 @@ import ( "github.com/theater/picomap/lib/picotool" ) +var target = flag.String("target", "all", "which firmware to load: picomap, picomap_test, or all") + func main() { + flag.Parse() wd, err := os.Getwd() if err != nil { slog.Error("fatal", "err", err) @@ -51,6 +55,13 @@ func boardSerial(id [8]byte) string { id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]) } +type deviceInfo struct { + dev string + serial string + uf2 string + name string +} + func run(buildDir string) error { if err := build(buildDir); err != nil { return err @@ -60,16 +71,39 @@ func run(buildDir string) error { if err != nil { return err } - if len(devs) < 2 { - return fmt.Errorf("expected 2 devices, found %d", len(devs)) + + allTargets := []struct { + name string + uf2 string + }{ + {"picomap", filepath.Join(buildDir, "picomap.uf2")}, + {"picomap_test", filepath.Join(buildDir, "picomap_test.uf2")}, } - serials := make([]string, 2) - errs := make([]error, 2) - uf2Names := []string{"picomap", "picomap_test"} + var targets []struct { + name string + uf2 string + } + switch *target { + case "all": + targets = allTargets + case "picomap": + targets = allTargets[:1] + case "picomap_test": + targets = allTargets[1:] + default: + return fmt.Errorf("unknown target %q", *target) + } + + if len(devs) < len(targets) { + return fmt.Errorf("need %d device(s), found %d", len(targets), len(devs)) + } + + devices := make([]deviceInfo, len(targets)) + errs := make([]error, len(targets)) var wg sync.WaitGroup - for i := range 2 { + for i := range targets { log := slog.With("dev", devs[i]) wg.Go(func() { log.Info("connecting for info") @@ -84,8 +118,13 @@ func run(buildDir string) error { errs[i] = err return } - serials[i] = boardSerial(info.BoardID) - log.Info("got info", "serial", serials[i], "firmware", info.FirmwareName) + devices[i] = deviceInfo{ + dev: devs[i], + serial: boardSerial(info.BoardID), + uf2: targets[i].uf2, + name: targets[i].name, + } + log.Info("got info", "serial", devices[i].serial, "firmware", info.FirmwareName) }) } wg.Wait() @@ -95,11 +134,11 @@ func run(buildDir string) error { } } - for i := range 2 { - log := slog.With("serial", serials[i]) + for i := range devices { + log := slog.With("serial", devices[i].serial) wg.Go(func() { log.Info("sending PICOBOOT") - c, err := client.NewSerial(devs[i], 2*time.Second) + c, err := client.NewSerial(devices[i].dev, 2*time.Second) if err != nil { errs[i] = err return @@ -107,38 +146,33 @@ func run(buildDir string) error { err = c.PICOBOOT() c.Close() if err != nil { - errs[i] = fmt.Errorf("PICOBOOT %s: %w", serials[i], err) + errs[i] = fmt.Errorf("PICOBOOT %s: %w", devices[i].serial, err) return } log.Info("PICOBOOT sent") }) } wg.Wait() - for _, err := range errs { + for i, err := range errs { if err != nil { - return err + return fmt.Errorf("[%s] %w", devices[i].serial, err) } } - uf2s := []string{ - filepath.Join(buildDir, "picomap.uf2"), - filepath.Join(buildDir, "picomap_test.uf2"), - } - - for i := range 2 { - log := slog.With("serial", serials[i]) + for i := range devices { + log := slog.With("serial", devices[i].serial) wg.Go(func() { - log.Info("loading", "uf2", uf2Names[i]) - errs[i] = picotool.Load(uf2s[i], serials[i], 10*time.Second) + log.Info("loading", "uf2", devices[i].name) + errs[i] = picotool.Load(devices[i].uf2, devices[i].serial, 10*time.Second) if errs[i] == nil { - log.Info("loaded", "uf2", uf2Names[i]) + log.Info("loaded", "uf2", devices[i].name) } }) } wg.Wait() for i, err := range errs { if err != nil { - return fmt.Errorf("[%s] load: %w", serials[i], err) + return fmt.Errorf("[%s] load: %w", devices[i].serial, err) } } diff --git a/firmware/lib/net.cpp b/firmware/lib/net.cpp index 1281618..7e365eb 100644 --- a/firmware/lib/net.cpp +++ b/firmware/lib/net.cpp @@ -172,6 +172,7 @@ const net_state& net_get_state() { } void net_poll() { + if (w6300::get_socket_recv_buf(raw_socket) == 0) return; static uint8_t rx_buf[1518]; w6300::ip_address dummy_addr = {}; w6300::port_num dummy_port{0};