diff --git a/sync/sync.go b/sync/sync.go index 86f4d94..d94c3cc 100644 --- a/sync/sync.go +++ b/sync/sync.go @@ -31,11 +31,66 @@ package sync import ( + "fmt" + "regexp" + "strings" + "os" + "path/filepath" "github.com/arduino/go-properties-orderedmap" discovery "github.com/arduino/pluggable-discovery-protocol-handler/v2" "go.bug.st/serial/enumerator" ) +var loaded = false +var filter = "" + +func load() string { + if loaded { + return filter + } + + loaded = true + thepath, err := filepath.Abs(filepath.Dir(os.Args[0])) + + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %s\n", err.Error()) + return filter + } + + data, err := os.ReadFile(filepath.Join(thepath, "skip.txt")) + + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %s\n", err.Error()) + return filter + } + + filter = strings.Trim(string(data), " \t\r\n") + + return filter +} + +func filterValid(ports []*enumerator.PortDetails) (ret []*enumerator.PortDetails) { + filter := load() + + if len(filter) <= 0 { + ret = ports + return + } + + for _, port := range ports { + if isValid(port, filter) { + ret = append(ret, port) + } + } + return +} + +func isValid(port *enumerator.PortDetails, filter string) bool { + match, _ := regexp.MatchString(filter, port.Name) + + return !match; +} + // nolint // processUpdates sends 'add' and 'remove' events by comparing two ports enumeration // made at different times: diff --git a/sync/sync_darwin.go b/sync/sync_darwin.go index c39ac52..abae634 100644 --- a/sync/sync_darwin.go +++ b/sync/sync_darwin.go @@ -64,6 +64,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch errorCB(err.Error()) return } + + current = filterValid(current) + for _, port := range current { eventCB("add", toDiscoveryPort(port)) } @@ -98,6 +101,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch enumeratorErr = err break } + + updates = filterValid(updates) + processUpdates(current, updates, eventCB) current = updates } diff --git a/sync/sync_linux.go b/sync/sync_linux.go index 9018318..57b0a9c 100644 --- a/sync/sync_linux.go +++ b/sync/sync_linux.go @@ -36,6 +36,8 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch return nil, err } + current = filterValid(current) + // Start sync reader from udev syncReader, err := uevent.NewReader() if err != nil { @@ -78,6 +80,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch if err != nil { continue } + + portList = filterValid(portList) + for _, port := range portList { if port.IsUSB && port.Name == changedPort { eventCB("add", toDiscoveryPort(port)) diff --git a/sync/sync_windows.go b/sync/sync_windows.go index 9dd3bee..a399f6a 100644 --- a/sync/sync_windows.go +++ b/sync/sync_windows.go @@ -120,6 +120,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch errorCB(fmt.Sprintf("Error enumerating serial ports: %s", err)) return } + + current = filterValid(current) + for _, port := range current { eventCB("add", toDiscoveryPort(port)) } @@ -140,6 +143,9 @@ func Start(eventCB discovery.EventCallback, errorCB discovery.ErrorCallback) (ch errorCB(fmt.Sprintf("Error enumerating serial ports: %s", err)) return } + + updates = filterValid(updates) + processUpdates(current, updates, eventCB) current = updates }