Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Matrix consistency check #13470

Merged
merged 2 commits into from
Jul 11, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions lib/python/qmk/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ def info_json(keyboard):
info_data = _extract_config_h(info_data)
info_data = _extract_rules_mk(info_data)

# Ensure that we have matrix row and column counts
info_data = _matrix_size(info_data)

# Validate against the jsonschema
try:
validate(info_data, 'qmk.api.keyboard.v1')
Expand All @@ -90,6 +93,9 @@ def info_json(keyboard):
if layout_name not in info_data.get('layouts', {}) and layout_name not in info_data.get('layout_aliases', {}):
_log_error(info_data, 'Claims to support community layout %s but no %s() macro found' % (layout, layout_name))

# Check that the reported matrix size is consistent with the actual matrix size
_check_matrix(info_data)

return info_data


Expand Down Expand Up @@ -338,6 +344,46 @@ def _extract_rules_mk(info_data):
return info_data


def _matrix_size(info_data):
"""Add info_data['matrix_size'] if it doesn't exist.
"""
if 'matrix_size' not in info_data and 'matrix_pins' in info_data:
info_data['matrix_size'] = {}

if 'direct' in info_data['matrix_pins']:
info_data['matrix_size']['cols'] = len(info_data['matrix_pins']['direct'][0])
info_data['matrix_size']['rows'] = len(info_data['matrix_pins']['direct'])
elif 'cols' in info_data['matrix_pins'] and 'rows' in info_data['matrix_pins']:
info_data['matrix_size']['cols'] = len(info_data['matrix_pins']['cols'])
info_data['matrix_size']['rows'] = len(info_data['matrix_pins']['rows'])

return info_data


def _check_matrix(info_data):
"""Check the matrix to ensure that row/column count is consistent.
"""
if 'matrix_pins' in info_data and 'matrix_size' in info_data:
actual_col_count = info_data['matrix_size'].get('cols', 0)
actual_row_count = info_data['matrix_size'].get('rows', 0)
col_count = row_count = 0

if 'direct' in info_data['matrix_pins']:
col_count = len(info_data['matrix_pins']['direct'][0])
row_count = len(info_data['matrix_pins']['direct'])
elif 'cols' in info_data['matrix_pins'] and 'rows' in info_data['matrix_pins']:
col_count = len(info_data['matrix_pins']['cols'])
row_count = len(info_data['matrix_pins']['rows'])

if col_count != actual_col_count and col_count != actual_col_count/2:
# FIXME: once we can we should detect if split is enabled to do the actual_col_count/2 check.
_log_error(info_data, f'MATRIX_COLS is inconsistent with the size of MATRIX_COL_PINS: {col_count} != {actual_col_count}')

if row_count != actual_row_count and row_count != actual_row_count/2:
# FIXME: once we can we should detect if split is enabled to do the actual_row_count/2 check.
_log_error(info_data, f'MATRIX_ROWS is inconsistent with the size of MATRIX_ROW_PINS: {row_count} != {actual_row_count}')


def _merge_layouts(info_data, new_info_data):
"""Merge new_info_data into info_data in an intelligent way.
"""
Expand Down