diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-10-06 09:43:07 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-10-13 20:37:24 +0300 |
commit | 33ee44dc16dc7e6fd15926d76a10545601a20613 (patch) | |
tree | 7d292401d4e6b7670961abc140927e6050c1d31f | |
parent | 5af6a1a0128b5776a1d66a55e7296c58aff72e97 (diff) |
libcamera: control_ids: Generate map of all supported controls
In order to deserialise a ControlList, we will need to lookup ControlId
instances based on their numerical ID. Generate a global map from the
controls definitions to support such a lookup.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
-rw-r--r-- | include/libcamera/control_ids.h.in | 2 | ||||
-rw-r--r-- | include/libcamera/controls.h | 1 | ||||
-rw-r--r-- | src/libcamera/control_ids.cpp.in | 7 | ||||
-rw-r--r-- | src/libcamera/controls.cpp | 9 | ||||
-rwxr-xr-x | src/libcamera/gen-controls.py | 3 |
5 files changed, 22 insertions, 0 deletions
diff --git a/include/libcamera/control_ids.h.in b/include/libcamera/control_ids.h.in index 1d0bc791..6ff0e418 100644 --- a/include/libcamera/control_ids.h.in +++ b/include/libcamera/control_ids.h.in @@ -24,6 +24,8 @@ ${ids} ${controls} +extern const ControlIdMap controls; + } /* namespace controls */ } /* namespace libcamera */ diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 90426753..d8acd800 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -111,6 +111,7 @@ private: ControlValue max_; }; +using ControlIdMap = std::unordered_map<unsigned int, const ControlId *>; using ControlInfoMap = std::unordered_map<const ControlId *, ControlRange>; class ControlList diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in index dd543382..99c511d0 100644 --- a/src/libcamera/control_ids.cpp.in +++ b/src/libcamera/control_ids.cpp.in @@ -31,6 +31,13 @@ ${controls_doc} ${controls_def} #endif +/** + * \brief List of all supported libcamera controls + */ +extern const ControlIdMap controls { +${controls_map} +}; + } /* namespace controls */ } /* namespace libcamera */ diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp index f3260edc..70c1af48 100644 --- a/src/libcamera/controls.cpp +++ b/src/libcamera/controls.cpp @@ -356,6 +356,15 @@ std::string ControlRange::toString() const } /** + * \typedef ControlIdMap + * \brief A map of numerical control ID to ControlId + * + * The map is used by ControlList instances to access controls by numerical + * IDs. A global map of all libcamera controls is provided by + * controls::controls. + */ + +/** * \typedef ControlInfoMap * \brief A map of ControlId to ControlRange */ diff --git a/src/libcamera/gen-controls.py b/src/libcamera/gen-controls.py index a3e52fb3..940386cc 100755 --- a/src/libcamera/gen-controls.py +++ b/src/libcamera/gen-controls.py @@ -25,6 +25,7 @@ ${description} ctrls_doc = [] ctrls_def = [] + ctrls_map = [] for ctrl in controls: name, ctrl = ctrl.popitem() @@ -43,10 +44,12 @@ ${description} ctrls_doc.append(doc_template.substitute(info)) ctrls_def.append(def_template.substitute(info)) + ctrls_map.append('\t{ ' + id_name + ', &' + name + ' },') return { 'controls_doc': '\n\n'.join(ctrls_doc), 'controls_def': '\n'.join(ctrls_def), + 'controls_map': '\n'.join(ctrls_map), } |