Lua USB HID
Note: Due to the wide variety of USB devices available, this functionality should be considered use at your own risk. QSC cannot guarantee compatibility with all USB HID peripherals.
Q-SYS provides two built-in Lua libraries for receiving input events from USB HID (Human Interface Device) peripherals connected to the USB-A ports on a Q-SYS Core processor:
-
UsbMonitor — Detects when USB HID devices are plugged in or removed.
-
Usb — Receives input events (key presses, axis movements, button clicks, etc.) from individual USB devices.
The UsbMonitor library monitors USB HID device connections and disconnections on the Core.
This will instantiate a new instance.
monitor = UsbMonitor.New("input")
This function is called when a USB Peripheral is added or removed from the core.
.EventHandler = function(device)
{
"devnode": "/dev/input/event2",
"devtype": "",
"sysname": "event2",
"syspath": "/sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input2/event2",
"subsystem": "input",
"properties": {
"ID_PATH_TAG": "acpi-LNXPWRBN_00",
"DEVPATH": "/devices/LNXSYSTM:00/LNXPWRBN:00/input/input2/event2",
"SUBSYSTEM": "input",
"USEC_INITIALIZED": "7474756",
"ID_PATH": "acpi-LNXPWRBN:00",
"MINOR": "66",
"ID_INPUT_KEY": "1",
"ID_INPUT": "1",
"DEVNAME": "/dev/input/event2",
"MAJOR": "13"
},
"tags": {},
"Added": true,
"sysnum": "",
"devpath": "/devices/LNXSYSTM:00/LNXPWRBN:00/input/input2/event2"
},
{
"devnode": "/dev/input/event3",
"devtype": "",
"sysname": "event3",
"syspath": "/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3/event3",
"subsystem": "input",
"properties": {
"ID_PATH_TAG": "acpi-LNXVIDEO_00",
"DEVPATH": "/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3/event3",
"SUBSYSTEM": "input",
"USEC_INITIALIZED": "7498631",
"ID_PATH": "acpi-LNXVIDEO:00",
"MINOR": "67",
"ID_INPUT_KEY": "1",
"ID_INPUT": "1",
"DEVNAME": "/dev/input/event3",
"MAJOR": "13"
},
"tags": {},
"Added": true,
"sysnum": "",
"devpath": "/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3/event3"
},
{
"devnode": "/dev/input/event0",
"devtype": "",
"sysname": "event0",
"syspath": "/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0/event0",
"subsystem": "input",
"properties": {
"ID_PATH_TAG": "acpi-PNP0C0C_00",
"DEVPATH": "/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0/event0",
"SUBSYSTEM": "input",
"USEC_INITIALIZED": "7530358",
"ID_PATH": "acpi-PNP0C0C:00",
"MINOR": "64",
"ID_INPUT_KEY": "1",
"ID_INPUT": "1",
"DEVNAME": "/dev/input/event0",
"MAJOR": "13"
},
"tags": {},
"Added": true,
"sysnum": "",
"devpath": "/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0/event0"
},
{
"devnode": "/dev/input/event1",
"devtype": "",
"sysname": "event1",
"syspath": "/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input1/event1",
"subsystem": "input",
"properties": {
"ID_PATH_TAG": "acpi-PNP0C0E_00",
"DEVPATH": "/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input1/event1",
"SUBSYSTEM": "input",
"USEC_INITIALIZED": "7522284",
"ID_PATH": "acpi-PNP0C0E:00",
"MINOR": "65",
"ID_INPUT_KEY": "1",
"ID_INPUT": "1",
"DEVNAME": "/dev/input/event1",
"MAJOR": "13"
},
"tags": {},
"Added": true,
"sysnum": "",
"devpath": "/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input1/event1"
},
{
"devnode": "/dev/input/event4",
"devtype": "",
"sysname": "event4",
"syspath": "/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3.2/1-1.3.2:1.0/0003:13BA:0001.0002/input/input7/event4",
"subsystem": "input",
"properties": {
"ID_PATH_TAG": "pci-0000_00_1d_0-usb-0_1_3_2_1_0",
"DEVPATH": "/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3.2/1-1.3.2:1.0/0003:13BA:0001.0002/input/input7/event4",
"ID_INPUT_KEYBOARD": "1",
"ID_MODEL_ENC": "0001",
"USEC_INITIALIZED": "983943837172",
"ID_USB_INTERFACE_NUM": "00",
"MINOR": "68",
"MAJOR": "13",
"ID_TYPE": "hid",
"ID_PATH": "pci-0000:00:1d.0-usb-0:1.3.2:1.0",
"ID_VENDOR_ID": "13ba",
"ID_VENDOR_ENC": "13ba",
"ID_MODEL": "0001",
"ID_MODEL_ID": "0001",
"ID_REVISION": "0100",
"DEVLINKS": "/dev/input/by-id/usb-13ba_0001-event-kbd /dev/input/by-path/pci-0000:00:1d.0-usb-0:1.3.2:1.0-event-kbd",
"ID_USB_INTERFACES": ":030101:",
"SUBSYSTEM": "input",
"ID_VENDOR": "13ba",
"ID_INPUT_KEY": "1",
"ID_USB_DRIVER": "usbhid",
"DEVNAME": "/dev/input/event4",
"ID_INPUT": "1",
"ID_BUS": "usb",
"ID_SERIAL": "13ba_0001"
},
"tags": {},
"Added": true,
"sysnum": "",
"devpath": "/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3.2/1-1.3.2:1.0/0003:13BA:0001.0002/input/input7/event4"
},
{
"devnode": "/dev/input/event5",
"devtype": "",
"sysname": "event5",
"syspath": "/sys/devices/virtual/input/input5/event5",
"subsystem": "input",
"properties": {
"MINOR": "69",
"DEVPATH": "/devices/virtual/input/input5/event5",
"SUBSYSTEM": "input",
"USEC_INITIALIZED": "23118530",
"ID_INPUT": "1",
"ID_INPUT_KEY": "1",
"DEVNAME": "/dev/input/event5",
"ID_INPUT_JOYSTICK": "1",
"ID_SERIAL": "noserial",
"MAJOR": "13"
},
"tags": {},
"Added": true,
"sysnum": "",
"devpath": "/devices/virtual/input/input5/event5"
},
{
"devnode": "/dev/input/event6",
"devtype": "",
"sysname": "event6",
"syspath": "/sys/devices/virtual/input/input6/event6",
"subsystem": "input",
"properties": {
"MINOR": "70",
"DEVPATH": "/devices/virtual/input/input6/event6",
"ID_INPUT_KEYBOARD": "1",
"SUBSYSTEM": "input",
"USEC_INITIALIZED": "23334484",
"DEVNAME": "/dev/input/event6",
"ID_INPUT_KEY": "1",
"ID_INPUT": "1",
"ID_SERIAL": "noserial",
"MAJOR": "13"
},
"tags": {},
"Added": true,
"sysnum": "",
"devpath": "/devices/virtual/input/input6/event6"
},
{
"sysname": "event7",
"subsystem": "input",
"devpath": "/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/0003:0079:0006.0003/input/input8/event7",
"devnode": "/dev/input/event7",
"sysnum": "",
"devtype": "",
"Added": true,
"properties": {
"ID_MODEL_ID": "0006",
"ID_USB_INTERFACE_NUM": "00",
"ID_USB_INTERFACES": ":030000:",
"ID_MODEL_ENC": "Generic\\x20\\x20\\x20USB\\x20\\x20Joystick\\x20\\x20",
"ACTION": "add",
"ID_PATH_TAG": "pci-0000_00_1d_0-usb-0_1_3_1_1_0",
"DEVLINKS": "/dev/input/by-id/usb-DragonRise_Inc._Generic_USB_Joystick-event-joystick /dev/input/by-path/pci-0000:00:1d.0-usb-0:1.3.1:1.0-event-joystick",
"ID_INPUT_JOYSTICK": "1",
"ID_MODEL": "Generic_USB_Joystick",
"ID_USB_DRIVER": "usbhid",
"ID_SERIAL": "DragonRise_Inc._Generic_USB_Joystick",
"USEC_INITIALIZED": "9887686401",
"ID_TYPE": "hid",
"SUBSYSTEM": "input",
"DEVNAME": "/dev/input/event7",
"SEQNUM": "2774",
"ID_VENDOR": "DragonRise_Inc.",
"ID_REVISION": "0107",
"MAJOR": "13",
"MINOR": "71",
"ID_PATH": "pci-0000:00:1d.0-usb-0:1.3.1:1.0",
"ID_INPUT": "1",
"ID_VENDOR_ENC": "DragonRise\\x20Inc.\\x20\\x20",
"ID_VENDOR_ID": "0079",
"DEVPATH": "/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/0003:0079:0006.0003/input/input8/event7",
"ID_BUS": "usb"
},
"syspath": "/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/0003:0079:0006.0003/input/input8/event7",
"tags": {}
}
This Lua library deals with individual USB Devices. This is like TCP sockets that are part of a TcpSocketServer.
UsbDevice = Usb.New(dev.devnode)
| Property | Type | Description |
| devnode | string | The device node path. Must begin with /dev/input/event (for HID devices) or /dev/tty (for serial-over-USB devices). |
This is a look-up table for USB Event types.
The Names are a string such as KEY and the Value will be an integer such as 1.
https://www.kernel.org/doc/Documentation/input/event-codes.txt
{
"SYN": 0, // Synchronization event
"KEY": 1, // Key or button event
"REL": 2, // Relative axis event
"ABS": 3, // Absolute axis event
"MSC": 4, // Miscellaneous event
"LED": 17, // LED event
"SND": 18, // Sound event
"REP": 20, // Used for autorepeating devices
"FF": 21, // Used to send force feedback commands to an input device
"PWR": 22, // special type for power button and switch input
"FF_STATUS": 23 // Force feedback status
}
A look-up table for Sync Event codes.
{
"REPORT": 0,
"CONFIG": 1,
"MT_REPORT": 2,
"DROPPED": 3
}
A look-up table for Relative Event codes.
{
"X": 0,
"Y": 1,
"Z": 2,
"RX": 3,
"RY": 4,
"RZ": 5,
"HWHEEL": 6,
"DIAL": 7,
"WHEEL": 8,
"MISC": 9
}
A look-up table for Absolute Event codes.
{
"X": 0,
"Y": 1,
"Z": 2,
"RX": 3,
"RY": 4,
"RZ": 5,
"THROTTLE": 6,
"RUDDER": 7,
"WHEEL": 8,
"GAS": 9,
"BRAKE": 10,
"HAT0X": 16,
"HAT0Y": 17,
"HAT1X": 18,
"HAT1Y": 19,
"HAT2X": 20,
"HAT2Y": 21,
"HAT3X": 22,
"HAT3Y": 23,
"PRESSURE": 24,
"DISTANCE": 25,
"TILT_X": 26,
"TILT_Y": 27,
"TOOL_WIDTH": 28,
"VOLUME": 32,
"MISC": 40,
"MT_SLOT": 47,
"MT_TOUCH_MAJOR": 48,
"MT_TOUCH_MINOR": 49,
"MT_WIDTH_MAJOR": 50,
"MT_WIDTH_MINOR": 51,
"MT_ORIENTATION": 52,
"MT_POSITION_X": 53,
"MT_POSITION_Y": 54,
"MT_TOOL_TYPE": 55,
"MT_BLOB_ID": 56,
"MT_TRACKING_ID": 57,
"MT_PRESSURE": 58,
"MT_DISTANCE": 59,
"MT_TOOL_X": 60,
"MT_TOOL_Y": 61
}
A lookup table for Switch Event codes.
Note: RFKILL_ALL and RADIO are the same. This is dictated by Linux input-event-codes.h:

{
"LID": 0,
"TABLET_MODE": 1,
"HEADPHONE_INSERT": 2,
"RFKILL_ALL": 3,
"RADIO": 3,
"MICROPHONE_INSERT": 4,
"DOCK": 5,
"LINEOUT_INSERT": 6,
"JACK_PHYSICAL_INSERT": 7,
"VIDEOOUT_INSERT": 8,
"CAMERA_LENS_COVER": 9,
"KEYPAD_SLIDE": 10,
"FRONT_PROXIMITY": 11,
"ROTATE_LOCK": 12,
"LINEIN_INSERT": 13
}
A lookup table for Misc Event codes.
{
"SERIAL": 0,
"PULSELED": 1,
"GESTURE": 2,
"RAW": 3,
"SCAN": 4,
"TIMESTAMP": 5
}
A lookup table for Led Event codes.
{
"NUML": 0,
"CAPSL": 1,
"SCROLLL": 2,
"COMPOSE": 3,
"KANA": 4,
"SLEEP": 5,
"SUSPEND": 6,
"MUTE": 7,
"MISC": 8,
"MAIL": 9,
"CHARGING": 10
}
A lookup table for Sound event codes. Content { "CLICK": 0, "BELL": 1, "TONE": 2 }
{
"CLICK": 0,
"BELL": 1,
"TONE": 2
}
A lookup table for key codes.
The keys are a string such as KEY_BACKSPACE and the value will be an integer such as 14.
{
"RESERVED": 0,
"ESC": 1,
"1": 2,
"2": 3,
"3": 4,
"4": 5,
"5": 6,
"6": 7,
"7": 8,
"8": 9,
"9": 10,
"0": 11,
"MINUS": 12,
"EQUAL": 13,
"BACKSPACE": 14,
"TAB": 15,
"Q": 16,
"W": 17,
"E": 18,
"R": 19,
"T": 20,
"Y": 21,
"U": 22,
"I": 23,
"O": 24,
"P": 25,
"LEFTBRACE": 26,
"RIGHTBRACE": 27,
"ENTER": 28,
"LEFTCTRL": 29,
"A": 30,
"S": 31,
"D": 32,
"F": 33,
"G": 34,
"H": 35,
"J": 36,
"K": 37,
"L": 38,
"SEMICOLON": 39,
"APOSTROPHE": 40,
"GRAVE": 41,
"LEFTSHIFT": 42,
"BACKSLASH": 43,
"Z": 44,
"X": 45,
"C": 46,
"V": 47,
"B": 48,
"N": 49,
"M": 50,
"COMMA": 51,
"DOT": 52,
"SLASH": 53,
"RIGHTSHIFT": 54,
"KPASTERISK": 55,
"LEFTALT": 56,
"SPACE": 57,
"CAPSLOCK": 58,
"F1": 59,
"F2": 60,
"F3": 61,
"F4": 62,
"F5": 63,
"F6": 64,
"F7": 65,
"F8": 66,
"F9": 67,
"F10": 68,
"NUMLOCK": 69,
"SCROLLLOCK": 70,
"KP7": 71,
"KP8": 72,
"KP9": 73,
"KPMINUS": 74,
"KP4": 75,
"KP5": 76,
"KP6": 77,
"KPPLUS": 78,
"KP1": 79,
"KP2": 80,
"KP3": 81,
"KP0": 82,
"KPDOT": 83,
"ZENKAKUHANKAKU": 85,
"102ND": 86,
"F11": 87,
"F12": 88,
"RO": 89,
"KATAKANA": 90,
"HIRAGANA": 91,
"HENKAN": 92,
"KATAKANAHIRAGANA": 93,
"MUHENKAN": 94,
"KPJPCOMMA": 95,
"KPENTER": 96,
"RIGHTCTRL": 97,
"KPSLASH": 98,
"SYSRQ": 99,
"RIGHTALT": 100,
"LINEFEED": 101,
"HOME": 102,
"UP": 103,
"PAGEUP": 104,
"LEFT": 105,
"RIGHT": 106,
"END": 107,
"DOWN": 108,
"PAGEDOWN": 109,
"INSERT": 110,
"DELETE": 111,
"MACRO": 112,
"MUTE": 113,
"VOLUMEDOWN": 114,
"VOLUMEUP": 115,
"POWER": 116,
"KPEQUAL": 117,
"KPPLUSMINUS": 118,
"PAUSE": 119,
"SCALE": 120,
"KPCOMMA": 121,
"HANGUEL": 122,
"HANGEUL": 122,
"HANJA": 123,
"YEN": 124,
"LEFTMETA": 125,
"RIGHTMETA": 126,
"COMPOSE": 127,
"STOP": 128,
"AGAIN": 129,
"PROPS": 130,
"UNDO": 131,
"FRONT": 132,
"COPY": 133,
"OPEN": 134,
"PASTE": 135,
"FIND": 136,
"CUT": 137,
"HELP": 138,
"MENU": 139,
"CALC": 140,
"SETUP": 141,
"SLEEP": 142,
"WAKEUP": 143,
"FILE": 144,
"SENDFILE": 145,
"DELETEFILE": 146,
"XFER": 147,
"PROG1": 148,
"PROG2": 149,
"WWW": 150,
"MSDOS": 151,
"SCREENLOCK": 152,
"COFFEE": 152,
"DIRECTION": 153,
"CYCLEWINDOWS": 154,
"MAIL": 155,
"BOOKMARKS": 156,
"COMPUTER": 157,
"BACK": 158,
"FORWARD": 159,
"CLOSECD": 160,
"EJECTCD": 161,
"EJECTCLOSECD": 162,
"NEXTSONG": 163,
"PLAYPAUSE": 164,
"PREVIOUSSONG": 165,
"STOPCD": 166,
"RECORD": 167,
"REWIND": 168,
"PHONE": 169,
"ISO": 170,
"CONFIG": 171,
"HOMEPAGE": 172,
"REFRESH": 173,
"EXIT": 174,
"MOVE": 175,
"EDIT": 176,
"SCROLLUP": 177,
"SCROLLDOWN": 178,
"KPLEFTPAREN": 179,
"KPRIGHTPAREN": 180,
"NEW": 181,
"REDO": 182,
"F13": 183,
"F14": 184,
"F15": 185,
"F16": 186,
"F17": 187,
"F18": 188,
"F19": 189,
"F20": 190,
"F21": 191,
"F22": 192,
"F23": 193,
"F24": 194,
"PLAYCD": 200,
"PAUSECD": 201,
"PROG3": 202,
"PROG4": 203,
"DASHBOARD": 204,
"SUSPEND": 205,
"CLOSE": 206,
"PLAY": 207,
"FASTFORWARD": 208,
"BASSBOOST": 209,
"PRINT": 210,
"HP": 211,
"CAMERA": 212,
"SOUND": 213,
"QUESTION": 214,
"EMAIL": 215,
"CHAT": 216,
"SEARCH": 217,
"CONNECT": 218,
"FINANCE": 219,
"SPORT": 220,
"SHOP": 221,
"ALTERASE": 222,
"CANCEL": 223,
"BRIGHTNESSDOWN": 224,
"BRIGHTNESSUP": 225,
"MEDIA": 226,
"SWITCHVIDEOMODE": 227,
"KBDILLUMTOGGLE": 228,
"KBDILLUMDOWN": 229,
"KBDILLUMUP": 230,
"SEND": 231,
"REPLY": 232,
"FORWARDMAIL": 233,
"SAVE": 234,
"DOCUMENTS": 235,
"BATTERY": 236,
"BLUETOOTH": 237,
"WLAN": 238,
"UWB": 239,
"UNKNOWN": 240,
"VIDEO_NEXT": 241,
"VIDEO_PREV": 242,
"BRIGHTNESS_CYCLE": 243,
"BRIGHTNESS_ZERO": 244,
"DISPLAY_OFF": 245,
"WIMAX": 246,
"RFKILL": 247,
"MICMUTE": 248,
"OK": 352,
"SELECT": 353,
"GOTO": 354,
"CLEAR": 355,
"POWER2": 356,
"OPTION": 357,
"INFO": 358,
"TIME": 359,
"VENDOR": 360,
"ARCHIVE": 361,
"PROGRAM": 362,
"CHANNEL": 363,
"FAVORITES": 364,
"EPG": 365,
"PVR": 366,
"MHP": 367,
"LANGUAGE": 368,
"TITLE": 369,
"SUBTITLE": 370,
"ANGLE": 371,
"ZOOM": 372,
"MODE": 373,
"KEYBOARD": 374,
"SCREEN": 375,
"PC": 376,
"TV": 377,
"TV2": 378,
"VCR": 379,
"VCR2": 380,
"SAT": 381,
"SAT2": 382,
"CD": 383,
"TAPE": 384,
"RADIO": 385,
"TUNER": 386,
"PLAYER": 387,
"TEXT": 388,
"DVD": 389,
"AUX": 390,
"MP3": 391,
"AUDIO": 392,
"VIDEO": 393,
"DIRECTORY": 394,
"LIST": 395,
"MEMO": 396,
"CALENDAR": 397,
"RED": 398,
"GREEN": 399,
"YELLOW": 400,
"BLUE": 401,
"CHANNELUP": 402,
"CHANNELDOWN": 403,
"FIRST": 404,
"LAST": 405,
"AB": 406,
"NEXT": 407,
"RESTART": 408,
"SLOW": 409,
"SHUFFLE": 410,
"BREAK": 411,
"PREVIOUS": 412,
"DIGITS": 413,
"TEEN": 414,
"TWEN": 415,
"VIDEOPHONE": 416,
"GAMES": 417,
"ZOOMIN": 418,
"ZOOMOUT": 419,
"ZOOMRESET": 420,
"WORDPROCESSOR": 421,
"EDITOR": 422,
"SPREADSHEET": 423,
"GRAPHICSEDITOR": 424,
"PRESENTATION": 425,
"DATABASE": 426,
"NEWS": 427,
"VOICEMAIL": 428,
"ADDRESSBOOK": 429,
"MESSENGER": 430,
"DISPLAYTOGGLE": 431,
"SPELLCHECK": 432,
"LOGOFF": 433,
"DOLLAR": 434,
"EURO": 435,
"FRAMEBACK": 436,
"FRAMEFORWARD": 437,
"CONTEXT_MENU": 438,
"MEDIA_REPEAT": 439,
"10CHANNELSUP": 440,
"10CHANNELSDOWN": 441,
"IMAGES": 442,
"DEL_EOL": 448,
"DEL_EOS": 449,
"INS_LINE": 450,
"DEL_LINE": 451,
"FN": 464,
"FN_ESC": 465,
"FN_F1": 466,
"FN_F2": 467,
"FN_F3": 468,
"FN_F4": 469,
"FN_F5": 470,
"FN_F6": 471,
"FN_F7": 472,
"FN_F8": 473,
"FN_F9": 474,
"FN_F10": 475,
"FN_F11": 476,
"FN_F12": 477,
"FN_1": 478,
"FN_2": 479,
"FN_D": 480,
"FN_E": 481,
"FN_F": 482,
"FN_S": 483,
"FN_B": 484,
"BRL_DOT1": 497,
"BRL_DOT2": 498,
"BRL_DOT3": 499,
"BRL_DOT4": 500,
"BRL_DOT5": 501,
"BRL_DOT6": 502,
"BRL_DOT7": 503,
"BRL_DOT8": 504,
"BRL_DOT9": 505,
"BRL_DOT10": 506,
"NUMERIC_0": 512,
"NUMERIC_1": 513,
"NUMERIC_2": 514,
"NUMERIC_3": 515,
"NUMERIC_4": 516,
"NUMERIC_5": 517,
"NUMERIC_6": 518,
"NUMERIC_7": 519,
"NUMERIC_8": 520,
"NUMERIC_9": 521,
"NUMERIC_STAR": 522,
"NUMERIC_POUND": 523,
"CAMERA_FOCUS": 528,
"WPS_BUTTON": 529,
"TOUCHPAD_TOGGLE": 530,
"TOUCHPAD_ON": 531,
"TOUCHPAD_OFF": 532,
"CAMERA_ZOOMIN": 533,
"CAMERA_ZOOMOUT": 534,
"CAMERA_UP": 535,
"CAMERA_DOWN": 536,
"CAMERA_LEFT": 537,
"CAMERA_RIGHT": 538
}
A lookup table for button codes. The keys are a string such as MOUSE and the value would be an integer such as 272.
{
"0": 256,
"MISC": 256,
"1": 257,
"2": 258,
"3": 259,
"4": 260,
"5": 261,
"6": 262,
"7": 263,
"8": 264,
"9": 265,
"MOUSE": 272,
"LEFT": 272,
"RIGHT": 273,
"MIDDLE": 274,
"SIDE": 275,
"EXTRA": 276,
"FORWARD": 277,
"BACK": 278,
"TASK": 279,
"JOYSTICK": 288,
"TRIGGER": 288,
"THUMB": 289,
"THUMB2": 290,
"TOP": 291,
"TOP2": 292,
"PINKIE": 293,
"BASE": 294,
"BASE2": 295,
"BASE3": 296,
"BASE4": 297,
"BASE5": 298,
"BASE6": 299,
"DEAD": 303,
"A": 304,
"GAMEPAD": 304,
"B": 305,
"C": 306,
"X": 307,
"Y": 308,
"Z": 309,
"TL": 310,
"TR": 311,
"TL2": 312,
"TR2": 313,
"SELECT": 314,
"START": 315,
"MODE": 316,
"THUMBL": 317,
"THUMBR": 318,
"DIGI": 320,
"TOOL_PEN": 320,
"TOOL_RUBBER": 321,
"TOOL_BRUSH": 322,
"TOOL_PENCIL": 323,
"TOOL_AIRBRUSH": 324,
"TOOL_FINGER": 325,
"TOOL_MOUSE": 326,
"TOOL_LENS": 327,
"TOOL_QUINTTAP": 328,
"TOUCH": 330,
"STYLUS": 331,
"STYLUS2": 332,
"TOOL_DOUBLETAP": 333,
"TOOL_TRIPLETAP": 334,
"TOOL_QUADTAP": 335,
"GEAR_DOWN": 336,
"WHEEL": 336,
"GEAR_UP": 337,
"TRIGGER_HAPPY": 704,
"TRIGGER_HAPPY1": 704,
"TRIGGER_HAPPY2": 705,
"TRIGGER_HAPPY3": 706,
"TRIGGER_HAPPY4": 707,
"TRIGGER_HAPPY5": 708,
"TRIGGER_HAPPY6": 709,
"TRIGGER_HAPPY7": 710,
"TRIGGER_HAPPY8": 711,
"TRIGGER_HAPPY9": 712,
"TRIGGER_HAPPY10": 713,
"TRIGGER_HAPPY11": 714,
"TRIGGER_HAPPY12": 715,
"TRIGGER_HAPPY13": 716,
"TRIGGER_HAPPY14": 717,
"TRIGGER_HAPPY15": 718,
"TRIGGER_HAPPY16": 719,
"TRIGGER_HAPPY17": 720,
"TRIGGER_HAPPY18": 721,
"TRIGGER_HAPPY19": 722,
"TRIGGER_HAPPY20": 723,
"TRIGGER_HAPPY21": 724,
"TRIGGER_HAPPY22": 725,
"TRIGGER_HAPPY23": 726,
"TRIGGER_HAPPY24": 727,
"TRIGGER_HAPPY25": 728,
"TRIGGER_HAPPY26": 729,
"TRIGGER_HAPPY27": 730,
"TRIGGER_HAPPY28": 731,
"TRIGGER_HAPPY29": 732,
"TRIGGER_HAPPY30": 733,
"TRIGGER_HAPPY31": 734,
"TRIGGER_HAPPY32": 735,
"TRIGGER_HAPPY33": 736,
"TRIGGER_HAPPY34": 737,
"TRIGGER_HAPPY35": 738,
"TRIGGER_HAPPY36": 739,
"TRIGGER_HAPPY37": 740,
"TRIGGER_HAPPY38": 741,
"TRIGGER_HAPPY39": 742,
"TRIGGER_HAPPY40": 743
}
The function is called with a table containing 3 items:
{
Type = <integer>,
Code = <integer>,
Value = <integer>
}
-
USB Devices should be either globally scoped or assigned to a globally scoped table to avoid issues with garbage collection.
-
The Usb.EventHandler can be called with no data, check if the parameter is nil

local UsbHelpers = {}
UsbHelpers.GetType = function(code)
for k, v in pairs(Usb.Type) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetSync = function(code)
for k, v in pairs(Usb.Sync) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetRelative = function(code)
for k, v in pairs(Usb.Relative) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetAbsolute = function(code)
for k, v in pairs(Usb.Absolute) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetSwitch = function(code)
for k, v in pairs(Usb.Switch) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetMisc = function(code)
for k, v in pairs(Usb.Misc) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetLed = function(code)
for k, v in pairs(Usb.Led) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetRepeat = function(code)
for k, v in pairs(Usb.Repeat) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetSound = function(code)
for k, v in pairs(Usb.Sound) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetForceFeedback = function(code)
for k, v in pairs(Usb.FF) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetKey = function(code)
for k, v in pairs(Usb.Key) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetButton = function(code)
for k, v in pairs(Usb.Button) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.GetKeyButton = function(code)
for k, v in pairs(Usb.Key) do
if code == v then
return (k)
end
end
for k, v in pairs(Usb.Button) do
if code == v then
return (k)
end
end
return nil
end
UsbHelpers.Actions = {
[0] = "Released",
[1] = "Pressed",
[2] = "Held"
}
return UsbHelpers
Note: This example uses the Lua Helper module shown above.
rapidjson = require("rapidjson")
UsbHelpers = require("UsbHelpers")
usb_monitorInput = UsbMonitor.New("input")
devices = {}
function usb_data_handler( data )
if data then
-- print(rapidjson.encode(data))
local eventType = UsbHelpers.GetType(data.Type)
-- print(UsbHelpers.GetType(data.Type))
if eventType == "KEY" then
local btn = UsbHelpers.GetKeyButton(data.Code)
local action = UsbHelpers.Actions[data.Value]
print("KEY/Button:",btn,action)
elseif eventType == "ABS" then
local axis = UsbHelpers.GetAbsolute(data.Code)
print("Absolute:",axis, data.Value)
elseif eventType == "REL" then
local axis = UsbHelpers.GetRelative(data.Code)
print("Relative:",axis, data.Value)
end
end
end
usb_monitorInput.EventHandler = function( dvc )
-- print(rapidjson.encode(dvc))
if dvc.properties.ID_VENDOR then
local b_added = dvc.Added
local vendor = dvc.properties.ID_VENDOR
local model = dvc.properties.ID_MODEL
print( dvc.devnode, vendor, model, b_added )
if b_added then
devices[dvc.devnode] = Usb.New( dvc.devnode )
devices[dvc.devnode].EventHandler = usb_data_handler
else
if devices[dvc.devnode] then
devices[dvc.devnode].EventHandler = function() end
devices[dvc.devnode] = nil
end
end
end
end
