brmesh/components/brmesh/address.h
Jonas Rabenstein e797cdb349 wip
2026-01-04 19:19:00 +01:00

35 lines
904 B
C++

#pragma once
#include <algorithm>
#include <array>
#include <span>
#include "esphome/core/helpers.h"
namespace esphome {
namespace brmesh {
class Address : public std::array<uint8_t, 3> {
static constexpr uint8_t reverse(uint8_t x) {
x = ((x & 0xAA) >> 1) | ((x & 0x55) << 1);
x = ((x & 0xCC) >> 2) | ((x & 0x33) << 2);
x = ((x & 0xF0) >> 4) | ((x & 0x0F) << 4);
return x;
}
public:
constexpr Address(const uint8_t a, const uint8_t b, const uint8_t c)
: array{reverse(c), reverse(b), reverse(a)} {}
template <size_t size>
std::span<uint8_t> set(const std::span<uint8_t, size> &dst) const {
return set(std::span<uint8_t>(dst));
}
std::span<uint8_t> set(const std::span<uint8_t> &dst) const {
if (dst.size() < size())
return {};
std::copy(cbegin(), cend(), &dst[0]);
return dst.subspan(0, size());
}
};
} // namespace brmesh
} // namespace esphome