From ef7a07dd8a3634d9dd5d0383b86e3a1a69d7c768 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Tue, 20 Oct 2020 17:43:15 +0200 Subject: libcamera: controls: Generate an array of valid values For each Control that supports enumerated values generate an array of ControlValue which contains the full list of valid values. At the expense of a slight increase in memory occupation this change allows the construction of the ControlInfo associated with a Control from the values list, defaulting the minimum and maximum values reported by the ControlInfo. Reviewed-by: Laurent Pinchart Reviewed-by: Kieran Bingham Signed-off-by: Jacopo Mondi --- include/libcamera/control_ids.h.in | 1 + src/libcamera/control_ids.cpp.in | 1 + utils/gen-controls.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/include/libcamera/control_ids.h.in b/include/libcamera/control_ids.h.in index baadca83..7edeb6b6 100644 --- a/include/libcamera/control_ids.h.in +++ b/include/libcamera/control_ids.h.in @@ -10,6 +10,7 @@ #ifndef __LIBCAMERA_CONTROL_IDS_H__ #define __LIBCAMERA_CONTROL_IDS_H__ +#include #include #include diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in index 056645cf..5fb1c2c3 100644 --- a/src/libcamera/control_ids.cpp.in +++ b/src/libcamera/control_ids.cpp.in @@ -8,6 +8,7 @@ */ #include +#include /** * \file control_ids.h diff --git a/utils/gen-controls.py b/utils/gen-controls.py index bf681503..8bdaf4bd 100755 --- a/utils/gen-controls.py +++ b/utils/gen-controls.py @@ -33,6 +33,12 @@ ${description}''') ${description} */''') def_template = string.Template('extern const Control<${type}> ${name}(${id_name}, "${name}");') + enum_values_doc = string.Template('''/** + * \\var ${name}Values + * \\brief List of all $name supported values + */''') + enum_values_start = string.Template('''extern const std::array ${name}Values = {''') + enum_values_values = string.Template('''\tstatic_cast(${name}),''') ctrls_doc = [] ctrls_def = [] @@ -68,6 +74,7 @@ ${description} enum_doc = [] enum_doc.append(enum_doc_start_template.substitute(info)) + num_entries = 0 for entry in enum: value_info = { 'name' : name, @@ -75,11 +82,25 @@ ${description} 'description': format_description(entry['description']), } enum_doc.append(enum_doc_value_template.substitute(value_info)) + num_entries += 1 enum_doc = '\n *\n'.join(enum_doc) enum_doc += '\n */' target_doc.append(enum_doc) + values_info = { + 'name': info['name'], + 'size': num_entries, + } + target_doc.append(enum_values_doc.substitute(values_info)) + target_def.append(enum_values_start.substitute(values_info)) + for entry in enum: + value_info = { + 'name': entry['name'] + } + target_def.append(enum_values_values.substitute(value_info)) + target_def.append("};") + target_doc.append(doc_template.substitute(info)) target_def.append(def_template.substitute(info)) @@ -100,6 +121,7 @@ ${description} def generate_h(controls): enum_template_start = string.Template('''enum ${name}Enum {''') enum_value_template = string.Template('''\t${name} = ${value},''') + enum_values_template = string.Template('''extern const std::array ${name}Values;''') template = string.Template('''extern const Control<${type}> ${name};''') ctrls = [] @@ -132,14 +154,22 @@ def generate_h(controls): if enum: target_ctrls.append(enum_template_start.substitute(info)) + num_entries = 0 for entry in enum: value_info = { 'name': entry['name'], 'value': entry['value'], } target_ctrls.append(enum_value_template.substitute(value_info)) + num_entries += 1 target_ctrls.append("};") + values_info = { + 'name': info['name'], + 'size': num_entries, + } + target_ctrls.append(enum_values_template.substitute(values_info)) + target_ctrls.append(template.substitute(info)) id_value += 1 -- cgit v1.2.1