ESPHome 2026.1.2
Loading...
Searching...
No Matches
mirage_protocol.cpp
Go to the documentation of this file.
1#include "mirage_protocol.h"
3#include "esphome/core/log.h"
4
5namespace esphome {
6namespace remote_base {
7
8static const char *const TAG = "remote.mirage";
9
10constexpr uint32_t HEADER_MARK_US = 8360;
11constexpr uint32_t HEADER_SPACE_US = 4248;
12constexpr uint32_t BIT_MARK_US = 554;
13constexpr uint32_t BIT_ONE_SPACE_US = 1592;
14constexpr uint32_t BIT_ZERO_SPACE_US = 545;
15
16constexpr unsigned int MIRAGE_IR_PACKET_BIT_SIZE = 120;
17// Max data bytes in packet (excluding checksum)
19
22 ESP_LOGI(TAG, "Transmit Mirage: %s", format_hex_pretty_to(hex_buf, data.data.data(), data.data.size()));
23 dst->set_carrier_frequency(38000);
24 dst->reserve(5 + ((data.data.size() + 1) * 2));
25 dst->mark(HEADER_MARK_US);
26 dst->space(HEADER_SPACE_US);
27 dst->mark(BIT_MARK_US);
28 uint8_t checksum = 0;
29 for (uint8_t item : data.data) {
30 this->encode_byte_(dst, item);
31 checksum += (item >> 4) + (item & 0xF);
32 }
33 this->encode_byte_(dst, checksum);
34}
35
37 for (uint8_t b = 0; b < 8; b++) {
38 if (item & (1UL << b)) {
39 dst->space(BIT_ONE_SPACE_US);
40 } else {
41 dst->space(BIT_ZERO_SPACE_US);
42 }
43 dst->mark(BIT_MARK_US);
44 }
45}
46
48 if (!src.expect_item(HEADER_MARK_US, HEADER_SPACE_US)) {
49 return {};
50 }
51 if (!src.expect_mark(BIT_MARK_US)) {
52 return {};
53 }
54 size_t size = src.size() - src.get_index() - 1;
55 if (size < MIRAGE_IR_PACKET_BIT_SIZE * 2)
56 return {};
58 uint8_t checksum = 0;
59 MirageData out;
60 while (size > 0) {
61 uint8_t data = 0;
62 for (uint8_t b = 0; b < 8; b++) {
63 if (src.expect_space(BIT_ONE_SPACE_US)) {
64 data |= (1UL << b);
65 } else if (!src.expect_space(BIT_ZERO_SPACE_US)) {
66 return {};
67 }
68 if (!src.expect_mark(BIT_MARK_US)) {
69 return {};
70 }
71 size -= 2;
72 }
73 if (size > 0) {
74 checksum += (data >> 4) + (data & 0xF);
75 out.data.push_back(data);
76 } else if (checksum != data) {
77 return {};
78 }
79 }
80 return out;
81}
82
85 ESP_LOGI(TAG, "Received Mirage: %s", format_hex_pretty_to(hex_buf, data.data.data(), data.data.size()));
86}
87
88} // namespace remote_base
89} // namespace esphome
uint8_t checksum
Definition bl0906.h:3
void encode_byte_(RemoteTransmitData *dst, uint8_t item)
void dump(const MirageData &data) override
void encode(RemoteTransmitData *dst, const MirageData &data) override
optional< MirageData > decode(RemoteReceiveData src) override
bool expect_item(uint32_t mark, uint32_t space)
void set_carrier_frequency(uint32_t carrier_frequency)
Definition remote_base.h:30
constexpr unsigned int MIRAGE_IR_PACKET_BIT_SIZE
constexpr size_t MIRAGE_MAX_DATA_BYTES
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
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:334
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:830