import os this_app_dir_path = "/home/pi/usb4vc/rpi_app" config_dir_path = "/home/pi/usb4vc/config" firmware_dir_path = "/home/pi/usb4vc/firmware" temp_dir_path = "/home/pi/usb4vc/temp" i2c_bootloader_pbid = [1] usb_bootloader_pbid = [2] def ensure_dir(dir_path): print('ensure_dir', dir_path) if not os.path.exists(dir_path): os.makedirs(dir_path) RPI_APP_VERSION_TUPLE = (0, 2, 1) code_name_to_value_lookup = { 'KEY_RESERVED':(0, 'kb_key'), 'KEY_ESC':(1, 'kb_key'), 'KEY_1':(2, 'kb_key'), 'KEY_2':(3, 'kb_key'), 'KEY_3':(4, 'kb_key'), 'KEY_4':(5, 'kb_key'), 'KEY_5':(6, 'kb_key'), 'KEY_6':(7, 'kb_key'), 'KEY_7':(8, 'kb_key'), 'KEY_8':(9, 'kb_key'), 'KEY_9':(10, 'kb_key'), 'KEY_0':(11, 'kb_key'), 'KEY_MINUS':(12, 'kb_key'), 'KEY_EQUAL':(13, 'kb_key'), 'KEY_BACKSPACE':(14, 'kb_key'), 'KEY_TAB':(15, 'kb_key'), 'KEY_Q':(16, 'kb_key'), 'KEY_W':(17, 'kb_key'), 'KEY_E':(18, 'kb_key'), 'KEY_R':(19, 'kb_key'), 'KEY_T':(20, 'kb_key'), 'KEY_Y':(21, 'kb_key'), 'KEY_U':(22, 'kb_key'), 'KEY_I':(23, 'kb_key'), 'KEY_O':(24, 'kb_key'), 'KEY_P':(25, 'kb_key'), 'KEY_LEFTBRACE':(26, 'kb_key'), 'KEY_RIGHTBRACE':(27, 'kb_key'), 'KEY_ENTER':(28, 'kb_key'), 'KEY_LEFTCTRL':(29, 'kb_key'), 'KEY_A':(30, 'kb_key'), 'KEY_S':(31, 'kb_key'), 'KEY_D':(32, 'kb_key'), 'KEY_F':(33, 'kb_key'), 'KEY_G':(34, 'kb_key'), 'KEY_H':(35, 'kb_key'), 'KEY_J':(36, 'kb_key'), 'KEY_K':(37, 'kb_key'), 'KEY_L':(38, 'kb_key'), 'KEY_SEMICOLON':(39, 'kb_key'), 'KEY_APOSTROPHE':(40, 'kb_key'), 'KEY_GRAVE':(41, 'kb_key'), 'KEY_LEFTSHIFT':(42, 'kb_key'), 'KEY_BACKSLASH':(43, 'kb_key'), 'KEY_Z':(44, 'kb_key'), 'KEY_X':(45, 'kb_key'), 'KEY_C':(46, 'kb_key'), 'KEY_V':(47, 'kb_key'), 'KEY_B':(48, 'kb_key'), 'KEY_N':(49, 'kb_key'), 'KEY_M':(50, 'kb_key'), 'KEY_COMMA':(51, 'kb_key'), 'KEY_DOT':(52, 'kb_key'), 'KEY_SLASH':(53, 'kb_key'), 'KEY_RIGHTSHIFT':(54, 'kb_key'), 'KEY_KPASTERISK':(55, 'kb_key'), 'KEY_LEFTALT':(56, 'kb_key'), 'KEY_SPACE':(57, 'kb_key'), 'KEY_CAPSLOCK':(58, 'kb_key'), 'KEY_F1':(59, 'kb_key'), 'KEY_F2':(60, 'kb_key'), 'KEY_F3':(61, 'kb_key'), 'KEY_F4':(62, 'kb_key'), 'KEY_F5':(63, 'kb_key'), 'KEY_F6':(64, 'kb_key'), 'KEY_F7':(65, 'kb_key'), 'KEY_F8':(66, 'kb_key'), 'KEY_F9':(67, 'kb_key'), 'KEY_F10':(68, 'kb_key'), 'KEY_NUMLOCK':(69, 'kb_key'), 'KEY_SCROLLLOCK':(70, 'kb_key'), 'KEY_KP7':(71, 'kb_key'), 'KEY_KP8':(72, 'kb_key'), 'KEY_KP9':(73, 'kb_key'), 'KEY_KPMINUS':(74, 'kb_key'), 'KEY_KP4':(75, 'kb_key'), 'KEY_KP5':(76, 'kb_key'), 'KEY_KP6':(77, 'kb_key'), 'KEY_KPPLUS':(78, 'kb_key'), 'KEY_KP1':(79, 'kb_key'), 'KEY_KP2':(80, 'kb_key'), 'KEY_KP3':(81, 'kb_key'), 'KEY_KP0':(82, 'kb_key'), 'KEY_KPDOT':(83, 'kb_key'), 'KEY_ZENKAKUHANKAKU':(85, 'kb_key'), 'KEY_102ND':(86, 'kb_key'), 'KEY_F11':(87, 'kb_key'), 'KEY_F12':(88, 'kb_key'), 'KEY_RO':(89, 'kb_key'), 'KEY_KATAKANA':(90, 'kb_key'), 'KEY_HIRAGANA':(91, 'kb_key'), 'KEY_HENKAN':(92, 'kb_key'), 'KEY_KATAKANAHIRAGANA':(93, 'kb_key'), 'KEY_MUHENKAN':(94, 'kb_key'), 'KEY_KPJPCOMMA':(95, 'kb_key'), 'KEY_KPENTER':(96, 'kb_key'), 'KEY_RIGHTCTRL':(97, 'kb_key'), 'KEY_KPSLASH':(98, 'kb_key'), 'KEY_SYSRQ':(99, 'kb_key'), 'KEY_RIGHTALT':(100, 'kb_key'), 'KEY_LINEFEED':(101, 'kb_key'), 'KEY_HOME':(102, 'kb_key'), 'KEY_UP':(103, 'kb_key'), 'KEY_PAGEUP':(104, 'kb_key'), 'KEY_LEFT':(105, 'kb_key'), 'KEY_RIGHT':(106, 'kb_key'), 'KEY_END':(107, 'kb_key'), 'KEY_DOWN':(108, 'kb_key'), 'KEY_PAGEDOWN':(109, 'kb_key'), 'KEY_INSERT':(110, 'kb_key'), 'KEY_DELETE':(111, 'kb_key'), 'KEY_MACRO':(112, 'kb_key'), 'KEY_MUTE':(113, 'kb_key'), 'KEY_VOLUMEDOWN':(114, 'kb_key'), 'KEY_VOLUMEUP':(115, 'kb_key'), 'KEY_POWER':(116, 'kb_key'), 'KEY_KPEQUAL':(117, 'kb_key'), 'KEY_KPPLUSMINUS':(118, 'kb_key'), 'KEY_PAUSE':(119, 'kb_key'), 'KEY_SCALE':(120, 'kb_key'), 'KEY_KPCOMMA':(121, 'kb_key'), 'KEY_HANGEUL':(122, 'kb_key'), 'KEY_HANGUEL':(122, 'kb_key'), 'KEY_HANJA':(123, 'kb_key'), 'KEY_YEN':(124, 'kb_key'), 'KEY_LEFTMETA':(125, 'kb_key'), 'KEY_RIGHTMETA':(126, 'kb_key'), 'KEY_COMPOSE':(127, 'kb_key'), 'KEY_STOP':(128, 'kb_key'), 'KEY_AGAIN':(129, 'kb_key'), 'KEY_PROPS':(130, 'kb_key'), 'KEY_UNDO':(131, 'kb_key'), 'KEY_FRONT':(132, 'kb_key'), 'KEY_COPY':(133, 'kb_key'), 'KEY_OPEN':(134, 'kb_key'), 'KEY_PASTE':(135, 'kb_key'), 'KEY_FIND':(136, 'kb_key'), 'KEY_CUT':(137, 'kb_key'), 'KEY_HELP':(138, 'kb_key'), 'KEY_MENU':(139, 'kb_key'), 'KEY_CALC':(140, 'kb_key'), 'KEY_SETUP':(141, 'kb_key'), 'KEY_SLEEP':(142, 'kb_key'), 'KEY_WAKEUP':(143, 'kb_key'), 'KEY_FILE':(144, 'kb_key'), 'KEY_SENDFILE':(145, 'kb_key'), 'KEY_DELETEFILE':(146, 'kb_key'), 'KEY_XFER':(147, 'kb_key'), 'KEY_PROG1':(148, 'kb_key'), 'KEY_PROG2':(149, 'kb_key'), 'KEY_WWW':(150, 'kb_key'), 'KEY_MSDOS':(151, 'kb_key'), 'KEY_COFFEE':(152, 'kb_key'), 'KEY_SCREENLOCK':(152, 'kb_key'), 'KEY_ROTATE_DISPLAY':(153, 'kb_key'), 'KEY_DIRECTION':(153, 'kb_key'), 'KEY_CYCLEWINDOWS':(154, 'kb_key'), 'KEY_MAIL':(155, 'kb_key'), 'KEY_BOOKMARKS':(156, 'kb_key'), 'KEY_COMPUTER':(157, 'kb_key'), 'KEY_BACK':(158, 'kb_key'), 'KEY_FORWARD':(159, 'kb_key'), 'KEY_CLOSECD':(160, 'kb_key'), 'KEY_EJECTCD':(161, 'kb_key'), 'KEY_EJECTCLOSECD':(162, 'kb_key'), 'KEY_NEXTSONG':(163, 'kb_key'), 'KEY_PLAYPAUSE':(164, 'kb_key'), 'KEY_PREVIOUSSONG':(165, 'kb_key'), 'KEY_STOPCD':(166, 'kb_key'), 'KEY_RECORD':(167, 'kb_key'), 'KEY_REWIND':(168, 'kb_key'), 'KEY_PHONE':(169, 'kb_key'), 'KEY_ISO':(170, 'kb_key'), 'KEY_CONFIG':(171, 'kb_key'), 'KEY_HOMEPAGE':(172, 'kb_key'), 'KEY_REFRESH':(173, 'kb_key'), 'KEY_EXIT':(174, 'kb_key'), 'KEY_MOVE':(175, 'kb_key'), 'KEY_EDIT':(176, 'kb_key'), 'KEY_SCROLLUP':(177, 'kb_key'), 'KEY_SCROLLDOWN':(178, 'kb_key'), 'KEY_KPLEFTPAREN':(179, 'kb_key'), 'KEY_KPRIGHTPAREN':(180, 'kb_key'), 'KEY_NEW':(181, 'kb_key'), 'KEY_REDO':(182, 'kb_key'), 'KEY_F13':(183, 'kb_key'), 'KEY_F14':(184, 'kb_key'), 'KEY_F15':(185, 'kb_key'), 'KEY_F16':(186, 'kb_key'), 'KEY_F17':(187, 'kb_key'), 'KEY_F18':(188, 'kb_key'), 'KEY_F19':(189, 'kb_key'), 'KEY_F20':(190, 'kb_key'), 'KEY_F21':(191, 'kb_key'), 'KEY_F22':(192, 'kb_key'), 'KEY_F23':(193, 'kb_key'), 'KEY_F24':(194, 'kb_key'), # -------------------- 'BTN_MISC': (0x100, 'usb_gp_btn'), 'BTN_0': (0x100, 'usb_gp_btn'), 'BTN_1': (0x101, 'usb_gp_btn'), 'BTN_2': (0x102, 'usb_gp_btn'), 'BTN_3': (0x103, 'usb_gp_btn'), 'BTN_4': (0x104, 'usb_gp_btn'), 'BTN_5': (0x105, 'usb_gp_btn'), 'BTN_6': (0x106, 'usb_gp_btn'), 'BTN_7': (0x107, 'usb_gp_btn'), 'BTN_8': (0x108, 'usb_gp_btn'), 'BTN_9': (0x109, 'usb_gp_btn'), 'BTN_JOYSTICK': (0x120, 'usb_gp_btn'), 'BTN_TRIGGER': (0x120, 'usb_gp_btn'), 'BTN_THUMB': (0x121, 'usb_gp_btn'), 'BTN_THUMB2': (0x122, 'usb_gp_btn'), 'BTN_TOP': (0x123, 'usb_gp_btn'), 'BTN_TOP2': (0x124, 'usb_gp_btn'), 'BTN_PINKIE': (0x125, 'usb_gp_btn'), 'BTN_BASE': (0x126, 'usb_gp_btn'), 'BTN_BASE2': (0x127, 'usb_gp_btn'), 'BTN_BASE3': (0x128, 'usb_gp_btn'), 'BTN_BASE4': (0x129, 'usb_gp_btn'), 'BTN_BASE5': (0x12a, 'usb_gp_btn'), 'BTN_BASE6': (0x12b, 'usb_gp_btn'), 'BTN_DEAD': (0x12f, 'usb_gp_btn'), 'BTN_GAMEPAD': (0x130, 'usb_gp_btn'), 'BTN_SOUTH': (0x130, 'usb_gp_btn'), 'BTN_A': (0x130, 'usb_gp_btn'), 'BTN_EAST': (0x131, 'usb_gp_btn'), 'BTN_B': (0x131, 'usb_gp_btn'), 'BTN_C': (0x132, 'usb_gp_btn'), 'BTN_NORTH': (0x133, 'usb_gp_btn'), 'BTN_X': (0x133, 'usb_gp_btn'), 'BTN_WEST': (0x134, 'usb_gp_btn'), 'BTN_Y': (0x134, 'usb_gp_btn'), 'BTN_Z': (0x135, 'usb_gp_btn'), 'BTN_TL': (0x136, 'usb_gp_btn'), 'BTN_TR': (0x137, 'usb_gp_btn'), 'BTN_TL2': (0x138, 'usb_gp_btn'), 'BTN_TR2': (0x139, 'usb_gp_btn'), 'BTN_SELECT': (0x13a, 'usb_gp_btn'), 'BTN_START': (0x13b, 'usb_gp_btn'), 'BTN_MODE': (0x13c, 'usb_gp_btn'), 'BTN_THUMBL': (0x13d, 'usb_gp_btn'), 'BTN_THUMBR': (0x13e, 'usb_gp_btn'), 'BTN_WHEEL': (0x150, 'usb_gp_btn'), 'BTN_GEAR_DOWN': (0x150, 'usb_gp_btn'), 'BTN_GEAR_UP': (0x151, 'usb_gp_btn'), 'BTN_DPAD_UP': (0x220, 'usb_gp_btn'), 'BTN_DPAD_DOWN': (0x221, 'usb_gp_btn'), 'BTN_DPAD_LEFT': (0x222, 'usb_gp_btn'), 'BTN_DPAD_RIGHT': (0x223, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY': (0x2c0, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY1': (0x2c0, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY2': (0x2c1, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY3': (0x2c2, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY4': (0x2c3, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY5': (0x2c4, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY6': (0x2c5, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY7': (0x2c6, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY8': (0x2c7, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY9': (0x2c8, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY10': (0x2c9, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY11': (0x2ca, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY12': (0x2cb, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY13': (0x2cc, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY14': (0x2cd, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY15': (0x2ce, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY16': (0x2cf, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY17': (0x2d0, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY18': (0x2d1, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY19': (0x2d2, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY20': (0x2d3, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY21': (0x2d4, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY22': (0x2d5, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY23': (0x2d6, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY24': (0x2d7, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY25': (0x2d8, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY26': (0x2d9, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY27': (0x2da, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY28': (0x2db, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY29': (0x2dc, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY30': (0x2dd, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY31': (0x2de, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY32': (0x2df, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY33': (0x2e0, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY34': (0x2e1, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY35': (0x2e2, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY36': (0x2e3, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY37': (0x2e4, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY38': (0x2e5, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY39': (0x2e6, 'usb_gp_btn'), 'BTN_TRIGGER_HAPPY40': (0x2e7, 'usb_gp_btn'), # -------------------- 'ABS_X':(0x00, 'usb_abs_axis'), 'ABS_Y':(0x01, 'usb_abs_axis'), 'ABS_Z':(0x02, 'usb_abs_axis'), 'ABS_RX':(0x03, 'usb_abs_axis'), 'ABS_RY':(0x04, 'usb_abs_axis'), 'ABS_RZ':(0x05, 'usb_abs_axis'), 'ABS_THROTTLE':(0x06, 'usb_abs_axis'), 'ABS_RUDDER':(0x07, 'usb_abs_axis'), 'ABS_WHEEL':(0x08, 'usb_abs_axis'), 'ABS_GAS':(0x09, 'usb_abs_axis'), 'ABS_BRAKE':(0x0a, 'usb_abs_axis'), 'ABS_HAT0X':(0x10, 'usb_abs_axis'), 'ABS_HAT0Y':(0x11, 'usb_abs_axis'), 'ABS_HAT1X':(0x12, 'usb_abs_axis'), 'ABS_HAT1Y':(0x13, 'usb_abs_axis'), 'ABS_HAT2X':(0x14, 'usb_abs_axis'), 'ABS_HAT2Y':(0x15, 'usb_abs_axis'), 'ABS_HAT3X':(0x16, 'usb_abs_axis'), 'ABS_HAT3Y':(0x17, 'usb_abs_axis'), # -------------------- 'BTN_MOUSE':(0x110, 'mouse_btn'), 'BTN_LEFT':(0x110, 'mouse_btn'), 'BTN_RIGHT':(0x111, 'mouse_btn'), 'BTN_MIDDLE':(0x112, 'mouse_btn'), 'BTN_SIDE':(0x113, 'mouse_btn'), 'BTN_EXTRA':(0x114, 'mouse_btn'), 'BTN_FORWARD':(0x115, 'mouse_btn'), 'BTN_BACK':(0x116, 'mouse_btn'), 'BTN_TASK':(0x117, 'mouse_btn'), # -------------------- 'REL_X':(0x00, 'usb_rel_axis'), 'REL_Y':(0x01, 'usb_rel_axis'), 'REL_Z':(0x02, 'usb_rel_axis'), 'REL_RX':(0x03, 'usb_rel_axis'), 'REL_RY':(0x04, 'usb_rel_axis'), 'REL_RZ':(0x05, 'usb_rel_axis'), 'REL_HWHEEL':(0x06, 'usb_rel_axis'), 'REL_DIAL':(0x07, 'usb_rel_axis'), 'REL_WHEEL':(0x08, 'usb_rel_axis'), 'REL_MISC':(0x09, 'usb_rel_axis'), # -------------------- 'IBM_GGP_BTN_1':('IBM_GGP_BTN_1', 'ibm_ggp_btn'), 'IBM_GGP_BTN_2':('IBM_GGP_BTN_2', 'ibm_ggp_btn'), 'IBM_GGP_BTN_3':('IBM_GGP_BTN_3', 'ibm_ggp_btn'), 'IBM_GGP_BTN_4':('IBM_GGP_BTN_4', 'ibm_ggp_btn'), # -------------------- 'IBM_GGP_JS1_X':('IBM_GGP_JS1_X', 'ibm_ggp_axis'), 'IBM_GGP_JS1_Y':('IBM_GGP_JS1_Y', 'ibm_ggp_axis'), 'IBM_GGP_JS2_X':('IBM_GGP_JS2_X', 'ibm_ggp_axis'), 'IBM_GGP_JS2_Y':('IBM_GGP_JS2_Y', 'ibm_ggp_axis'), # -------------------- 'IBM_GGP_JS1_XP':('IBM_GGP_JS1_XP', 'ibm_ggp_half_axis'), 'IBM_GGP_JS1_XN':('IBM_GGP_JS1_XN', 'ibm_ggp_half_axis'), 'IBM_GGP_JS1_YP':('IBM_GGP_JS1_YP', 'ibm_ggp_half_axis'), 'IBM_GGP_JS1_YN':('IBM_GGP_JS1_YN', 'ibm_ggp_half_axis'), 'IBM_GGP_JS2_XP':('IBM_GGP_JS2_XP', 'ibm_ggp_half_axis'), 'IBM_GGP_JS2_XN':('IBM_GGP_JS2_XN', 'ibm_ggp_half_axis'), 'IBM_GGP_JS2_YP':('IBM_GGP_JS2_YP', 'ibm_ggp_half_axis'), 'IBM_GGP_JS2_YN':('IBM_GGP_JS2_YN', 'ibm_ggp_half_axis'), } code_value_to_name_lookup = { 0x100:{'BTN_MISC', 'BTN_0'}, 0x101:{'BTN_1'}, 0x102:{'BTN_2'}, 0x103:{'BTN_3'}, 0x104:{'BTN_4'}, 0x105:{'BTN_5'}, 0x106:{'BTN_6'}, 0x107:{'BTN_7'}, 0x108:{'BTN_8'}, 0x109:{'BTN_9'}, 0x110:{'BTN_MOUSE'}, 0x110:{'BTN_LEFT'}, 0x111:{'BTN_RIGHT'}, 0x112:{'BTN_MIDDLE'}, 0x113:{'BTN_SIDE'}, 0x114:{'BTN_EXTRA'}, 0x115:{'BTN_FORWARD'}, 0x116:{'BTN_BACK'}, 0x117:{'BTN_TASK'}, 0x120:{'BTN_JOYSTICK'}, 0x120:{'BTN_TRIGGER'}, 0x121:{'BTN_THUMB'}, 0x122:{'BTN_THUMB2'}, 0x123:{'BTN_TOP'}, 0x124:{'BTN_TOP2'}, 0x125:{'BTN_PINKIE'}, 0x126:{'BTN_BASE'}, 0x127:{'BTN_BASE2'}, 0x128:{'BTN_BASE3'}, 0x129:{'BTN_BASE4'}, 0x12a:{'BTN_BASE5'}, 0x12b:{'BTN_BASE6'}, 0x12f:{'BTN_DEAD'}, 0x130:{'BTN_GAMEPAD', 'BTN_SOUTH', 'BTN_A'}, 0x131:{'BTN_EAST', 'BTN_B'}, 0x132:{'BTN_C'}, 0x133:{'BTN_NORTH', 'BTN_X'}, 0x134:{'BTN_WEST', 'BTN_Y'}, 0x135:{'BTN_Z'}, 0x136:{'BTN_TL'}, 0x137:{'BTN_TR'}, 0x138:{'BTN_TL2'}, 0x139:{'BTN_TR2'}, 0x13a:{'BTN_SELECT'}, 0x13b:{'BTN_START'}, 0x13c:{'BTN_MODE'}, 0x13d:{'BTN_THUMBL'}, 0x13e:{'BTN_THUMBR'}, 0x150:{'BTN_WHEEL', 'BTN_GEAR_DOWN'}, 0x151:{'BTN_GEAR_UP'}, 0x220:{'BTN_DPAD_UP'}, 0x221:{'BTN_DPAD_DOWN'}, 0x222:{'BTN_DPAD_LEFT'}, 0x223:{'BTN_DPAD_RIGHT'}, 0x2c0:{'BTN_TRIGGER_HAPPY', 'BTN_TRIGGER_HAPPY1'}, 0x2c1:{'BTN_TRIGGER_HAPPY2'}, 0x2c2:{'BTN_TRIGGER_HAPPY3'}, 0x2c3:{'BTN_TRIGGER_HAPPY4'}, 0x2c4:{'BTN_TRIGGER_HAPPY5'}, 0x2c5:{'BTN_TRIGGER_HAPPY6'}, 0x2c6:{'BTN_TRIGGER_HAPPY7'}, 0x2c7:{'BTN_TRIGGER_HAPPY8'}, 0x2c8:{'BTN_TRIGGER_HAPPY9'}, 0x2c9:{'BTN_TRIGGER_HAPPY10'}, 0x2ca:{'BTN_TRIGGER_HAPPY11'}, 0x2cb:{'BTN_TRIGGER_HAPPY12'}, 0x2cc:{'BTN_TRIGGER_HAPPY13'}, 0x2cd:{'BTN_TRIGGER_HAPPY14'}, 0x2ce:{'BTN_TRIGGER_HAPPY15'}, 0x2cf:{'BTN_TRIGGER_HAPPY16'}, 0x2d0:{'BTN_TRIGGER_HAPPY17'}, 0x2d1:{'BTN_TRIGGER_HAPPY18'}, 0x2d2:{'BTN_TRIGGER_HAPPY19'}, 0x2d3:{'BTN_TRIGGER_HAPPY20'}, 0x2d4:{'BTN_TRIGGER_HAPPY21'}, 0x2d5:{'BTN_TRIGGER_HAPPY22'}, 0x2d6:{'BTN_TRIGGER_HAPPY23'}, 0x2d7:{'BTN_TRIGGER_HAPPY24'}, 0x2d8:{'BTN_TRIGGER_HAPPY25'}, 0x2d9:{'BTN_TRIGGER_HAPPY26'}, 0x2da:{'BTN_TRIGGER_HAPPY27'}, 0x2db:{'BTN_TRIGGER_HAPPY28'}, 0x2dc:{'BTN_TRIGGER_HAPPY29'}, 0x2dd:{'BTN_TRIGGER_HAPPY30'}, 0x2de:{'BTN_TRIGGER_HAPPY31'}, 0x2df:{'BTN_TRIGGER_HAPPY32'}, 0x2e0:{'BTN_TRIGGER_HAPPY33'}, 0x2e1:{'BTN_TRIGGER_HAPPY34'}, 0x2e2:{'BTN_TRIGGER_HAPPY35'}, 0x2e3:{'BTN_TRIGGER_HAPPY36'}, 0x2e4:{'BTN_TRIGGER_HAPPY37'}, 0x2e5:{'BTN_TRIGGER_HAPPY38'}, 0x2e6:{'BTN_TRIGGER_HAPPY39'}, 0x2e7:{'BTN_TRIGGER_HAPPY40'}, 0x00:{'ABS_X'}, 0x01:{'ABS_Y'}, 0x02:{'ABS_Z'}, 0x03:{'ABS_RX'}, 0x04:{'ABS_RY'}, 0x05:{'ABS_RZ'}, 0x06:{'ABS_THROTTLE'}, 0x07:{'ABS_RUDDER'}, 0x08:{'ABS_WHEEL'}, 0x09:{'ABS_GAS'}, 0x0a:{'ABS_BRAKE'}, 0x10:{'ABS_HAT0X'}, 0x11:{'ABS_HAT0Y'}, 0x12:{'ABS_HAT1X'}, 0x13:{'ABS_HAT1Y'}, 0x14:{'ABS_HAT2X'}, 0x15:{'ABS_HAT2Y'}, 0x16:{'ABS_HAT3X'}, 0x17:{'ABS_HAT3Y'}, 373:{'BTN_MODE'}, } board_id_lookup = { 'Unknown':0, 'IBMPC':1, 'ADB':2, } protocol_id_lookup = { 'OFF':0, 'AT_PS2_KB':1, 'XT_KB':2, 'ADB_KB':3, 'PS2_MOUSE':4, 'MICROSOFT_SERIAL_MOUSE':5, 'ADB_MOUSE':6, 'GAMEPORT_15PIN_GAMEPAD':7, 'GAMEPORT_GRAVIS_GAMEPAD':8, 'GAMEPORT_MICROSOFT_SIDEWINDER':9, 'RAW_KEYBOARD':125, 'RAW_MOUSE':126, 'RAW_GAMEPAD':127, } gamepad_event_code_name_list = [ 'BTN_1', 'BTN_2', 'BTN_3', 'BTN_4', 'BTN_5', 'BTN_6', 'BTN_7', 'BTN_8', 'BTN_9', 'BTN_JOYSTICK', 'BTN_TRIGGER', 'BTN_THUMB', 'BTN_THUMB2', 'BTN_TOP', 'BTN_TOP2', 'BTN_PINKIE', 'BTN_BASE', 'BTN_BASE2', 'BTN_BASE3', 'BTN_BASE4', 'BTN_BASE5', 'BTN_BASE6', 'BTN_DEAD', 'BTN_GAMEPAD', 'BTN_SOUTH', 'BTN_A', 'BTN_EAST', 'BTN_B', 'BTN_C', 'BTN_NORTH', 'BTN_X', 'BTN_WEST', 'BTN_Y', 'BTN_Z', 'BTN_TL', 'BTN_TR', 'BTN_TL2', 'BTN_TR2', 'BTN_SELECT', 'BTN_START', 'BTN_MODE', 'BTN_THUMBL', 'BTN_THUMBR', 'BTN_WHEEL', 'BTN_GEAR_DOWN', 'BTN_GEAR_UP', 'BTN_DPAD_UP', 'BTN_DPAD_DOWN', 'BTN_DPAD_LEFT', 'BTN_DPAD_RIGHT', 'BTN_TRIGGER_HAPPY', 'BTN_TRIGGER_HAPPY1', 'BTN_TRIGGER_HAPPY2', 'BTN_TRIGGER_HAPPY3', 'BTN_TRIGGER_HAPPY4', 'BTN_TRIGGER_HAPPY5', 'BTN_TRIGGER_HAPPY6', 'BTN_TRIGGER_HAPPY7', 'BTN_TRIGGER_HAPPY8', 'BTN_TRIGGER_HAPPY9', 'BTN_TRIGGER_HAPPY10', 'BTN_TRIGGER_HAPPY11', 'BTN_TRIGGER_HAPPY12', 'BTN_TRIGGER_HAPPY13', 'BTN_TRIGGER_HAPPY14', 'BTN_TRIGGER_HAPPY15', 'BTN_TRIGGER_HAPPY16', 'BTN_TRIGGER_HAPPY17', 'BTN_TRIGGER_HAPPY18', 'BTN_TRIGGER_HAPPY19', 'BTN_TRIGGER_HAPPY20', 'BTN_TRIGGER_HAPPY21', 'BTN_TRIGGER_HAPPY22', 'BTN_TRIGGER_HAPPY23', 'BTN_TRIGGER_HAPPY24', 'BTN_TRIGGER_HAPPY25', 'BTN_TRIGGER_HAPPY26', 'BTN_TRIGGER_HAPPY27', 'BTN_TRIGGER_HAPPY28', 'BTN_TRIGGER_HAPPY29', 'BTN_TRIGGER_HAPPY30', 'BTN_TRIGGER_HAPPY31', 'BTN_TRIGGER_HAPPY32', 'BTN_TRIGGER_HAPPY33', 'BTN_TRIGGER_HAPPY34', 'BTN_TRIGGER_HAPPY35', 'BTN_TRIGGER_HAPPY36', 'BTN_TRIGGER_HAPPY37', 'BTN_TRIGGER_HAPPY38', 'BTN_TRIGGER_HAPPY39', 'BTN_TRIGGER_HAPPY40',]