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