libcamera: controls: Add support for float controls

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

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Jacopo Mondi 2020-01-09 14:31:00 +01:00 committed by Laurent Pinchart
parent abd96336ed
commit 8b12a161e0
3 changed files with 29 additions and 3 deletions

View file

@ -24,6 +24,7 @@ enum ControlType {
ControlTypeBool,
ControlTypeInteger32,
ControlTypeInteger64,
ControlTypeFloat,
};
namespace details {
@ -52,6 +53,11 @@ struct control_type<int64_t> {
static constexpr ControlType value = ControlTypeInteger64;
};
template<>
struct control_type<float> {
static constexpr ControlType value = ControlTypeFloat;
};
template<typename T, std::size_t N>
struct control_type<Span<T, N>> : public control_type<std::remove_cv_t<T>> {
};

View file

@ -165,6 +165,12 @@ void ControlSerializer::store(const ControlValue &value,
break;
}
case ControlTypeFloat: {
float data = value.get<float>();
buffer.write(&data);
break;
}
default:
break;
}
@ -337,6 +343,12 @@ ControlValue ControlSerializer::load<ControlValue>(ControlType type,
return ControlValue(value);
}
case ControlTypeFloat: {
float value;
b.read(&value);
return ControlValue(value);
}
default:
return ControlValue();
}

View file

@ -55,6 +55,7 @@ static constexpr size_t ControlValueSize[] = {
[ControlTypeBool] = sizeof(bool),
[ControlTypeInteger32] = sizeof(int32_t),
[ControlTypeInteger64] = sizeof(int64_t),
[ControlTypeFloat] = sizeof(float),
};
} /* namespace */
@ -70,6 +71,8 @@ static constexpr size_t ControlValueSize[] = {
* 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
*/
/**
@ -205,6 +208,11 @@ std::string ControlValue::toString() const
str += std::to_string(*value);
break;
}
case ControlTypeFloat: {
const float *value = reinterpret_cast<const float *>(data);
str += std::to_string(*value);
break;
}
case ControlTypeNone:
break;
}
@ -374,9 +382,9 @@ void ControlValue::set(ControlType type, bool isArray, const void *data,
* instead of Control.
*
* Controls of any type can be defined through template specialisation, but
* libcamera only supports the bool, int32_t and int64_t types natively (this
* includes types that are equivalent to the supported types, such as int and
* long int).
* libcamera only supports the bool, int32_t, int64_t and float types natively
* (this includes types that are equivalent to the supported types, such as int
* and long int).
*
* Controls IDs shall be unique. While nothing prevents multiple instances of
* the Control class to be created with the same ID for the same object, doing