Allow strings in keymap. Replace with keys in keyboard _init cycle.

This commit is contained in:
John Morrison 2022-04-25 20:16:48 +01:00 committed by xs5871
parent a4d6a44a04
commit 9f964aba36
4 changed files with 43 additions and 6 deletions

View File

@ -2,9 +2,9 @@
KMK is configured through a rather large plain-old-Python class called
`KMKKeyboard`. Subclasses of this configuration exist which pre-fill defaults
for various known keyboards (for example, many QMK, TMK, or ZMK keyboards
are supported with a nice!nano, or through our ItsyBitsy to Pro Micro pinout adapter.
This class is the main interface between end users and the inner workings of KMK.
for various known keyboards (for example, many QMK, TMK, or ZMK keyboards
are supported with a nice!nano, or through our ItsyBitsy to Pro Micro pinout adapter.
This class is the main interface between end users and the inner workings of KMK.
Let's dive in!
- Edit or create a file called `main.py` on your `CIRCUITPY` drive. You can also
@ -73,6 +73,13 @@ print(dir(board))
keyboard.keymap = [[KC.A, KC.B]]
```
- You can also define the keymap with strings. They get replaced with `Key` objects
when the keyboard is started:
```python
keyboard.keymap = [['A', 'B']]
```
You can further define a bunch of other stuff:
- `keyboard.debug_enabled` which will spew a ton of debugging information to the serial

View File

@ -19,11 +19,11 @@ mergulhar!
ter problemas de corrupção. ou você pode estar em um dia ruim e apagar o
arquivo errado.
- Atribuir uma instância `KMKKeyboard` a uma variável, por exemplo, `keyboard =
KMKKeyboard()` (note os parênteses).
- Atribuir uma instância `KMKKeyboard` a uma variável, por exemplo,
`keyboard = KMKKeyboard()` (note os parênteses).
- Certificar-se quie esta instância de `KMKKeyboard` é realmente executada ao
fim do arquivo usando um bloco como este:
fim do arquivo usando um bloco como este:
```python
if __name__ == '__main__':
@ -75,6 +75,13 @@ print(dir(board))
keyboard.keymap = [[KC.A, KC.B]]
```
- Você também pode definir o mapa de teclas com strings. Eles são substituídos por
`Key` objetos quando o teclado é iniciado:
```python
keyboard.keymap = [['A', 'B']]
```
Você pode definir um monte de outras coisas
- `keyboard.debug_enabled` que vai atirar um monte de informação de depuração

View File

@ -293,6 +293,15 @@ class KMKKeyboard:
cm.extend(m.coord_mapping)
self.coord_mapping = tuple(cm)
def _init_replace_strings_in_keymap_with_keys(self):
for _, layer in enumerate(self.keymap):
for key_idx, key in enumerate(layer):
if isinstance(key, str):
replacement = KC[key]
layer[key_idx] = replacement
if self.debug_enabled:
print(f"Replacing '{key}' with {replacement}")
def _init_hid(self):
if self.hid_type == HIDModes.NOOP:
self._hid_helper = AbstractHID
@ -475,6 +484,7 @@ class KMKKeyboard:
self._init_sanity_check()
self._init_hid()
self._init_matrix()
self._init_replace_strings_in_keymap_with_keys()
self._init_coord_mapping()
for module in self.modules:

View File

@ -10,6 +10,19 @@ class TestKmkKeyboard(unittest.TestCase):
keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}])
def test_basic_kmk_keyboard_replace_string_primary_name(self):
keyboard = KeyboardTest([], [['1', '2', '3', '4']])
keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}])
def test_basic_kmk_keyboard_replace_string_secondary_name(self):
keyboard = KeyboardTest([], [['N1', 'N2', 'N3', 'N4']])
keyboard.test('Simple key press', [(0, True), (0, False)], [{KC.N1}, {}])
def test_basic_kmk_keyboard_unknown_replacement_string(self):
with self.assertRaises(ValueError):
KeyboardTest([], [['UNKNOWN1', 'UNKNOWN2', 'UNKNOWN3', 'UNKNOWN4']])
if __name__ == '__main__':
unittest.main()