ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
pd_pioneer_protocol.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <vector>
5
6#include "esphome/core/hal.h"
8#include "remote_base.h"
9
10namespace esphome::remote_base {
11
13 public:
14 static constexpr uint8_t FRAME_SIZE = 14;
15 static constexpr uint8_t OFFSET_CS = 13;
16
17 PDPioneerData() = default;
18 PDPioneerData(std::initializer_list<uint8_t> data) {
19 std::copy_n(data.begin(), std::min(data.size(), this->data_.size()), this->data_.begin());
20 }
21 PDPioneerData(const std::vector<uint8_t> &data) {
22 std::copy_n(data.begin(), std::min(data.size(), this->data_.size()), this->data_.begin());
23 }
24 PDPioneerData(const uint8_t *data, size_t len) {
25 progmem_memcpy(this->data_.data(), data, std::min(len, this->data_.size()));
26 }
27
28 uint8_t *data() { return this->data_.data(); }
29 const uint8_t *data() const { return this->data_.data(); }
30
31 // Position 3 tells the two bursts of a command apart; the odd burst's checksum carries an extra 15
32 bool is_odd_burst() const { return this->data_[3] == 0x02; }
33 bool is_even_burst() const { return this->data_[3] == 0x01; }
34
35 bool is_valid() const {
36 return (this->is_odd_burst() || this->is_even_burst()) && this->data_[OFFSET_CS] == this->checksum_();
37 }
38
39 void finalize() { this->data_[OFFSET_CS] = this->checksum_(); }
40
41 static constexpr size_t TO_STR_BUFFER_SIZE = format_hex_pretty_size(FRAME_SIZE);
42 const char *to_str(char *buffer) const {
43 format_hex_pretty_to(buffer, TO_STR_BUFFER_SIZE, this->data_.data(), this->data_.size(), '.');
44 return buffer;
45 }
46
47 bool operator==(const PDPioneerData &rhs) const { return this->data_ == rhs.data_; }
48
49 uint8_t &operator[](size_t idx) { return this->data_[idx]; }
50 const uint8_t &operator[](size_t idx) const { return this->data_[idx]; }
51
52 protected:
53 uint8_t checksum_() const {
54 uint8_t cs = this->is_odd_burst() ? 15 : 0;
55 for (uint8_t idx = 0; idx < OFFSET_CS; idx++)
56 cs += this->data_[idx];
57 return cs;
58 }
59
60 std::array<uint8_t, FRAME_SIZE> data_{};
61};
62
63class PDPioneerProtocol : public RemoteProtocol<PDPioneerData> {
64 public:
65 void encode(RemoteTransmitData *dst, const PDPioneerData &src);
66 optional<PDPioneerData> decode(RemoteReceiveData src);
67 void dump(const PDPioneerData &data);
68};
69
70DECLARE_REMOTE_PROTOCOL(PDPioneer)
71
72} // namespace esphome::remote_base
PDPioneerData(std::initializer_list< uint8_t > data)
bool operator==(const PDPioneerData &rhs) const
PDPioneerData(const std::vector< uint8_t > &data)
const char * to_str(char *buffer) const
PDPioneerData(const uint8_t *data, size_t len)
std::array< uint8_t, FRAME_SIZE > data_
static constexpr size_t TO_STR_BUFFER_SIZE
const uint8_t & operator[](size_t idx) const
void encode(RemoteTransmitData *dst, const PDPioneerData &src)
optional< PDPioneerData > decode(RemoteReceiveData src)
uint32_t buffer
Definition gif.cpp:50
void progmem_memcpy(void *dst, const void *src, size_t len)
Definition hal.h:56
const void size_t len
Definition hal.h:68
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).
Definition helpers.cpp:498
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".
Definition helpers.h:1533
const void * src
Definition hal.h:68