183 lines
3.5 KiB
Python
183 lines
3.5 KiB
Python
from enum import IntEnum
|
|
from os import name
|
|
import serial
|
|
from ipkvm import profile
|
|
import threading
|
|
from queue import Queue
|
|
import json
|
|
|
|
# Python can't make number to number enums???
|
|
HIDMouseScanCodes = {
|
|
0: 1,
|
|
2: 2,
|
|
1: 4,
|
|
3: 8,
|
|
4: 16
|
|
}
|
|
|
|
# God Bless CHADGPT
|
|
class HIDKeyCode(IntEnum):
|
|
"""
|
|
Enum that translates modern JS key.code andvalues to HID scancodes.
|
|
"""
|
|
# Letter keys (A-Z)
|
|
KeyA = 4
|
|
KeyB = 5
|
|
KeyC = 6
|
|
KeyD = 7
|
|
KeyE = 8
|
|
KeyF = 9
|
|
KeyG = 10
|
|
KeyH = 11
|
|
KeyI = 12
|
|
KeyJ = 13
|
|
KeyK = 14
|
|
KeyL = 15
|
|
KeyM = 16
|
|
KeyN = 17
|
|
KeyO = 18
|
|
KeyP = 19
|
|
KeyQ = 20
|
|
KeyR = 21
|
|
KeyS = 22
|
|
KeyT = 23
|
|
KeyU = 24
|
|
KeyV = 25
|
|
KeyW = 26
|
|
KeyX = 27
|
|
KeyY = 28
|
|
KeyZ = 29
|
|
|
|
# Number keys (top row)
|
|
Digit1 = 30
|
|
Digit2 = 31
|
|
Digit3 = 32
|
|
Digit4 = 33
|
|
Digit5 = 34
|
|
Digit6 = 35
|
|
Digit7 = 36
|
|
Digit8 = 37
|
|
Digit9 = 38
|
|
Digit0 = 39
|
|
|
|
# Control keys
|
|
Enter = 40
|
|
Escape = 41
|
|
Backspace = 42
|
|
Tab = 43
|
|
Space = 44
|
|
|
|
Minus = 45
|
|
Equal = 46
|
|
BracketLeft = 47
|
|
BracketRight = 48
|
|
Backslash = 49
|
|
|
|
# Punctuation keys
|
|
Semicolon = 51
|
|
Quote = 52
|
|
Backquote = 53
|
|
Comma = 54
|
|
Period = 55
|
|
Slash = 56
|
|
|
|
CapsLock = 57
|
|
|
|
# Function keys (F1-F12)
|
|
F1 = 58
|
|
F2 = 59
|
|
F3 = 60
|
|
F4 = 61
|
|
F5 = 62
|
|
F6 = 63
|
|
F7 = 64
|
|
F8 = 65
|
|
F9 = 66
|
|
F10 = 67
|
|
F11 = 68
|
|
F12 = 69
|
|
|
|
PrintScreen = 70
|
|
ScrollLock = 71
|
|
Pause = 72
|
|
|
|
Insert = 73
|
|
Home = 74
|
|
PageUp = 75
|
|
|
|
Delete = 76
|
|
End = 77
|
|
PageDown = 78
|
|
|
|
ArrowRight = 79
|
|
ArrowLeft = 80
|
|
ArrowDown = 81
|
|
ArrowUp = 82
|
|
|
|
# Numpad keys
|
|
NumLock = 83
|
|
NumpadDivide = 84
|
|
NumpadMultiply = 85
|
|
NumpadSubtract = 86
|
|
NumpadAdd = 87
|
|
NumpadEnter = 88
|
|
Numpad1 = 89
|
|
Numpad2 = 90
|
|
Numpad3 = 91
|
|
Numpad4 = 92
|
|
Numpad5 = 93
|
|
Numpad6 = 94
|
|
Numpad7 = 95
|
|
Numpad8 = 96
|
|
Numpad9 = 97
|
|
Numpad0 = 98
|
|
NumpadDecimal = 99
|
|
|
|
# Additional keys
|
|
IntlBackslash = 100
|
|
ContextMenu = 101
|
|
Power = 102
|
|
|
|
# Modifier keys
|
|
ControlLeft = 224
|
|
ShiftLeft = 225
|
|
AltLeft = 226
|
|
MetaLeft = 227 # Windows / Command key (left)
|
|
ControlRight = 228
|
|
ShiftRight = 229
|
|
AltRight = 230
|
|
MetaRight = 231 # Windows / Command key (right)
|
|
|
|
class Esp32Serial(threading.Thread):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.post_code_queue: Queue[str] = Queue()
|
|
self.mkb_queue: Queue[dict[str, int | dict[str, int]]] = Queue()
|
|
self.change_serial_device = threading.Event()
|
|
self.device = self.get_device()
|
|
|
|
self.start()
|
|
|
|
def run(self):
|
|
while True:
|
|
if self.change_serial_device.is_set():
|
|
self.change_serial_device.clear()
|
|
self.device = self.get_device()
|
|
|
|
with self.device as ser:
|
|
while not self.mkb_queue.empty():
|
|
msg = self.mkb_queue.get()
|
|
ser.write(json.dumps(msg).encode())
|
|
|
|
while ser.in_waiting > 0:
|
|
print(ser.read().hex())
|
|
# self.post_code_queue.put(ser.read().hex())
|
|
|
|
def get_device(self):
|
|
if name == "posix":
|
|
return serial.Serial(f"/dev/serial/by-id/{profile["esp32_serial"]}", 115200, bytesize=serial.EIGHTBITS,
|
|
parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE)
|
|
|
|
else:
|
|
raise RuntimeError("Your OS is unsupported!")
|