35 lines
904 B
C++
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
|