[libcamera-devel] [RFC PATCH v2 3/9] libcamera: controls: Introduce Control structures
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Jun 21 18:13:55 CEST 2019
ControlIdentifiers declare the types of a control, and map their names,
and the ControlInfo class allows runtime state to be represented.
Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
include/libcamera/controls.h | 58 ++++++++++++
include/libcamera/meson.build | 1 +
src/libcamera/controls.cpp | 160 ++++++++++++++++++++++++++++++++++
src/libcamera/meson.build | 1 +
4 files changed, 220 insertions(+)
create mode 100644 include/libcamera/controls.h
create mode 100644 src/libcamera/controls.cpp
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
new file mode 100644
index 000000000000..95198d41c4cf
--- /dev/null
+++ b/include/libcamera/controls.h
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * controls.h - Control handling
+ */
+#ifndef __LIBCAMERA_CONTROLS_H__
+#define __LIBCAMERA_CONTROLS_H__
+
+#include <libcamera/value.h>
+
+namespace libcamera {
+
+enum ControlId : uint32_t {
+ /* IPA Controls */
+ IpaAwbEnable,
+
+ /* Manual Controls */
+ ManualBrightness,
+ ManualExposure,
+ ManualGain,
+};
+
+struct ControlIdentifier {
+ ControlId id;
+ const char *name;
+ ValueType type;
+};
+
+class ControlInfo
+{
+public:
+ ControlInfo(ControlId id, Value min = 0, Value max = 0);
+
+ ControlId id() const { return ident_->id; }
+ const char *name() const { return ident_->name; }
+ ValueType type() const { return ident_->type; }
+
+ const Value &min() { return min_; }
+ const Value &max() { return min_; }
+
+ std::string toString() const;
+
+ bool operator==(const ControlInfo &rhs) const { return id() == rhs.id(); }
+ bool operator==(const ControlId rhs) const { return id() == rhs; }
+
+private:
+ struct ControlIdentifier const *ident_;
+ Value min_;
+ Value max_;
+
+};
+
+std::ostream &operator<<(std::ostream &stream, const ControlInfo &value);
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_CONTROLS_H__ */
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index eb2211ae1fc3..06e3feebd23d 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -1,5 +1,6 @@
libcamera_api = files([
'buffer.h',
+ 'controls.h',
'camera.h',
'camera_manager.h',
'event_dispatcher.h',
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
new file mode 100644
index 000000000000..b1be46ddb55e
--- /dev/null
+++ b/src/libcamera/controls.cpp
@@ -0,0 +1,160 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * controls.cpp - Control handling
+ */
+
+#include <limits.h>
+#include <sstream>
+#include <string>
+
+#include <libcamera/controls.h>
+
+#include "log.h"
+#include "utils.h"
+
+/**
+ * \file controls.h
+ * \brief Describes control framework and controls supported by a camera
+ */
+
+namespace libcamera {
+
+LOG_DEFINE_CATEGORY(Controls)
+
+/**
+ * \enum ControlId
+ * Control Identifiers
+ * \var IpaAwbEnable
+ * bool: Enables or disables the AWB
+ * \var ManualExposure
+ * Manually control the exposure time in milli-seconds
+ * \var ManualGain
+ * Controls the value of the manual gain setting
+ */
+
+/**
+ * \struct ControlIdentifier
+ * Defines a Control with a unique ID, a name, and a type.
+ * \var ControlIdentifier::id
+ * The unique ID for a control
+ * \var ControlIdentifier::name
+ * The string representation of the control
+ * \var ControlIdentifier::type
+ * The ValueType required to represent the control value
+ */
+
+/*
+ * Two sets of tables are generated for the static control definitions.
+ *
+ * An enum to declare the ID (in controls.h), and a type to establish its
+ * representation.
+ *
+ * Todo: Automate the generation of both tables from a single input table.
+ * Todo: Consider if this should be a static std::map created at init instead.
+ */
+static const struct ControlIdentifier ControlTypes[] = {
+#define CONTROL_TYPE(_id, _type) { _id, #_id, _type }
+
+ CONTROL_TYPE(IpaAwbEnable, ValueBool),
+ CONTROL_TYPE(ManualBrightness, ValueInteger),
+ CONTROL_TYPE(ManualExposure, ValueInteger),
+ CONTROL_TYPE(ManualGain, ValueInteger),
+
+#undef CONTROL_TYPE
+};
+
+static struct ControlIdentifier const *FindControlType(ControlId id)
+{
+ struct ControlIdentifier const *ident;
+
+ for (ident = ControlTypes;
+ ident != &ControlTypes[ARRAY_SIZE(ControlTypes)];
+ ++ident) {
+ if (ident->id == id)
+ return ident;
+ }
+
+ LOG(Controls, Fatal) << "Failed to find a ControlType.";
+
+ /* Unreachable. */
+ return nullptr;
+}
+
+/**
+ * \class ControlInfo
+ * \brief Describes the information and capabilities of a Control
+ */
+
+/**
+ * \brief Construct a ControlInfo with minimum and maximum range parameters.
+ */
+ControlInfo::ControlInfo(ControlId id, Value min, Value max)
+ : ident_(FindControlType(id)), min_(min), max_(max)
+{
+}
+
+/**
+ * \fn ControlInfo::id()
+ * \brief Return the ID of the control information descriptor
+ * \return the ControlId
+ */
+
+/**
+ * \fn ControlInfo::name()
+ * \brief Return the string name of the control information descriptor
+ * \return A string name for the Control
+ */
+
+/**
+ * \fn ControlInfo::type()
+ * \brief Return the ValueType of the control information descriptor
+ * \return the ControlId
+ */
+
+/**
+ * \fn ControlInfo::min()
+ * \brief Reports the minimum value of the control
+ * \return a Value with the minimum setting for the control
+ */
+
+/**
+ * \fn ControlInfo::max()
+ * \brief Reports the maximum value of the control
+ * \return a Value with the maximum setting for the control
+ */
+
+/**
+ * \brief Provide a string representation of the ControlInfo
+ */
+std::string ControlInfo::toString() const
+{
+ std::stringstream ss;
+
+ ss << "Control: " << name()
+ << " : Min(" << min_ << ") Max(" << max_ << ")";
+
+ return ss.str();
+}
+
+/**
+ * \fn ControlInfo::operator==(const ControlInfo &rhs) const
+ * \brief Establish equivalence of ControlInfo. Only the IDs are considered.
+ */
+
+/**
+ * \fn ControlInfo::operator==(const ControlId rhs) const
+ * \brief Establish equivalence of ControlInfo, against a ControlID.
+ */
+
+/**
+ * \brief Provide a string stream representation of the ControlInfo \a info to
+ * the \a stream.
+ */
+std::ostream &operator<<(std::ostream &stream, const ControlInfo &info)
+{
+ return stream << info.toString();
+}
+
+} /* namespace libcamera */
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 8e68373118df..e2c07d79bfb5 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -3,6 +3,7 @@ libcamera_sources = files([
'camera.cpp',
'camera_manager.cpp',
'camera_sensor.cpp',
+ 'controls.cpp',
'device_enumerator.cpp',
'device_enumerator_sysfs.cpp',
'event_dispatcher.cpp',
--
2.20.1
More information about the libcamera-devel
mailing list