aboutsummaryrefslogtreecommitdiff
path: root/lib/python/qmk/info.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/qmk/info.py')
-rw-r--r--lib/python/qmk/info.py96
1 files changed, 46 insertions, 50 deletions
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
index 9c8521a2a3..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
@@ -352,55 +380,12 @@ def _extract_secure_unlock(info_data, config_c):
info_data['secure']['unlock_sequence'] = unlock_array
-def _extract_split_main(info_data, config_c):
- """Populate data about the split configuration
- """
- # Figure out how the main half is determined
- if config_c.get('SPLIT_HAND_PIN') is True:
- if 'split' not in info_data:
- info_data['split'] = {}
-
- if 'main' in info_data['split']:
- _log_warning(info_data, 'Split main hand is specified in both config.h (SPLIT_HAND_PIN) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
-
- info_data['split']['main'] = 'pin'
-
- if config_c.get('SPLIT_HAND_MATRIX_GRID'):
- if 'split' not in info_data:
- info_data['split'] = {}
-
- if 'main' in info_data['split']:
- _log_warning(info_data, 'Split main hand is specified in both config.h (SPLIT_HAND_MATRIX_GRID) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
-
- info_data['split']['main'] = 'matrix_grid'
- info_data['split']['matrix_grid'] = _extract_pins(config_c['SPLIT_HAND_MATRIX_GRID'])
-
- if config_c.get('EE_HANDS') is True:
- if 'split' not in info_data:
- info_data['split'] = {}
-
- if 'main' in info_data['split']:
- _log_warning(info_data, 'Split main hand is specified in both config.h (EE_HANDS) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
-
- info_data['split']['main'] = 'eeprom'
-
- if config_c.get('MASTER_RIGHT') is True:
- if 'split' not in info_data:
- info_data['split'] = {}
-
- if 'main' in info_data['split']:
- _log_warning(info_data, 'Split main hand is specified in both config.h (MASTER_RIGHT) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
-
- info_data['split']['main'] = 'right'
-
- if config_c.get('MASTER_LEFT') is True:
- if 'split' not in info_data:
- info_data['split'] = {}
-
- if 'main' in info_data['split']:
- _log_warning(info_data, 'Split main hand is specified in both config.h (MASTER_LEFT) and info.json (split.main) (Value: %s), the config.h value wins.' % info_data['split']['main'])
-
- info_data['split']['main'] = 'left'
+def _extract_split_handedness(info_data, config_c):
+ # Migrate
+ split = info_data.get('split', {})
+ if 'matrix_grid' in split:
+ split['handedness'] = split.get('handedness', {})
+ split['handedness']['matrix_grid'] = split.pop('matrix_grid')
def _extract_split_transport(info_data, config_c):
@@ -428,6 +413,15 @@ def _extract_split_transport(info_data, config_c):
if 'protocol' not in info_data['split']['transport']:
info_data['split']['transport']['protocol'] = 'serial'
+ # Migrate
+ transport = info_data.get('split', {}).get('transport', {})
+ if 'sync_matrix_state' in transport:
+ transport['sync'] = transport.get('sync', {})
+ transport['sync']['matrix_state'] = transport.pop('sync_matrix_state')
+ if 'sync_modifiers' in transport:
+ transport['sync'] = transport.get('sync', {})
+ transport['sync']['modifiers'] = transport.pop('sync_modifiers')
+
def _extract_split_right_pins(info_data, config_c):
# Figure out the right half matrix pins
@@ -520,6 +514,8 @@ def _config_to_json(key_type, config_value):
return list(map(str.strip, config_value.split(',')))
elif key_type == 'bool':
+ if isinstance(config_value, bool):
+ return config_value
return config_value in true_values
elif key_type == 'hex':
@@ -583,7 +579,7 @@ def _extract_config_h(info_data, config_c):
_extract_matrix_info(info_data, config_c)
_extract_audio(info_data, config_c)
_extract_secure_unlock(info_data, config_c)
- _extract_split_main(info_data, config_c)
+ _extract_split_handedness(info_data, config_c)
_extract_split_transport(info_data, config_c)
_extract_split_right_pins(info_data, config_c)
_extract_encoders(info_data, config_c)