Files
external_libcamera/include/libcamera/controls.h
Laurent Pinchart dd37ef784e libcamera: controls: Use explicit 32-bit integer types
Make the control API more explicit when dealing with integer controls by
specifying the size. We already do so for 64-bit integers, using int64_t
and ControlTypeInteger64, do the same for 32-bit integers.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
2019-10-04 19:33:08 +03:00

136 lines
3.0 KiB
C++

/* 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 ControlType {
ControlTypeNone,
ControlTypeBool,
ControlTypeInteger32,
ControlTypeInteger64,
};
class ControlValue
{
public:
ControlValue();
ControlValue(bool value);
ControlValue(int32_t value);
ControlValue(int64_t value);
ControlType type() const { return type_; };
bool isNone() const { return type_ == ControlTypeNone; };
template<typename T>
const T &get() const;
template<typename T>
void set(const T &value);
std::string toString() const;
private:
ControlType type_;
union {
bool bool_;
int32_t integer32_;
int64_t integer64_;
};
};
struct ControlIdentifier {
ControlId id;
const char *name;
ControlType 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; }
ControlType 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);
}
using ControlInfoMap = std::unordered_map<ControlId, ControlInfo>;
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(ControlId id) const;
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[](ControlId id);
ControlValue &operator[](const ControlInfo *info) { return controls_[info]; }
void update(const ControlList &list);
private:
Camera *camera_;
ControlListMap controls_;
};
} /* namespace libcamera */
#endif /* __LIBCAMERA_CONTROLS_H__ */