summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-09-29 14:24:09 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-05 20:02:51 +0300
commit8ea6912c9607dab0a30c9bbf518dfc80df68a10c (patch)
treea5a933b6fc28de84c2087563d9791fb872c52fab /src
parenta8c40942b99e7e50d43a40c4b0a601c7428b30fd (diff)
libcamera: controls: Auto-generate control_ids.h and control_ids.cpp
Bring back auto-generation of control ids. In this version, both the header and the source files are generated from a single YAML file that stores all control definitions. This allows centralising controls in a single file, while the previous version required keeping both declarations (in a header) and documentation (in a the source) in sync manually. Using YAML as a format to store control definitions is a trade-off between ease of use (there are many YAML parsers available) and simplicity (XML was considered, but would have lead to more complex processing). A new build time dependency is added on python3-yaml, which should be available as a package in all distributions and build environments. The YAML format is likely to change over time as we improve documentation of controls, the first version simply copies the information currently available. Future improvements should also include a YAML schema to validate the YAML source file. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/control_ids.cpp52
-rw-r--r--src/libcamera/control_ids.cpp.in25
-rw-r--r--src/libcamera/control_ids.yaml35
-rwxr-xr-xsrc/libcamera/gen-controls.py114
-rw-r--r--src/libcamera/meson.build12
5 files changed, 185 insertions, 53 deletions
diff --git a/src/libcamera/control_ids.cpp b/src/libcamera/control_ids.cpp
deleted file mode 100644
index 3af23a45..00000000
--- a/src/libcamera/control_ids.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2019, Google Inc.
- *
- * control_ids.cpp : Control ID list
- */
-
-#include <libcamera/control_ids.h>
-
-/**
- * \file control_ids.h
- * \brief Camera control identifiers
- */
-
-namespace libcamera {
-
-namespace controls {
-
-/**
- * \brief Enables or disables the AWB.
- * \sa ManualGain
- */
-extern const Control<bool> AwbEnable(AWB_ENABLE, "AwbEnable");
-
-/**
- * \brief Specify a fixed brightness parameter.
- */
-extern const Control<int32_t> Brightness(BRIGHTNESS, "Brightness");
-
-/**
- * \brief Specify a fixed contrast parameter.
- */
-extern const Control<int32_t> Contrast(CONTRAST, "Contrast");
-
-/**
- * \brief Specify a fixed saturation parameter.
- */
-extern const Control<int32_t> Saturation(SATURATION, "Saturation");
-
-/**
- * \brief Specify a fixed exposure time in milli-seconds
- */
-extern const Control<int32_t> ManualExposure(MANUAL_EXPOSURE, "ManualExposure");
-
-/**
- * \brief Specify a fixed gain parameter
- */
-extern const Control<int32_t> ManualGain(MANUAL_GAIN, "ManualGain");
-
-} /* namespace controls */
-
-} /* namespace libcamera */
diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in
new file mode 100644
index 00000000..f699ac9e
--- /dev/null
+++ b/src/libcamera/control_ids.cpp.in
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * control_ids.cpp : Control ID list
+ *
+ * This file is auto-generated. Do not edit.
+ */
+
+#include <libcamera/control_ids.h>
+
+/**
+ * \file control_ids.h
+ * \brief Camera control identifiers
+ */
+
+namespace libcamera {
+
+namespace controls {
+
+${controls}
+
+} /* namespace controls */
+
+} /* namespace libcamera */
diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml
new file mode 100644
index 00000000..819a5967
--- /dev/null
+++ b/src/libcamera/control_ids.yaml
@@ -0,0 +1,35 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Copyright (C) 2019, Google Inc.
+#
+%YAML 1.2
+---
+controls:
+ - AwbEnable:
+ type: bool
+ description: |
+ Enables or disables the AWB.
+
+ \sa ManualGain
+
+ - Brightness:
+ type: int32_t
+ description: Specify a fixed brightness parameter
+
+ - Contrast:
+ type: int32_t
+ description: Specify a fixed contrast parameter
+
+ - Saturation:
+ type: int32_t
+ description: Specify a fixed saturation parameter
+
+ - ManualExposure:
+ type: int32_t
+ description: Specify a fixed exposure time in milli-seconds
+
+ - ManualGain:
+ type: int32_t
+ description: Specify a fixed gain parameter
+
+...
diff --git a/src/libcamera/gen-controls.py b/src/libcamera/gen-controls.py
new file mode 100755
index 00000000..0899e40b
--- /dev/null
+++ b/src/libcamera/gen-controls.py
@@ -0,0 +1,114 @@
+#!/usr/bin/python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2019, Google Inc.
+#
+# Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+#
+# gen-controls.py - Generate control definitions from YAML
+
+import argparse
+import string
+import sys
+import yaml
+
+
+def snake_case(s):
+ return ''.join([c.isupper() and ('_' + c) or c for c in s]).strip('_')
+
+
+def generate_cpp(controls):
+ template = string.Template('''/**
+${description}
+ */
+extern const Control<${type}> ${name}(${id_name}, "${name}");''')
+
+ ctrls = []
+
+ for ctrl in controls:
+ name, ctrl = ctrl.popitem()
+ id_name = snake_case(name).upper()
+
+ description = ctrl['description'].strip('\n').split('\n')
+ description[0] = '\\brief ' + description[0]
+ description = '\n'.join([(line and ' * ' or ' *') + line for line in description])
+
+ info = {
+ 'name': name,
+ 'type': ctrl['type'],
+ 'description': description,
+ 'id_name': id_name,
+ }
+
+ ctrls.append(template.substitute(info))
+
+ return {'controls': '\n\n'.join(ctrls)}
+
+
+def generate_h(controls):
+ template = string.Template('''extern const Control<${type}> ${name};''')
+
+ ctrls = []
+ ids = []
+ id_value = 1
+
+ for ctrl in controls:
+ name, ctrl = ctrl.popitem()
+ id_name = snake_case(name).upper()
+
+ ids.append('\t' + id_name + ' = ' + str(id_value) + ',')
+
+ info = {
+ 'name': name,
+ 'type': ctrl['type'],
+ }
+
+ ctrls.append(template.substitute(info))
+ id_value += 1
+
+ return {'ids': '\n'.join(ids), 'controls': '\n'.join(ctrls)}
+
+
+def fill_template(template, data):
+
+ template = open(template, 'rb').read()
+ template = template.decode('utf-8')
+ template = string.Template(template)
+ return template.substitute(data)
+
+
+def main(argv):
+
+ # Parse command line arguments
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-o', dest='output', metavar='file', type=str,
+ help='Output file name. Defaults to standard output if not specified.')
+ parser.add_argument('input', type=str,
+ help='Input file name.')
+ parser.add_argument('template', type=str,
+ help='Template file name.')
+ args = parser.parse_args(argv[1:])
+
+ data = open(args.input, 'rb').read()
+ controls = yaml.safe_load(data)['controls']
+
+ if args.template.endswith('.cpp.in'):
+ data = generate_cpp(controls)
+ elif args.template.endswith('.h.in'):
+ data = generate_h(controls)
+ else:
+ raise RuntimeError('Unknown template type')
+
+ data = fill_template(args.template, data)
+
+ if args.output:
+ output = open(args.output, 'wb')
+ output.write(data.encode('utf-8'))
+ output.close()
+ else:
+ sys.stdout.write(data)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 8123d1d5..f0795bbd 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -5,7 +5,6 @@ libcamera_sources = files([
'camera_manager.cpp',
'camera_sensor.cpp',
'controls.cpp',
- 'control_ids.cpp',
'device_enumerator.cpp',
'device_enumerator_sysfs.cpp',
'event_dispatcher.cpp',
@@ -58,6 +57,17 @@ if libudev.found()
])
endif
+gen_controls = files('gen-controls.py')
+
+control_ids_cpp = custom_target('control_ids_cpp',
+ input : files('control_ids.yaml', 'control_ids.cpp.in'),
+ output : 'control_ids.cpp',
+ depend_files : gen_controls,
+ command : [gen_controls, '-o', '@OUTPUT@', '@INPUT@'])
+
+libcamera_sources += control_ids_cpp
+libcamera_sources += control_ids_h
+
gen_version = join_paths(meson.source_root(), 'utils', 'gen-version.sh')
version_cpp = vcs_tag(command : [gen_version, meson.build_root()],