ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
midea_protocol.cpp
Go to the documentation of this file.
1#include "midea_protocol.h"
2#include "esphome/core/log.h"
3
4namespace esphome::remote_base {
5
6ESPHOME_LOG_TAG(TAG, "remote.midea");
7
8static const int32_t TICK_US = 560;
9static const int32_t HEADER_MARK_US = 8 * TICK_US;
10static const int32_t HEADER_SPACE_US = 8 * TICK_US;
11static const int32_t BIT_MARK_US = 1 * TICK_US;
12static const int32_t BIT_ONE_SPACE_US = 3 * TICK_US;
13static const int32_t BIT_ZERO_SPACE_US = 1 * TICK_US;
14static const int32_t FOOTER_MARK_US = 1 * TICK_US;
15static const int32_t FOOTER_SPACE_US = 10 * TICK_US;
16static constexpr BitTimings BIT_TIMINGS{.bit_mark = BIT_MARK_US,
17 .one_space = BIT_ONE_SPACE_US,
18 .zero_space = BIT_ZERO_SPACE_US,
20// The second copy of the frame is sent inverted
21static constexpr BitTimings INVERTED_BIT_TIMINGS{.bit_mark = BIT_MARK_US,
22 .one_space = BIT_ZERO_SPACE_US,
23 .zero_space = BIT_ONE_SPACE_US,
25
26uint8_t MideaData::calc_cs_() const {
27 uint8_t cs = 0;
28 for (uint8_t idx = 0; idx < OFFSET_CS; idx++)
29 cs -= reverse_bits(this->data_[idx]);
30 return reverse_bits(cs);
31}
32
33bool MideaData::is_compliment(const MideaData &rhs) const {
34 return std::equal(this->data_.begin(), this->data_.end(), rhs.data_.begin(),
35 [](const uint8_t &a, const uint8_t &b) { return a + b == 255; });
36}
37
39 dst->set_carrier_frequency(38000);
40 dst->reserve(2 + 48 * 2 + 2 + 2 + 48 * 2 + 1);
41 dst->item(HEADER_MARK_US, HEADER_SPACE_US);
42 dst->item_bytes<BIT_TIMINGS>(src.data(), src.size());
43 dst->item(FOOTER_MARK_US, FOOTER_SPACE_US);
44 dst->item(HEADER_MARK_US, HEADER_SPACE_US);
45 dst->item_bytes<INVERTED_BIT_TIMINGS>(src.data(), src.size());
46 dst->mark(FOOTER_MARK_US);
47}
48
49static bool decode_data(RemoteReceiveData &src, MideaData &dst) {
50 return src.expect_bytes<BIT_TIMINGS>(dst.data(), dst.size());
51}
52
54 MideaData out, inv;
55 if (src.expect_item(HEADER_MARK_US, HEADER_SPACE_US) && decode_data(src, out) && out.is_valid() &&
56 src.expect_item(FOOTER_MARK_US, FOOTER_SPACE_US) && src.expect_item(HEADER_MARK_US, HEADER_SPACE_US) &&
57 decode_data(src, inv) && src.expect_mark(FOOTER_MARK_US) && out.is_compliment(inv))
58 return out;
59 return {};
60}
61
62void MideaProtocol::dump(const MideaData &data) {
64 ESP_LOGI(TAG, "Received Midea: %s", data.to_str(buf));
65}
66
67} // namespace esphome::remote_base
std::array< uint8_t, 6 > data_
static constexpr uint8_t OFFSET_CS
bool is_compliment(const MideaData &rhs) const
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)
void set_carrier_frequency(uint32_t carrier_frequency)
Definition remote_base.h:64
void item(uint32_t mark, uint32_t space)
Definition remote_base.h:43
void item_bytes(const uint8_t *bytes, size_t len)
One item per bit of each byte.
Definition remote_base.h:49
std::vector< uint8_t > & out
Definition gif.cpp:49
ESPHOME_LOG_TAG(TAG, "remote.abbwelcome")
const void * src
Definition hal.h:68
uint8_t reverse_bits(uint8_t x)
Reverse the order of 8 bits.
Definition helpers.h:1081
A bit is a mark (one_mark or zero_mark, both bit_mark unless set) and a space (one_space or zero_spac...
Definition remote_base.h:29