summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2019-06-19 16:56:40 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-07-02 16:59:20 +0300
commit20d5640ca49c76c89be5bebcc00981942c7a9c19 (patch)
tree2df084fecebca0484467093def94e443d1d6459b /include
parenta110cc94ab5dfb26bf6a5eae61ea5ba2deb6d3f3 (diff)
libcamera: controls: Introduce control-related data types
Add a set of data types to support controls: - ControlValue stores a control type and value in a generic way - ControlId enumerates all the control identifiers - ControlIdentifier declares the types of a control and map their names - ControlInfo stores runtime information for controls - ControlList contains a set of control info and value pairs The control definitions map is generated from the controls documentation to ensure that the two will always be synchronised. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'include')
-rw-r--r--include/libcamera/control_ids.h35
-rw-r--r--include/libcamera/controls.h134
-rw-r--r--include/libcamera/meson.build2
3 files changed, 171 insertions, 0 deletions
diff --git a/include/libcamera/control_ids.h b/include/libcamera/control_ids.h
new file mode 100644
index 00000000..d0e700da
--- /dev/null
+++ b/include/libcamera/control_ids.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * control_ids.h : Control ID list
+ */
+
+#ifndef __LIBCAMERA_CONTROL_IDS_H__
+#define __LIBCAMERA_CONTROL_IDS_H__
+
+#include <functional>
+
+namespace libcamera {
+
+enum ControlId {
+};
+
+} /* namespace libcamera */
+
+namespace std {
+
+template<>
+struct hash<libcamera::ControlId> {
+ using argument_type = libcamera::ControlId;
+ using result_type = std::size_t;
+
+ result_type operator()(const argument_type &key) const noexcept
+ {
+ return std::hash<std::underlying_type<argument_type>::type>()(key);
+ }
+};
+
+} /* namespace std */
+
+#endif // __LIBCAMERA_CONTROL_IDS_H__
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
new file mode 100644
index 00000000..22061559
--- /dev/null
+++ b/include/libcamera/controls.h
@@ -0,0 +1,134 @@
+/* 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 <stdint.h>
+#include <string>
+#include <unordered_map>
+
+#include <libcamera/control_ids.h>
+
+namespace libcamera {
+
+class Camera;
+
+enum ControlValueType {
+ ControlValueNone,
+ ControlValueBool,
+ ControlValueInteger,
+ ControlValueInteger64,
+};
+
+class ControlValue
+{
+public:
+ ControlValue();
+ ControlValue(bool value);
+ ControlValue(int value);
+ ControlValue(int64_t value);
+
+ ControlValueType type() const { return type_; };
+ bool isNone() const { return type_ == ControlValueNone; };
+
+ void set(bool value);
+ void set(int value);
+ void set(int64_t value);
+
+ bool getBool() const;
+ int getInt() const;
+ int64_t getInt64() const;
+
+ std::string toString() const;
+
+private:
+ ControlValueType type_;
+
+ union {
+ bool bool_;
+ int integer_;
+ int64_t integer64_;
+ };
+};
+
+struct ControlIdentifier {
+ ControlId id;
+ const char *name;
+ ControlValueType type;
+};
+
+class ControlInfo
+{
+public:
+ explicit ControlInfo(ControlId id, const ControlValue &min = 0,
+ const ControlValue &max = 0);
+
+ ControlId id() const { return ident_->id; }
+ const char *name() const { return ident_->name; }
+ ControlValueType type() const { return ident_->type; }
+
+ const ControlValue &min() const { return min_; }
+ const ControlValue &max() const { return max_; }
+
+ std::string toString() const;
+
+private:
+ const struct ControlIdentifier *ident_;
+ ControlValue min_;
+ ControlValue max_;
+};
+
+bool operator==(const ControlInfo &lhs, const ControlInfo &rhs);
+bool operator==(const ControlId &lhs, const ControlInfo &rhs);
+bool operator==(const ControlInfo &lhs, const ControlId &rhs);
+static inline bool operator!=(const ControlInfo &lhs, const ControlInfo &rhs)
+{
+ return !(lhs == rhs);
+}
+static inline bool operator!=(const ControlId &lhs, const ControlInfo &rhs)
+{
+ return !(lhs == rhs);
+}
+static inline bool operator!=(const ControlInfo &lhs, const ControlId &rhs)
+{
+ return !(lhs == rhs);
+}
+
+class ControlList
+{
+private:
+ using ControlListMap = std::unordered_map<const ControlInfo *, ControlValue>;
+
+public:
+ ControlList(Camera *camera);
+
+ using iterator = ControlListMap::iterator;
+ using const_iterator = ControlListMap::const_iterator;
+
+ iterator begin() { return controls_.begin(); }
+ iterator end() { return controls_.end(); }
+ const_iterator begin() const { return controls_.begin(); }
+ const_iterator end() const { return controls_.end(); }
+
+ bool contains(const ControlInfo *info) const;
+ bool empty() const { return controls_.empty(); }
+ std::size_t size() const { return controls_.size(); }
+ void clear() { controls_.clear(); }
+
+ ControlValue &operator[](const ControlInfo *info) { return controls_[info]; }
+
+ void update(const ControlList &list);
+
+private:
+ Camera *camera_;
+ ControlListMap controls_;
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_CONTROLS_H__ */
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index 15484724..3067120a 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -2,6 +2,8 @@ libcamera_api = files([
'buffer.h',
'camera.h',
'camera_manager.h',
+ 'control_ids.h',
+ 'controls.h',
'event_dispatcher.h',
'event_notifier.h',
'geometry.h',