Primer script en #LUA utilizando #lualibhid para el proyecto #PIDEME

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:

  1. ————————————————————————
  2. — L I B R A R Y ——————————————————-
  3. require(“lualibhid”)
  4. ————————————————————————
  5. — C O N S T A N T S —————————————————
  6. dofile(“hidconstant.lua”)
  7. ————————————————————————
  8. — V A R I A B L E S —————————————————
  9. local vid = HID_ID_MATCH_ANY –ok
  10. local pid = HID_ID_MATCH_ANY –ok
  11. ————————————————————————
  12. — M A I N C O D E —————————————————-
  13. libhid.set_debug(HID_DEBUG.ALL) –ok
  14. –libhid.set_debug_stream() –ok
  15. libhid.set_usb_debug(0) –ok
  16. libhid.data_init()
  17. libhid.init() –ok
  18. local hid = libhid.new_HIDInterface() –working
  19. local matcher = libhid.matcher_load(vid, pid)
  20. — Open recursively all HID devices found
  21. while ((libhid.force_open(hid, 0, 2, matcher))~=HID_RET.DEVICE_NOT_FOUND) do
  22.     libhid.write_identification(hid)
  23.     libhid.close(hid)
  24. end
  25. libhid.matcher_unload(matcher)
  26. libhid.delete_HIDInterface(hid)
  27. libhid.cleanup()

El archivo hidconstant.lua, contiene una lista de constantes útiles para el manejo de la librería:

  1. HID_RET = {
  2.     SUCCESS = 0,
  3.     INVALID_PARAMETER = 1,
  4.     NOT_INITIALISED = 2,
  5.     ALREADY_INITIALISED = 3,
  6.     FAIL_FIND_BUSSES = 4,
  7.     FAIL_FIND_DEVICES = 5,
  8.     FAIL_OPEN_DEVICE = 6,
  9.     DEVICE_NOT_FOUND = 7,
  10.     DEVICE_NOT_OPENED = 8,
  11.     DEVICE_ALREADY_OPENED = 9,
  12.     FAIL_CLOSE_DEVICE = 10,
  13.     FAIL_CLAIM_IFACE = 11,
  14.     FAIL_DETACH_DRIVER = 12,
  15.     NOT_HID_DEVICE = 13,
  16.     HID_DESC_SHORT = 14,
  17.     REPORT_DESC_SHORT = 15,
  18.     REPORT_DESC_LONG = 16,
  19.     FAIL_ALLOC = 17,
  20.     OUT_OF_SPACE = 18,
  21.     FAIL_SET_REPORT = 19,
  22.     FAIL_GET_REPORT = 20,
  23.     FAIL_INT_READ = 21,
  24.     NOT_FOUND = 22,
  25.     TIMEOUT = 23
  26. }
  27. HID_DEBUG = {
  28.     NONE = 0x0, — Default
  29.     ERRORS = 0x1, — Serious conditions
  30.     WARNINGS = 0x2, — Less serious conditions
  31.     NOTICES = 0x4, — Informational messages
  32.     TRACES = 0x8, — Verbose tracing of functions
  33.     ASSERTS = 0x10, — Assertions for sanity checking
  34.     — This is what you probably want to start with while developing
  35.     — with libhid_
  36.     NOTRACES = 0x0 + 0x1 + 0x2 + 0x4 + 0x10,
  37.     ALL = 0x0 + 0x1 + 0x2 + 0x4 + 0x8 + 0x10
  38. }
  39. HID_ID_MATCH_ANY = 0x0000

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!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s