changes to communication
Fork of XBeeLib by
Diff: XBee/XBee.h
- Revision:
- 0:fcaad0dfa051
- Child:
- 1:794d1d3e4a08
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XBee/XBee.h Fri May 08 11:50:56 2015 +0200 @@ -0,0 +1,845 @@ +/** + * Copyright (c) 2015 Digi International Inc., + * All rights not expressly granted are reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343 + * ======================================================================= + */ + +#if !defined(__DIGI_RADIO_H_) +#define __DIGI_RADIO_H_ + +#include <stdint.h> +#include "config.h" +#include "Utils/Debug.h" +#include "Frames/AtCmdFrame.h" +#include "FrameHandlers/FrameHandler.h" +#include "FrameHandlers/FH_ModemStatus.h" +#include "FrameBuffer/FrameBuffer.h" +#include "Addresses.h" +#include "RemoteXBee/RemoteXBee.h" +#include "IO/IO.h" + +#define MAX_FRAME_HANDLERS 4 +#define RESET_TIMEOUT_MS 5000 + +#define DR_API_FRAME_OVERHEAD 4 /* Start of frame + frame len + checksum */ +#define DR_MIN_API_FRAME_LEN 4 +#define DR_START_OF_FRAME 0x7E +#define DR_ESCAPE_BYTE 0x7D +#define DR_XON_BYTE 0x11 +#define DR_XOFF_BYTE 0x13 +#define DR_ESCAPE_XOR_BYTE 0x20 + +/* TODO, verify these flags work in all modules */ +#define DISABLE_RETRIES_AND_ROUTE_REPAIR 0x01 +#define ENABLE_APS_ENCRYPTION 0x20 +#define USE_EXTENDED_TX_TIMEOUT 0x40 + +namespace XBeeLib { + +/** + * @defgroup RadioStatus + * @{ + */ +/** + * RadioStatus + */ +enum RadioStatus { + Success = 0, /**< Success */ + Failure = -1, /**< Failure */ + OpNotSupported = -2, /**< Option Not Supported */ +}; +/** + * @} + */ + +/** + * @defgroup RadioType + * @{ + */ +/** + * RadioType + */ +enum RadioType { + Unknown = 0, /**< Not detected yet */ + XB24_A_S1 = 0x17, /**< S1 */ + XBP24_A_S1 = 0x18, /**< S1 */ + XB24_B_S2 = 0x19, /**< S2 */ + XBP24_B_S2 = 0x1A, /**< S2 */ + XBP09_D = 0x1B, /**< S4 */ + XBP09_XC = 0x1C, /**< S3 */ + XBP08_D = 0x1D, /**< 868MHz S5 */ + XBP24_B_S2B = 0x1E, /**< S2B */ + XB24_WF = 0x1F, /**< S6 */ + XBP24_C_SMT = 0x21, /**< XBee PRO SMT S2C */ + XB24_C_SMT = 0x22, /**< XBee SMT S2C */ + XBP09_XC_B = 0x23, /**< S3B */ + XBP09_B = 0x23, /**< S3B */ + XB8 = 0x24, /**< S8 */ + XB2B_WF_TH = 0x27, /**< S6B TH */ + XB2B_WF_SMT = 0x28, /**< S6B SMT */ + XBP24_C_TH = 0x2D, /**< S2C TH */ + XB24_C_TH = 0x2E, /**< S2C TH */ +}; +/** + * @} + */ + +/** + * @defgroup TxStatus + * @{ + */ +/** + * TxStatus + */ +enum TxStatus { + TxStatusSuccess = 0, /**< Success */ + TxStatusAckFail = 1, /**< MAC ACK Failure */ + TxStatusCCAFail = 2, /**< CCA Failure */ + TxStatusInvDestEP = 0x15, /**< Invalid destination endpoint */ + TxStatusNwAckFail = 0x21, /**< Network ACK Failure */ + TxStatusNotJoinNw = 0x22, /**< Not Joined to Network */ + TxStatusSelfAddr = 0x23, /**< Self-addressed */ + TxStatusAddrNotFound = 0x24, /**< Address Not Found */ + TxStatusRouteNotFound = 0x25, /**< Route Not Found */ + TxStatusBroadSrcFail2Heard = 0x26, /**< Broadcast source failed to hear a neighbor relay the message */ + TxStatusInvBindTableIdx = 0x2B, /**< Invalid binding table index */ + TxStatusResourceError = 0x2C, /**< Resource error lack of free buffers, timers, etc. */ + TxStatusAttBroadcWithAPS = 0x2D, /**< Attempted broadcast with APS transmission */ + TxStatusAttUnicWithAPSEE0 = 0x2E, /**< Attempted unicast with APS transmission, but EE=0 */ + TxStatusResourceError2 = 0x31, /**< TxStatusResourceError2 */ + TxStatusInternalError = 0x32, /**< Resource error lack of free buffers, timers, etc. */ + TxStatusPayloadTooLarge = 0x74, /**< Data payload too large */ + TxStatusIndirectMsgUnReq = 0x75, /**< Indirect message unrequested */ + TxStatusInvalidAddr = 0xfe, /**< Invalid Address (Error generated by the library) */ + TxStatusTimeout = 0xff, /**< Timeout (Error generated by the library) */ +}; +/** + * @} + */ + +/** + * @defgroup PmMode + * @{ + */ +/** + * PmMode + */ +enum PmMode { + SleepDisabled = 0, /**< SleepDisabled */ + PinSleep = 1, /**< PinSleep */ + PinDoze = 2, /**< PinDoze */ + CyclicSeleep = 4, /**< CyclicSeleep */ + CyclicSeleepPinW = 5, /**< CyclicSeleepPinW */ +}; +/** + * @} + */ + + /** + * @defgroup NetworkRole + * @{ + */ +/** + * NetworkRole + */ +enum NetworkRole { + UnknownRole, /**< Unknown Role */ + Coordinator, /**< Coordinator */ + Router, /**< Router */ + EndDevice, /**< EndDevice */ +}; +/** + * @} + */ + +/** + * @defgroup RadioLocation + * @{ + */ +/** + * RadioLocation + */ +enum RadioLocation { + RadioLocal = 0, /**< Local Radio */ + RadioRemote = 1, /**< Remote Radio */ +}; +/** + * @} + */ + +/** Parent Class for XBee modules, not to be directly used */ +class XBee +{ + private: + /** wait_for_module_to_reset - waits until a Modem Status packet with a reset status + * is received, or the timeout expires. + * + * @returns + * Success if a Modem Status was received, + * Failure otherwise + */ + RadioStatus wait_for_module_to_reset(volatile uint16_t *rst_cnt_p, uint16_t init_rst_cnt); + + protected: + /** timer used by local and remote objects */ + static Timer _timer; + + /** buffer to store the received frames */ + static FrameBuffer _framebuf; + + public: + + /** + * RadioMode + */ + enum RadioMode { + ModeUnknown = 0, /**< Unknown */ + ModeAPI1 = 1, /**< API1 */ + ModeAPI2 = 2, /**< API2 */ + ModeTransparent = 3, /**< Transparent */ + ModeBootloader = 4, /**< Bootloader */ + }; + + /** Class constructor + * @param tx the TX pin of the UART that will interface the XBee module + * @param rx the RX pin of the UART that will interface the XBee module + * @param reset the pin to which the XBee's reset line is attached to, use NC if not available + * @param rts the RTS pin for the UART that will interface the XBee module, use NC if not available + * @param cts the CTS pin for the UART that will interface the XBee module, use NC if not available + * @param baud the baudrate for the UART that will interface the XBee module. Note that the module has to be already configured + * to this baud rate (ATBD parameter). By default it is configured to 9600 bps + * */ + XBee(PinName tx, PinName rx, PinName reset = NC, PinName rts = NC, PinName cts = NC, int baud = 9600); + + XBee(const XBee& other); /* Intentionally not implemented */ + /** Class destructor */ + virtual ~XBee(); + + /** init- initializes object + * This function must be called just after creating the object so it initializes internal data. + * @returns + * Success if the module has been properly initialized and is ready to process data. + * Failure otherwise. + */ + RadioStatus init(); + + /** get_addr64 - returns the 64bit address of the local device + * + * @returns the 64bit address of the local device + */ + uint64_t get_addr64() const; + + /** get_addr16 - returns the 16bit address of the local device + * + * @returns the 16-bit address of the local device. + */ + uint16_t get_addr16() const; + + /** get_network_address - gets the 16bit network address of the device + * + * @param addr pointer where the device 16bit network address will be stored + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus get_network_address(uint16_t * const addr); + + /** hardware_reset - performs a hardware reset. The reset GPIO must have + * been provided to the constructor + * + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus hardware_reset(); + + /** software_reset - performs a firmware reset + * + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus software_reset(); + + /** device_reset - performs a hardware reset if there is a GPIO connected to the + * reset line of the device. Otherwise, performs a firmware reset. + * + * @returns + * Success if the operation was successful, + * Failure otherwise + */ +#if defined(UNIT_TEST) + virtual +#endif + RadioStatus device_reset(); + + /** get_radio_type - returns the type of radio, in most cases the hardware version + * + * @returns the radio type + */ + RadioType get_radio_type() const; + + /** set_tx_options - sets the transmit options byte, used with the transmit frames. + * Valid flags are: + * - DISABLE_RETRIES_AND_ROUTE_REPAIR + * - ENABLE_APS_ENCRYPTION + * - USE_EXTENDED_TX_TIMEOUT + * + * @param options variable with the option flags + */ + void set_tx_options(uint8_t options); + + /** set_broadcast_radius - sets the max number of hops for a broadcast msg. + * When set to 0 uses the maximum possible. + * + * @param bc_radius variable with the broadcast radious + */ + void set_broadcast_radius(uint8_t bc_radius); + + /** get_tx_options - returns the tx options byte configured in the library. + * + * @returns the tx options byte configured in the library. + */ + uint8_t get_tx_options() const; + + /** get_bc_radius - returns the broadcast radius configured in the library. + * + * @returns the broadcast radius configured in the library. + */ + uint8_t get_bc_radius() const; + + /************************ Configuration member methods *************************/ + /** write_config - write settings to non volatile memory + * + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus write_config(); + + /** config_io_sample_destination - configures to which node a remote module will send its IO Samples to. + * @Note: this will modify 'remote' DH and DL parameters, if the remote node is configured in transparent mode this could lead to unwanted behavior. + * Consult the module's reference manual for more information. + * + * @param remote remote device that will be sending the IO Samples + * @param destination remote device that will be receiving the IO Samples sent by 'remote' + * @returns the result of the data transfer + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus config_io_sample_destination(const RemoteXBee& remote, const RemoteXBee& destination); + + /** set_io_sample_rate - configures how often the IO Samples should be sent to the destination (see @ref send_io_sample_to). + * + * @param remote remote device that will be sending the IO Samples + * @param seconds the IO Sample sending rate in seconds (granularity is of 1 millisecond). Maximum is 65.535 seconds. + * @returns the result of the data transfer + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus set_io_sample_rate(const RemoteXBee& remote, float seconds); + + /** set_power_level - sets the power level at which the radio will transmit + * + * @param level power level at which the radio will transmit + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus set_power_level(uint8_t level); + + /** get_power_level - reads the power level configured in the radio + * + * @param level pointer where the read power level will be stored + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus get_power_level(uint8_t * const level); + + /** get_hw_version - gets the hardware version of the radio + * + * @returns the hardware version of the radio + */ + uint16_t get_hw_version() const; + + /** get_fw_version - gets the firmware version of the radio + * + * @returns the firmware version of the radio + */ + uint16_t get_fw_version() const; + + /** set_node_identifier - configures the Node Identifier string + * + * @param node_id NULL-terminated string with the Node Identifier that will be set on the module. Up to 20 characters length (21 with NULL-terminator). + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus set_node_identifier(const char * const node_id); + + /** get_node_identifier - reads the configured Node Identifier string + * + * @param node_id Pointer to where to store the read Node Identifier, it must point to a buffer with at least 21-bytes length. + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus get_node_identifier(char * const node_id); + + /** start_node_discovery - starts a node discovery operation. The responses + * have to be processes on the callback function that have to be registered + * for that purpose + * + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + 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) + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus config_node_discovery(uint16_t timeout_ms, uint8_t options = 0); + + /** get_config_node_discovery - reads the configuration of the node discovery + * settings + * + * @param timeout_ms pointer where the node discovery time out value will be stored + * @param options pointer whre the node discovery options (flags) will be saved + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus get_config_node_discovery(uint16_t * const timeout_ms, uint8_t * const options); + + /** set_timeout - sets the timeout in ms, used by sync methods + * + * @param timeout_ms new timeout in ms + */ + void set_timeout(uint16_t timeout_ms); + + /** get_timeout - gets the timeout in ms configured in the library. This value + * is used in sync commands + * + * @returns the configured timeout value in ms + */ + uint16_t get_timeout() const; + + /* ... */ + + /*********************** send_data member methods ************************/ + /** send_data - sends data to a remote device waiting for the packet + * answer with the result of the operation + * + * @param remote 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 + */ + virtual TxStatus send_data(const RemoteXBee& remote, const uint8_t *const data, uint16_t len) = 0; + + /** send_data_broadcast - sends data to all devices in the network, using the + * broadcast address. The method waits for the packet + * answer with the result of the operation + * + * @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_broadcast(const uint8_t *const data, uint16_t len); + + /** set_param - sets a parameter in the local radio by sending an AT command and waiting for the response. + * + * @param param parameter to be set. + * @param data the parameter value (4 bytes) to be set. + * @returns the command response status. + */ + AtCmdFrame::AtCmdResp set_param(const char * const param, uint32_t data); + + /** set_param - sets a parameter in the local radio by sending an AT command and waiting for the response. + * + * @param param parameter to be set. + * @param data the parameter value byte array (len bytes) to be set. + * @param len number of bytes of the parameter value. + * @returns the command response status. + */ + AtCmdFrame::AtCmdResp set_param(const char * const param, const uint8_t * data = NULL, uint16_t len = 0); + + /** get_param - gets a parameter from the local radio by sending an AT command and waiting for the response. + * + * @param param parameter to be get. + * @param data pointer where the param value (4 bytes) will be stored. + * @returns the command response status. + */ + AtCmdFrame::AtCmdResp get_param(const char * const param, uint32_t * const data); + + /** get_param - gets a parameter from the local radio by sending an AT command and waiting for the response. + * + * @param param parameter to be get. + * @param data pointer where the param value (n bytes) will be stored. + * @param len pointer where the number of bytes of the param value will be stored. + * @returns the command response status. + */ + AtCmdFrame::AtCmdResp get_param(const char * const param, uint8_t * const data, uint16_t * const len); + + /** set_param - sets a parameter in a remote radio by sending an AT command and waiting for the response. + * + * @param remote remote device + * @param param parameter to be set. + * @param data the parameter value (4 bytes) to be set. + * @returns the command response status. + */ + virtual AtCmdFrame::AtCmdResp set_param(const RemoteXBee& remote, const char * const param, uint32_t data) = 0; + + /** set_param - sets a parameter in a remote radio by sending an AT command and waiting for the response. + * + * @param remote remote device + * @param param parameter to be set. + * @param data the parameter value byte array (len bytes) to be set. + * @param len number of bytes of the parameter value. + * @returns the command response status. + */ + virtual AtCmdFrame::AtCmdResp set_param(const RemoteXBee& remote, const char * const param, const uint8_t * data = NULL, uint16_t len = 0) = 0; + + /** get_param - gets a parameter from a remote radio by sending an AT command and waiting for the response. + * + * @param remote remote device + * @param param parameter to be get. + * @param data pointer where the param value (4 bytes) will be stored. + * @returns the command response status. + */ + virtual AtCmdFrame::AtCmdResp get_param(const RemoteXBee& remote, const char * const param, uint32_t * const data) = 0; + + /** get_param - gets a parameter from a remote radio by sending an AT command and waiting for the response. + * + * @param remote remote device + * @param param parameter to be get. + * @param data pointer where the param value (n bytes) will be stored. + * @param len pointer where the number of bytes of the param value will be stored. + * @returns the command response status. + */ + virtual AtCmdFrame::AtCmdResp get_param(const RemoteXBee& remote, const char * const param, uint8_t * const data, uint16_t * const len) = 0; + +#if defined(ENABLE_PM_SUPPORT) + /** set_pm_control - sets the operational mode of the Power Management on + * the radio and registers the GPIOs used to handle the + * Power Management + * + * @param mode operational mode of the power management + * @param on_sleep pin used to detect the on/sleep status of the module + * @param sleep_rq pin used to request the module to go to sleep (when pin + * sleep mode is used + * @returns the result of the configuration operation + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus set_pm_control(PmMode mode, PinName on_sleep = NC, PinName sleep_rq = NC); + + /** get_pm_mode - gets the power management mode programmed in the radio. + * + * @param mode pointer where the read mode will be stored. + * @returns the result of the configuration operation + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus get_pm_mode(PmMode *mode); + + /** config_pm_timing - configures the power management timing parameters. + * + * @param before_sleep_ms number of miliseconds of inactivity before the radio will + * automatically go to sleep again (when using cyclic sleep). + * @param total_sleep_period_ms time interval in ms the radio will be sleeping. Once + * this time passes, the radio will wakeup, will check for + * packets and will wait before_sleep_ms of inactivity + * before entering again in sleep mode. + * @returns the result of the configuration operation + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus config_pm_timing(uint32_t before_sleep_ms, uint32_t total_sleep_period_ms); + + /** enter_sleep_mode - sets the radio into low power mode. If the pm working mode + * is pin-sleep, then it will use the GPIO, otherwise, it will + * use the serial interface. + * + * @note the method does not wait until the radio enters in sleep mode, it returns + * without making any verification. + * @returns the result of the operation + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus enter_sleep_mode(); + + /** exit_sleep_mode - for the pm mode called pin-sleep, sets the radio into active power + * using the corresponding GPIO. + * + */ + void exit_sleep_mode(); + + /** is_sleeping - checks if the radio is sleeping or if its active. + * + * @returns true if the radio is sleeping, false otherwisw + */ + bool is_sleeping(); + + /** register_wakeup_cb - registers the callback function that will be called + * when the radio wakes up from sleep mode. + * + * @param f function pointer with the callback function + */ + void register_wakeup_cb(void (*f)(void)); + + /** unregister_wakeup_cb - removes the wakeup callback */ + void unregister_wakeup_cb(); +#endif /* defined(ENABLE_PM_SUPPORT) */ + + /** process_rx_frames - method that process the frames queued in the reception + * buffer. Calls the process_frame_data method of the frame + * handlers registered + * + * @returns Number of dropped frames since latest call to this method. + */ + uint32_t process_rx_frames(); + + /** register_modem_status_cb - registers the callback function that will be called + * when a Modem Status packet is received + * + * @param function function pointer with the callback function + */ + void register_modem_status_cb(modem_status_cb_t function); + + /** unregister_modem_status_cb - removes the Modem Status reception callback */ + void unregister_modem_status_cb(); + + protected: + + enum RadioProtocol { + None, + ZigBee, + Raw_802_15_4, +#ifdef EXTRA_XBEE_PROTOCOLS + XBeeWiFi, + DigiMesh, + SmartEnergy, + DigiPoint, + ZNet, +#endif + }; + /** send_byte_escaping_if - sends a byte, through the serial interface, to + * the radio, escaping the byte if the working mode of the radio is API2. + * + * @param line PWM line being set + * @param data the byte that will be send to radio + */ + void send_byte_escaping_if(uint8_t data); + + /** uart_read_cb - serial interface callback, called when data is received on + * the serial port. The function parses the incoming data and, when a good + * frame is detected, saves it in the frame list + */ + void uart_read_cb(); + + /** get_this_api_frame - searches in the FrameBuffer for an incoming frame + * with frameid equal to id and frame type equal to type + * or type2. If after timeout the frame hast not been found, + * returns. + * + * @param id id of the frame we are looking for. + * @param type tye type we expect the frame to be. + * @param type2 alternative valid type, if provided. + * @returns a pointer to the frame found in the FrameBuffer or a null pointer if + * the frame has not been found and the timeout expired. + */ + ApiFrame * get_this_api_frame(uint8_t id, ApiFrame::ApiFrameType type, + ApiFrame::ApiFrameType type2 = ApiFrame::Invalid); + + /** send_api_frame - method to send, over the serial port, an API frame + * + * @param frame pointer to the frame that will be sent. + */ +#if defined(UNIT_TEST) + virtual +#endif + void send_api_frame(ApiFrame *frame); + + /** update_radio_status - method called when a modem status frame is received + * to update the internal status variables of the library. + * @note This is not a pure virtual function because it can be called while + * the object is being constructed and we need the implementation of the + * base class. + * + * @param status byte with the status received in the modem status frame + */ + virtual void radio_status_update(AtCmdFrame::ModemStatus modem_status); + + /** Method used internaly by the derived classes to transmit data to + * remote nodes, waiting for the answer from the device + * + * @param frame frame that will be sent to the radio (have to be a + * proper transmit frame + * @returns the result of the data transfer + * TxStatusSuccess if the operation was successful, + * the error code otherwise + */ + TxStatus send_data(ApiFrame *frame); + + /** send_at_cmd - sends an AT command to the radio and waits for the response. + * + * @param frame api frame with the command and command params. + * @param buf pointer where the param response (n bytes) will be stored. + * @param len pointer where the number of bytes of the param response will be stored. + * @param radio_location radio location, either RadioLocal or RadioRemote. + * @param reverse reverse the byte ordering of the response saved in buf. + * @returns the command response status. + */ + AtCmdFrame::AtCmdResp send_at_cmd(AtCmdFrame *frame, + uint8_t *const buf, uint16_t *const len, RadioLocation radio_location = RadioLocal, bool reverse = true); + + /* send_at_cmd - methods used internally by other methods */ + AtCmdFrame::AtCmdResp send_at_cmd(AtCmdFrame *frame); + AtCmdFrame::AtCmdResp send_at_cmd(AtCmdFrame *frame, uint8_t *data); + AtCmdFrame::AtCmdResp send_at_cmd(AtCmdFrame *frame, uint16_t *data); + AtCmdFrame::AtCmdResp send_at_cmd(AtCmdFrame *frame, uint32_t *data); + +#if defined(ENABLE_PM_SUPPORT) + /** Sets the radio into low power mode. This method is used by enter_sleep_mode() */ + RadioStatus sleep_now(); +#endif /* defined(ENABLE_PM_SUPPORT) */ + + /** register_frame_handler - registers an object to handle incoming frames from + * the radio. + * @note For any type of frame more than one handler can be registered and all + * of them are called, sequentially, when a frame of that type arrives. + * + * @param handler pointer to the frame handler object + * @returns the result of the registration + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus register_frame_handler(FrameHandler *const handler); + + /** unregister_frame_handler - removes a previously registered frame handler + * + * @param handler pointer to the frame handler object + * @returns the result of the unregister operation + * Success if the operation was successful, + * Failure otherwise + */ + RadioStatus unregister_frame_handler(FrameHandler *const handler); + + /** get_radio_protocol - returns the RF protocol that the connected module uses + * based on its firmware and hardware versions + * + * @returns a RadioProtocol enum. + */ + RadioProtocol get_radio_protocol(void) const; + + /** get_iosample - forces an io_sample read (reads all digital and analog inputs) + * + * @param remote remote device + * @param io_sample buffer where the io_sample response is copied + * @param len pointer where the length of the io_sample response is stored + * @returns + * Success if the operation was successful, + * Failure otherwise + */ + 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); + + /** Operating mode of the module (API1, API2,...) */ + RadioMode _mode; + + /** Type of radio, mainly the hardware version, but may differ in some cases */ + RadioType _type; + + /** Hardware version value of the radio */ + uint16_t _hw_version; + + /** Firmware version value of the radio */ + uint16_t _fw_version; + + /** Timeout in ms for sync operations (when we wait for a response) */ + uint16_t _timeout_ms; + + /** Device 64 bit address (SH, SL) */ + uint64_t _dev_addr64; + + /** Device 16 bit address (MY) */ + uint16_t _dev_addr16; + + /** Serial Interface, use RawSerial as we dont use the streams */ + RawSerial *_uart; + + /** IO connected to the radio reset line */ + DigitalOut *_reset; + + /** Transmit options byte */ + uint8_t _tx_options; + + /** Broadcast radius, number of hops a broadcast transmission can occur. + * When set to 0 it will use the maximum */ + uint8_t _bc_radius; + /** Array of frame handler pointers. We use an array instead of a vector or other + * data structure to save memory and avoid dynamic memory allocation, to avoid + * memory fragmentation */ + FrameHandler *_fhandlers[MAX_FRAME_HANDLERS]; + + /** Hardware reset counter, automatically updated by the library */ + volatile uint16_t _hw_reset_cnt; + + /** Watchdog reset counter, automatically updated by the library */ + volatile uint16_t _wd_reset_cnt; + + uint16_t _reset_timeout; + + /** Frame handler used for the Modem Status packets. Automatically registered when a callback + * function is registered */ + FH_ModemStatus *_modem_status_handler; + + /** Latest modem status received */ + AtCmdFrame::ModemStatus _modem_status; + + /** Library is initializing */ + bool _initializing; + +#if defined(ENABLE_PM_SUPPORT) + /* Power Management mode used by the radio */ + PmMode _pm_mode; + /** IO connected to the radio on_sleep line */ + InterruptIn *_on_sleep; + /** IO connected to the radio sleep_req line */ + DigitalOut *_sleep_req; +#endif +}; + +} /* namespace XBeeLib */ + +#endif /* defined(__DIGI_RADIO_H_) */ + + +