ESPHome 2025.5.0
Loading...
Searching...
No Matches
toto_protocol.cpp
Go to the documentation of this file.
1#include "toto_protocol.h"
2#include "esphome/core/log.h"
3
4namespace esphome {
5namespace remote_base {
6
7static const char *const TAG = "remote.toto";
8
9static const uint32_t PREAMBLE_HIGH_US = 6200;
10static const uint32_t PREAMBLE_LOW_US = 2800;
11static const uint32_t BIT_HIGH_US = 550;
12static const uint32_t BIT_ONE_LOW_US = 1700;
13static const uint32_t BIT_ZERO_LOW_US = 550;
14static const uint32_t TOTO_HEADER = 0x2008;
15
17 uint32_t payload = 0;
18
19 payload = data.rc_code_1 << 20;
20 payload |= data.rc_code_2 << 16;
21 payload |= data.command << 8;
22 payload |= ((payload & 0xFF0000) >> 16) ^ ((payload & 0x00FF00) >> 8);
23
24 dst->reserve(80);
25 dst->set_carrier_frequency(38000);
26 dst->item(PREAMBLE_HIGH_US, PREAMBLE_LOW_US);
27
28 for (uint32_t mask = 1UL << 14; mask; mask >>= 1) {
29 if (TOTO_HEADER & mask) {
30 dst->item(BIT_HIGH_US, BIT_ONE_LOW_US);
31 } else {
32 dst->item(BIT_HIGH_US, BIT_ZERO_LOW_US);
33 }
34 }
35
36 for (uint32_t mask = 1UL << 23; mask; mask >>= 1) {
37 if (payload & mask) {
38 dst->item(BIT_HIGH_US, BIT_ONE_LOW_US);
39 } else {
40 dst->item(BIT_HIGH_US, BIT_ZERO_LOW_US);
41 }
42 }
43
44 dst->mark(BIT_HIGH_US);
45}
47 uint16_t header = 0;
48 uint32_t payload = 0;
49
50 TotoData data{
51 .rc_code_1 = 0,
52 .rc_code_2 = 0,
53 .command = 0,
54 };
55
56 if (!src.expect_item(PREAMBLE_HIGH_US, PREAMBLE_LOW_US)) {
57 return {};
58 }
59
60 for (uint32_t mask = 1UL << 14; mask; mask >>= 1) {
61 if (src.expect_item(BIT_HIGH_US, BIT_ONE_LOW_US)) {
62 header |= mask;
63 } else if (src.expect_item(BIT_HIGH_US, BIT_ZERO_LOW_US)) {
64 header &= ~mask;
65 } else {
66 return {};
67 }
68 }
69
70 if (header != TOTO_HEADER) {
71 return {};
72 }
73
74 for (uint32_t mask = 1UL << 23; mask; mask >>= 1) {
75 if (src.expect_item(BIT_HIGH_US, BIT_ONE_LOW_US)) {
76 payload |= mask;
77 } else if (src.expect_item(BIT_HIGH_US, BIT_ZERO_LOW_US)) {
78 payload &= ~mask;
79 } else {
80 return {};
81 }
82 }
83
84 if ((((payload & 0xFF0000) >> 16) ^ ((payload & 0x00FF00) >> 8)) != (payload & 0x0000FF)) {
85 return {};
86 }
87
88 data.rc_code_1 = (payload & 0xF00000) >> 20;
89 data.rc_code_2 = (payload & 0x0F0000) >> 16;
90 data.command = (payload & 0x00FF00) >> 8;
91
92 return data;
93}
94void TotoProtocol::dump(const TotoData &data) {
95 ESP_LOGI(TAG, "Received Toto data: rc_code_1=0x%01X, rc_code_2=0x%01X, command=0x%02X", data.rc_code_1,
96 data.rc_code_2, data.command);
97}
98
99} // namespace remote_base
100} // namespace esphome
bool expect_item(uint32_t mark, uint32_t space)
void set_carrier_frequency(uint32_t carrier_frequency)
Definition remote_base.h:34
void item(uint32_t mark, uint32_t space)
Definition remote_base.h:29
optional< TotoData > decode(RemoteReceiveData src) override
void dump(const TotoData &data) override
void encode(RemoteTransmitData *dst, const TotoData &data) override
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7