ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
mirage_protocol.cpp
Go to the documentation of this file.
1#include "mirage_protocol.h"
2#include "esphome/core/hal.h"
4#include "esphome/core/log.h"
5
6#include <algorithm>
7
8namespace esphome::remote_base {
9
10ESPHOME_LOG_TAG(TAG, "remote.mirage");
11
12constexpr uint32_t HEADER_MARK_US = 8360;
13constexpr uint32_t HEADER_SPACE_US = 4248;
14constexpr uint32_t BIT_MARK_US = 554;
15constexpr uint32_t BIT_ONE_SPACE_US = 1592;
16constexpr uint32_t BIT_ZERO_SPACE_US = 545;
17
18constexpr unsigned int MIRAGE_IR_PACKET_BIT_SIZE = 120;
19// Max data bytes in packet (excluding checksum)
21
22void MirageProtocol::encode(RemoteTransmitData *dst, const uint8_t *data, size_t len) {
23 // data may be a PROGMEM table, so log a RAM copy
24 uint8_t log_buf[MIRAGE_MAX_DATA_BYTES];
25 const size_t log_len = std::min(len, MIRAGE_MAX_DATA_BYTES);
26 progmem_memcpy(log_buf, data, log_len);
28 ESP_LOGI(TAG, "Transmit Mirage: %s", format_hex_pretty_to(hex_buf, log_buf, log_len));
29 dst->set_carrier_frequency(38000);
30 dst->reserve(5 + ((len + 1) * 2));
31 dst->mark(HEADER_MARK_US);
32 dst->space(HEADER_SPACE_US);
33 dst->mark(BIT_MARK_US);
34 uint8_t checksum = 0;
35 for (size_t i = 0; i < len; i++) {
36 const uint8_t item = progmem_read_byte(data + i);
37 this->encode_byte_(dst, item);
38 checksum += (item >> 4) + (item & 0xF);
39 }
40 this->encode_byte_(dst, checksum);
41}
42
44 for (uint8_t b = 0; b < 8; b++) {
45 if (item & (1UL << b)) {
46 dst->space(BIT_ONE_SPACE_US);
47 } else {
48 dst->space(BIT_ZERO_SPACE_US);
49 }
50 dst->mark(BIT_MARK_US);
51 }
52}
53
55 if (!src.expect_item(HEADER_MARK_US, HEADER_SPACE_US)) {
56 return {};
57 }
58 if (!src.expect_mark(BIT_MARK_US)) {
59 return {};
60 }
61 size_t size = src.size() - src.get_index() - 1;
63 return {};
65 uint8_t checksum = 0;
67 while (size > 0) {
68 uint8_t data = 0;
69 for (uint8_t b = 0; b < 8; b++) {
70 if (src.expect_space(BIT_ONE_SPACE_US)) {
71 data |= (1UL << b);
72 } else if (!src.expect_space(BIT_ZERO_SPACE_US)) {
73 return {};
74 }
75 if (!src.expect_mark(BIT_MARK_US)) {
76 return {};
77 }
78 size -= 2;
79 }
80 if (size > 0) {
81 checksum += (data >> 4) + (data & 0xF);
82 out.data.push_back(data);
83 } else if (checksum != data) {
84 return {};
85 }
86 }
87 return out;
88}
89
92 ESP_LOGI(TAG, "Received Mirage: %s", format_hex_pretty_to(hex_buf, data.data.data(), data.data.size()));
93}
94
95} // namespace esphome::remote_base
uint8_t checksum
Definition bl0906.h:3
optional< MirageData > decode(RemoteReceiveData src)
void encode_byte_(RemoteTransmitData *dst, uint8_t item)
void dump(const MirageData &data)
void encode(RemoteTransmitData *dst, const MirageData &data)
void set_carrier_frequency(uint32_t carrier_frequency)
Definition remote_base.h:64
std::vector< uint8_t > & out
Definition gif.cpp:49
constexpr unsigned int MIRAGE_IR_PACKET_BIT_SIZE
ESPHOME_LOG_TAG(TAG, "remote.abbwelcome")
constexpr size_t MIRAGE_MAX_DATA_BYTES
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
uint16_t size
Definition helpers.cpp:34
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
uint8_t progmem_read_byte(const uint8_t *addr)
Definition hal.h:51
static void uint32_t