package main import ( "encoding/hex" "log/slog" "net" "os" "sync" "time" "github.com/theater/picomap/lib/client" ) type deviceResult struct { dev string info *client.ResponseInfo err error } func main() { if err := run(); err != nil { slog.Error("fatal", "err", err) os.Exit(1) } } func run() error { devs, err := client.ListSerial() if err != nil { return err } if len(devs) == 0 { slog.Error("no devices found") os.Exit(1) } results := make([]deviceResult, len(devs)) var wg sync.WaitGroup for i, dev := range devs { results[i].dev = dev log := slog.With("dev", dev) wg.Go(func() { log.Info("connecting") c, err := client.NewSerial(dev, 2*time.Second) if err != nil { results[i].err = err return } log.Info("requesting info") info, err := c.Info() c.Close() if err != nil { results[i].err = err return } log.Info("got info", "firmware", info.FirmwareName) results[i].info = info }) } wg.Wait() for _, r := range results { if r.err != nil { slog.Error("device error", "dev", r.dev, "err", r.err) continue } slog.Info("device", "dev", r.dev, "board_id", hex.EncodeToString(r.info.BoardID[:]), "mac", net.HardwareAddr(r.info.MAC[:]).String(), "ip", net.IP(r.info.IP[:]).String(), "firmware", r.info.FirmwareName) } return nil }