summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-08-08 02:16:19 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-08-16 00:28:32 +0300
commit5c1cb5e5bcc279a38b3947e9050ef4cd9e4ae0fd (patch)
tree6315f57da01e27c749cf502a95667073f611f9d3
parent6a96113107a9cf29b24f50b81f930508c0748fcd (diff)
py: gen-py-controls: Use Control class
Replace manual extraction of data from YAML with the Control helper class. This centralizes YAML parsing and avoids manual mistakes. In order to import the controls module, add the utils/codegen/ directory to the PYTHONPATH through the Python build environment. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
-rwxr-xr-xsrc/py/libcamera/gen-py-controls.py32
-rw-r--r--src/py/libcamera/meson.build6
-rw-r--r--utils/codegen/meson.build1
3 files changed, 21 insertions, 18 deletions
diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
index 8efbf95b..a18dc533 100755
--- a/src/py/libcamera/gen-py-controls.py
+++ b/src/py/libcamera/gen-py-controls.py
@@ -8,6 +8,8 @@ import string
import sys
import yaml
+from controls import Control
+
def find_common_prefix(strings):
prefix = strings[0]
@@ -28,9 +30,7 @@ def generate_py(controls, mode):
vendor_defs = []
vendors = []
for vendor, ctrl_list in controls.items():
- for ctrls in ctrl_list:
- name, ctrl = ctrls.popitem()
-
+ for ctrl in ctrl_list:
if vendor not in vendors and vendor != 'libcamera':
vendor_mode_str = f'{vendor.capitalize()}{mode.capitalize()}'
vendors_class_def.append('class Py{}\n{{\n}};\n'.format(vendor_mode_str))
@@ -44,29 +44,28 @@ def generate_py(controls, mode):
ns = 'libcamera::{}::'.format(mode)
container = 'controls'
- out += f'\t{container}.def_readonly_static("{name}", static_cast<const libcamera::ControlId *>(&{ns}{name}));\n\n'
+ out += f'\t{container}.def_readonly_static("{ctrl.name}", static_cast<const libcamera::ControlId *>(&{ns}{ctrl.name}));\n\n'
- enum = ctrl.get('enum')
- if not enum:
+ if not ctrl.is_enum:
continue
- cpp_enum = name + 'Enum'
+ cpp_enum = ctrl.name + 'Enum'
out += '\tpy::enum_<{}{}>({}, \"{}\")\n'.format(ns, cpp_enum, container, cpp_enum)
if mode == 'controls':
# Adjustments for controls
- if name == 'LensShadingMapMode':
+ if ctrl.name == 'LensShadingMapMode':
prefix = 'LensShadingMapMode'
else:
- prefix = find_common_prefix([e['name'] for e in enum])
+ prefix = find_common_prefix([e.name for e in ctrl.enum_values])
else:
# Adjustments for properties
- prefix = find_common_prefix([e['name'] for e in enum])
+ prefix = find_common_prefix([e.name for e in ctrl.enum_values])
- for entry in enum:
- cpp_enum = entry['name']
- py_enum = entry['name'][len(prefix):]
+ for entry in ctrl.enum_values:
+ cpp_enum = entry.name
+ py_enum = entry.name[len(prefix):]
out += '\t\t.value(\"{}\", {}{})\n'.format(py_enum, ns, cpp_enum)
@@ -103,9 +102,10 @@ def main(argv):
controls = {}
for input in args.input:
- data = open(input, 'rb').read()
- vendor = yaml.safe_load(data)['vendor']
- controls[vendor] = yaml.safe_load(data)['controls']
+ data = yaml.safe_load(open(input, 'rb').read())
+ vendor = data['vendor']
+ ctrls = data['controls']
+ controls[vendor] = [Control(*ctrl.popitem(), vendor) for ctrl in ctrls]
data = generate_py(controls, args.mode)
diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build
index 2e674075..6ad2d771 100644
--- a/src/py/libcamera/meson.build
+++ b/src/py/libcamera/meson.build
@@ -35,7 +35,8 @@ pycamera_sources += custom_target('py_gen_controls',
input : controls_files,
output : ['py_controls_generated.cpp'],
command : [gen_py_controls, '--mode', 'controls', '-o', '@OUTPUT@',
- '-t', gen_py_controls_template, '@INPUT@'])
+ '-t', gen_py_controls_template, '@INPUT@'],
+ env : py_build_env)
# Generate properties
@@ -45,7 +46,8 @@ pycamera_sources += custom_target('py_gen_properties',
input : properties_files,
output : ['py_properties_generated.cpp'],
command : [gen_py_controls, '--mode', 'properties', '-o', '@OUTPUT@',
- '-t', gen_py_properties_template, '@INPUT@'])
+ '-t', gen_py_properties_template, '@INPUT@'],
+ env : py_build_env)
# Generate formats
diff --git a/utils/codegen/meson.build b/utils/codegen/meson.build
index fb2196ee..adf33bba 100644
--- a/utils/codegen/meson.build
+++ b/utils/codegen/meson.build
@@ -5,6 +5,7 @@
py_build_env = environment()
# \todo Investigate usage of PYTHONPYCACHEPREFIX for Python >= 3.8
py_build_env.set('PYTHONDONTWRITEBYTECODE', '1')
+py_build_env.prepend('PYTHONPATH', meson.current_source_dir())
py_modules += ['jinja2', 'yaml']