Posted to tcl by schelte at Mon Oct 31 08:10:04 GMT 2022view raw
- package require cffi
- namespace eval hid {
- namespace ensemble create -subcommands {open enumerate}
- cffi::Wrapper create hidapi /usr/lib64/libhidapi-hidraw.so
- cffi::Struct create hid_device_info {
- path string
- vid ushort
- pid ushort
- serial pointer.wchar_t
- release ushort
- mfr pointer.wchar_t
- product pointer.wchar_t
- page ushort
- usage ushort
- intf int
- next pointer.hid_device_info
- }
- hidapi functions {
- hid_init int {}
- hid_open_path pointer.hid_device {
- path string
- }
- hid_enumerate pointer.hid_device_info {
- vid ushort
- pid ushort
- }
- hid_free_enumeration void {
- devs {pointer.hid_device_info dispose}
- }
- }
- hid_init
- proc open {path} {
- return [hid_open_path $path]
- }
- proc enumerate {vid pid} {
- set devs [hid_enumerate $vid $pid]
- try {
- set rc {}
- set devptr $devs
- set size [dict get [hid_device_info info] Size]
- while {![cffi::pointer isnull $devptr]} {
- set data [cffi::memory tobinary $devptr $size]]
- set struct [hid_device_info frombinary $data]
- set devptr [dict get $struct next]
- lappend rc [dict remove $struct next]
- }
- return $rc
- } finally {
- # Commenting out this makes the error go away
- hid_free_enumeration $devs
- }
- }
- }
- set list [hid enumerate 0x1209 0x5432]
- set path [dict get [lindex $list 0] path]
- hid open $path
- Value has the wrong type. Pointer tag does not match registered tag.
- while executing
- "hid_open_path $path"
- (procedure "open" line 2)
- invoked from within
- "hid open $path"
- (file "hidapi-bug.tcl" line 64)