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

Message ID 20191209163446.32381-3-jacopo@jmondi.org
State Accepted
Headers show
Series
  • Introduce libcamera properties
Related show

Commit Message

Jacopo Mondi Dec. 9, 2019, 4:34 p.m. UTC
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.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/gen-controls.py | 41 +++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

Comments

Niklas Söderlund Dec. 9, 2019, 5:25 p.m. UTC | #1
Hi Jacopo,

Thanks for your work.

On 2019-12-09 17:34:38 +0100, Jacopo Mondi wrote:
> 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.
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> ---
>  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
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

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