diff options
-rw-r--r-- | include/libcamera/controls.h | 14 | ||||
-rw-r--r-- | src/libcamera/control_ids.cpp.in | 4 | ||||
-rw-r--r-- | src/libcamera/controls.cpp | 15 |
3 files changed, 26 insertions, 7 deletions
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 7c2bb287..96a774cc 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -8,6 +8,7 @@ #pragma once #include <assert.h> +#include <map> #include <optional> #include <set> #include <stdint.h> @@ -213,14 +214,13 @@ private: class ControlId { public: - ControlId(unsigned int id, const std::string &name, ControlType type) - : id_(id), name_(name), type_(type) - { - } + ControlId(unsigned int id, const std::string &name, ControlType type, + const std::map<std::string, int32_t> &enumStrMap = {}); unsigned int id() const { return id_; } const std::string &name() const { return name_; } ControlType type() const { return type_; } + const std::map<int32_t, std::string> &enumerators() const { return reverseMap_; } private: LIBCAMERA_DISABLE_COPY_AND_MOVE(ControlId) @@ -228,6 +228,8 @@ private: unsigned int id_; std::string name_; ControlType type_; + std::map<std::string, int32_t> enumStrMap_; + std::map<int32_t, std::string> reverseMap_; }; static inline bool operator==(unsigned int lhs, const ControlId &rhs) @@ -256,8 +258,8 @@ class Control : public ControlId public: using type = T; - Control(unsigned int id, const char *name) - : ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value) + Control(unsigned int id, const char *name, const std::map<std::string, int32_t> &enumStrMap = {}) + : ControlId(id, name, details::control_type<std::remove_cv_t<T>>::value, enumStrMap) { } diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in index 05c8fb38..3a204931 100644 --- a/src/libcamera/control_ids.cpp.in +++ b/src/libcamera/control_ids.cpp.in @@ -89,8 +89,10 @@ extern const std::map<std::string, {{ctrl.type}}> {{ctrl.name}}NameValueMap = { { "{{enum.name}}", {{enum.name}} }, {%- endfor %} }; -{% endif -%} +extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}", {{ctrl.name}}NameValueMap); +{% else -%} extern const Control<{{ctrl.type}}> {{ctrl.name}}({{ctrl.name|snake_case|upper}}, "{{ctrl.name}}"); +{% endif -%} {%- endfor %} {% if vendor != 'libcamera' %} diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index dba74404..a46c431a 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -389,7 +389,15 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen * \param[in] id The control numerical ID * \param[in] name The control name * \param[in] type The control data type + * \param[in] enumStrMap The map from enum names to values (optional) */ +ControlId::ControlId(unsigned int id, const std::string &name, ControlType type, + const std::map<std::string, int32_t> &enumStrMap) + : id_(id), name_(name), type_(type), enumStrMap_(enumStrMap) +{ + for (const auto &pair : enumStrMap_) + reverseMap_[pair.second] = pair.first; +} /** * \fn unsigned int ControlId::id() const @@ -410,6 +418,12 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen */ /** + * \fn const std::map<int32_t, std::string> &ControlId::enumerators() const + * \brief Retrieve the map of enum values to enum names + * \return The map of enum values to enum names + */ + +/** * \fn bool operator==(unsigned int lhs, const ControlId &rhs) * \brief Compare a ControlId with a control numerical ID * \param[in] lhs Left-hand side numerical ID @@ -459,6 +473,7 @@ void ControlValue::reserve(ControlType type, bool isArray, std::size_t numElemen * \brief Construct a Control instance * \param[in] id The control numerical ID * \param[in] name The control name + * \param[in] enumStrMap The map from enum names to values (optional) * * The control data type is automatically deduced from the template type T. */ |