summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Scally <dan.scally@ideasonboard.com>2024-05-02 14:30:40 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2024-05-08 09:47:07 +0100
commit6728160b11fd849224f8bc581340cea9876e0c9a (patch)
tree04010304132560de347382f95fb8b4826748876e
parent76e2db61ee15a78c0be95a563ef74c9e2493fa84 (diff)
libcamera: controls: Generate enum value-name maps
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> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--include/libcamera/control_ids.h.in2
-rw-r--r--include/libcamera/property_ids.h.in2
-rwxr-xr-xutils/gen-controls.py19
3 files changed, 23 insertions, 0 deletions
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