ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
midea_protocol.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <vector>
5
7#include "esphome/core/hal.h"
9#include "remote_base.h"
10
11namespace esphome::remote_base {
12
13class MideaData {
14 public:
15 // Make default
17 // Make from initializer_list
18 MideaData(std::initializer_list<uint8_t> data) {
19 std::copy_n(data.begin(), std::min(data.size(), this->data_.size()), this->data_.begin());
20 }
21 // Make from vector
22 MideaData(const std::vector<uint8_t> &data) {
23 std::copy_n(data.begin(), std::min(data.size(), this->data_.size()), this->data_.begin());
24 }
25 MideaData(const uint8_t *data, size_t len) {
26 progmem_memcpy(this->data_.data(), data, std::min(len, this->data_.size()));
27 }
28
29 uint8_t *data() { return this->data_.data(); }
30 const uint8_t *data() const { return this->data_.data(); }
31 uint8_t size() const { return this->data_.size(); }
32 bool is_valid() const { return this->data_[OFFSET_CS] == this->calc_cs_(); }
33 void finalize() { this->data_[OFFSET_CS] = this->calc_cs_(); }
34 bool is_compliment(const MideaData &rhs) const;
36 static constexpr size_t TO_STR_BUFFER_SIZE = format_hex_pretty_size(6);
38 const char *to_str(char *buffer) const {
39 format_hex_pretty_to(buffer, TO_STR_BUFFER_SIZE, this->data_.data(), this->data_.size(), '.');
40 return buffer;
41 }
42 // compare only 40-bits
43 bool operator==(const MideaData &rhs) const {
44 return std::equal(this->data_.begin(), this->data_.begin() + OFFSET_CS, rhs.data_.begin());
45 }
51 MideaDataType type() const { return static_cast<MideaDataType>(this->data_[0]); }
52 template<typename T> T to() const { return T(*this); }
53 uint8_t &operator[](size_t idx) { return this->data_[idx]; }
54 const uint8_t &operator[](size_t idx) const { return this->data_[idx]; }
55
56 protected:
57 uint8_t get_value_(uint8_t idx, uint8_t mask = 255, uint8_t shift = 0) const {
58 return (this->data_[idx] >> shift) & mask;
59 }
60 void set_value_(uint8_t idx, uint8_t value, uint8_t mask = 255, uint8_t shift = 0) {
61 this->data_[idx] &= ~(mask << shift);
62 this->data_[idx] |= (value << shift);
63 }
64 void set_mask_(uint8_t idx, bool state, uint8_t mask = 255) { this->set_value_(idx, state ? mask : 0, mask); }
65 static constexpr uint8_t OFFSET_CS = 5;
66 // 48-bits data
67 std::array<uint8_t, 6> data_;
68 // Calculate checksum
69 uint8_t calc_cs_() const;
70};
71
72class MideaProtocol : public RemoteProtocol<MideaData> {
73 public:
74 void encode(RemoteTransmitData *dst, const MideaData &src);
75 optional<MideaData> decode(RemoteReceiveData src);
76 void dump(const MideaData &data);
77};
78
79DECLARE_REMOTE_PROTOCOL(Midea)
80
81} // namespace esphome::remote_base
MideaData(const std::vector< uint8_t > &data)
const char * to_str(char *buffer) const
Format to buffer, returns pointer to buffer.
std::array< uint8_t, 6 > data_
const uint8_t & operator[](size_t idx) const
static constexpr uint8_t OFFSET_CS
MideaData(const uint8_t *data, size_t len)
void set_value_(uint8_t idx, uint8_t value, uint8_t mask=255, uint8_t shift=0)
MideaData(std::initializer_list< uint8_t > data)
bool is_compliment(const MideaData &rhs) const
const uint8_t * data() const
uint8_t get_value_(uint8_t idx, uint8_t mask=255, uint8_t shift=0) const
uint8_t & operator[](size_t idx)
bool operator==(const MideaData &rhs) const
void set_mask_(uint8_t idx, bool state, uint8_t mask=255)
static constexpr size_t TO_STR_BUFFER_SIZE
Buffer size for to_str(): 6 bytes = "AA.BB.CC.DD.EE.FF\0".
void encode(RemoteTransmitData *dst, const MideaData &src)
optional< MideaData > decode(RemoteReceiveData src)
void dump(const MideaData &data)
bool state
Definition fan.h:2
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:1609
const void * src
Definition hal.h:68