forked from iphong/lib-esp-rc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEspRC.h
181 lines (164 loc) · 4.54 KB
/
EspRC.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
// //
// // Author: Phong Vu
// //
// #ifndef __ESP_RC_H__
// #define __ESP_RC_H__
// #include <esp8266wifi.h>
// #include <espnow.h>
// #include <ticker.h>
// u8 broadcast[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
// typedef std::function<void()> esp_rc_cb_t;
// typedef std::function<void(u8*, u8)> esp_rc_callback_t;
// struct esp_rc_listener_t {
// String prefix;
// esp_rc_cb_t callback;
// };
// struct esp_rc_event_t {
// String prefix;
// esp_rc_callback_t callback;
// };
// extern struct esp_rc_class esp_rc;
// struct esp_rc_class {
// esp_rc_event_t events[100];
// u8 events_num = 0;
// void begin() {
// if (esp_now_init() == OK) {
// esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
// if (esp_now_is_peer_exist(broadcast))
// esp_now_del_peer(broadcast);
// esp_now_add_peer(broadcast, ESP_NOW_ROLE_COMBO, 0, 0, 0);
// esp_now_register_send_cb([](u8 *sender, u8 err) {
// Serial.println("sent");
// });
// esp_now_register_recv_cb([](u8 *sender, u8 *data, u8 size) {
// auto i = 0;
// while (i < esp_rc.events_num) {
// esp_rc_event_t e = esp_rc.events[i];
// u8 offset = e.prefix.length();
// if (esp_rc.equals(data, (u8*)e.prefix.c_str(), offset)) {
// e.callback(&data[offset], size - offset);
// }
// i++;
// }
// });
// }
// }
// void send(String data) {
// esp_now_send(broadcast, (u8*)data.c_str(), data.length());
// }
// void on(String prefix, esp_rc_callback_t callback) {
// events[events_num++] = esp_rc_event_t { prefix, callback };
// }
// bool equals(u8 *a, u8 *b, u8 size, u8 offset = 0) {
// for (auto i = offset; i < offset + size; i++) {
// if (a[i] != b[i]) {
// return false;
// }
// }
// return true;
// }
// } esp_rc;
// class EspRCClass;
// extern EspRCClass EspRC;
// class EspRCClass {
// public:
// Ticker loop;
// esp_rc_listener_t listeners[255];
// u8 _listeners_num;
// u8 *_sender;
// u8 *_data;
// u8 _size;
// u32 _sentTime;
// bool _isSending;
// HardwareSerial *_serial;
// void bridge(HardwareSerial *port) {
// _serial = port;
// _serial->begin(921600);
// }
// u8 _buffer[255];
// void update() {
// if (_serial->available()) {
// u16 size = _serial->readBytesUntil('\n', _buffer, 255);
// esp_now_send(broadcast, _buffer, size);
// onMessage(NULL, _buffer, size);
// _isSending = true;
// _sentTime = micros();
// }
// }
// u8 getSize() {
// return _size;
// }
// u8 *getBytes() {
// return _data;
// }
// String getValue() {
// String d = "";
// for (auto i = 0; i < _size; i++) d.concat((const char)_data[i]);
// return d;
// }
// void send(String data, u8 *receiver = NULL) {
// if (_isSending) return;
// esp_now_send(receiver, (u8 *)data.c_str(), (u8)data.length());
// _isSending = true;
// _sentTime = micros();
// }
// void send(String data, String value) {
// send(data + value);
// }
// void send(String data, double value) {
// send(data + String(value));
// }
// void on(String prefix, esp_rc_cb_t callback) {
// listeners[_listeners_num++] = {prefix, callback};
// }
// void end() {
// esp_now_del_peer(broadcast);
// esp_now_unregister_recv_cb();
// esp_now_deinit();
// }
// void begin(u8 channel = 0) {
// if (WiFi.getMode() == WIFI_OFF) {
// WiFi.mode(WIFI_STA);
// }
// if (esp_now_init() == OK) {
// esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
// if (esp_now_is_peer_exist(broadcast))
// esp_now_del_peer(broadcast);
// esp_now_add_peer(broadcast, ESP_NOW_ROLE_COMBO, channel, 0, 0);
// esp_now_register_send_cb(onSend);
// esp_now_register_recv_cb(onMessage);
// }
// }
// static bool equals(u8 *a, u8 *b, u8 size, u8 offset = 0) {
// for (auto i = offset; i < offset + size; i++) {
// if (a[i] != b[i]) {
// return false;
// }
// }
// return true;
// }
// private:
// esp_now_send_cb_t onSend = [](u8 *receiver, u8 err) {
// EspRC._isSending = false;
// };
// esp_now_recv_cb_t onMessage = [](u8 *sender, u8 *data, u8 size) {
// if (EspRC._serial) {
// for (auto i = 0; i < size; i++)
// EspRC._serial->write(data[i]);
// EspRC._serial->print('\n');
// }
// for (auto i = 0; i < EspRC._listeners_num; i++) {
// esp_rc_listener_t *listener = &EspRC.listeners[i];
// u8 *prefix = (u8 *)listener->prefix.c_str();
// u8 len = listener->prefix.length();
// if (equals(prefix, data, len)) {
// if (listener->callback) {
// EspRC._data = data + len;
// EspRC._size = size - len;
// listener->callback();
// }
// }
// }
// };
// } EspRC;
// #endif //__ESP_RC_H__