6static const char *
const TAG =
"remote.coolix";
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;
27 dst->
item(HEADER_MARK_US, HEADER_SPACE_US);
30 for (
unsigned shift = 16;; shift -= 8) {
32 const uint8_t
byte = src >> shift;
34 for (uint8_t mask = 1 << 7; mask; mask >>= 1)
35 dst->
item(BIT_MARK_US, (
byte & mask) ? BIT_ONE_SPACE_US : BIT_ZERO_SPACE_US);
37 for (uint8_t mask = 1 << 7; mask; mask >>= 1)
38 dst->
item(BIT_MARK_US, (
byte & mask) ? BIT_ZERO_SPACE_US : BIT_ONE_SPACE_US);
42 dst->
mark(FOOTER_MARK_US);
50 dst->
reserve(100 + 100 * data.has_second());
51 encode_frame(dst, data.first);
52 if (data.has_second()) {
53 dst->
space(FOOTER_SPACE_US);
54 encode_frame(dst, data.second);
60 if (!src.
expect_item(HEADER_MARK_US, HEADER_SPACE_US))
64 for (
unsigned n = 3;; data <<= 8) {
66 for (
uint32_t mask = 1 << 7; mask; mask >>= 1) {
77 if (!src.
expect_item(BIT_MARK_US, (data & mask) ? BIT_ZERO_SPACE_US : BIT_ONE_SPACE_US))
93 const auto size = data.size();
94 if ((
size != 200 &&
size != 100) || !decode_frame(data, result.
first))
96 if (
size == 100 || !data.expect_space(FOOTER_SPACE_US) || !decode_frame(data, result.
second))
102 if (data.is_strict()) {
103 ESP_LOGI(TAG,
"Received Coolix: 0x%06" PRIX32, data.first);
104 }
else if (data.has_second()) {
105 ESP_LOGI(TAG,
"Received unstrict Coolix: [0x%06" PRIX32
", 0x%06" PRIX32
"]", data.first, data.second);
107 ESP_LOGI(TAG,
"Received unstrict Coolix: [0x%06" PRIX32
"]", data.first);
void dump(const CoolixData &data) override
optional< CoolixData > decode(RemoteReceiveData data) override
void encode(RemoteTransmitData *dst, const CoolixData &data) override
bool expect_item(uint32_t mark, uint32_t space)
bool expect_space(uint32_t length)
bool expect_mark(uint32_t length)
void space(uint32_t length)
void set_carrier_frequency(uint32_t carrier_frequency)
void mark(uint32_t length)
void item(uint32_t mark, uint32_t space)
void reserve(uint32_t len)
const std::vector< uint8_t > & data
bool operator==(const CoolixData &other) const