From 4e590d42bea6f2c79ee72b2557f201b19e009fe8 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sat, 6 Sep 2025 22:25:00 +0800 Subject: [PATCH] feat: auto guess port for monitoring --- cmd/internal/build/build.go | 2 ++ cmd/internal/clean/clean.go | 1 + cmd/internal/flags/flags.go | 5 ++++- cmd/internal/install/install.go | 1 + cmd/internal/monitor/monitor.go | 20 ++++++++++++++------ cmd/internal/run/run.go | 2 ++ cmd/internal/test/test.go | 1 + internal/build/build.go | 8 ++++++-- internal/crosscompile/crosscompile.go | 6 +++--- internal/crosscompile/crosscompile_test.go | 2 +- internal/monitor/monitor.go | 13 +++++++------ 11 files changed, 42 insertions(+), 19 deletions(-) diff --git a/cmd/internal/build/build.go b/cmd/internal/build/build.go index af53ab62..41c65f11 100644 --- a/cmd/internal/build/build.go +++ b/cmd/internal/build/build.go @@ -36,6 +36,8 @@ var Cmd = &base.Command{ func init() { Cmd.Run = runCmd base.PassBuildFlags(Cmd) + + flags.AddCommonFlags(&Cmd.Flag) flags.AddBuildFlags(&Cmd.Flag) flags.AddOutputFlags(&Cmd.Flag) } diff --git a/cmd/internal/clean/clean.go b/cmd/internal/clean/clean.go index 907ec849..096ca421 100644 --- a/cmd/internal/clean/clean.go +++ b/cmd/internal/clean/clean.go @@ -31,6 +31,7 @@ var Cmd = &base.Command{ func init() { Cmd.Run = runCmd + flags.AddCommonFlags(&Cmd.Flag) flags.AddBuildFlags(&Cmd.Flag) } diff --git a/cmd/internal/flags/flags.go b/cmd/internal/flags/flags.go index d2a7aadf..2a2f80d8 100644 --- a/cmd/internal/flags/flags.go +++ b/cmd/internal/flags/flags.go @@ -27,8 +27,11 @@ var CheckLinkArgs bool var CheckLLFiles bool var GenLLFiles bool +func AddCommonFlags(fs *flag.FlagSet) { + fs.BoolVar(&Verbose, "v", false, "Verbose output") +} + func AddBuildFlags(fs *flag.FlagSet) { - fs.BoolVar(&Verbose, "v", false, "Verbose mode") fs.StringVar(&Tags, "tags", "", "Build tags") fs.StringVar(&BuildEnv, "buildenv", "", "Build environment") if buildenv.Dev { diff --git a/cmd/internal/install/install.go b/cmd/internal/install/install.go index d986853c..037c4c68 100644 --- a/cmd/internal/install/install.go +++ b/cmd/internal/install/install.go @@ -35,6 +35,7 @@ var Cmd = &base.Command{ func init() { Cmd.Run = runCmd + flags.AddCommonFlags(&Cmd.Flag) flags.AddBuildFlags(&Cmd.Flag) flags.AddEmbeddedFlags(&Cmd.Flag) } diff --git a/cmd/internal/monitor/monitor.go b/cmd/internal/monitor/monitor.go index 9392d024..af7bab30 100644 --- a/cmd/internal/monitor/monitor.go +++ b/cmd/internal/monitor/monitor.go @@ -22,6 +22,7 @@ import ( "github.com/goplus/llgo/cmd/internal/base" "github.com/goplus/llgo/cmd/internal/flags" + "github.com/goplus/llgo/internal/crosscompile" "github.com/goplus/llgo/internal/monitor" ) @@ -32,6 +33,7 @@ var Cmd = &base.Command{ } func init() { + flags.AddCommonFlags(&Cmd.Flag) flags.AddEmbeddedFlags(&Cmd.Flag) Cmd.Run = runMonitor } @@ -45,24 +47,30 @@ func runMonitor(cmd *base.Command, args []string) { os.Exit(1) } - if flags.Port == "" && flags.Target == "" { - fmt.Fprintf(os.Stderr, "llgo monitor: must specify either -port or -target\n") - return - } - var executable string if len(args) == 1 { executable = args[0] } + var serialPort []string + if flags.Target != "" { + conf, err := crosscompile.UseTarget(flags.Target) + if err != nil { + fmt.Fprintf(os.Stderr, "llgo monitor: %v\n", err) + os.Exit(1) + } + serialPort = conf.Flash.SerialPort + } + config := monitor.MonitorConfig{ Port: flags.Port, Target: flags.Target, BaudRate: flags.BaudRate, Executable: executable, + SerialPort: serialPort, } - if err := monitor.Monitor(config, true); err != nil { + if err := monitor.Monitor(config, flags.Verbose); err != nil { fmt.Fprintf(os.Stderr, "llgo monitor: %v\n", err) os.Exit(1) } diff --git a/cmd/internal/run/run.go b/cmd/internal/run/run.go index b1614715..68b8ce83 100644 --- a/cmd/internal/run/run.go +++ b/cmd/internal/run/run.go @@ -48,11 +48,13 @@ func init() { Cmd.Run = runCmd CmpTestCmd.Run = runCmpTest base.PassBuildFlags(Cmd) + flags.AddCommonFlags(&Cmd.Flag) flags.AddBuildFlags(&Cmd.Flag) flags.AddEmulatorFlags(&Cmd.Flag) flags.AddEmbeddedFlags(&Cmd.Flag) // for -target support base.PassBuildFlags(CmpTestCmd) + flags.AddCommonFlags(&CmpTestCmd.Flag) flags.AddBuildFlags(&CmpTestCmd.Flag) flags.AddEmulatorFlags(&CmpTestCmd.Flag) flags.AddEmbeddedFlags(&CmpTestCmd.Flag) // for -target support diff --git a/cmd/internal/test/test.go b/cmd/internal/test/test.go index 5a259922..0a8a5a05 100644 --- a/cmd/internal/test/test.go +++ b/cmd/internal/test/test.go @@ -17,6 +17,7 @@ var Cmd = &base.Command{ func init() { Cmd.Run = runCmd + flags.AddCommonFlags(&Cmd.Flag) flags.AddBuildFlags(&Cmd.Flag) flags.AddEmulatorFlags(&Cmd.Flag) flags.AddEmbeddedFlags(&Cmd.Flag) diff --git a/internal/build/build.go b/internal/build/build.go index aad02f41..68242e55 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -360,12 +360,16 @@ func Do(args []string, conf *Config) ([]Package, error) { if err != nil { return nil, err } - err = monitor.Monitor(monitor.MonitorConfig{ + monitorConfig := monitor.MonitorConfig{ Port: ctx.buildConf.Port, Target: conf.Target, Executable: finalApp, BaudRate: conf.BaudRate, - }, verbose) + } + if ctx.crossCompile.Flash.Method != "openocd" { + monitorConfig.SerialPort = ctx.crossCompile.Flash.SerialPort + } + err = monitor.Monitor(monitorConfig, verbose) } if err != nil { return nil, err diff --git a/internal/crosscompile/crosscompile.go b/internal/crosscompile/crosscompile.go index ebbb3e3c..9da1cf98 100644 --- a/internal/crosscompile/crosscompile.go +++ b/internal/crosscompile/crosscompile.go @@ -491,8 +491,8 @@ func use(goos, goarch string, wasiThreads bool) (export Export, err error) { return } -// useTarget loads configuration from a target name (e.g., "rp2040", "wasi") -func useTarget(targetName string) (export Export, err error) { +// UseTarget loads configuration from a target name (e.g., "rp2040", "wasi") +func UseTarget(targetName string) (export Export, err error) { resolver := targets.NewDefaultResolver() config, err := resolver.Resolve(targetName) @@ -716,7 +716,7 @@ func useTarget(targetName string) (export Export, err error) { // If targetName is provided, it takes precedence over goos/goarch func Use(goos, goarch string, wasiThreads bool, targetName string) (export Export, err error) { if targetName != "" && !strings.HasPrefix(targetName, "wasm") && !strings.HasPrefix(targetName, "wasi") { - return useTarget(targetName) + return UseTarget(targetName) } return use(goos, goarch, wasiThreads) } diff --git a/internal/crosscompile/crosscompile_test.go b/internal/crosscompile/crosscompile_test.go index 8ea3f146..42152a58 100644 --- a/internal/crosscompile/crosscompile_test.go +++ b/internal/crosscompile/crosscompile_test.go @@ -214,7 +214,7 @@ func TestUseTarget(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - export, err := useTarget(tc.targetName) + export, err := UseTarget(tc.targetName) if tc.expectError { if err == nil { diff --git a/internal/monitor/monitor.go b/internal/monitor/monitor.go index 2596cd8b..4b205b54 100644 --- a/internal/monitor/monitor.go +++ b/internal/monitor/monitor.go @@ -22,11 +22,12 @@ import ( // MonitorConfig contains configuration for the monitor type MonitorConfig struct { - Port string // Serial port device - Target string // Target name for crosscompile config - BaudRate int // Baudrate of serial monitor - Executable string // Optional path to executable for debug info - WaitTime int // Wait time for port connection (ms) + Port string // Serial port device + Target string // Target name for crosscompile config + BaudRate int // Baudrate of serial monitor + Executable string // Optional path to executable for debug info + WaitTime int // Wait time for port connection (ms) + SerialPort []string // List of serial ports to use } // Monitor starts serial monitoring with the given configuration @@ -40,7 +41,7 @@ func Monitor(config MonitorConfig, verbose bool) error { } // Resolve port using flash.GetPort - port, err := flash.GetPort(config.Port, nil) + port, err := flash.GetPort(config.Port, config.SerialPort) if err != nil { return fmt.Errorf("failed to find port: %w", err) }