ESPHome 2025.5.0
Loading...
Searching...
No Matches
gobox_protocol.cpp
Go to the documentation of this file.
1#include "gobox_protocol.h"
2#include "esphome/core/log.h"
3
4namespace esphome {
5namespace remote_base {
6
7static const char *const TAG = "remote.gobox";
8
9constexpr uint32_t BIT_MARK_US = 580; // 70us seems like a safe time delta for the receiver...
10constexpr uint32_t BIT_ONE_SPACE_US = 1640;
11constexpr uint32_t BIT_ZERO_SPACE_US = 545;
12constexpr uint64_t HEADER = 0b011001001100010uL; // 15 bits
13constexpr uint64_t HEADER_SIZE = 15;
14constexpr uint64_t CODE_SIZE = 17;
15
16void GoboxProtocol::dump_timings_(const RawTimings &timings) const {
17 ESP_LOGD(TAG, "Gobox: size=%u", timings.size());
18 for (int32_t timing : timings) {
19 ESP_LOGD(TAG, "Gobox: timing=%ld", (long) timing);
20 }
21}
22
24 ESP_LOGI(TAG, "Send Gobox: code=0x%x", data.code);
25 dst->set_carrier_frequency(38000);
26 dst->reserve((HEADER_SIZE + CODE_SIZE + 1) * 2);
27 uint64_t code = (HEADER << CODE_SIZE) | (data.code & ((1UL << CODE_SIZE) - 1));
28 ESP_LOGI(TAG, "Send Gobox: code=0x%Lx", code);
29 for (int16_t i = (HEADER_SIZE + CODE_SIZE - 1); i >= 0; i--) {
30 if (code & ((uint64_t) 1 << i)) {
31 dst->item(BIT_MARK_US, BIT_ONE_SPACE_US);
32 } else {
33 dst->item(BIT_MARK_US, BIT_ZERO_SPACE_US);
34 }
35 }
36 dst->item(BIT_MARK_US, 2000);
37
38 dump_timings_(dst->get_data());
39}
40
42 if (src.size() < ((HEADER_SIZE + CODE_SIZE) * 2 + 1)) {
43 return {};
44 }
45
46 // First check for the header
47 uint64_t code = HEADER;
48 for (int16_t i = HEADER_SIZE - 1; i >= 0; i--) {
49 if (code & ((uint64_t) 1 << i)) {
50 if (!src.expect_item(BIT_MARK_US, BIT_ONE_SPACE_US)) {
51 return {};
52 }
53 } else {
54 if (!src.expect_item(BIT_MARK_US, BIT_ZERO_SPACE_US)) {
55 return {};
56 }
57 }
58 }
59
60 // Next, build up the code
61 code = 0UL;
62 for (int16_t i = CODE_SIZE - 1; i >= 0; i--) {
63 if (!src.expect_mark(BIT_MARK_US)) {
64 return {};
65 }
66 if (src.expect_space(BIT_ONE_SPACE_US)) {
67 code |= (1UL << i);
68 } else if (!src.expect_space(BIT_ZERO_SPACE_US)) {
69 return {};
70 }
71 }
72
73 if (!src.expect_mark(BIT_MARK_US)) {
74 return {};
75 }
76
77 dump_timings_(src.get_raw_data());
78
79 GoboxData out;
80 out.code = code;
81
82 return out;
83}
84
85void GoboxProtocol::dump(const GoboxData &data) {
86 ESP_LOGI(TAG, "Received Gobox: code=0x%x", data.code);
87 switch (data.code) {
88 case GOBOX_MENU:
89 ESP_LOGI(TAG, "Received Gobox: key=MENU");
90 break;
91 case GOBOX_RETURN:
92 ESP_LOGI(TAG, "Received Gobox: key=RETURN");
93 break;
94 case GOBOX_UP:
95 ESP_LOGI(TAG, "Received Gobox: key=UP");
96 break;
97 case GOBOX_LEFT:
98 ESP_LOGI(TAG, "Received Gobox: key=LEFT");
99 break;
100 case GOBOX_RIGHT:
101 ESP_LOGI(TAG, "Received Gobox: key=RIGHT");
102 break;
103 case GOBOX_DOWN:
104 ESP_LOGI(TAG, "Received Gobox: key=DOWN");
105 break;
106 case GOBOX_OK:
107 ESP_LOGI(TAG, "Received Gobox: key=OK");
108 break;
109 case GOBOX_TOGGLE:
110 ESP_LOGI(TAG, "Received Gobox: key=TOGGLE");
111 break;
112 case GOBOX_PROFILE:
113 ESP_LOGI(TAG, "Received Gobox: key=PROFILE");
114 break;
115 case GOBOX_FASTER:
116 ESP_LOGI(TAG, "Received Gobox: key=FASTER");
117 break;
118 case GOBOX_SLOWER:
119 ESP_LOGI(TAG, "Received Gobox: key=SLOWER");
120 break;
121 case GOBOX_LOUDER:
122 ESP_LOGI(TAG, "Received Gobox: key=LOUDER");
123 break;
124 case GOBOX_SOFTER:
125 ESP_LOGI(TAG, "Received Gobox: key=SOFTER");
126 break;
127 }
128}
129
130} // namespace remote_base
131} // namespace esphome
void dump(const GoboxData &data) override
void encode(RemoteTransmitData *dst, const GoboxData &data) override
optional< GoboxData > decode(RemoteReceiveData src) override
bool expect_item(uint32_t mark, uint32_t space)
const RawTimings & get_raw_data() const
Definition remote_base.h:53
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
const RawTimings & get_data() const
Definition remote_base.h:36
constexpr uint64_t HEADER
constexpr uint64_t HEADER_SIZE
constexpr uint64_t CODE_SIZE
std::vector< int32_t > RawTimings
Definition remote_base.h:23
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7