From 8aa536fc44e114ba5b3def815a4316a426f0c84e Mon Sep 17 00:00:00 2001 From: abakum Date: Wed, 5 Feb 2025 23:13:54 +0300 Subject: [PATCH] Windows: nativeGetPortsList, com0com, nativeGetDetailedPortsList --- enumerator/usb_windows.go | 30 ++++++++++++++++++++++++------ go.mod | 1 + go.sum | 2 ++ serial_windows.go | 5 +++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/enumerator/usb_windows.go b/enumerator/usb_windows.go index 2d3793b..5c3027b 100644 --- a/enumerator/usb_windows.go +++ b/enumerator/usb_windows.go @@ -12,6 +12,7 @@ import ( "syscall" "unsafe" + "github.com/abakum/go-serial" "golang.org/x/sys/windows" ) @@ -271,9 +272,15 @@ func nativeGetDetailedPortsList() ([]*PortDetails, error) { if err != nil { return nil, &PortEnumerationError{causedBy: err} } + ports, err := serial.GetPortsList() + if err != nil || len(ports) == 0 { + return nil, &PortEnumerationError{causedBy: err} + } var res []*PortDetails - for _, g := range guids { + // com0com {df799e12-3c56-421b-b298-b6d3642bc878} + com0com := guid{0xdf799e12, 0x3c56, 0x421b, [8]byte{0xb2, 0x98, 0xb6, 0xd3, 0x64, 0x2b, 0xc8, 0x78}} + for _, g := range append(guids, com0com) { devsSet, err := g.getDevicesSet() if err != nil { return nil, &PortEnumerationError{causedBy: err} @@ -290,10 +297,10 @@ func nativeGetDetailedPortsList() ([]*PortDetails, error) { if err != nil { continue } - if len(portName) < 3 || portName[0:3] != "COM" { - // Accept only COM ports - continue - } + // if len(portName) < 3 || portName[0:3] != "COM" { + // // Accept only COM ports + // continue + // } details.Name = portName if err := retrievePortDetailsFromDevInfo(device, details); err != nil { @@ -302,7 +309,18 @@ func nativeGetDetailedPortsList() ([]*PortDetails, error) { res = append(res, details) } } - return res, nil + ordRes := []*PortDetails{} + for _, port := range ports { + inner: + for _, detailedPort := range res { + if port == detailedPort.Name { + ordRes = append(ordRes, detailedPort) + break inner + } + } + } + + return ordRes, nil } func retrievePortNameFromDevInfo(device *deviceInfo) (string, error) { diff --git a/go.mod b/go.mod index 51233c0..a65765c 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fvbommel/sortorder v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 9504059..f6d126b 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,8 @@ github.com/creack/goselect v0.1.2/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglD github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= +github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/serial_windows.go b/serial_windows.go index b1e67e1..6481994 100644 --- a/serial_windows.go +++ b/serial_windows.go @@ -19,10 +19,12 @@ package serial import ( "errors" + "sort" "sync" "syscall" "time" + "github.com/fvbommel/sortorder" "golang.org/x/sys/windows" "golang.org/x/sys/windows/registry" ) @@ -55,6 +57,9 @@ func nativeGetPortsList() (list []string, err error) { } list = append(list, item) } + if len(list) > 1 { + sort.Sort(sortorder.Natural(list)) + } return list, nil }