summaryrefslogtreecommitdiff
path: root/lib/python/qmk/info.py
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2023-11-20 15:41:48 +0000
committerGitHub <noreply@github.com>2023-11-20 15:41:48 +0000
commite279c78ba3054ebc2e294dd91ea98341cc509d1e (patch)
treef22fc30fa1f966c708ec137f667c44a6528c4403 /lib/python/qmk/info.py
parent62cca5c43a63e694da4596dc41d1251f9c530198 (diff)
Enable linking of encoders to switch within layout macros (#22264)
Diffstat (limited to 'lib/python/qmk/info.py')
-rw-r--r--lib/python/qmk/info.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
index fe829a724a..3efd34555c 100644
--- a/lib/python/qmk/info.py
+++ b/lib/python/qmk/info.py
@@ -55,6 +55,29 @@ def _get_key_left_position(key):
return key['x'] - 0.25 if key.get('h', 1) == 2 and key.get('w', 1) == 1.25 else key['x']
+def _find_invalid_encoder_index(info_data):
+ """Perform additional validation of encoders
+ """
+ enc_count = len(info_data.get('encoder', {}).get('rotary', []))
+ enc_count += len(info_data.get('split', {}).get('encoder', {}).get('right', {}).get('rotary', []))
+
+ ret = []
+ layouts = info_data.get('layouts', {})
+ for layout_name, layout_data in layouts.items():
+ found = set()
+ for key in layout_data['layout']:
+ if 'encoder' in key:
+ if enc_count == 0:
+ ret.append((layout_name, key['encoder'], 'non-configured'))
+ elif key['encoder'] >= enc_count:
+ ret.append((layout_name, key['encoder'], 'out of bounds'))
+ elif key['encoder'] in found:
+ ret.append((layout_name, key['encoder'], 'duplicate'))
+ found.add(key['encoder'])
+
+ return ret
+
+
def _additional_validation(keyboard, info_data):
"""Non schema checks
"""
@@ -105,6 +128,11 @@ def _additional_validation(keyboard, info_data):
if not decl.get("aliases", []):
_log_error(info_data, f'Keycode {decl["key"]} has no short form alias')
+ # encoder IDs in layouts must be in range and not duplicated
+ found = _find_invalid_encoder_index(info_data)
+ for layout_name, encoder_index, reason in found:
+ _log_error(info_data, f'Layout "{layout_name}" contains {reason} encoder index {encoder_index}.')
+
def _validate(keyboard, info_data):
"""Perform various validation on the provided info.json data