From 20d5640ca49c76c89be5bebcc00981942c7a9c19 Mon Sep 17 00:00:00 2001
From: Kieran Bingham <kieran.bingham@ideasonboard.com>
Date: Wed, 19 Jun 2019 16:56:40 +0100
Subject: libcamera: controls: Introduce control-related data types
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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>
---
 include/libcamera/control_ids.h |  35 +++++++++++
 include/libcamera/controls.h    | 134 ++++++++++++++++++++++++++++++++++++++++
 include/libcamera/meson.build   |   2 +
 3 files changed, 171 insertions(+)
 create mode 100644 include/libcamera/control_ids.h
 create mode 100644 include/libcamera/controls.h

(limited to 'include')

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',
-- 
cgit v1.2.1