[libcamera-devel] [PATCH 11/23] libcamera: controls: Add support for float controls

Jacopo Mondi jacopo at jmondi.org
Mon Jan 13 17:42:33 CET 2020


Add support for float values in Control<> and ControlValue classes.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 include/libcamera/controls.h         |  3 +++
 src/libcamera/control_serializer.cpp | 13 ++++++++++
 src/libcamera/controls.cpp           | 36 ++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+)

diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 458b84e8fa8c..8fa33d93b088 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -20,6 +20,7 @@ enum ControlType {
 	ControlTypeBool,
 	ControlTypeInteger32,
 	ControlTypeInteger64,
+	ControlTypeFloat,
 };
 
 class ControlValue
@@ -29,6 +30,7 @@ public:
 	ControlValue(bool value);
 	ControlValue(int32_t value);
 	ControlValue(int64_t value);
+	ControlValue(float value);
 
 	ControlType type() const { return type_; }
 	bool isNone() const { return type_ == ControlTypeNone; }
@@ -53,6 +55,7 @@ private:
 		bool bool_;
 		int32_t integer32_;
 		int64_t integer64_;
+		float float_;
 	};
 };
 
diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
index a5d6d875c76f..fd91baf15156 100644
--- a/src/libcamera/control_serializer.cpp
+++ b/src/libcamera/control_serializer.cpp
@@ -34,6 +34,7 @@ static constexpr size_t ControlValueSize[] = {
 	[ControlTypeBool]	= sizeof(bool),
 	[ControlTypeInteger32]	= sizeof(int32_t),
 	[ControlTypeInteger64]	= sizeof(int64_t),
+	[ControlTypeFloat]	= sizeof(float),
 };
 
 } /* namespace */
@@ -176,6 +177,12 @@ void ControlSerializer::store(const ControlValue &value,
 		break;
 	}
 
+	case ControlTypeFloat: {
+		float data = value.get<float>();
+		buffer.write(&data);
+		break;
+	}
+
 	default:
 		break;
 	}
@@ -348,6 +355,12 @@ ControlValue ControlSerializer::load<ControlValue>(ControlType type,
 		return ControlValue(value);
 	}
 
+	case ControlTypeFloat: {
+		float value;
+		b.read(&value);
+		return ControlValue(value);
+	}
+
 	default:
 		return ControlValue();
 	}
diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
index 123a6f19974a..74ce5d0ba4f1 100644
--- a/src/libcamera/controls.cpp
+++ b/src/libcamera/controls.cpp
@@ -58,6 +58,8 @@ LOG_DEFINE_CATEGORY(Controls)
  * The control stores a 32-bit integer value
  * \var ControlTypeInteger64
  * The control stores a 64-bit integer value
+ * \var ControlTypeFloat
+ * The control stores a 32-bit floating point value
  */
 
 /**
@@ -100,6 +102,15 @@ ControlValue::ControlValue(int64_t value)
 {
 }
 
+/**
+ * \brief Construct a float ControlValue
+ * \param[in] value Float value to store
+ */
+ControlValue::ControlValue(float value)
+	: type_(ControlTypeFloat), float_(value)
+{
+}
+
 /**
  * \fn ControlValue::type()
  * \brief Retrieve the data type of the value
@@ -153,6 +164,14 @@ const int64_t &ControlValue::get<int64_t>() const
 	return integer64_;
 }
 
+template<>
+const float &ControlValue::get<float>() const
+{
+	ASSERT(type_ == ControlTypeFloat);
+
+	return float_;
+}
+
 template<>
 void ControlValue::set<bool>(const bool &value)
 {
@@ -173,6 +192,13 @@ void ControlValue::set<int64_t>(const int64_t &value)
 	type_ = ControlTypeInteger64;
 	integer64_ = value;
 }
+
+template<>
+void ControlValue::set<float>(const float &value)
+{
+	type_ = ControlTypeFloat;
+	float_ = value;
+}
 #endif /* __DOXYGEN__ */
 
 /**
@@ -190,6 +216,8 @@ std::string ControlValue::toString() const
 		return std::to_string(integer32_);
 	case ControlTypeInteger64:
 		return std::to_string(integer64_);
+	case ControlTypeFloat:
+		return std::to_string(float_);
 	}
 
 	return "<ValueType Error>";
@@ -211,6 +239,8 @@ bool ControlValue::operator==(const ControlValue &other) const
 		return integer32_ == other.integer32_;
 	case ControlTypeInteger64:
 		return integer64_ == other.integer64_;
+	case ControlTypeFloat:
+		return float_ == other.float_;
 	default:
 		return false;
 	}
@@ -341,6 +371,12 @@ Control<int64_t>::Control(unsigned int id, const char *name)
 	: ControlId(id, name, ControlTypeInteger64)
 {
 }
+
+template<>
+Control<float>::Control(unsigned int id, const char *name)
+	: ControlId(id, name, ControlTypeFloat)
+{
+}
 #endif /* __DOXYGEN__ */
 
 /**
-- 
2.24.0



More information about the libcamera-devel mailing list