mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 09:10:30 +08:00
refactoring
This commit is contained in:
parent
2f767573d3
commit
5e1e3cdf64
2
Makefile
2
Makefile
@ -103,7 +103,7 @@ run-ipmi: testenv
|
|||||||
|
|
||||||
|
|
||||||
regen: testenv
|
regen: testenv
|
||||||
for file in kvmd/data/keymap.yaml hid/src/keymap.h; do \
|
for file in kvmd/keymap.py hid/src/keymap.h; do \
|
||||||
docker run --user `id -u`:`id -g` --rm \
|
docker run --user `id -u`:`id -g` --rm \
|
||||||
--volume `pwd`:/src \
|
--volume `pwd`:/src \
|
||||||
-it $(TESTENV_IMAGE) bash -c "cd src && ./genmap.py keymap.in $$file.mako $$file"; \
|
-it $(TESTENV_IMAGE) bash -c "cd src && ./genmap.py keymap.in $$file.mako $$file"; \
|
||||||
|
|||||||
@ -33,8 +33,8 @@ import mako.template
|
|||||||
# =====
|
# =====
|
||||||
@dataclasses.dataclass(frozen=True)
|
@dataclasses.dataclass(frozen=True)
|
||||||
class _KeyMapping:
|
class _KeyMapping:
|
||||||
arduino_hid_code: int
|
serial_hid_code: int
|
||||||
arduino_hid_key: str
|
serial_hid_key: str
|
||||||
web_key: str
|
web_key: str
|
||||||
|
|
||||||
|
|
||||||
@ -47,8 +47,8 @@ def _read_keymap_in(path: str) -> List[_KeyMapping]:
|
|||||||
parts = list(map(str.strip, line.split()))
|
parts = list(map(str.strip, line.split()))
|
||||||
if len(parts) >= 3:
|
if len(parts) >= 3:
|
||||||
keymap.append(_KeyMapping(
|
keymap.append(_KeyMapping(
|
||||||
arduino_hid_code=int(parts[0]),
|
serial_hid_code=int(parts[0]),
|
||||||
arduino_hid_key=parts[1],
|
serial_hid_key=parts[1],
|
||||||
web_key=parts[2],
|
web_key=parts[2],
|
||||||
))
|
))
|
||||||
return keymap
|
return keymap
|
||||||
|
|||||||
@ -29,8 +29,8 @@
|
|||||||
<%! import operator %>
|
<%! import operator %>
|
||||||
INLINE KeyboardKeycode keymap(uint8_t code) {
|
INLINE KeyboardKeycode keymap(uint8_t code) {
|
||||||
switch(code) {
|
switch(code) {
|
||||||
% for km in sorted(keymap, key=operator.attrgetter("arduino_hid_key")):
|
% for km in sorted(keymap, key=operator.attrgetter("serial_hid_key")):
|
||||||
case ${km.arduino_hid_code}: return ${km.arduino_hid_key};
|
case ${km.serial_hid_code}: return ${km.serial_hid_key};
|
||||||
% endfor
|
% endfor
|
||||||
default: return KEY_ERROR_UNDEFINED;
|
default: return KEY_ERROR_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,108 +0,0 @@
|
|||||||
# ========================================================================== #
|
|
||||||
# #
|
|
||||||
# KVMD - The main Pi-KVM daemon. #
|
|
||||||
# #
|
|
||||||
# Copyright (C) 2018 Maxim Devaev <mdevaev@gmail.com> #
|
|
||||||
# #
|
|
||||||
# This program is free software: you can redistribute it and/or modify #
|
|
||||||
# it under the terms of the GNU General Public License as published by #
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or #
|
|
||||||
# (at your option) any later version. #
|
|
||||||
# #
|
|
||||||
# This program is distributed in the hope that it will be useful, #
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
||||||
# GNU General Public License for more details. #
|
|
||||||
# #
|
|
||||||
# You should have received a copy of the GNU General Public License #
|
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
|
||||||
# #
|
|
||||||
# ========================================================================== #
|
|
||||||
|
|
||||||
|
|
||||||
AltLeft: 79
|
|
||||||
AltRight: 83
|
|
||||||
ArrowDown: 75
|
|
||||||
ArrowLeft: 74
|
|
||||||
ArrowRight: 73
|
|
||||||
ArrowUp: 76
|
|
||||||
Backquote: 49
|
|
||||||
Backslash: 46
|
|
||||||
Backspace: 39
|
|
||||||
BracketLeft: 44
|
|
||||||
BracketRight: 45
|
|
||||||
CapsLock: 53
|
|
||||||
Comma: 50
|
|
||||||
ControlLeft: 77
|
|
||||||
ControlRight: 81
|
|
||||||
Delete: 70
|
|
||||||
Digit0: 36
|
|
||||||
Digit1: 27
|
|
||||||
Digit2: 28
|
|
||||||
Digit3: 29
|
|
||||||
Digit4: 30
|
|
||||||
Digit5: 31
|
|
||||||
Digit6: 32
|
|
||||||
Digit7: 33
|
|
||||||
Digit8: 34
|
|
||||||
Digit9: 35
|
|
||||||
End: 71
|
|
||||||
Enter: 37
|
|
||||||
Equal: 43
|
|
||||||
Escape: 38
|
|
||||||
F1: 54
|
|
||||||
F10: 63
|
|
||||||
F11: 64
|
|
||||||
F12: 65
|
|
||||||
F2: 55
|
|
||||||
F3: 56
|
|
||||||
F4: 57
|
|
||||||
F5: 58
|
|
||||||
F6: 59
|
|
||||||
F7: 60
|
|
||||||
F8: 61
|
|
||||||
F9: 62
|
|
||||||
Home: 68
|
|
||||||
Insert: 67
|
|
||||||
KeyA: 1
|
|
||||||
KeyB: 2
|
|
||||||
KeyC: 3
|
|
||||||
KeyD: 4
|
|
||||||
KeyE: 5
|
|
||||||
KeyF: 6
|
|
||||||
KeyG: 7
|
|
||||||
KeyH: 8
|
|
||||||
KeyI: 9
|
|
||||||
KeyJ: 10
|
|
||||||
KeyK: 11
|
|
||||||
KeyL: 12
|
|
||||||
KeyM: 13
|
|
||||||
KeyN: 14
|
|
||||||
KeyO: 15
|
|
||||||
KeyP: 16
|
|
||||||
KeyQ: 17
|
|
||||||
KeyR: 18
|
|
||||||
KeyS: 19
|
|
||||||
KeyT: 20
|
|
||||||
KeyU: 21
|
|
||||||
KeyV: 22
|
|
||||||
KeyW: 23
|
|
||||||
KeyX: 24
|
|
||||||
KeyY: 25
|
|
||||||
KeyZ: 26
|
|
||||||
MetaLeft: 80
|
|
||||||
MetaRight: 84
|
|
||||||
Minus: 42
|
|
||||||
PageDown: 72
|
|
||||||
PageUp: 69
|
|
||||||
Pause: 85
|
|
||||||
Period: 51
|
|
||||||
PrintScreen: 66
|
|
||||||
Quote: 48
|
|
||||||
ScrollLock: 86
|
|
||||||
Semicolon: 47
|
|
||||||
ShiftLeft: 78
|
|
||||||
ShiftRight: 82
|
|
||||||
Slash: 52
|
|
||||||
Space: 41
|
|
||||||
Tab: 40
|
|
||||||
107
kvmd/keymap.py
107
kvmd/keymap.py
@ -20,17 +20,108 @@
|
|||||||
# ========================================================================== #
|
# ========================================================================== #
|
||||||
|
|
||||||
|
|
||||||
import pkgutil
|
import dataclasses
|
||||||
|
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
# =====
|
||||||
|
@dataclasses.dataclass(frozen=True)
|
||||||
|
class SerialKey:
|
||||||
|
code: int
|
||||||
|
|
||||||
|
|
||||||
|
@dataclasses.dataclass(frozen=True)
|
||||||
|
class Key:
|
||||||
|
serial: SerialKey
|
||||||
|
|
||||||
|
|
||||||
# =====
|
# =====
|
||||||
def _get_keymap() -> Dict[str, int]:
|
KEYMAP: Dict[str, Key] = {
|
||||||
return yaml.safe_load(pkgutil.get_data("kvmd", "data/keymap.yaml").decode()) # type: ignore
|
"AltLeft": Key(serial=SerialKey(code=79)),
|
||||||
|
"AltRight": Key(serial=SerialKey(code=83)),
|
||||||
|
"ArrowDown": Key(serial=SerialKey(code=75)),
|
||||||
# =====
|
"ArrowLeft": Key(serial=SerialKey(code=74)),
|
||||||
KEYMAP = _get_keymap()
|
"ArrowRight": Key(serial=SerialKey(code=73)),
|
||||||
|
"ArrowUp": Key(serial=SerialKey(code=76)),
|
||||||
|
"Backquote": Key(serial=SerialKey(code=49)),
|
||||||
|
"Backslash": Key(serial=SerialKey(code=46)),
|
||||||
|
"Backspace": Key(serial=SerialKey(code=39)),
|
||||||
|
"BracketLeft": Key(serial=SerialKey(code=44)),
|
||||||
|
"BracketRight": Key(serial=SerialKey(code=45)),
|
||||||
|
"CapsLock": Key(serial=SerialKey(code=53)),
|
||||||
|
"Comma": Key(serial=SerialKey(code=50)),
|
||||||
|
"ControlLeft": Key(serial=SerialKey(code=77)),
|
||||||
|
"ControlRight": Key(serial=SerialKey(code=81)),
|
||||||
|
"Delete": Key(serial=SerialKey(code=70)),
|
||||||
|
"Digit0": Key(serial=SerialKey(code=36)),
|
||||||
|
"Digit1": Key(serial=SerialKey(code=27)),
|
||||||
|
"Digit2": Key(serial=SerialKey(code=28)),
|
||||||
|
"Digit3": Key(serial=SerialKey(code=29)),
|
||||||
|
"Digit4": Key(serial=SerialKey(code=30)),
|
||||||
|
"Digit5": Key(serial=SerialKey(code=31)),
|
||||||
|
"Digit6": Key(serial=SerialKey(code=32)),
|
||||||
|
"Digit7": Key(serial=SerialKey(code=33)),
|
||||||
|
"Digit8": Key(serial=SerialKey(code=34)),
|
||||||
|
"Digit9": Key(serial=SerialKey(code=35)),
|
||||||
|
"End": Key(serial=SerialKey(code=71)),
|
||||||
|
"Enter": Key(serial=SerialKey(code=37)),
|
||||||
|
"Equal": Key(serial=SerialKey(code=43)),
|
||||||
|
"Escape": Key(serial=SerialKey(code=38)),
|
||||||
|
"F1": Key(serial=SerialKey(code=54)),
|
||||||
|
"F10": Key(serial=SerialKey(code=63)),
|
||||||
|
"F11": Key(serial=SerialKey(code=64)),
|
||||||
|
"F12": Key(serial=SerialKey(code=65)),
|
||||||
|
"F2": Key(serial=SerialKey(code=55)),
|
||||||
|
"F3": Key(serial=SerialKey(code=56)),
|
||||||
|
"F4": Key(serial=SerialKey(code=57)),
|
||||||
|
"F5": Key(serial=SerialKey(code=58)),
|
||||||
|
"F6": Key(serial=SerialKey(code=59)),
|
||||||
|
"F7": Key(serial=SerialKey(code=60)),
|
||||||
|
"F8": Key(serial=SerialKey(code=61)),
|
||||||
|
"F9": Key(serial=SerialKey(code=62)),
|
||||||
|
"Home": Key(serial=SerialKey(code=68)),
|
||||||
|
"Insert": Key(serial=SerialKey(code=67)),
|
||||||
|
"KeyA": Key(serial=SerialKey(code=1)),
|
||||||
|
"KeyB": Key(serial=SerialKey(code=2)),
|
||||||
|
"KeyC": Key(serial=SerialKey(code=3)),
|
||||||
|
"KeyD": Key(serial=SerialKey(code=4)),
|
||||||
|
"KeyE": Key(serial=SerialKey(code=5)),
|
||||||
|
"KeyF": Key(serial=SerialKey(code=6)),
|
||||||
|
"KeyG": Key(serial=SerialKey(code=7)),
|
||||||
|
"KeyH": Key(serial=SerialKey(code=8)),
|
||||||
|
"KeyI": Key(serial=SerialKey(code=9)),
|
||||||
|
"KeyJ": Key(serial=SerialKey(code=10)),
|
||||||
|
"KeyK": Key(serial=SerialKey(code=11)),
|
||||||
|
"KeyL": Key(serial=SerialKey(code=12)),
|
||||||
|
"KeyM": Key(serial=SerialKey(code=13)),
|
||||||
|
"KeyN": Key(serial=SerialKey(code=14)),
|
||||||
|
"KeyO": Key(serial=SerialKey(code=15)),
|
||||||
|
"KeyP": Key(serial=SerialKey(code=16)),
|
||||||
|
"KeyQ": Key(serial=SerialKey(code=17)),
|
||||||
|
"KeyR": Key(serial=SerialKey(code=18)),
|
||||||
|
"KeyS": Key(serial=SerialKey(code=19)),
|
||||||
|
"KeyT": Key(serial=SerialKey(code=20)),
|
||||||
|
"KeyU": Key(serial=SerialKey(code=21)),
|
||||||
|
"KeyV": Key(serial=SerialKey(code=22)),
|
||||||
|
"KeyW": Key(serial=SerialKey(code=23)),
|
||||||
|
"KeyX": Key(serial=SerialKey(code=24)),
|
||||||
|
"KeyY": Key(serial=SerialKey(code=25)),
|
||||||
|
"KeyZ": Key(serial=SerialKey(code=26)),
|
||||||
|
"MetaLeft": Key(serial=SerialKey(code=80)),
|
||||||
|
"MetaRight": Key(serial=SerialKey(code=84)),
|
||||||
|
"Minus": Key(serial=SerialKey(code=42)),
|
||||||
|
"PageDown": Key(serial=SerialKey(code=72)),
|
||||||
|
"PageUp": Key(serial=SerialKey(code=69)),
|
||||||
|
"Pause": Key(serial=SerialKey(code=85)),
|
||||||
|
"Period": Key(serial=SerialKey(code=51)),
|
||||||
|
"PrintScreen": Key(serial=SerialKey(code=66)),
|
||||||
|
"Quote": Key(serial=SerialKey(code=48)),
|
||||||
|
"ScrollLock": Key(serial=SerialKey(code=86)),
|
||||||
|
"Semicolon": Key(serial=SerialKey(code=47)),
|
||||||
|
"ShiftLeft": Key(serial=SerialKey(code=78)),
|
||||||
|
"ShiftRight": Key(serial=SerialKey(code=82)),
|
||||||
|
"Slash": Key(serial=SerialKey(code=52)),
|
||||||
|
"Space": Key(serial=SerialKey(code=41)),
|
||||||
|
"Tab": Key(serial=SerialKey(code=40)),
|
||||||
|
}
|
||||||
|
|||||||
@ -19,7 +19,26 @@
|
|||||||
# #
|
# #
|
||||||
# ========================================================================== #
|
# ========================================================================== #
|
||||||
|
|
||||||
|
|
||||||
|
import dataclasses
|
||||||
|
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
|
||||||
|
# =====
|
||||||
|
@dataclasses.dataclass(frozen=True)
|
||||||
|
class SerialKey:
|
||||||
|
code: int
|
||||||
|
|
||||||
|
|
||||||
|
@dataclasses.dataclass(frozen=True)
|
||||||
|
class Key:
|
||||||
|
serial: SerialKey
|
||||||
|
|
||||||
<%! import operator %>
|
<%! import operator %>
|
||||||
|
# =====
|
||||||
|
KEYMAP: Dict[str, Key] = {
|
||||||
% for km in sorted(keymap, key=operator.attrgetter("web_key")):
|
% for km in sorted(keymap, key=operator.attrgetter("web_key")):
|
||||||
${km.web_key}: ${km.arduino_hid_code}
|
"${km.web_key}": Key(serial=SerialKey(code=${km.serial_hid_code})),
|
||||||
% endfor
|
% endfor
|
||||||
|
}
|
||||||
@ -82,7 +82,7 @@ class _KeyEvent(_BoolEvent):
|
|||||||
assert self.name in keymap.KEYMAP
|
assert self.name in keymap.KEYMAP
|
||||||
|
|
||||||
def make_command(self) -> bytes:
|
def make_command(self) -> bytes:
|
||||||
code = keymap.KEYMAP[self.name]
|
code = keymap.KEYMAP[self.name].serial.code
|
||||||
key_bytes = bytes([code])
|
key_bytes = bytes([code])
|
||||||
assert len(key_bytes) == 1, (self, key_bytes, code)
|
assert len(key_bytes) == 1, (self, key_bytes, code)
|
||||||
state_bytes = (b"\x01" if self.state else b"\x00")
|
state_bytes = (b"\x01" if self.state else b"\x00")
|
||||||
|
|||||||
4
setup.py
4
setup.py
@ -93,10 +93,6 @@ def main() -> None:
|
|||||||
"kvmd.apps.ipmi",
|
"kvmd.apps.ipmi",
|
||||||
],
|
],
|
||||||
|
|
||||||
package_data={
|
|
||||||
"kvmd": ["data/*.yaml"],
|
|
||||||
},
|
|
||||||
|
|
||||||
scripts=[
|
scripts=[
|
||||||
os.path.join("scripts", name)
|
os.path.join("scripts", name)
|
||||||
for name in os.listdir("scripts")
|
for name in os.listdir("scripts")
|
||||||
|
|||||||
@ -8,8 +8,8 @@ IpmiServer.handle_raw_request
|
|||||||
|
|
||||||
fake_rpi.RPi.GPIO
|
fake_rpi.RPi.GPIO
|
||||||
|
|
||||||
_KeyMapping.arduino_hid_code
|
_KeyMapping.serial_hid_code
|
||||||
_KeyMapping.arduino_hid_key
|
_KeyMapping.serial_hid_key
|
||||||
_KeyMapping.web_key
|
_KeyMapping.web_key
|
||||||
|
|
||||||
_ScriptWriter.get_args
|
_ScriptWriter.get_args
|
||||||
|
|||||||
@ -27,8 +27,7 @@ from kvmd.keymap import KEYMAP
|
|||||||
|
|
||||||
# =====
|
# =====
|
||||||
def test_ok__keymap() -> None:
|
def test_ok__keymap() -> None:
|
||||||
assert type(KEYMAP["KeyA"]) == int # pylint: disable=unidiomatic-typecheck
|
assert KEYMAP["KeyA"].serial.code == 1
|
||||||
assert KEYMAP["KeyA"] == 1
|
|
||||||
|
|
||||||
|
|
||||||
def test_fail__keymap() -> None:
|
def test_fail__keymap() -> None:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user