Primer script en #LUA utilizando #lualibhid para el proyecto #PIDEME
Posted by nelsonlombardo on April 22, 2012
Hace algún tiempo estoy trabajando en un sistema simple que utiliza LUA para hacer los scripts que permiten construir prototipos rápidos de drivers utilizando diferentes protocolos y puertos de comunicación con sensores, equipos de medición, etc. El logo que hice para el proyecto:

En cierto punto parte del proyecto es utilizar un conjunto de librerías para manipulación de puertos y protocolos con LUA. Uno de los grandes faltantes era para realizar la comunicación de la clase USB HID. Lo bueno es que existe una librería llamada libhid, están permiten la comuncación por USB HID de forma cross-platform. Ellas utilizan las famosas librerías libusb, muy utilizadas y cross-platform.
Básicamente el paso fundamental fue desarrollar la librería que permitiera acceso nativo a las libhid. Aunque hubieron complicaciones y aún están en una fase de prueba, logré escribir un pequeño script en LUA que simula el ejemplo lshid que trae las libhid. Básicamente el lshid funciona cómo el conocido lspci o lsusb. Son utilidades que otorgan información sobre los dispositivos con los que trabajan, en el caso de este script lshid.lua, enumera e informa sobre los dipositivos USB HID que encuentra:
Se puede observar que otorga información del único dispositivo USB HID conectado en cada caso. Bueno ha sido una dulce victoria por ahora, pero aún falta pulir detalles en general.
El script lshid.lua propiamente dicho es el siguiente:
-
————————————————————————
-
– L I B R A R Y ——————————————————-
-
require(“lualibhid”)
-
————————————————————————
-
– C O N S T A N T S —————————————————
-
dofile(“hidconstant.lua”)
-
————————————————————————
-
– V A R I A B L E S —————————————————
-
local vid = HID_ID_MATCH_ANY –ok
-
local pid = HID_ID_MATCH_ANY –ok
-
————————————————————————
-
– M A I N C O D E —————————————————-
-
libhid.set_debug(HID_DEBUG.ALL) –ok
-
–libhid.set_debug_stream() –ok
-
libhid.set_usb_debug(0) –ok
-
libhid.data_init()
-
libhid.init() –ok
-
local hid = libhid.new_HIDInterface() –working
-
local matcher = libhid.matcher_load(vid, pid)
-
– Open recursively all HID devices found
-
while ((libhid.force_open(hid, 0, 2, matcher))~=HID_RET.DEVICE_NOT_FOUND) do
-
libhid.write_identification(hid)
-
libhid.close(hid)
-
end
-
libhid.matcher_unload(matcher)
-
libhid.delete_HIDInterface(hid)
-
libhid.cleanup()
El archivo hidconstant.lua, contiene una lista de constantes útiles para el manejo de la librería:
-
HID_RET = {
-
SUCCESS = 0,
-
INVALID_PARAMETER = 1,
-
NOT_INITIALISED = 2,
-
ALREADY_INITIALISED = 3,
-
FAIL_FIND_BUSSES = 4,
-
FAIL_FIND_DEVICES = 5,
-
FAIL_OPEN_DEVICE = 6,
-
DEVICE_NOT_FOUND = 7,
-
DEVICE_NOT_OPENED = 8,
-
DEVICE_ALREADY_OPENED = 9,
-
FAIL_CLOSE_DEVICE = 10,
-
FAIL_CLAIM_IFACE = 11,
-
FAIL_DETACH_DRIVER = 12,
-
NOT_HID_DEVICE = 13,
-
HID_DESC_SHORT = 14,
-
REPORT_DESC_SHORT = 15,
-
REPORT_DESC_LONG = 16,
-
FAIL_ALLOC = 17,
-
OUT_OF_SPACE = 18,
-
FAIL_SET_REPORT = 19,
-
FAIL_GET_REPORT = 20,
-
FAIL_INT_READ = 21,
-
NOT_FOUND = 22,
-
TIMEOUT = 23
-
}
-
HID_DEBUG = {
-
NONE = 0×0, – Default
-
ERRORS = 0×1, – Serious conditions
-
WARNINGS = 0×2, – Less serious conditions
-
NOTICES = 0×4, – Informational messages
-
TRACES = 0×8, – Verbose tracing of functions
-
ASSERTS = 0×10, – Assertions for sanity checking
-
— This is what you probably want to start with while developing
-
— with libhid_
-
NOTRACES = 0×0 + 0×1 + 0×2 + 0×4 + 0×10,
-
ALL = 0×0 + 0×1 + 0×2 + 0×4 + 0×8 + 0×10
-
}
-
HID_ID_MATCH_ANY = 0×0000
Pueden notar lo sencillo del script y de lo poderoso del mismo. Cuando tenga una versión un poco más pulida estaré subiendo más detalles.
Happy Hacking!



