Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: DigiLogger
Fork of XBeeLib_vs by
Diff: XBee/RadioConfig.cpp
- Revision:
- 4:629712865107
- Parent:
- 3:8662ebe83570
- Child:
- 6:06522f3a6642
diff -r 8662ebe83570 -r 629712865107 XBee/RadioConfig.cpp
--- a/XBee/RadioConfig.cpp Mon May 18 13:16:55 2015 +0200
+++ b/XBee/RadioConfig.cpp Mon Jun 01 18:59:43 2015 +0200
@@ -26,17 +26,6 @@
return Success;
}
-RadioStatus XBee::sleep_now(void)
-{
- AtCmdFrame::AtCmdResp cmdresp;
-
- cmdresp = set_param("SI");
- if (cmdresp != AtCmdFrame::AtCmdRespOk) {
- return Failure;
- }
- return Success;
-}
-
RadioStatus XBee::set_power_level(uint8_t level)
{
AtCmdFrame::AtCmdResp cmdresp;
@@ -138,6 +127,25 @@
return Success;
}
+RadioStatus XBee::enable_network_encryption(bool enable)
+{
+ AtCmdFrame::AtCmdResp cmdresp;
+
+ cmdresp = set_param("EE", enable);
+ return cmdresp == AtCmdFrame::AtCmdRespOk ? Success : Failure;
+}
+
+RadioStatus XBee::set_network_encryption_key(const uint8_t * const key, const uint16_t length)
+{
+ if (key == NULL || length == 0 || length > 16) {
+ return Failure;
+ }
+ AtCmdFrame::AtCmdResp cmdresp;
+
+ cmdresp = set_param("KY", key, length);
+ return cmdresp == AtCmdFrame::AtCmdRespOk ? Success : Failure;
+}
+
uint16_t XBee::get_hw_version() const
{
return _hw_version;
@@ -158,24 +166,43 @@
return _tx_options;
}
-void XBee::set_broadcast_radius(uint8_t bc_radius)
-{
- _bc_radius = bc_radius;
-}
-
-uint8_t XBee::get_bc_radius() const
-{
- return _bc_radius;
-}
-
RadioStatus XBee::start_node_discovery()
{
+ AtCmdFrame::AtCmdResp cmdresp;
+ uint32_t nd_timeout_cfg;
+
+ cmdresp = get_param("NT", &nd_timeout_cfg);
+ if (cmdresp != AtCmdFrame::AtCmdRespOk) {
+ return Failure;
+ }
+
+ const unsigned int guard_time_ms = 1000;
+ const uint32_t nd_timeout_cfg_ms = nd_timeout_cfg * 100;
+ _nd_timeout = nd_timeout_cfg_ms + guard_time_ms;
+
+ _nd_timer.start();
+
AtCmdFrame cmd_frame = AtCmdFrame("ND");
send_api_frame(&cmd_frame);
return Success;
}
+bool XBee::is_node_discovery_in_progress()
+{
+ const int nd_timer = _nd_timer.read_ms();
+
+ if (nd_timer == 0)
+ return false;
+
+ if (nd_timer > _nd_timeout) {
+ _nd_timer.stop();
+ _nd_timer.reset();
+ }
+
+ return true;
+}
+
void XBee::_get_remote_node_by_id(const char * const node_id, uint64_t * const addr64, uint16_t * const addr16)
{
*addr64 = ADDR64_UNASSIGNED;
@@ -198,40 +225,48 @@
_timeout_ms = (uint16_t)nd_timeout_100msec * 100 + 1000;
}
- const AtCmdFrame::AtCmdResp cmdresp = set_param("ND", (const uint8_t *)node_id, strlen(node_id));
- if (cmdresp != AtCmdFrame::AtCmdRespOk) {
- _timeout_ms = old_timeout;
+ const int nd_timeout = _timeout_ms;
+ Timer nd_timer = Timer();
+
+ nd_timer.start();
+
+ AtCmdFrame atnd_frame = AtCmdFrame("ND", (const uint8_t *)node_id, strlen(node_id));
+ const uint8_t frame_id = atnd_frame.get_frame_id();
+ _node_by_ni_frame_id = frame_id;
+ send_api_frame(&atnd_frame);
+
+ ApiFrame * const resp_frame = get_this_api_frame(frame_id, ApiFrame::AtCmdResp);
+ _timeout_ms = old_timeout;
+
+ _node_by_ni_frame_id = 0;
+
+ if (resp_frame == NULL) {
+ digi_log(LogLevelWarning, "_get_remote_node_by_id: timeout when waiting for ATND response");
return;
}
- const int nd_start_time = _timer.read_ms();
- const int nd_end_time = nd_start_time + _timeout_ms;
-
- AtCmdFrame atnd_frame = AtCmdFrame("ND", (const uint8_t *)node_id, strlen(node_id));
- send_api_frame(&atnd_frame);
-
- ApiFrame * const resp_frame = get_this_api_frame(atnd_frame.get_frame_id(), ApiFrame::AtCmdResp);
- _timeout_ms = old_timeout;
-
- while (_timer.read_ms() < nd_end_time) {
- wait_ms(10);
- }
-
- if (resp_frame == NULL) {
- digi_log(LogLevelWarning, "XBeeZB::get_remote_node_by_id timeout when waiting for ATND response");
+ if (resp_frame->get_data_len() < sizeof (uint16_t) + sizeof (uint64_t)) {
+ /* In 802.15.4 this might be the OK or Timeout message with no information */
+ digi_log(LogLevelInfo, "_get_remote_node_by_id: node not found\r\n", __FUNCTION__, node_id);
+ _framebuf_syncr.free_frame(resp_frame);
return;
}
const AtCmdFrame::AtCmdResp resp = (AtCmdFrame::AtCmdResp)resp_frame->get_data_at(ATCMD_RESP_STATUS_OFFSET);
if (resp != AtCmdFrame::AtCmdRespOk) {
- digi_log(LogLevelWarning, "send_at_cmd bad response: 0x%x\r\n", resp);
- _framebuf.free_frame(resp_frame);
+ digi_log(LogLevelWarning, "_get_remote_node_by_id: send_at_cmd bad response: 0x%x\r\n", resp);
+ _framebuf_syncr.free_frame(resp_frame);
return;
}
rmemcpy((uint8_t *)addr16, resp_frame->get_data() + ATCMD_RESP_DATA_OFFSET, sizeof *addr16);
rmemcpy((uint8_t *)addr64, resp_frame->get_data() + ATCMD_RESP_DATA_OFFSET + sizeof *addr16, sizeof *addr64);
- _framebuf.free_frame(resp_frame);
+ _framebuf_syncr.free_frame(resp_frame);
+
+ while (nd_timer.read_ms() < nd_timeout) {
+ wait_ms(10);
+ }
+
return;
}
