Skip to content

Commit 136c80b

Browse files
committed
Merge pull request #9 from matthijskooijman/callbacks
Add support for callbacks and various other improvements
2 parents 3390a87 + 6b063ab commit 136c80b

File tree

7 files changed

+2005
-23
lines changed

7 files changed

+2005
-23
lines changed

Printers.cpp

Lines changed: 356 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,356 @@
1+
#include "Printers.h"
2+
3+
void printHex(Print& p, const uint8_t* buf, size_t len, const __FlashStringHelper* byte_sep, const __FlashStringHelper* group_sep, size_t group_by) {
4+
size_t cur_group = 0;
5+
while (len--) {
6+
// Print the group separator whenever starting a new
7+
// group
8+
if (group_by && group_sep && cur_group == group_by) {
9+
p.print(group_sep);
10+
cur_group = 0;
11+
}
12+
13+
// Print the byte separator, except when at the start of
14+
// a new group (this also excludes the first byte)
15+
if (cur_group != 0 && byte_sep)
16+
p.print(byte_sep);
17+
18+
printHex(p, *buf);
19+
20+
buf++;
21+
cur_group++;
22+
}
23+
}
24+
25+
void printErrorCb(uint8_t code, uintptr_t data) {
26+
Print *p = (Print*)data;
27+
p->print(F("Error reading API packet. Error code: "));
28+
p->println(code);
29+
}
30+
31+
void printErrorCb(ZBTxStatusResponse& r, uintptr_t data) {
32+
Print *p = (Print*)data;
33+
if (!r.isSuccess()) {
34+
p->print(F("Error sending Zigbee packet. Delivery status: "));
35+
p->println(r.getDeliveryStatus());
36+
}
37+
}
38+
39+
void printErrorCb(TxStatusResponse& r, uintptr_t data) {
40+
Print *p = (Print*)data;
41+
if (!r.isSuccess()) {
42+
p->print(F("Error sending packet. Delivery status: "));
43+
p->println(r.getStatus());
44+
}
45+
}
46+
47+
void printErrorCb(AtCommandResponse& r, uintptr_t data) {
48+
Print *p = (Print*)data;
49+
if (!r.isOk()) {
50+
p->print(F("Error sending "));
51+
p->write(r.getCommand(), 2);
52+
p->print(F(" command. Status: "));
53+
p->println(r.getStatus());
54+
}
55+
}
56+
57+
void printErrorCb(RemoteAtCommandResponse& r, uintptr_t data) {
58+
Print *p = (Print*)data;
59+
if (!r.isOk()) {
60+
p->print(F("Error sending remote "));
61+
p->write(r.getCommand(), 2);
62+
p->print(F(" command. Status: "));
63+
p->println(r.getStatus());
64+
}
65+
}
66+
67+
void printErrorCb(XBeeResponse& r, uintptr_t data) {
68+
uint8_t id = r.getApiId();
69+
// Figure out the API type and call the corresonding function
70+
if (id == ZB_TX_STATUS_RESPONSE) {
71+
ZBTxStatusResponse response;
72+
r.getZBTxStatusResponse(response);
73+
printErrorCb(response, data);
74+
} else if (id == TX_STATUS_RESPONSE) {
75+
TxStatusResponse response;
76+
r.getTxStatusResponse(response);
77+
printErrorCb(response, data);
78+
} else if (id == AT_COMMAND_RESPONSE) {
79+
AtCommandResponse response;
80+
r.getAtCommandResponse(response);
81+
printErrorCb(response, data);
82+
} else if (id == REMOTE_AT_COMMAND_RESPONSE) {
83+
RemoteAtCommandResponse response;
84+
r.getRemoteAtCommandResponse(response);
85+
printErrorCb(response, data);
86+
}
87+
}
88+
89+
90+
91+
void printRawResponseCb(XBeeResponse& response, uintptr_t data) {
92+
Print *p = (Print*)data;
93+
p->print("Response received: ");
94+
// Reconstruct the original packet
95+
uint8_t header[] = {START_BYTE, response.getMsbLength(), response.getLsbLength(), response.getApiId()};
96+
printHex(*p, header, sizeof(header), F(" "), NULL);
97+
p->write(' ');
98+
printHex(*p, response.getFrameData(), response.getFrameDataLength(), F(" "), NULL);
99+
p->println();
100+
}
101+
102+
103+
104+
/**
105+
* Helper function to print a field name, followed by the hexadecimal
106+
* value and a newline.
107+
*/
108+
template <typename T>
109+
static void printField(Print* p, const __FlashStringHelper *prefix, T data) {
110+
p->print(prefix);
111+
printHex(*p, data);
112+
p->println();
113+
}
114+
115+
void printResponseCb(ZBTxStatusResponse& status, uintptr_t data) {
116+
Print *p = (Print*)data;
117+
p->println(F("ZBTxStatusResponse received:"));
118+
printField(p, F(" FrameId: 0x"), status.getFrameId());
119+
printField(p, F(" To: 0x"), status.getRemoteAddress());
120+
printField(p, F(" Delivery status: 0x"), status.getDeliveryStatus());
121+
printField(p, F(" Discovery status: 0x"), status.getDiscoveryStatus());
122+
}
123+
124+
void printResponseCb(ZBRxResponse& rx, uintptr_t data) {
125+
Print *p = (Print*)data;
126+
p->println(F("ZBRxResponse received:"));
127+
printField(p, F(" From: 0x"), rx.getRemoteAddress64());
128+
printField(p, F(" From: 0x"), rx.getRemoteAddress16());
129+
printField(p, F(" Receive options: 0x"), rx.getOption());
130+
if (rx.getDataLength() > 8)
131+
p->print(" Payload:\r\n ");
132+
else
133+
p->print(" Payload: ");
134+
printHex(*p, rx.getFrameData() + rx.getDataOffset(), rx.getDataLength(), F(" "), F("\r\n "), 8);
135+
p->println();
136+
}
137+
138+
void printResponseCb(ZBExplicitRxResponse& rx, uintptr_t data) {
139+
Print *p = (Print*)data;
140+
p->println(F("ZBExplicitRxResponse received:"));
141+
printField(p, F(" From: 0x"), rx.getRemoteAddress64());
142+
printField(p, F(" From: 0x"), rx.getRemoteAddress16());
143+
printField(p, F(" Receive options: 0x"), rx.getOption());
144+
printField(p, F(" Src endpoint: 0x"), rx.getSrcEndpoint());
145+
printField(p, F(" Dst endpoint: 0x"), rx.getDstEndpoint());
146+
printField(p, F(" Cluster id: 0x"), rx.getClusterId());
147+
printField(p, F(" Profile id: 0x"), rx.getProfileId());
148+
if (rx.getDataLength() > 8)
149+
p->print(" Payload:\r\n ");
150+
else
151+
p->print(" Payload: ");
152+
printHex(*p, rx.getFrameData() + rx.getDataOffset(), rx.getDataLength(), F(" "), F("\r\n "), 8);
153+
p->println();
154+
}
155+
156+
void printResponseCb(ZBRxIoSampleResponse& rx, uintptr_t data) {
157+
Print *p = (Print*)data;
158+
p->println(F("ZBRxIoSampleResponse received:"));
159+
printField(p, F(" From: 0x"), rx.getRemoteAddress64());
160+
printField(p, F(" From: 0x"), rx.getRemoteAddress16());
161+
printField(p, F(" Receive options: 0x"), rx.getOption());
162+
for (uint8_t i = 0; i < 16; ++i) {
163+
if (rx.isDigitalEnabled(i)) {
164+
p->print(F(" Digital pin "));
165+
p->print(i);
166+
p->print(F(": "));
167+
p->print(rx.isDigitalOn(i) ? "HIGH" : "LOW");
168+
p->println();
169+
}
170+
}
171+
for (uint8_t i = 0; i < 8; ++i) {
172+
if (rx.isAnalogEnabled(i)) {
173+
p->print(F(" Analog pin "));
174+
p->print(i);
175+
p->print(F(": 0x"));
176+
printHex(*p, rx.getAnalog(i));
177+
p->println();
178+
}
179+
}
180+
}
181+
182+
void printResponseCb(TxStatusResponse& status, uintptr_t data) {
183+
Print *p = (Print*)data;
184+
p->println(F("TxStatusResponse received:"));
185+
printField(p, F(" FrameId: 0x"), status.getFrameId());
186+
printField(p, F(" Status: 0x"), status.getStatus());
187+
}
188+
189+
void printResponseCb(Rx16Response& rx, uintptr_t data) {
190+
Print *p = (Print*)data;
191+
p->println("Rx16Response received:");
192+
printField(p, F(" From: 0x"), rx.getRemoteAddress16());
193+
printField(p, F(" Rssi: 0x"), rx.getRssi());
194+
printField(p, F(" Receive options: 0x"), rx.getOption());
195+
if (rx.getDataLength() > 8)
196+
p->print(" Payload:\r\n ");
197+
else
198+
p->print(" Payload: ");
199+
printHex(*p, rx.getFrameData() + rx.getDataOffset(), rx.getDataLength(), F(" "), F("\r\n "), 8);
200+
p->println();
201+
}
202+
203+
void printResponseCb(Rx64Response& rx, uintptr_t data) {
204+
Print *p = (Print*)data;
205+
p->println("Rx64Response received:");
206+
printField(p, F(" From: 0x"), rx.getRemoteAddress64());
207+
printField(p, F(" Rssi: 0x"), rx.getRssi());
208+
printField(p, F(" Receive options: 0x"), rx.getOption());
209+
if (rx.getDataLength() > 8)
210+
p->print(" Payload:\r\n ");
211+
else
212+
p->print(" Payload: ");
213+
printHex(*p, rx.getFrameData() + rx.getDataOffset(), rx.getDataLength(), F(" "), F("\r\n "), 8);
214+
p->println();
215+
}
216+
217+
/**
218+
* Helper function to share common functionality between the two sample
219+
* resonses.
220+
*/
221+
static void printSamples(Print* p, RxIoSampleBaseResponse& rx) {
222+
for (uint8_t s = 0; s < rx.getSampleSize(); ++s) {
223+
p->print(F(" Sample "));
224+
p->print(s);
225+
p->println(F(":"));
226+
227+
for (uint8_t i = 0; i < 9; ++i) {
228+
if (rx.isDigitalEnabled(i)) {
229+
p->print(F(" Digital pin "));
230+
p->print(i);
231+
p->print(F(": "));
232+
p->print(rx.isDigitalOn(i, s) ? "HIGH" : "LOW");
233+
p->println();
234+
}
235+
}
236+
for (uint8_t i = 0; i < 7; ++i) {
237+
if (rx.isAnalogEnabled(i)) {
238+
p->print(F(" Analog pin "));
239+
p->print(i);
240+
p->print(F(": 0x"));
241+
printHex(*p, rx.getAnalog(i, s));
242+
p->println();
243+
}
244+
}
245+
}
246+
}
247+
248+
void printResponseCb(Rx16IoSampleResponse& rx, uintptr_t data) {
249+
Print *p = (Print*)data;
250+
p->println("Rx16IoSampleResponse received:");
251+
printField(p, F(" From: 0x"), rx.getRemoteAddress16());
252+
printField(p, F(" Rssi: 0x"), rx.getRssi());
253+
printField(p, F(" Receive options: 0x"), rx.getOption());
254+
printField(p, F(" Number of samples: 0x"), rx.getSampleSize());
255+
printSamples(p, rx);
256+
}
257+
258+
void printResponseCb(Rx64IoSampleResponse& rx, uintptr_t data) {
259+
Print *p = (Print*)data;
260+
p->println("Rx64IoSampleResponse received:");
261+
printField(p, F(" From: 0x"), rx.getRemoteAddress64());
262+
printField(p, F(" Rssi: 0x"), rx.getRssi());
263+
printField(p, F(" Receive options: 0x"), rx.getOption());
264+
printField(p, F(" Number of samples: 0x"), rx.getSampleSize());
265+
printSamples(p, rx);
266+
}
267+
268+
void printResponseCb(ModemStatusResponse& status, uintptr_t data) {
269+
Print *p = (Print*)data;
270+
p->println("ModemStatusResponse received:");
271+
printField(p, F(" Status: 0x"), status.getStatus());
272+
}
273+
274+
void printResponseCb(AtCommandResponse& at, uintptr_t data) {
275+
Print *p = (Print*)data;
276+
p->println("AtCommandResponse received:");
277+
p->print(F(" Command: "));
278+
p->write(at.getCommand(), 2);
279+
p->println();
280+
printField(p, F(" Status: 0x"), at.getStatus());
281+
if (at.getValueLength()) {
282+
p->print(F(" Value: "));
283+
printHex(*p, at.getValue(), at.getValueLength(), F(" "), NULL);
284+
p->println();
285+
}
286+
}
287+
288+
void printResponseCb(RemoteAtCommandResponse& at, uintptr_t data) {
289+
Print *p = (Print*)data;
290+
p->println("AtRemoteCommandResponse received:");
291+
printField(p, F(" To: 0x"), at.getRemoteAddress64());
292+
printField(p, F(" To: 0x"), at.getRemoteAddress16());
293+
p->print(F(" Command: "));
294+
p->write(at.getCommand(), 2);
295+
p->println();
296+
printField(p, F(" Status: 0x"), at.getStatus());
297+
if (at.getValueLength()) {
298+
p->print(F(" Value: "));
299+
printHex(*p, at.getValue(), at.getValueLength(), F(" "), NULL);
300+
p->println();
301+
}
302+
}
303+
304+
void printResponseCb(XBeeResponse& r, uintptr_t data) {
305+
uint8_t id = r.getApiId();
306+
// Figure out the API type and call the corresonding function
307+
if (id == ZB_TX_STATUS_RESPONSE) {
308+
ZBTxStatusResponse response;
309+
r.getZBTxStatusResponse(response);
310+
printResponseCb(response, data);
311+
} else if (id == ZB_RX_RESPONSE) {
312+
ZBRxResponse response;
313+
r.getZBRxResponse(response);
314+
printResponseCb(response, data);
315+
} else if (id == ZB_EXPLICIT_RX_RESPONSE) {
316+
ZBExplicitRxResponse response;
317+
r.getZBExplicitRxResponse(response);
318+
printResponseCb(response, data);
319+
} else if (id == ZB_IO_SAMPLE_RESPONSE) {
320+
ZBRxIoSampleResponse response;
321+
r.getZBRxIoSampleResponse(response);
322+
printResponseCb(response, data);
323+
} else if (id == TX_STATUS_RESPONSE) {
324+
TxStatusResponse response;
325+
r.getTxStatusResponse(response);
326+
printResponseCb(response, data);
327+
} else if (id == RX_16_RESPONSE) {
328+
Rx16Response response;
329+
r.getRx16Response(response);
330+
printResponseCb(response, data);
331+
} else if (id == RX_64_RESPONSE) {
332+
Rx64Response response;
333+
r.getRx64Response(response);
334+
printResponseCb(response, data);
335+
} else if (id == RX_16_IO_RESPONSE) {
336+
Rx16IoSampleResponse response;
337+
r.getRx16IoSampleResponse(response);
338+
printResponseCb(response, data);
339+
} else if (id == RX_64_IO_RESPONSE) {
340+
Rx64IoSampleResponse response;
341+
r.getRx64IoSampleResponse(response);
342+
printResponseCb(response, data);
343+
} else if (id == MODEM_STATUS_RESPONSE) {
344+
ModemStatusResponse response;
345+
r.getModemStatusResponse(response);
346+
printResponseCb(response, data);
347+
} else if (id == AT_COMMAND_RESPONSE) {
348+
AtCommandResponse response;
349+
r.getAtCommandResponse(response);
350+
printResponseCb(response, data);
351+
} else if (id == REMOTE_AT_COMMAND_RESPONSE) {
352+
RemoteAtCommandResponse response;
353+
r.getRemoteAtCommandResponse(response);
354+
printResponseCb(response, data);
355+
}
356+
}

0 commit comments

Comments
 (0)