HidApi
This is a high level, cross platform wrapper of the hidapi
library https://github.com/libusb/hidapi for
Julia. It comes with batteries included and can be used to communicate with HID devices on Linux, Mac and Windows.
Under the hood
The compiled hidapi
library is provided by Julias binary build provisioning system in the
project hidapi_jll.
The low-level C-interface to hidapi.h
has been created by wrapping the library using Clang.jl.
Finally a couple of functions have been added, forming the high-level API.
Prerequisits
None. Although on Linux you might need to create a udev rule if the device can't be enumerated.
Installation
Pkg.add("HidApi.jl")
using HidApi
Usage (high level API)
A high level API allows to enumerate or find devices and offers a simple way to read and write hid messages. Devices have to be opened before reading or writing.
# initalize
init()
# enumerate
dump.(enumerate_devices())
# open and read data
dev = open(find_device(0x04ec, 0x2605))
data = read(dev)
# do something with data
...
# close
close(dev)
# exit
shutdown()
Usage (low level API)
All low level hidapi.h
functions are available but not exported. They typically are prefixed
with hid_xxx
.
# initialize
val = HidApi.hid_init()
if val < 0
error("init failed")
end
# enumerate
devs = HidApi.hid_enumerate(0x0, 0x0)
cur_dev = devs
while cur_dev != C_NULL
hid_device_info = unsafe_load(cur_dev)
dump(hid_device_info)
global cur_dev = hid_device_info.next
end
# free up devices list
HidApi.hid_free_enumeration(devs)
# open the device
handle = HidApi.hid_open(0x04ec, 0x2605, C_NULL)
if handle == C_NULL
error("open failed")
end
# create a vector, pass it to hid_read
data = Vector{Cuchar}(undef, 64)
val = HidApi.hid_read_timeout(handle, data, 64, 2000)
if val == -1
error("error while reading")
end
# do something with data
...
# close the device
HidApi.hid_close(handle)
# exit at the end
HidApi.hid_exit()
Mixing low-level and high-level
In case you need to do something thats not possible with the high level interface you
can mix in the low-level calls by using the handle
from a HidDevice
.