[v2,2/8] libcamera: controls: Generate enum value-name maps
diff mbox series

Message ID 20240417131536.484129-3-dan.scally@ideasonboard.com
State New
Headers show
Series
  • Centralise Agc into libipa
Related show

Commit Message

Daniel Scally April 17, 2024, 1:15 p.m. UTC
Generate maps for each control enum which associate strings that
represent the enum values with the values themselves. This change
will allow us to refer to enumerated control values using the
string. For example if we want to pass variables to an algorithm
for use when a control has a particular value we can embed within
tuning files a dictionary that uses the control values as keys.

Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
---
Changes in v2:

	- Expanded commit message

 include/libcamera/control_ids.h.in  |  2 ++
 include/libcamera/property_ids.h.in |  2 ++
 utils/gen-controls.py               | 19 +++++++++++++++++++
 3 files changed, 23 insertions(+)

Patch
diff mbox series

diff --git a/include/libcamera/control_ids.h.in b/include/libcamera/control_ids.h.in
index d53b1cf7..58dd48e1 100644
--- a/include/libcamera/control_ids.h.in
+++ b/include/libcamera/control_ids.h.in
@@ -10,7 +10,9 @@ 
 #pragma once
 
 #include <array>
+#include <map>
 #include <stdint.h>
+#include <string>
 
 #include <libcamera/controls.h>
 
diff --git a/include/libcamera/property_ids.h.in b/include/libcamera/property_ids.h.in
index 43372c71..f51ba028 100644
--- a/include/libcamera/property_ids.h.in
+++ b/include/libcamera/property_ids.h.in
@@ -9,7 +9,9 @@ 
 
 #pragma once
 
+#include <map>
 #include <stdint.h>
+#include <string>
 
 #include <libcamera/controls.h>
 
diff --git a/utils/gen-controls.py b/utils/gen-controls.py
index 6cd5e362..4fe1e705 100755
--- a/utils/gen-controls.py
+++ b/utils/gen-controls.py
@@ -140,6 +140,12 @@  ${description}
  */''')
     enum_values_start = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values = {''')
     enum_values_values = string.Template('''\tstatic_cast<int32_t>(${name}),''')
+    name_value_map_doc = string.Template('''/**
+ * \\var ${name}NameValueMap
+ * \\brief Map of all $name supported value names (in std::string format) to value
+ */''')
+    name_value_map_start = string.Template('''extern const std::map<std::string, ${type}> ${name}NameValueMap = {''')
+    name_value_values = string.Template('''\t{ "${name}", ${name} },''')
 
     ctrls_doc = {}
     ctrls_def = {}
@@ -183,6 +189,7 @@  ${description}
 
             values_info = {
                 'name': info['name'],
+                'type': ctrl.type,
                 'size': num_entries,
             }
             target_doc.append(enum_values_doc.substitute(values_info))
@@ -194,6 +201,15 @@  ${description}
                 target_def.append(enum_values_values.substitute(value_info))
             target_def.append("};")
 
+            target_doc.append(name_value_map_doc.substitute(values_info))
+            target_def.append(name_value_map_start.substitute(values_info))
+            for enum in ctrl.enum_values:
+                value_info = {
+                    'name': enum.name
+                }
+                target_def.append(name_value_values.substitute(value_info))
+            target_def.append("};")
+
         target_doc.append(doc_template.substitute(info))
         target_def.append(def_template.substitute(info))
 
@@ -231,6 +247,7 @@  def generate_h(controls, mode, ranges):
     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;''')
+    name_value_map_template = string.Template('''extern const std::map<std::string, ${type}> ${name}NameValueMap;''')
     template = string.Template('''extern const Control<${type}> ${name};''')
 
     ctrls = {}
@@ -273,9 +290,11 @@  def generate_h(controls, mode, ranges):
 
             values_info = {
                 'name': info['name'],
+                'type': ctrl.type,
                 'size': num_entries,
             }
             target_ctrls.append(enum_values_template.substitute(values_info))
+            target_ctrls.append(name_value_map_template.substitute(values_info))
 
         target_ctrls.append(template.substitute(info))
         id_value[vendor] += 1