refactoring

This commit is contained in:
Devaev Maxim 2019-09-26 04:23:50 +03:00
parent 2f767573d3
commit 5e1e3cdf64
10 changed files with 130 additions and 133 deletions

View File

@ -103,7 +103,7 @@ run-ipmi: 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 \
--volume `pwd`:/src \
-it $(TESTENV_IMAGE) bash -c "cd src && ./genmap.py keymap.in $$file.mako $$file"; \

View File

@ -33,8 +33,8 @@ import mako.template
# =====
@dataclasses.dataclass(frozen=True)
class _KeyMapping:
arduino_hid_code: int
arduino_hid_key: str
serial_hid_code: int
serial_hid_key: str
web_key: str
@ -47,8 +47,8 @@ def _read_keymap_in(path: str) -> List[_KeyMapping]:
parts = list(map(str.strip, line.split()))
if len(parts) >= 3:
keymap.append(_KeyMapping(
arduino_hid_code=int(parts[0]),
arduino_hid_key=parts[1],
serial_hid_code=int(parts[0]),
serial_hid_key=parts[1],
web_key=parts[2],
))
return keymap

View File

@ -29,8 +29,8 @@
<%! import operator %>
INLINE KeyboardKeycode keymap(uint8_t code) {
switch(code) {
% for km in sorted(keymap, key=operator.attrgetter("arduino_hid_key")):
case ${km.arduino_hid_code}: return ${km.arduino_hid_key};
% for km in sorted(keymap, key=operator.attrgetter("serial_hid_key")):
case ${km.serial_hid_code}: return ${km.serial_hid_key};
% endfor
default: return KEY_ERROR_UNDEFINED;
}

View File

@ -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

View File

@ -20,17 +20,108 @@
# ========================================================================== #
import pkgutil
import dataclasses
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]:
return yaml.safe_load(pkgutil.get_data("kvmd", "data/keymap.yaml").decode()) # type: ignore
# =====
KEYMAP = _get_keymap()
KEYMAP: Dict[str, Key] = {
"AltLeft": Key(serial=SerialKey(code=79)),
"AltRight": Key(serial=SerialKey(code=83)),
"ArrowDown": Key(serial=SerialKey(code=75)),
"ArrowLeft": Key(serial=SerialKey(code=74)),
"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)),
}

View File

@ -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 %>
# =====
KEYMAP: Dict[str, 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
}

View File

@ -82,7 +82,7 @@ class _KeyEvent(_BoolEvent):
assert self.name in keymap.KEYMAP
def make_command(self) -> bytes:
code = keymap.KEYMAP[self.name]
code = keymap.KEYMAP[self.name].serial.code
key_bytes = bytes([code])
assert len(key_bytes) == 1, (self, key_bytes, code)
state_bytes = (b"\x01" if self.state else b"\x00")

View File

@ -93,10 +93,6 @@ def main() -> None:
"kvmd.apps.ipmi",
],
package_data={
"kvmd": ["data/*.yaml"],
},
scripts=[
os.path.join("scripts", name)
for name in os.listdir("scripts")

View File

@ -8,8 +8,8 @@ IpmiServer.handle_raw_request
fake_rpi.RPi.GPIO
_KeyMapping.arduino_hid_code
_KeyMapping.arduino_hid_key
_KeyMapping.serial_hid_code
_KeyMapping.serial_hid_key
_KeyMapping.web_key
_ScriptWriter.get_args

View File

@ -27,8 +27,7 @@ from kvmd.keymap import KEYMAP
# =====
def test_ok__keymap() -> None:
assert type(KEYMAP["KeyA"]) == int # pylint: disable=unidiomatic-typecheck
assert KEYMAP["KeyA"] == 1
assert KEYMAP["KeyA"].serial.code == 1
def test_fail__keymap() -> None: