diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libcamera/control_ids.cpp | 52 | ||||
-rw-r--r-- | src/libcamera/control_ids.cpp.in | 25 | ||||
-rw-r--r-- | src/libcamera/control_ids.yaml | 35 | ||||
-rwxr-xr-x | src/libcamera/gen-controls.py | 114 | ||||
-rw-r--r-- | src/libcamera/meson.build | 12 |
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()], |