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, ControlTypeBool,
ControlTypeInteger32, ControlTypeInteger32,
ControlTypeInteger64, ControlTypeInteger64,
ControlTypeFloat,
}; };
namespace details { namespace details {
@ -52,6 +53,11 @@ struct control_type<int64_t> {
static constexpr ControlType value = ControlTypeInteger64; static constexpr ControlType value = ControlTypeInteger64;
}; };
template<>
struct control_type<float> {
static constexpr ControlType value = ControlTypeFloat;
};
template<typename T, std::size_t N> template<typename T, std::size_t N>
struct control_type<Span<T, N>> : public control_type<std::remove_cv_t<T>> { 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; break;
} }
case ControlTypeFloat: {
float data = value.get<float>();
buffer.write(&data);
break;
}
default: default:
break; break;
} }
@ -337,6 +343,12 @@ ControlValue ControlSerializer::load<ControlValue>(ControlType type,
return ControlValue(value); return ControlValue(value);
} }
case ControlTypeFloat: {
float value;
b.read(&value);
return ControlValue(value);
}
default: default:
return ControlValue(); return ControlValue();
} }

View file

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