[libcamera-devel] [PATCH v4 02/10] libcamera: controls: Parse 'enum' in gen-controls.py

Jacopo Mondi jacopo at jmondi.org
Wed Jan 8 17:34:26 CET 2020


In preparation to add libcamera Camera properties definitions by re-using
the control generation framework, augment the gen_controls.py script to
support parsing the 'enum' yaml tag and generate documentation and
definition of possible values associated with a Control or a Property
and defined through an enumeration of supported values.

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/gen-controls.py | 41 +++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/src/libcamera/gen-controls.py b/src/libcamera/gen-controls.py
index 940386cc68c8..4a1ee52cdb04 100755
--- a/src/libcamera/gen-controls.py
+++ b/src/libcamera/gen-controls.py
@@ -17,6 +17,10 @@ def snake_case(s):
 
 
 def generate_cpp(controls):
+    enum_doc_start_template = string.Template('''/**
+ * \enum ${name}Values\n * Supported ${name} values\n\n''')
+    enum_doc_value_template = string.Template(''' * \\var ${name}Values::${value}
+${description}\n *\n''')
     doc_template = string.Template('''/**
  * \\var extern const Control<${type}> ${name}
 ${description}
@@ -42,6 +46,27 @@ ${description}
             'id_name': id_name,
         }
 
+        enum_doc = []
+        try:
+            enum = ctrl['enum']
+            enum_doc += enum_doc_start_template.substitute(info)
+
+            for value in enum:
+                enum_description = value['description'].strip('\n').split('\n')
+                enum_description[0] = '\\brief ' + enum_description[0]
+                enum_description = '\n'.join([' * ' + line for line in enum_description])
+                value_info = {
+                    'name' : name,
+                    'value': list(value.keys())[0],
+                    'description': enum_description,
+                }
+                enum_doc += enum_doc_value_template.substitute(value_info)
+            enum_doc += " */"
+            enum_doc = ''.join(enum_doc)
+            ctrls_doc.append(enum_doc)
+        except KeyError:
+            pass
+
         ctrls_doc.append(doc_template.substitute(info))
         ctrls_def.append(def_template.substitute(info))
         ctrls_map.append('\t{ ' + id_name + ', &' + name + ' },')
@@ -54,6 +79,8 @@ ${description}
 
 
 def generate_h(controls):
+    enum_template_start = string.Template('''enum ${name}Values {''')
+    enum_value_template = string.Template('''\t${name} = ${value},''')
     template = string.Template('''extern const Control<${type}> ${name};''')
 
     ctrls = []
@@ -71,6 +98,20 @@ def generate_h(controls):
             'type': ctrl['type'],
         }
 
+        try:
+            enum = ctrl['enum']
+            ctrls.append(enum_template_start.substitute(info))
+
+            for value in enum:
+                value_info = {
+                    'name': list(value.keys())[0],
+                    'value': value['value'],
+                }
+                ctrls.append(enum_value_template.substitute(value_info))
+            ctrls.append("};")
+        except KeyError:
+            pass
+
         ctrls.append(template.substitute(info))
         id_value += 1
 
-- 
2.24.0



More information about the libcamera-devel mailing list