14static constexpr uint8_t MAX_DATA_LENGTH = 15;
15static constexpr uint8_t DATA_LENGTH_MASK = 0x3f;
39 std::copy_n(
data.begin(), std::min(
data.size(), this->data_.size()), this->data_.begin());
43 std::copy_n(
data.begin(), std::min(
data.size(), this->data_.size()), this->data_.begin());
51 const uint8_t *
data()
const {
return this->
data_.data(); }
53 return std::min(
static_cast<uint8_t
>(6 + (2 * this->
get_address_length()) + (this->
data_[2] & DATA_LENGTH_MASK)),
54 static_cast<uint8_t
>(this->
data_.size()));
57 return this->
data_[0] == 0x55 && this->
data_[1] == 0xff &&
58 ((this->
data_[2] & DATA_LENGTH_MASK) <= MAX_DATA_LENGTH) &&
63 this->
data_[2] |= 0x80;
65 this->
data_[2] &= 0x7f;
72 if (three_byte_address) {
73 this->
data_[2] |= 0x40;
75 this->
data_[2] &= 0xbf;
84 this->
data_[4] = (address >> 8) & 0xff;
85 this->
data_[5] = address & 0xff;
87 this->
data_[4] = (address >> 16) & 0xff;
88 this->
data_[5] = (address >> 8) & 0xff;
89 this->
data_[6] = address & 0xff;
100 this->
data_[6] = (address >> 8) & 0xff;
101 this->
data_[7] = address & 0xff;
103 this->
data_[7] = (address >> 16) & 0xff;
104 this->
data_[8] = (address >> 8) & 0xff;
105 this->
data_[9] = address & 0xff;
123 uint8_t
size =
static_cast<uint8_t
>(std::min<size_t>(MAX_DATA_LENGTH,
len));
124 this->
data_[2] &= (0xff ^ DATA_LENGTH_MASK);
125 this->
data_[2] |= (size & DATA_LENGTH_MASK);
131 std::vector<uint8_t>
data(this->
data_.begin() + 5 + 2 * this->get_address_length(),
132 this->data_.begin() + 5 + 2 * this->get_address_length() + this->get_data_size());
136 return std::min(MAX_DATA_LENGTH,
static_cast<uint8_t
>(this->
data_[2] & DATA_LENGTH_MASK));
142 this->
data_[0] = 0x55;
143 this->
data_[1] = 0xff;
149 template<
size_t N>
char *
format_to(
char (&
buffer)[N], uint8_t max_print_bytes = 255)
const {
154 if (std::equal(this->
data_.begin(), this->data_.begin() + this->size(), rhs.
data_.begin()))
165 std::array<uint8_t, 12 + MAX_DATA_LENGTH>
data_;
173 uint8_t print_bytes = std::min(this->
size(), max_print_bytes);
177 ptr += snprintf(ptr,
end - ptr,
"%s ", raw_hex);
181 ptr += snprintf(ptr,
end - ptr,
183 :
"[%04" PRIX32
" %s %04" PRIX32
"] Type: %02X",
188 format_hex_pretty_to(data_hex, this->data_.data() + 5 + 2 * this->get_address_length(), this->get_data_size(),
190 snprintf(ptr,
end - ptr,
", Data: %s", data_hex);
193 snprintf(ptr,
end - ptr,
"[Invalid]");
215 return data.has_value() && data.value() == this->
data_;
bool matches(RemoteReceiveData src) override
void set_retransmission(const bool retransmission)
void set_destination_address(const uint32_t destination_address)
void set_message_id(const uint8_t message_id)
void set_auto_message_id(const bool auto_message_id)
void set_message_type(const uint8_t message_type)
void set_data(const std::vector< uint8_t > &data)
void set_source_address(const uint32_t source_address)
void set_three_byte_address(const bool three_byte_address)
uint32_t get_destination_address() const
bool operator==(const ABBWelcomeData &rhs) const
bool get_retransmission() const
uint8_t get_address_length() const
uint8_t get_three_byte_address() const
ABBWelcomeData(std::initializer_list< uint8_t > data)
uint8_t get_data_size() const
void set_message_id(uint8_t message_id)
void set_retransmission(bool retransmission)
uint8_t get_message_type() const
static constexpr size_t FORMAT_BUFFER_SIZE
uint32_t get_source_address() const
void set_destination_address(uint32_t address)
void set_three_byte_address(bool three_byte_address)
char * format_to_internal_(char *buffer, uint8_t max_print_bytes) const
const uint8_t * data() const
const uint8_t & operator[](size_t idx) const
std::array< uint8_t, 12+MAX_DATA_LENGTH > data_
char * format_to(char(&buffer)[N], uint8_t max_print_bytes=255) const
void set_data(const uint8_t *data, size_t len)
data may be a PROGMEM table
void set_data(const std::vector< uint8_t > &data)
uint8_t get_message_id() const
std::vector< uint8_t > get_data() const
void set_message_type(uint8_t message_type)
void set_fixed_message_id(uint8_t message_id)
A configured id, which finalize() keeps instead of picking one.
ABBWelcomeData(const ABBWelcomeData &)=default
void set_source_address(uint32_t address)
ABBWelcomeData(const std::vector< uint8_t > &data)
uint8_t & operator[](size_t idx)
void encode(RemoteTransmitData *dst, const ABBWelcomeData &src)
void encode_byte_(RemoteTransmitData *dst, uint8_t data) const
bool decode_byte_(RemoteReceiveData &src, bool &done, uint8_t &data)
optional< ABBWelcomeData > decode(RemoteReceiveData src)
void dump(const ABBWelcomeData &data)
void progmem_memcpy(void *dst, const void *src, size_t len)
constexpr uint32_t encode_uint24(uint8_t byte1, uint8_t byte2, uint8_t byte3)
Encode a 24-bit value given three bytes in most to least significant byte order.
char * format_hex_pretty_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length, char separator)
Format byte array as uppercase hex to buffer (base implementation).
uint32_t random_uint32()
Return a random 32-bit unsigned integer.
constexpr size_t format_hex_pretty_size(size_t byte_count)
Calculate buffer size needed for format_hex_pretty_to with separator: "XX:XX:...:XX\0".
constexpr uint16_t encode_uint16(uint8_t msb, uint8_t lsb)
Encode a 16-bit value given the most and least significant byte.