From 65773bb3ba5f2a513e4c4f46de0e223050249b18 Mon Sep 17 00:00:00 2001 From: Daniel Jobson Date: Fri, 26 Sep 2025 14:36:23 +0200 Subject: [PATCH 1/2] hidread: add enumeration of devices --- cmd/hidread/main.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cmd/hidread/main.go b/cmd/hidread/main.go index 42d065d..c1bbfd0 100644 --- a/cmd/hidread/main.go +++ b/cmd/hidread/main.go @@ -38,6 +38,7 @@ func main() { path := flag.String("f", "", "File path to device") size := flag.Int("s", 64, "Size of Input Reports to read") versionOnly := flag.Bool("v", false, "Output version information.") + enumerate := flag.Bool("e", false, "Enumerate devices.") flag.Parse() @@ -55,6 +56,19 @@ func main() { os.Exit(0) } + if *enumerate { + hid.Enumerate(hid.VendorIDAny, hid.ProductIDAny, func(info *hid.DeviceInfo) error { + fmt.Printf("%s: ID %04x:%04x %s %s\n", + info.Path, + info.VendorID, + info.ProductID, + info.MfrStr, + info.ProductStr) + return nil + }) + os.Exit(0) + } + dev, err := hid.OpenPath(*path) if err != nil { fmt.Printf("%v\n", err) From f2cb5ca4d951a8e6e849c09593a9cc9dbce81eda Mon Sep 17 00:00:00 2001 From: Daniel Jobson Date: Fri, 26 Sep 2025 14:37:09 +0200 Subject: [PATCH 2/2] hidread: Scan for and open a specified VID and PID. Optionally retry the scan every second, and connect as soon as it is found. --- cmd/hidread/main.go | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/cmd/hidread/main.go b/cmd/hidread/main.go index c1bbfd0..ebad554 100644 --- a/cmd/hidread/main.go +++ b/cmd/hidread/main.go @@ -10,6 +10,7 @@ import ( "os" "runtime/debug" "strings" + "time" "github.com/sstallion/go-hid" ) @@ -39,6 +40,9 @@ func main() { size := flag.Int("s", 64, "Size of Input Reports to read") versionOnly := flag.Bool("v", false, "Output version information.") enumerate := flag.Bool("e", false, "Enumerate devices.") + vid := flag.Uint("vid", 0, "VID for device to open.") + pid := flag.Uint("pid", 0, "PID for device to open.") + continue_search := flag.Bool("c", false, "Continue scanning for device with specified VID and PID, open when it appears.") flag.Parse() @@ -51,7 +55,7 @@ func main() { os.Exit(0) } - if *help || *path == "" { + if *help { flag.Usage() os.Exit(0) } @@ -69,6 +73,36 @@ func main() { os.Exit(0) } + var hid_dev hid.DeviceInfo + if *vid != 0 && *pid != 0 { + for { + hid.Enumerate(uint16(*vid), uint16(*pid), func(info *hid.DeviceInfo) error { + fmt.Printf("%s: ID %04x:%04x %s %s\n", + info.Path, + info.VendorID, + info.ProductID, + info.MfrStr, + info.ProductStr) + hid_dev = *info + + return nil + }) + + *path = hid_dev.Path + + if *path != "" || !*continue_search { + break + } + time.Sleep(1 * time.Second) + fmt.Printf("Searching..\n") + } + } + + if *path == "" { + fmt.Printf("Path empty\n") + os.Exit(0) + } + dev, err := hid.OpenPath(*path) if err != nil { fmt.Printf("%v\n", err)