Hid: JS keycode, HID keycode, mapping, sending

This commit is contained in:
Petr Kracík 2020-05-24 12:44:34 +02:00
parent 33bca6c35c
commit 72025093c5
3 changed files with 485 additions and 22 deletions

View File

@ -1,10 +1,16 @@
from flask import Response from flask import Response
from flask import Flask from flask import Flask
from flask import render_template from flask import render_template
from flask import request
import threading import threading
import argparse import argparse
import datetime import datetime
import time import time
import json
from hidkeycodes import hidkeycodes
from jskeycodes import jskeycodes
lock = threading.Lock() lock = threading.Lock()
@ -14,10 +20,10 @@ app = Flask(__name__)
NULL = chr(0) NULL = chr(0)
hiddev = None hiddev = None
def init(): def hid_init():
hiddev=open('/dev/hidg0', 'rb+') hiddev=open('/dev/hidg0', 'rb+')
def hidwrite(data): def hid_write(data):
if hiddev is None: if hiddev is None:
return False return False
@ -27,12 +33,26 @@ def hidwrite(data):
def send_key(hidkey, shift, alt, ctlr, superkey): def send_key(hidkey, shift, alt, ctlr, superkey):
# TODO handle mod keys # TODO handle mod keys
hidwrite(NULL*2+chr(hidkey)+NULL*5) hid_write(NULL*2+chr(hidkey)+NULL*5)
hidwrite(NULL*8) hid_write(NULL*8)
def get_hid_by_scancode(scancode): def get_hid_by_jscode(rawkeycode):
hidkeycode = None
hidkeyname = None
if rawkeycode in jskeycodes.values():
hidkeyname = list(jskeycodes.keys())[list(jskeycodes.values()).index(rawkeycode)]
if hidkeyname in hidkeycodes:
hidkeycode = hidkeycodes[hidkeyname]
else:
print("Code for key {} not found in HID mapping".format(hidkeyname))
else:
print("Javascript code for key {} not found".format(rawkeycode))
print ("JS key: {} HID key: {}({})".format(rawkeycode, hidkeyname, hidkeycode))
return hidkeycode
@app.route("/") @app.route("/")
def index(): def index():
@ -41,7 +61,24 @@ def index():
@app.route("/hid/keyboard", methods=["POST"]) @app.route("/hid/keyboard", methods=["POST"])
def keypress(): def keypress():
return Response("Stisknuto ", mimetype = "text/plain") keyevent = json.loads(request.data)
print ("Raw data: {}".format(request.data))
rawkeycode = keyevent['code']
hidkeycode = get_hid_by_jscode(rawkeycode)
if hidkeycode is not None:
try:
send_key(
hidkeycode,
keyevent['shiftKey'],
keyevent['altKey'],
keyevent['ctrlKey'],
False)
except Exception as e:
print("Error sending HID message", e)
return Response("Press {}".format(hidkeycode), mimetype = "text/plain")
# check to see if this is the main thread of execution # check to see if this is the main thread of execution
@ -56,6 +93,8 @@ if __name__ == '__main__':
help="# of frames used to construct the background model") help="# of frames used to construct the background model")
args = vars(ap.parse_args()) args = vars(ap.parse_args())
hid_init()
app.run(host=args["ip"], port=args["port"], debug=True, app.run(host=args["ip"], port=args["port"], debug=True,
threaded=True, use_reloader=False) threaded=True, use_reloader=False)

181
hidkeycodes.py Normal file
View File

@ -0,0 +1,181 @@
hidkeycodes = {
'KEY_MOD_LCTRL': '0x01',
'KEY_MOD_LSHIFT': '0x02',
'KEY_MOD_LALT': '0x04',
'KEY_MOD_LMETA': '0x08',
'KEY_MOD_RCTRL': '0x10',
'KEY_MOD_RSHIFT': '0x20',
'KEY_MOD_RALT': '0x40',
'KEY_MOD_RMETA': '0x80',
'KEY_NONE': '0x00',
'KEY_ERR_OVF': '0x01',
'KEY_A': '0x04',
'KEY_B': '0x05',
'KEY_C': '0x06',
'KEY_D': '0x07',
'KEY_E': '0x08',
'KEY_F': '0x09',
'KEY_G': '0x0a',
'KEY_H': '0x0b',
'KEY_I': '0x0c',
'KEY_J': '0x0d',
'KEY_K': '0x0e',
'KEY_L': '0x0f',
'KEY_M': '0x10',
'KEY_N': '0x11',
'KEY_O': '0x12',
'KEY_P': '0x13',
'KEY_Q': '0x14',
'KEY_R': '0x15',
'KEY_S': '0x16',
'KEY_T': '0x17',
'KEY_U': '0x18',
'KEY_V': '0x19',
'KEY_W': '0x1a',
'KEY_X': '0x1b',
'KEY_Y': '0x1c',
'KEY_Z': '0x1d',
'KEY_1': '0x1e',
'KEY_2': '0x1f',
'KEY_3': '0x20',
'KEY_4': '0x21',
'KEY_5': '0x22',
'KEY_6': '0x23',
'KEY_7': '0x24',
'KEY_8': '0x25',
'KEY_9': '0x26',
'KEY_0': '0x27',
'KEY_ENTER': '0x28',
'KEY_ESC': '0x29',
'KEY_BACKSPACE': '0x2a',
'KEY_TAB': '0x2b',
'KEY_SPACE': '0x2c',
'KEY_MINUS': '0x2d',
'KEY_EQUAL': '0x2e',
'KEY_LEFTBRACE': '0x2f',
'KEY_RIGHTBRACE': '0x30',
'KEY_BACKSLASH': '0x31',
'KEY_HASHTILDE': '0x32',
'KEY_SEMICOLON': '0x33',
'KEY_APOSTROPHE': '0x34',
'KEY_GRAVE': '0x35',
'KEY_COMMA': '0x36',
'KEY_DOT': '0x37',
'KEY_SLASH': '0x38',
'KEY_CAPSLOCK': '0x39',
'KEY_F1': '0x3a',
'KEY_F2': '0x3b',
'KEY_F3': '0x3c',
'KEY_F4': '0x3d',
'KEY_F5': '0x3e',
'KEY_F6': '0x3f',
'KEY_F7': '0x40',
'KEY_F8': '0x41',
'KEY_F9': '0x42',
'KEY_F10': '0x43',
'KEY_F11': '0x44',
'KEY_F12': '0x45',
'KEY_SYSRQ': '0x46',
'KEY_SCROLLLOCK': '0x47',
'KEY_PAUSE': '0x48',
'KEY_INSERT': '0x49',
'KEY_HOME': '0x4a',
'KEY_PAGEUP': '0x4b',
'KEY_DELETE': '0x4c',
'KEY_END': '0x4d',
'KEY_PAGEDOWN': '0x4e',
'KEY_RIGHT': '0x4f',
'KEY_LEFT': '0x50',
'KEY_DOWN': '0x51',
'KEY_UP': '0x52',
'KEY_NUMLOCK': '0x53',
'KEY_KPSLASH': '0x54',
'KEY_KPASTERISK': '0x55',
'KEY_KPMINUS': '0x56',
'KEY_KPPLUS': '0x57',
'KEY_KPENTER': '0x58',
'KEY_KP1': '0x59',
'KEY_KP2': '0x5a',
'KEY_KP3': '0x5b',
'KEY_KP4': '0x5c',
'KEY_KP5': '0x5d',
'KEY_KP6': '0x5e',
'KEY_KP7': '0x5f',
'KEY_KP8': '0x60',
'KEY_KP9': '0x61',
'KEY_KP0': '0x62',
'KEY_KPDOT': '0x63',
'KEY_102ND': '0x64',
'KEY_COMPOSE': '0x65',
'KEY_POWER': '0x66',
'KEY_KPEQUAL': '0x67',
'KEY_F13': '0x68',
'KEY_F14': '0x69',
'KEY_F15': '0x6a',
'KEY_F16': '0x6b',
'KEY_F17': '0x6c',
'KEY_F18': '0x6d',
'KEY_F19': '0x6e',
'KEY_F20': '0x6f',
'KEY_F21': '0x70',
'KEY_F22': '0x71',
'KEY_F23': '0x72',
'KEY_F24': '0x73',
'KEY_OPEN': '0x74',
'KEY_HELP': '0x75',
'KEY_PROPS': '0x76',
'KEY_FRONT': '0x77',
'KEY_STOP': '0x78',
'KEY_AGAIN': '0x79',
'KEY_UNDO': '0x7a',
'KEY_CUT': '0x7b',
'KEY_COPY': '0x7c',
'KEY_PASTE': '0x7d',
'KEY_FIND': '0x7e',
'KEY_MUTE': '0x7f',
'KEY_VOLUMEUP': '0x80',
'KEY_VOLUMEDOWN': '0x81',
'KEY_KPCOMMA': '0x85',
'KEY_RO': '0x87',
'KEY_KATAKANAHIRAGANA': '0x88',
'KEY_YEN': '0x89',
'KEY_HENKAN': '0x8a',
'KEY_MUHENKAN': '0x8b',
'KEY_KPJPCOMMA': '0x8c',
'KEY_HANGEUL': '0x90',
'KEY_HANJA': '0x91',
'KEY_KATAKANA': '0x92',
'KEY_HIRAGANA': '0x93',
'KEY_ZENKAKUHANKAKU': '0x94',
'KEY_KPLEFTPAREN': '0xb6',
'KEY_KPRIGHTPAREN': '0xb7',
'KEY_LEFTCTRL': '0xe0',
'KEY_LEFTSHIFT': '0xe1',
'KEY_LEFTALT': '0xe2',
'KEY_LEFTWINDOWS': '0xe3',
'KEY_RIGHTCTRL': '0xe4',
'KEY_RIGHTSHIFT': '0xe5',
'KEY_RIGHTALT': '0xe6',
'KEY_RIGHTMETA': '0xe7',
'KEY_MEDIA_PLAYPAUSE': '0xe8',
'KEY_MEDIA_STOPCD': '0xe9',
'KEY_MEDIA_PREVIOUSSONG': '0xea',
'KEY_MEDIA_NEXTSONG': '0xeb',
'KEY_MEDIA_EJECTCD': '0xec',
'KEY_MEDIA_VOLUMEUP': '0xed',
'KEY_MEDIA_VOLUMEDOWN': '0xee',
'KEY_MEDIA_MUTE': '0xef',
'KEY_MEDIA_WWW': '0xf0',
'KEY_MEDIA_BACK': '0xf1',
'KEY_MEDIA_FORWARD': '0xf2',
'KEY_MEDIA_STOP': '0xf3',
'KEY_MEDIA_FIND': '0xf4',
'KEY_MEDIA_SCROLLUP': '0xf5',
'KEY_MEDIA_SCROLLDOWN': '0xf6',
'KEY_MEDIA_EDIT': '0xf7',
'KEY_MEDIA_SLEEP': '0xf8',
'KEY_MEDIA_COFFEE': '0xf9',
'KEY_MEDIA_REFRESH': '0xfa',
'KEY_MEDIA_CALC': '0xfb',
}

243
jskeycodes.py Normal file
View File

@ -0,0 +1,243 @@
jskeycodes = {
'KEY_A': 'KeyA',
'KEY_B': 'KeyB',
'KEY_C': 'KeyC',
'KEY_D': 'KeyD',
'KEY_E': 'KeyE',
'KEY_F': 'KeyF',
'KEY_G': 'KeyG',
'KEY_H': 'KeyH',
'KEY_I': 'KeyI',
'KEY_J': 'KeyJ',
'KEY_K': 'KeyK',
'KEY_L': 'KeyL',
'KEY_M': 'KeyM',
'KEY_N': 'KeyN',
'KEY_O': 'KeyO',
'KEY_P': 'KeyP',
'KEY_Q': 'KeyQ',
'KEY_R': 'KeyR',
'KEY_S': 'KeyS',
'KEY_T': 'KeyT',
'KEY_U': 'KeyU',
'KEY_V': 'KeyV',
'KEY_W': 'KeyW',
'KEY_X': 'KeyX',
'KEY_Y': 'KeyY',
'KEY_Z': 'KeyZ',
'KEY_GRAVE': 'Backquote',
'KEY_0': 'Digit0',
'KEY_1': 'Digit1',
'KEY_2': 'Digit2',
'KEY_3': 'Digit3',
'KEY_4': 'Digit4',
'KEY_5': 'Digit5',
'KEY_6': 'Digit6',
'KEY_7': 'Digit7',
'KEY_8': 'Digit8',
'KEY_9': 'Digit9',
'KEY_MINUS': 'Minus',
'KEY_EQUAL': 'Equal',
'KEY_LEFTBRACE': 'BracketLeft',
'KEY_RIGHTBRACE': 'BracketRight',
'KEY_SEMICOLON': 'Semicolon',
'KEY_APOSTROPHE': 'Quote',
'KEY_BACKSLASH': 'Backslash',
'KEY_COMMA': 'Comma',
'KEY_DOT': 'Period',
'KEY_SLASH': 'Slash',
'KEY_102ND': 'IntlBackslash',
'KEY_KP0': 'Numpad0',
'KEY_KP1': 'Numpad1',
'KEY_KP2': 'Numpad2',
'KEY_KP3': 'Numpad3',
'KEY_KP4': 'Numpad4',
'KEY_KP5': 'Numpad5',
'KEY_KP6': 'Numpad6',
'KEY_KP7': 'Numpad7',
'KEY_KP8': 'Numpad8',
'KEY_KP9': 'Numpad9',
'KEY_KPASTERISK': 'NumpadMultiply',
'KEY_KPPLUS': 'NumpadAdd',
'KEY_KPMINUS': 'NumpadSubtract',
'KEY_KPDOT': 'NumpadDecimal',
'KEY_KPSLASH': 'NumpadDivide',
'KEY_KPENTER': 'NumpadEnter',
'KEY_ESC': 'Escape',
'KEY_F1': 'F1',
'KEY_F2': 'F2',
'KEY_F3': 'F3',
'KEY_F4': 'F4',
'KEY_F5': 'F5',
'KEY_F6': 'F6',
'KEY_F7': 'F7',
'KEY_F8': 'F8',
'KEY_F9': 'F9',
'KEY_F10': 'F10',
'KEY_F11': 'F11',
'KEY_F12': 'F12',
'KEY_F13': 'F13',
'KEY_F14': 'F14',
'KEY_F15': 'F15',
'KEY_F16': 'F16',
'KEY_F17': 'F17',
'KEY_F18': 'F18',
'KEY_F19': 'F19',
'KEY_F20': 'F20',
'KEY_F21': 'F21',
'KEY_F22': 'F22',
'KEY_F23': 'F23',
'KEY_BACKSPACE': 'Backspace',
'KEY_SPACE': 'Space',
'KEY_TAB': 'Tab',
'KEY_ENTER' : 'Enter',
'KEY_PAGEUP': 'PageUp',
'KEY_PAGEDOWN': 'PageDown',
'KEY_HOME': 'Home',
'KEY_END': 'End',
'KEY_INSERT': 'Insert',
'KEY_DELETE': 'Delete',
'KEY_UP': 'ArrowUp',
'KEY_DOWN': 'ArrowDown',
'KEY_LEFT': 'ArrowLeft',
'KEY_RIGHT': 'ArrowRight',
'KEY_NUMLOCK': 'NumLock',
'KEY_CAPSLOCK': 'CapsLock',
'KEY_SCROLLLOCK': 'ScrollLock',
'KEY_LEFTWINDOWS': 'MetaLeft',
'KEY_RIGHTMETA': 'ContextMenu',
}
jskeywhich = {
'KEY_CANCEL': 3,
'KEY_BACKSPACE': 8,
'KEY_TAB': 9,
'KEY_CLEAR': 12,
'KEY_ENTER': 13,
'KEY_...': 14,
'KEY_SHIFT': 16,
'KEY_CONTROL': 17,
'KEY_ALT': 18,
'KEY_PAUSE': 19,
'KEY_CAPSLOCK': 20,
'KEY_ESC': 27,
'KEY_SPACE': 32,
'KEY_PAGEUP': 33,
'KEY_PAGEDOWN': 34,
'KEY_END': 35,
'KEY_HOME': 36,
'KEY_LEFT': 37,
'KEY_UP': 38,
'KEY_RIGHT': 39,
'KEY_DOWN': 40,
'KEY_PRINTSCREEN': 44,
'KEY_INSERT': 45,
'KEY_DELETE': 46,
'KEY_0': 48,
'KEY_1': 49,
'KEY_2': 50,
'KEY_3': 51,
'KEY_4': 52,
'KEY_5': 53,
'KEY_6': 54,
'KEY_7': 55,
'KEY_8': 56,
'KEY_9': 57,
'KEY_SEMICOLON': 59,
'KEY_EQUAL': 61,
'KEY_A': 65,
'KEY_B': 66,
'KEY_C': 67,
'KEY_D': 68,
'KEY_E': 69,
'KEY_F': 70,
'KEY_G': 71,
'KEY_H': 72,
'KEY_I': 73,
'KEY_J': 74,
'KEY_K': 75,
'KEY_L': 76,
'KEY_M': 77,
'KEY_N': 78,
'KEY_O': 79,
'KEY_P': 80,
'KEY_Q': 81,
'KEY_R': 82,
'KEY_S': 83,
'KEY_T': 84,
'KEY_U': 85,
'KEY_V': 86,
'KEY_W': 87,
'KEY_X': 88,
'KEY_Y': 89,
'KEY_Z': 90,
'KEY_CONTEXTMENU': 93,
'KEY_NP0': 96,
'KEY_NP1': 97,
'KEY_NP2': 98,
'KEY_NP3': 99,
'KEY_NP4': 100,
'KEY_NP5': 101,
'KEY_NP6': 102,
'KEY_NP7': 103,
'KEY_NP8': 104,
'KEY_NP9': 105,
'KEY_KPASTERISK': 106,
'KEY_KPPLUS': 107,
'KEY_SEPARATOR': 108,
'KEY_KPMINUS': 109,
'KEY_KPDOT': 110,
'KEY_KPSLASH': 111,
'KEY_F1': 112,
'KEY_F2': 113,
'KEY_F3': 114,
'KEY_F4': 115,
'KEY_F5': 116,
'KEY_F6': 117,
'KEY_F7': 118,
'KEY_F8': 119,
'KEY_F9': 120,
'KEY_F10': 121,
'KEY_F11': 122,
'KEY_F12': 123,
'KEY_F13': 124,
'KEY_F14': 125,
'KEY_F15': 126,
'KEY_F16': 127,
'KEY_F17': 128,
'KEY_F18': 129,
'KEY_F19': 130,
'KEY_F20': 131,
'KEY_F21': 132,
'KEY_F22': 133,
'KEY_F23': 134,
'KEY_F24': 135,
'KEY_NUMLOCK': 144,
'KEY_SCROLLLOCK': 145,
'KEY_FIND': 170,
'KEY_COMMA': 188,
'KEY_MINUS': 189,
'KEY_DOT': 190,
'KEY_SLASH': 191,
'KEY_GRAVE': 192,
'KEY_LEFTBRACE': 219,
'KEY_BACKSLASH': 220,
'KEY_RIGHTBRACE': 221,
'KEY_APOSTROPHE': 222,
'KEY_META': 224
}