[libcamera-devel] [PATCH v5 06/14] libcamera: controls: Generate an array of valid values

Jacopo Mondi jacopo at jmondi.org
Sun Oct 25 17:04:26 CET 2020


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 at ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 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 baadca83b103..7edeb6b65e32 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 <array>
 #include <stdint.h>
 
 #include <libcamera/controls.h>
diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in
index 056645cfbdfb..5fb1c2c30558 100644
--- a/src/libcamera/control_ids.cpp.in
+++ b/src/libcamera/control_ids.cpp.in
@@ -8,6 +8,7 @@
  */
 
 #include <libcamera/control_ids.h>
+#include <libcamera/controls.h>
 
 /**
  * \file control_ids.h
diff --git a/utils/gen-controls.py b/utils/gen-controls.py
index bf681503f86a..8bdaf4bdf078 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
 
-- 
2.28.0



More information about the libcamera-devel mailing list