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