Lorenzo Maiorfi / XBeeLib_Fixed

Dependents:   XBeeZB_Receive_Data

Fork of XBeeLib by Digi International Inc.

Files at this revision

API Documentation at this revision

Comitter:
hbujanda
Date:
Mon May 11 17:58:00 2015 +0200
Parent:
0:fcaad0dfa051
Child:
2:2ee1b6d51df2
Commit message:
Automatic upload

Changed in this revision

DigiLogger.lib Show annotated file Show diff for this revision Revisions of this file
RemoteXBee/RemoteXBee.h Show annotated file Show diff for this revision Revisions of this file
Utils/Utils.h Show annotated file Show diff for this revision Revisions of this file
XBee/RadioConfig.cpp Show annotated file Show diff for this revision Revisions of this file
XBee/XBee.cpp Show annotated file Show diff for this revision Revisions of this file
XBee/XBee.h Show annotated file Show diff for this revision Revisions of this file
XBee802/XBee802.cpp Show annotated file Show diff for this revision Revisions of this file
XBee802/XBee802.h Show annotated file Show diff for this revision Revisions of this file
XBeeZB/XBeeZB.cpp Show annotated file Show diff for this revision Revisions of this file
XBeeZB/XBeeZB.h Show annotated file Show diff for this revision Revisions of this file
--- a/DigiLogger.lib	Fri May 08 11:50:56 2015 +0200
+++ b/DigiLogger.lib	Mon May 11 17:58:00 2015 +0200
@@ -1,1 +1,1 @@
-http://developer.mbed.org/teams/Digi-International-Inc/code/DigiLogger/#79cea2b2eea6
+http://developer.mbed.org/teams/Digi-International-Inc/code/DigiLogger/#1f16339607b7
--- a/RemoteXBee/RemoteXBee.h	Fri May 08 11:50:56 2015 +0200
+++ b/RemoteXBee/RemoteXBee.h	Mon May 11 17:58:00 2015 +0200
@@ -115,7 +115,6 @@
     protected:
 
         friend FH_NodeDiscovery802;
-        friend class XBee802;
 
         /** Class constructor for a 802.15.4 remote device (connected wirelessly) for which both the 64-bit and 16-bit addresses are known.
          * This constructor is only used by FH_NodeDiscovery802 class.
--- a/Utils/Utils.h	Fri May 08 11:50:56 2015 +0200
+++ b/Utils/Utils.h	Mon May 11 17:58:00 2015 +0200
@@ -23,8 +23,6 @@
 #define UINT64_HI32(u64)     (uint32_t)((u64) >> 32)
 #define UINT64_LO32(u64)     (uint32_t)((u64) & 0xFFFFFFFF)
 
-#define UNUSED_PARAMETER(a)  ((void)(a))
-
 /** rmemcpy - like memcpy but copies the bytes in reverse order
  *
  *  @param dest pointer with the destination address
--- a/XBee/RadioConfig.cpp	Fri May 08 11:50:56 2015 +0200
+++ b/XBee/RadioConfig.cpp	Mon May 11 17:58:00 2015 +0200
@@ -94,6 +94,7 @@
 
     cmdresp = set_param("FR");
     if (cmdresp != AtCmdFrame::AtCmdRespOk) {
+        digi_log(LogLevelError, "software_reset failed!\r\n");
         return Failure;
     }
 
@@ -175,65 +176,6 @@
     return Success;
 }
 
-void XBee::_get_remote_node_by_id(const char * const node_id, uint64_t * const addr64, uint16_t * const addr16)
-{
-    *addr64 = ADDR64_UNASSIGNED;
-    *addr16 = ADDR16_UNKNOWN;
-    if (node_id == NULL) {
-        return;
-    }
-    const size_t node_id_len = strlen(node_id);
-    if (node_id_len == 0 || node_id_len > MAX_NI_PARAM_LEN) {
-        return;
-    }
-
-    const uint16_t old_timeout = _timeout_ms;
-
-    uint32_t nd_timeout_100msec;
-    const AtCmdFrame::AtCmdResp nt_resp = get_param("NT", &nd_timeout_100msec);
-    if (nt_resp != AtCmdFrame::AtCmdRespOk) {
-        _timeout_ms = 10000;
-    } else {
-        _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;
-        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");
-        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);
-        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);
-    return;
-}
-
 RadioStatus XBee::config_node_discovery(uint16_t timeout_ms, uint8_t options)
 {
     AtCmdFrame::AtCmdResp cmdresp;
--- a/XBee/XBee.cpp	Fri May 08 11:50:56 2015 +0200
+++ b/XBee/XBee.cpp	Mon May 11 17:58:00 2015 +0200
@@ -30,12 +30,12 @@
 
 /* Class constructor */
 XBee::XBee(PinName tx, PinName rx, PinName reset, PinName rts, PinName cts, int baud) :
-    _mode(ModeUnknown), _type(Unknown), _hw_version(0), _fw_version(0), _timeout_ms(SYNC_OPS_TIMEOUT_MS), _dev_addr64(ADDR64_UNASSIGNED), _dev_addr16(ADDR16_UNKNOWN),
+    _mode(ModeUnknown), _type(Unknown), _timeout_ms(SYNC_OPS_TIMEOUT_MS), _hw_version(0), _fw_version(0), _dev_addr64(ADDR64_UNASSIGNED), _dev_addr16(ADDR16_UNKNOWN),
     _reset(NULL), _tx_options(0), _bc_radius(0), _hw_reset_cnt(0), _wd_reset_cnt(0), _reset_timeout(0), _modem_status_handler(NULL), _modem_status(AtCmdFrame::HwReset), _initializing(true), _pm_mode(SleepDisabled)
 {
 
     if (reset != NC) {
-        _reset = new DigitalOut(reset);
+        _reset = new DigitalOut(reset, 1);
     }
 #if defined(ENABLE_PM_SUPPORT)
     _on_sleep = NULL;
@@ -44,9 +44,25 @@
 
     _uart = new RawSerial(tx, rx);
     _uart->baud(baud);
+
+    _serial_flow_type = SerialBase::Disabled;
 #if defined(DEVICE_SERIAL_FC)
     if (rts != NC && cts != NC) {
-        _uart->set_flow_control(SerialBase::RTSCTS, rts, cts);
+#if !(defined AVOID_USING_RTS)
+        _serial_flow_type = SerialBase::RTSCTS;
+        _uart->set_flow_control(_serial_flow_type, rts, cts);        
+#else
+        _serial_flow_type = SerialBase::CTS;
+        _uart->set_flow_control(_serial_flow_type, cts);
+#endif
+    }
+    else if (rts != NC && cts == NC) {
+        _serial_flow_type = SerialBase::RTS;
+        _uart->set_flow_control(_serial_flow_type, rts);
+    }
+    else if (rts == NC && cts != NC) {
+        _serial_flow_type = SerialBase::CTS;
+        _uart->set_flow_control(_serial_flow_type, cts);
     }
 #endif
     /* Enable the reception of bytes on the serial interface by providing a cb */
@@ -288,7 +304,6 @@
  * object has been completed and the virtual functions filled */
 void XBee::radio_status_update(AtCmdFrame::ModemStatus modem_status)
 {
-    UNUSED_PARAMETER(modem_status);
 }
 
 void XBee::set_timeout(uint16_t timeout_ms)
@@ -638,8 +653,6 @@
 
 RadioStatus XBee::config_pm_timing(uint32_t before_sleep_ms, uint32_t total_sleep_period_ms)
 {
-    UNUSED_PARAMETER(before_sleep_ms);
-    UNUSED_PARAMETER(total_sleep_period_ms);
     return Success;
 }
 
--- a/XBee/XBee.h	Fri May 08 11:50:56 2015 +0200
+++ b/XBee/XBee.h	Mon May 11 17:58:00 2015 +0200
@@ -403,18 +403,13 @@
          */
         RadioStatus start_node_discovery();
 
-#define XBEEZB_ND_OPTION_APPEND_DD          (1 << 0)
-#define XBEEZB_ND_OPTION_SELF_RESPONSE      (1 << 1)
-#define XBEE802_ND_OPTION_SELF_RESPONSE     (1 << 0)
-
         /** config_node_discovery - configures the node discovery operation
          *
          *  @param timeout_ms max allowed time for devices in the network to answer
          *                    to the Node Discovery request
          *  @param  options node discovery options (flags)
-         *              XBEE802_ND_OPTION_SELF_RESPONSE - to allow the module self responding (802.15.4 only)
-         *              XBEEZB_ND_OPTION_SELF_RESPONSE - to allow the module self responding (ZigBee only)
-         *              XBEEZB_ND_OPTION_APPEND_DD - to append the DD value to the response (ZigBee only)
+         *              ND_OPTION_APPEND_DD - to append the DD value to the response
+         *              ND_OPTION_SELF_RESPONSE - to allow the module self responding
          *  @returns
          *     Success if the operation was successful,
          *     Failure otherwise
@@ -769,7 +764,8 @@
          */
         RadioStatus get_iosample(const RemoteXBee& remote, uint8_t * const io_sample, uint16_t * const len);
 
-        void _get_remote_node_by_id(const char * const node_id, uint64_t * addr64, uint16_t * addr16);
+        /** serial hardware flow control selected by the user (RTSCTS, RTS,CTS) */
+        SerialBase::Flow _serial_flow_type;
 
         /** Operating mode of the module (API1, API2,...) */
         RadioMode   _mode;
--- a/XBee802/XBee802.cpp	Fri May 08 11:50:56 2015 +0200
+++ b/XBee802/XBee802.cpp	Mon May 11 17:58:00 2015 +0200
@@ -160,12 +160,16 @@
     return TxStatusInvalidAddr;
 }
 
-RemoteXBee802 XBee802::get_remote_node_by_id(const char * const node_id)
+TxStatus XBee802::send_data(uint64_t remote64, const uint8_t *const data, uint16_t len)
 {
-    uint64_t addr64;
-    uint16_t addr16;
-    _get_remote_node_by_id(node_id, &addr64, &addr16);
-    return RemoteXBee802(addr64, addr16);
+    TxFrame802 frame = TxFrame802(remote64, _tx_options, data, len);
+    return send_data(&frame);
+}
+
+TxStatus XBee802::send_data(uint16_t addr16, const uint8_t *const data, uint16_t len)
+{
+    TxFrame802 frame = TxFrame802(addr16, _tx_options, data, len);
+    return send_data(&frame);
 }
 
 void XBee802::register_node_discovery_cb(node_discovery_802_cb_t function)
--- a/XBee802/XBee802.h	Fri May 08 11:50:56 2015 +0200
+++ b/XBee802/XBee802.h	Mon May 11 17:58:00 2015 +0200
@@ -153,13 +153,29 @@
          */
         virtual TxStatus send_data(const RemoteXBee& remote, const uint8_t *const data, uint16_t len);
 
-        /** get_remote_node_by_id - searches for a device in the network with the specified Node Identifier.
+        /** send_data - sends data to a remote device waiting for the packet
+         *                   answer with the result of the operation
          *
-         *  @param node_id node id of the device we are looking for
-         *  @returns a RemoteXBee802 with the 16-bit and 64-bit address of the remote device whose node id matches with the parameter.
-         *  If node is not found, the returned object will have invalid addresses (RemoteXBee802::is_valid() will return false).
+         *  @param remote64 64bit address of the remote device
+         *  @param data pointer to the data that will be sent
+         *  @param len number of bytes that will be transmitted
+         *  @returns the result of the data transfer
+         *     TxStatusSuccess if the operation was successful,
+         *     the error code otherwise
          */
-        RemoteXBee802 get_remote_node_by_id(const char * const node_id);
+        TxStatus send_data(uint64_t remote64, const uint8_t *const data, uint16_t len);
+
+        /** send_data - sends data to a remote device waiting for the packet
+         *                   answer with the result of the operation
+         *
+         *  @param addr16 16bit address of the remote device
+         *  @param data pointer to the data that will be sent
+         *  @param len number of bytes that will be transmitted
+         *  @returns the result of the data transfer
+         *     TxStatusSuccess if the operation was successful,
+         *     the error code otherwise
+         */
+        TxStatus send_data(uint16_t addr16, const uint8_t *const data, uint16_t len);
 
         /* Allow using XBee::set_param() methods for local radio from this class */
         using XBee::set_param;
--- a/XBeeZB/XBeeZB.cpp	Fri May 08 11:50:56 2015 +0200
+++ b/XBeeZB/XBeeZB.cpp	Mon May 11 17:58:00 2015 +0200
@@ -334,14 +334,6 @@
     return send_data(&frame);
 }
 
-RemoteXBeeZB XBeeZB::get_remote_node_by_id(const char * const node_id)
-{
-    uint64_t addr64;
-    uint16_t addr16;
-    _get_remote_node_by_id(node_id, &addr64, &addr16);
-    return RemoteXBeeZB(addr64, addr16);
-}
-
 NetworkRole XBeeZB::get_network_role()
 {
     return _nw_role;
@@ -409,6 +401,37 @@
     }
 }
 
+XBeeZB * XBeeZB::get_device_by_id(const char * const node_id)
+{
+    return NULL;
+}
+
+RadioStatus XBeeZB::get_device_by_id(const char * const node_id, uint64_t * const dev_addr)
+{
+    AtCmdFrame::AtCmdResp cmdresp;
+    uint32_t dh, dl;
+    
+    if (strlen(node_id) > MAX_NI_PARAM_LEN)
+        return Failure;
+
+    cmdresp = set_param("DN", (const uint8_t *)node_id, strlen(node_id));
+    if (cmdresp != AtCmdFrame::AtCmdRespOk)
+        return Failure;
+    
+    /* Read the address of the remote device from the DH, DL parameters */
+    cmdresp = get_param("DH", &dh);
+    if (cmdresp != AtCmdFrame::AtCmdRespOk)
+        return Failure;
+    
+    cmdresp = get_param("DL", &dl);
+    if (cmdresp != AtCmdFrame::AtCmdRespOk)
+        return Failure;
+    
+    *dev_addr = UINT64(dh, dl);
+    
+    return Success;
+}
+
 AtCmdFrame::AtCmdResp XBeeZB::get_param(const RemoteXBee& remote, const char * const param, uint32_t * const data)
 {
     if (!remote.is_valid_addr64b())
--- a/XBeeZB/XBeeZB.h	Fri May 08 11:50:56 2015 +0200
+++ b/XBeeZB/XBeeZB.h	Mon May 11 17:58:00 2015 +0200
@@ -21,6 +21,9 @@
 
 namespace XBeeLib {
 
+#define ND_OPTION_APPEND_DD         (1 << 0)
+#define ND_OPTION_SELF_RESPONSE     (1 << 1)
+
 /** Class for XBee ZigBee modules, derived from XBee */
 class XBeeZB : public XBee
 {
@@ -337,13 +340,23 @@
          */
         bool is_joined();
         
-        /** get_remote_node_by_id - searches for a device in the network with the specified Node Identifier.
+        /** get_device_by_id - finds and retrieves a pointer to the remote device in 
+         *                     the network whose device id matches with the parameter
          *
          *  @param node_id node id of the device we are looking for
-         *  @returns a RemoteXBeeZB with the 16-bit and 64-bit address of the remote device whose node id matches with the parameter.
-         *  If node is not found, the returned object will have invalid addresses (RemoteXBeeZB::is_valid() will return false).
+         *  @returns a pointer to the remote object device created or NULL if the device
+         *           was not found
          */
-        RemoteXBeeZB get_remote_node_by_id(const char * const node_id);
+        XBeeZB * get_device_by_id(const char * const node_id);
+
+        /** get_device_by_id - searches for a device in the network with the especified 
+         *                     node id, if found, returns its 64 bit address
+         *
+         *  @param node_id node id of the device we are looking for
+         *  @returns an object with the 64 bit address of the remote device whose node id 
+         *           matches with the parameter
+         */
+        RadioStatus get_device_by_id(const char * const node_id, uint64_t * const dev_addr);
 
         /* Allow using XBee::set_param() methods for local radio from this class */
         using XBee::set_param;