summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2020-10-20 17:43:15 +0200
committerJacopo Mondi <jacopo@jmondi.org>2020-10-26 17:51:55 +0100
commitef7a07dd8a3634d9dd5d0383b86e3a1a69d7c768 (patch)
treeabe64259152a9101d040511e99796cd65e6525d0 /utils
parent7a307fa6472789b30a13567371714a0f0ee0ab76 (diff)
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 <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'utils')
-rwxr-xr-xutils/gen-controls.py30
1 files changed, 30 insertions, 0 deletions
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<const ControlValue, ${size}> ${name}Values = {''')
+ enum_values_values = string.Template('''\tstatic_cast<int32_t>(${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<const ControlValue, ${size}> ${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