Newer
Older
voi / voi_keyboard.py
import uinput
from pythonosc import dispatcher
from pythonosc import osc_server

keylist = [
    "KEY_A",
    "KEY_B",
    "KEY_C",
    "KEY_D",
    "KEY_E",
    "KEY_F",
    "KEY_G",
    "KEY_H",
    "KEY_I",
    "KEY_J",
    "KEY_K",
    "KEY_L",
    "KEY_M",
    "KEY_N",
    "KEY_O",
    "KEY_P",
    "KEY_Q",
    "KEY_R",
    "KEY_S",
    "KEY_T",
    "KEY_U",
    "KEY_V",
    "KEY_W",
    "KEY_X",
    "KEY_Y",
    "KEY_Z",
    "KEY_1",
    "KEY_2",
    "KEY_3",
    "KEY_4",
    "KEY_5",
    "KEY_6",
    "KEY_7",
    "KEY_8",
    "KEY_9",
    "KEY_0",
    "KEY_MINUS",
    "KEY_EQUAL",
    "KEY_YEN",
    "KEY_LEFTBRACE",
    "KEY_RIGHTBRACE",
    "KEY_SEMICOLON",
    "KEY_APOSTROPHE",
    "KEY_BACKSLASH",
    "KEY_COMMA",
    "KEY_DOT",
    "KEY_SLASH",
    "KEY_BACKSLASH",
    "KEY_F1",
    "KEY_F2",
    "KEY_F3",
    "KEY_F4",
    "KEY_F5",
    "KEY_F6",
    "KEY_F7",
    "KEY_F8",
    "KEY_F9",
    "KEY_F10",
    "KEY_F11",
    "KEY_F12",
    "KEY_ESC",
    "KEY_TAB",
    "KEY_CAPSLOCK",
    "KEY_LEFTSHIFT",
    "KEY_LEFTCTRL",
    "KEY_LEFTMETA",
    "KEY_LEFTALT",
    "KEY_BACKSPACE",
    "KEY_ENTER",
    "KEY_RIGHTSHIFT",
    "KEY_RIGHTCTRL",
    "KEY_RIGHTALT",
    "KEY_SPACE",
    "KEY_MUHENKAN",
    "KEY_HENKAN",
    "KEY_KATAKANAHIRAGANA"
]


events = "events_list = (\n"
for key in keylist:
    events += (f"   uinput.{key},\n")
events += ")"
events_list = ""
exec(f"{events}")

def key_to_key(key):
    for k in keylist:
        if k == key:
            return key
    return ""

def key_emit(dev:uinput.Device,key,state):
    device.emit(key, state)

def print_handler(unused_addr, *args):
    print(f"Received message:{unused_addr} {args}")

def key_handler(addr, *args):
    if addr[0] != "/":
        return
    addr = addr[1:]
    if key_to_key(addr) == "":
        return
    exec(f"key_emit(device,uinput.{addr},int(args[0]))")

device = uinput.Device(events_list)
handlers = [
    ("/*",print_handler),
    ("/KEY*",key_handler),
]

if __name__ == "__main__":
    dispatcher = dispatcher.Dispatcher()
    for addr, func in handlers:
        dispatcher.map(addr, func)

    ip = "127.0.0.1"
    port = 7777

    server = osc_server.ThreadingOSCUDPServer((ip, port), dispatcher)
    print(f"Serving on {ip}:{port}")
    server.serve_forever()