12namespace roboctrl::device::super_cap_protocol {
21inline std::optional<feedback> decode(std::span<const std::byte> data) {
22 if (data.size() != 8)
return std::nullopt;
23 static_assert(
sizeof(float) == 4 && std::numeric_limits<float>::is_iec559);
25 for (
size_t i = 0; i < 4; ++i) raw |= uint32_t{std::to_integer<uint8_t>(data[i + 1])} << (8 * i);
26 const float power = std::bit_cast<float>(raw);
27 if (!std::isfinite(power))
return std::nullopt;
28 return feedback{std::to_integer<uint8_t>(data[0]), power,
29 static_cast<uint16_t
>(std::to_integer<uint8_t>(data[5]) | uint16_t{std::to_integer<uint8_t>(data[6])} << 8),
30 std::to_integer<uint8_t>(data[7])};
33inline std::array<std::byte, 8> encode(
bool enabled, uint16_t power_limit, uint16_t buffer_target) {
34 return {
static_cast<std::byte
>(enabled),
static_cast<std::byte
>(power_limit & 0xff),
35 static_cast<std::byte
>(power_limit >> 8),
static_cast<std::byte
>(buffer_target & 0xff),
36 static_cast<std::byte
>(buffer_target >> 8), std::byte{0}, std::byte{0}, std::byte{0}};
39inline bool output_enabled(
bool requested,
bool command_fresh,
bool online, uint8_t error) {
40 return requested && command_fresh && online && error == 0;