fd
Dependents: xtoff3 CYS_Receiver
Fork of RF24Network by
Diff: RF24Network.h
- Revision:
- 4:75c5aa56411f
- Parent:
- 3:dfc8da7ac18c
- Child:
- 5:b1110d26a900
--- a/RF24Network.h Thu Nov 05 05:54:47 2015 +0000 +++ b/RF24Network.h Thu Apr 21 03:43:13 2016 +0000 @@ -5,15 +5,16 @@ modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. */ - + /* -* Mbed support added by Akash Vibhute <akash.roboticist@gmail.com> -* Porting completed on Nov/05/2015 -* -* Updated with TMRh20's RF24 library on Nov/04/2015 from https://github.com/TMRh20 -* -*/ - + * Mbed support added by Akash Vibhute <akash.roboticist@gmail.com> + * Porting completed on Nov/05/2015 + * + * Updated 1: Synced with TMRh20's RF24 library on Nov/04/2015 from https://github.com/TMRh20 + * Updated 2: Synced with TMRh20's RF24 library on Apr/18/2015 from https://github.com/TMRh20 + * + */ + #ifndef __RF24NETWORK_H__ #define __RF24NETWORK_H__ @@ -22,25 +23,34 @@ * * Class declaration for RF24Network */ -#define min(a,b) (a<b?a:b) + + #include "mbed.h" #include <stddef.h> #include <stdint.h> +//#include <stdio.h> +//#include <string.h> #include "RF24Network_config.h" + + +/** + + */ + /* Header types range */ #define MIN_USER_DEFINED_HEADER_TYPE 0 #define MAX_USER_DEFINED_HEADER_TYPE 127 -/** +/** */ - + // ACK Response Types /** * **Reserved network message types** * * The network will determine whether to automatically acknowledge payloads based on their general type <br> - * + * * **User types** (1-127) 1-64 will NOT be acknowledged <br> * **System types** (128-255) 192 through 255 will NOT be acknowledged<br> * @@ -53,37 +63,37 @@ /** * A NETWORK_ADDR_RESPONSE type is utilized to manually route custom messages containing a single RF24Network address -* +* * Used by RF24Mesh -* +* * If a node receives a message of this type that is directly addressed to it, it will read the included message, and forward the payload * on to the proper recipient. <br> * This allows nodes to forward multicast messages to the master node, receive a response, and forward it back to the requester. */ -#define NETWORK_ADDR_RESPONSE 128 +#define NETWORK_ADDR_RESPONSE 128 //#define NETWORK_ADDR_CONFIRM 129 /** -* Messages of type NETWORK_PING will be dropped automatically by the recipient. A NETWORK_ACK or automatic radio-ack will indicate to the sender whether the +* Messages of type NETWORK_PING will be dropped automatically by the recipient. A NETWORK_ACK or automatic radio-ack will indicate to the sender whether the * payload was successful. The time it takes to successfully send a NETWORK_PING is the round-trip-time. */ #define NETWORK_PING 130 /** - * External data types are used to define messages that will be passed to an external data system. This allows RF24Network to route and pass any type of data, such + * External data types are used to define messages that will be passed to an external data system. This allows RF24Network to route and pass any type of data, such * as TCP/IP frames, while still being able to utilize standard RF24Network messages etc. * * **Linux** - * Linux devices (defined RF24_LINUX) will buffer all data types in the user cache. + * Linux devices (defined RF24_LINUX) will buffer all data types in the user cache. * * **Arduino/AVR/Etc:** Data transmitted with the type set to EXTERNAL_DATA_TYPE will not be loaded into the user cache. <br> * External systems can extract external data using the following process, while internal data types are cached in the user buffer, and accessed using network.read() : * @code * uint8_t return_type = network.update(); * if(return_type == EXTERNAL_DATA_TYPE){ - * uint16_t size = network.frag_ptr->message_size; + * uint16_t size = network.frag_ptr->message_size; * memcpy(&myDataBuffer,network.frag_ptr->message_buffer,network.frag_ptr->message_size); - * } + * } * @endcode */ #define EXTERNAL_DATA_TYPE 131 @@ -102,7 +112,7 @@ * Messages of this type indicate the last fragment in a sequence of message fragments. * Messages of this type do not receive a NETWORK_ACK */ -#define NETWORK_LAST_FRAGMENT 150 +#define NETWORK_LAST_FRAGMENT 150 //#define NETWORK_LAST_FRAGMENT 201 // NO ACK Response Types @@ -112,9 +122,9 @@ * Messages of this type are used internally, to signal the sender that a transmission has been completed. * RF24Network does not directly have a built-in transport layer protocol, so message delivery is not 100% guaranteed.<br> * Messages can be lost via corrupted dynamic payloads, or a NETWORK_ACK can fail, while the message was actually successful. - * + * * NETWORK_ACK messages can be utilized as a traffic/flow control mechanism, since transmitting nodes will be forced to wait until - * the payload is transmitted across the network and acknowledged, before sending additional data. + * the payload is transmitted across the network and acknowledged, before sending additional data. * * In the event that the transmitting device will be waiting for a direct response, manually sent by the recipient, a NETWORK_ACK is not required. <br> * User messages utilizing a 'type' with a decimal value of 64 or less will not be acknowledged across the network via NETWORK_ACK messages. @@ -127,7 +137,7 @@ * Messages of this type are used with multi-casting , to find active/available nodes. * Any node receiving a NETWORK_POLL sent to a multicast address will respond directly to the sender with a blank message, indicating the * address of the available node via the header. - */ + */ #define NETWORK_POLL 194 /** @@ -143,6 +153,7 @@ #define NETWORK_MORE_FRAGMENTS_NACK 200 + /** Internal defines for handling written payloads */ #define TX_NORMAL 0 #define TX_ROUTED 1 @@ -157,17 +168,19 @@ /** Internal defines for handling internal payloads - prevents reading additional data from the radio * when buffers are full */ -#define FLAG_HOLD_INCOMING 1 -/** FLAG_BYPASS_HOLDS is mainly for use with RF24Mesh as follows: - * a: Ensure no data in radio buffers, else exit - * b: Address is changed to multicast address for renewal - * c: Holds Cleared (bypass flag is set) - * d: Address renewal takes place and is set - * e: Holds Enabled (bypass flag off) - */ -#define FLAG_BYPASS_HOLDS 2 - -#define FLAG_FAST_FRAG 4 + #define FLAG_HOLD_INCOMING 1 + /** FLAG_BYPASS_HOLDS is mainly for use with RF24Mesh as follows: + * a: Ensure no data in radio buffers, else exit + * b: Address is changed to multicast address for renewal + * c: Holds Cleared (bypass flag is set) + * d: Address renewal takes place and is set + * e: Holds Enabled (bypass flag off) + */ + #define FLAG_BYPASS_HOLDS 2 + + #define FLAG_FAST_FRAG 4 + + #define FLAG_NO_POLL 8 class RF24; @@ -178,68 +191,69 @@ * * Headers are addressed to the appropriate node, and the network forwards them on to their final destination. */ -struct RF24NetworkHeader { - uint16_t from_node; /**< Logical address where the message was generated */ - uint16_t to_node; /**< Logical address where the message is going */ - uint16_t id; /**< Sequential message ID, incremented every time a new frame is constructed */ - /** - * Message Types: - * User message types 1 through 64 will NOT be acknowledged by the network, while message types 65 through 127 will receive a network ACK. - * System message types 192 through 255 will NOT be acknowledged by the network. Message types 128 through 192 will receive a network ACK. <br> - * <br><br> - */ - unsigned char type; /**< <b>Type of the packet. </b> 0-127 are user-defined types, 128-255 are reserved for system */ +struct RF24NetworkHeader +{ + uint16_t from_node; /**< Logical address where the message was generated */ + uint16_t to_node; /**< Logical address where the message is going */ + uint16_t id; /**< Sequential message ID, incremented every time a new frame is constructed */ + /** + * Message Types: + * User message types 1 through 64 will NOT be acknowledged by the network, while message types 65 through 127 will receive a network ACK. + * System message types 192 through 255 will NOT be acknowledged by the network. Message types 128 through 192 will receive a network ACK. <br> + * <br><br> + */ + unsigned char type; /**< <b>Type of the packet. </b> 0-127 are user-defined types, 128-255 are reserved for system */ + + /** + * During fragmentation, it carries the fragment_id, and on the last fragment + * it carries the header_type.<br> + */ + unsigned char reserved; /**< *Reserved for system use* */ - /** - * During fragmentation, it carries the fragment_id, and on the last fragment - * it carries the header_type.<br> - */ - unsigned char reserved; /**< *Reserved for system use* */ - - static uint16_t next_id; /**< The message ID of the next message to be sent (unused)*/ + static uint16_t next_id; /**< The message ID of the next message to be sent (unused)*/ - /** - * Default constructor - * + /** + * Default constructor + * - * Simply constructs a blank header - */ - RF24NetworkHeader() {} + * Simply constructs a blank header + */ + RF24NetworkHeader() {} - /** - * Send constructor - * - * @note Now supports automatic fragmentation for very long messages, which can be sent as usual if fragmentation is enabled. - * - * Fragmentation is enabled by default for all devices except ATTiny <br> - * Configure fragmentation and max payload size in RF24Network_config.h - * - * Use this constructor to create a header and then send a message - * - * @code - * uint16_t recipient_address = 011; - * - * RF24NetworkHeader header(recipient_address,'t'); - * - * network.write(header,&message,sizeof(message)); - * @endcode - * - * @param _to The Octal format, logical node address where the message is going - * @param _type The type of message which follows. Only 0-127 are allowed for - * user messages. Types 1-64 will not receive a network acknowledgement. - */ + /** + * Send constructor + * + * @note Now supports automatic fragmentation for very long messages, which can be sent as usual if fragmentation is enabled. + * + * Fragmentation is enabled by default for all devices except ATTiny <br> + * Configure fragmentation and max payload size in RF24Network_config.h + * + * Use this constructor to create a header and then send a message + * + * @code + * uint16_t recipient_address = 011; + * + * RF24NetworkHeader header(recipient_address,'t'); + * + * network.write(header,&message,sizeof(message)); + * @endcode + * + * @param _to The Octal format, logical node address where the message is going + * @param _type The type of message which follows. Only 0-127 are allowed for + * user messages. Types 1-64 will not receive a network acknowledgement. + */ - RF24NetworkHeader(uint16_t _to, unsigned char _type = 0): to_node(_to), id(next_id++), type(_type) {} - /** - * Create debugging string - * - * Useful for debugging. Dumps all members into a single string, using - * internal static memory. This memory will get overridden next time - * you call the method. - * - * @return String representation of this object - */ - const char* toString(void) const; + RF24NetworkHeader(uint16_t _to, unsigned char _type = 0): to_node(_to), id(next_id++), type(_type) {} + /** + * Create debugging string + * + * Useful for debugging. Dumps all members into a single string, using + * internal static memory. This memory will get overridden next time + * you call the method. + * + * @return String representation of this object + */ + const char* toString(void) const; }; @@ -248,71 +262,76 @@ * * The actual frame put over the air consists of a header (8-bytes) and a message payload (Up to 24-bytes)<br> * When data is received, it is stored using the RF24NetworkFrame structure, which includes: - * 1. The header - * 2. The size of the included message + * 1. The header + * 2. The size of the included message * 3. The 'message' or data being received - * + * * */ -struct RF24NetworkFrame { - RF24NetworkHeader header; /**< Header which is sent with each message */ - uint16_t message_size; /**< The size in bytes of the payload length */ - /** - * On Arduino, the message buffer is just a pointer, and can be pointed to any memory location. - * On Linux the message buffer is a standard byte array, equal in size to the defined MAX_PAYLOAD_SIZE - */ - - uint8_t *message_buffer; //< Pointer to the buffer storing the actual message - - /** - * Default constructor - * - * Simply constructs a blank frame. Frames are generally used internally. See RF24NetworkHeader. - */ - //RF24NetworkFrame() {} + struct RF24NetworkFrame +{ + RF24NetworkHeader header; /**< Header which is sent with each message */ + uint16_t message_size; /**< The size in bytes of the payload length */ + + /** + * On Arduino, the message buffer is just a pointer, and can be pointed to any memory location. + * On Linux the message buffer is a standard byte array, equal in size to the defined MAX_PAYLOAD_SIZE + */ + + + + uint8_t *message_buffer; //< Pointer to the buffer storing the actual message - RF24NetworkFrame() {} - /** - * Constructor - create a network frame with data - * Frames are constructed and handled differently on Arduino/AVR and Linux devices (defined RF24_LINUX) - * - * <br> - * **Linux:** - * @param _header The RF24Network header to be stored in the frame - * @param _message The 'message' or data. - * @param _len The size of the 'message' or data. - * - * <br> - * **Arduino/AVR/Etc.** - * @see RF24Network.frag_ptr - * @param _header The RF24Network header to be stored in the frame - * @param _message_size The size of the 'message' or data - * - * - * Frames are used internally and by external systems. See RF24NetworkHeader. - */ + /** + * Default constructor + * + * Simply constructs a blank frame. Frames are generally used internally. See RF24NetworkHeader. + */ + //RF24NetworkFrame() {} + + RF24NetworkFrame() {} + /** + * Constructor - create a network frame with data + * Frames are constructed and handled differently on Arduino/AVR and Linux devices (defined RF24_LINUX) + * + * <br> + * **Linux:** + * @param _header The RF24Network header to be stored in the frame + * @param _message The 'message' or data. + * @param _len The size of the 'message' or data. + * + * <br> + * **Arduino/AVR/Etc.** + * @see RF24Network.frag_ptr + * @param _header The RF24Network header to be stored in the frame + * @param _message_size The size of the 'message' or data + * + * + * Frames are used internally and by external systems. See RF24NetworkHeader. + */ + + RF24NetworkFrame(RF24NetworkHeader &_header, uint16_t _message_size): + header(_header), message_size(_message_size){ + } - RF24NetworkFrame(RF24NetworkHeader &_header, uint16_t _message_size): - header(_header), message_size(_message_size) { - } - /** - * Create debugging string - * - * Useful for debugging. Dumps all members into a single string, using - * internal static memory. This memory will get overridden next time - * you call the method. - * - * @return String representation of this object - */ - const char* toString(void) const; + /** + * Create debugging string + * + * Useful for debugging. Dumps all members into a single string, using + * internal static memory. This memory will get overridden next time + * you call the method. + * + * @return String representation of this object + */ + const char* toString(void) const; }; - + /** * 2014-2015 - Optimized Network Layer for RF24 Radios @@ -323,485 +342,490 @@ class RF24Network { -private: - Timer rf24netTimer; - /**@}*/ - /** - * @name Primary Interface - * - * These are the main methods you need to operate the network - */ - /**@{*/ + + /**@}*/ + /** + * @name Primary Interface + * + * These are the main methods you need to operate the network + */ + /**@{*/ + public: - /** - * Construct the network - * - * @param _radio The underlying radio driver instance - * - */ + /** + * Construct the network + * + * @param _radio The underlying radio driver instance + * + */ - RF24Network( RF24& _radio ); + RF24Network( RF24& _radio ); - /** - * Bring up the network using the current radio frequency/channel. - * Calling begin brings up the network, and configures the address, which designates the location of the node within RF24Network topology. - * @note Node addresses are specified in Octal format, see <a href=Addressing.html>RF24Network Addressing</a> for more information. - * @warning Be sure to 'begin' the radio first. - * - * **Example 1:** Begin on current radio channel with address 0 (master node) - * @code - * network.begin(00); - * @endcode - * **Example 2:** Begin with address 01 (child of master) - * @code - * network.begin(01); - * @endcode - * **Example 3:** Begin with address 011 (child of 01, grandchild of master) - * @code - * network.begin(011); - * @endcode - * - * @see begin(uint8_t _channel, uint16_t _node_address ) - * @param _node_address The logical address of this node - * - */ + /** + * Bring up the network using the current radio frequency/channel. + * Calling begin brings up the network, and configures the address, which designates the location of the node within RF24Network topology. + * @note Node addresses are specified in Octal format, see <a href=Addressing.html>RF24Network Addressing</a> for more information. + * @warning Be sure to 'begin' the radio first. + * + * **Example 1:** Begin on current radio channel with address 0 (master node) + * @code + * network.begin(00); + * @endcode + * **Example 2:** Begin with address 01 (child of master) + * @code + * network.begin(01); + * @endcode + * **Example 3:** Begin with address 011 (child of 01, grandchild of master) + * @code + * network.begin(011); + * @endcode + * + * @see begin(uint8_t _channel, uint16_t _node_address ) + * @param _node_address The logical address of this node + * + */ + + inline void begin(uint16_t _node_address){ + begin(USE_CURRENT_CHANNEL,_node_address); + } - inline void begin(uint16_t _node_address) { - begin(USE_CURRENT_CHANNEL,_node_address); - } + /** + * Main layer loop + * + * This function must be called regularly to keep the layer going. This is where payloads are + * re-routed, received, and all the action happens. + * + * @see + * + * @return Returns the type of the last received payload. + */ + uint8_t update(void); + + /** + * Test whether there is a message available for this node + * + * @return Whether there is a message available for this node + */ + bool available(void); + + /** + * Read the next available header + * + * Reads the next available header without advancing to the next + * incoming message. Useful for doing a switch on the message type + * + * If there is no message available, the header is not touched + * + * @param[out] header The header (envelope) of the next message + */ + uint16_t peek(RF24NetworkHeader& header); - /** - * Main layer loop - * - * This function must be called regularly to keep the layer going. This is where payloads are - * re-routed, received, and all the action happens. - * - * @see - * - * @return Returns the type of the last received payload. - */ - uint8_t update(void); + /** + * Read a message + * + * @code + * while ( network.available() ) { + * RF24NetworkHeader header; + * uint32_t time; + * network.peek(header); + * if(header.type == 'T'){ + * network.read(header,&time,sizeof(time)); + * Serial.print("Got time: "); + * Serial.println(time); + * } + * } + * @endcode + * @param[out] header The header (envelope) of this message + * @param[out] message Pointer to memory where the message should be placed + * @param maxlen The largest message size which can be held in @p message + * @return The total number of bytes copied into @p message + */ + uint16_t read(RF24NetworkHeader& header, void* message, uint16_t maxlen); - /** - * Test whether there is a message available for this node - * - * @return Whether there is a message available for this node - */ - bool available(void); + /** + * Send a message + * + * @note RF24Network now supports fragmentation for very long messages, send as normal. Fragmentation + * may need to be enabled or configured by editing the RF24Network_config.h file. Default max payload size is 120 bytes. + * + * @code + * uint32_t time = millis(); + * uint16_t to = 00; // Send to master + * RF24NetworkHeader header(to, 'T'); // Send header type 'T' + * network.write(header,&time,sizeof(time)); + * @endcode + * @param[in,out] header The header (envelope) of this message. The critical + * thing to fill in is the @p to_node field so we know where to send the + * message. It is then updated with the details of the actual header sent. + * @param message Pointer to memory where the message is located + * @param len The size of the message + * @return Whether the message was successfully received + */ + bool write(RF24NetworkHeader& header,const void* message, uint16_t len); - /** - * Read the next available header - * - * Reads the next available header without advancing to the next - * incoming message. Useful for doing a switch on the message type - * - * If there is no message available, the header is not touched - * - * @param[out] header The header (envelope) of the next message - */ - uint16_t peek(RF24NetworkHeader& header); + /**@}*/ + /** + * @name Advanced Configuration + * + * For advanced configuration of the network + */ + /**@{*/ + - /** - * Read a message - * - * @code - * while ( network.available() ) { - * RF24NetworkHeader header; - * uint32_t time; - * network.peek(header); - * if(header.type == 'T'){ - * network.read(header,&time,sizeof(time)); - * Serial.print("Got time: "); - * Serial.println(time); - * } - * } - * @endcode - * @param[out] header The header (envelope) of this message - * @param[out] message Pointer to memory where the message should be placed - * @param maxlen The largest message size which can be held in @p message - * @return The total number of bytes copied into @p message - */ - uint16_t read(RF24NetworkHeader& header, void* message, uint16_t maxlen); + /** + * Construct the network in dual head mode using two radio modules. + * @note Not working on RPi. Radios will share MISO, MOSI and SCK pins, but require separate CE,CS pins. + * @code + * RF24 radio(7,8); + * RF24 radio1(4,5); + * RF24Network(radio.radio1); + * @endcode + * @param _radio The underlying radio driver instance + * @param _radio1 The second underlying radio driver instance + */ + + RF24Network( RF24& _radio, RF24& _radio1); + + /** + * By default, multicast addresses are divided into levels. + * + * Nodes 1-5 share a multicast address, nodes n1-n5 share a multicast address, and nodes n11-n55 share a multicast address.<br> + * + * This option is used to override the defaults, and create custom multicast groups that all share a single + * address. <br> + * The level should be specified in decimal format 1-6 <br> + * @see multicastRelay + * @param level Levels 1 to 6 are available. All nodes at the same level will receive the same + * messages if in range. Messages will be routed in order of level, low to high by default, with the + * master node (00) at multicast Level 0 + */ + + void multicastLevel(uint8_t level); + + /** + * Enabling this will allow this node to automatically forward received multicast frames to the next highest + * multicast level. Duplicate frames are filtered out, so multiple forwarding nodes at the same level should + * not interfere. Forwarded payloads will also be received. + * @see multicastLevel + */ + + bool multicastRelay; + + /** + * Set up the watchdog timer for sleep mode using the number 0 through 10 to represent the following time periods:<br> + * wdt_16ms = 0, wdt_32ms, wdt_64ms, wdt_128ms, wdt_250ms, wdt_500ms, wdt_1s, wdt_2s, wdt_4s, wdt_8s + * @code + * setup_watchdog(7); // Sets the WDT to trigger every second + * @endcode + * @param prescalar The WDT prescaler to define how often the node will wake up. When defining sleep mode cycles, this time period is 1 cycle. + */ + void setup_watchdog(uint8_t prescalar); /** - * Send a message - * - * @note RF24Network now supports fragmentation for very long messages, send as normal. Fragmentation - * may need to be enabled or configured by editing the RF24Network_config.h file. Default max payload size is 120 bytes. - * - * @code - * uint32_t time = millis(); - * uint16_t to = 00; // Send to master - * RF24NetworkHeader header(to, 'T'); // Send header type 'T' - * network.write(header,&time,sizeof(time)); - * @endcode - * @param[in,out] header The header (envelope) of this message. The critical - * thing to fill in is the @p to_node field so we know where to send the - * message. It is then updated with the details of the actual header sent. - * @param message Pointer to memory where the message is located - * @param len The size of the message - * @return Whether the message was successfully received - */ - bool write(RF24NetworkHeader& header,const void* message, uint16_t len); - - /**@}*/ - /** - * @name Advanced Configuration - * - * For advanced configuration of the network - */ - /**@{*/ - + * @note: This value is automatically assigned based on the node address + * to reduce errors and increase throughput of the network. + * + * Sets the timeout period for individual payloads in milliseconds at staggered intervals. + * Payloads will be retried automatically until success or timeout + * Set to 0 to use the normal auto retry period defined by radio.setRetries() + * + */ - /** - * Construct the network in dual head mode using two radio modules. - * @note Not working on RPi. Radios will share MISO, MOSI and SCK pins, but require separate CE,CS pins. - * @code - * RF24 radio(7,8); - * RF24 radio1(4,5); - * RF24Network(radio.radio1); - * @endcode - * @param _radio The underlying radio driver instance - * @param _radio1 The second underlying radio driver instance - */ - - RF24Network( RF24& _radio, RF24& _radio1); - - /** - * By default, multicast addresses are divided into levels. - * - * Nodes 1-5 share a multicast address, nodes n1-n5 share a multicast address, and nodes n11-n55 share a multicast address.<br> - * - * This option is used to override the defaults, and create custom multicast groups that all share a single - * address. <br> - * The level should be specified in decimal format 1-6 <br> - * @see multicastRelay - * @param level Levels 1 to 6 are available. All nodes at the same level will receive the same - * messages if in range. Messages will be routed in order of level, low to high by default, with the - * master node (00) at multicast Level 0 - */ - - void multicastLevel(uint8_t level); - - /** - * Enabling this will allow this node to automatically forward received multicast frames to the next highest - * multicast level. Duplicate frames are filtered out, so multiple forwarding nodes at the same level should - * not interfere. Forwarded payloads will also be received. - * @see multicastLevel - */ - - bool multicastRelay; + uint32_t txTimeout; /**< Network timeout value */ + + /** + * This only affects payloads that are routed by one or more nodes. + * This specifies how long to wait for an ack from across the network. + * Radios sending directly to their parent or children nodes do not + * utilize this value. + */ + + uint16_t routeTimeout; /**< Timeout for routed payloads */ + + + /**@}*/ + /** + * @name Advanced Operation + * + * For advanced operation of the network + */ + /**@{*/ - /** - * Set up the watchdog timer for sleep mode using the number 0 through 10 to represent the following time periods:<br> - * wdt_16ms = 0, wdt_32ms, wdt_64ms, wdt_128ms, wdt_250ms, wdt_500ms, wdt_1s, wdt_2s, wdt_4s, wdt_8s - * @code - * setup_watchdog(7); // Sets the WDT to trigger every second - * @endcode - * @param prescalar The WDT prescaler to define how often the node will wake up. When defining sleep mode cycles, this time period is 1 cycle. - */ - void setup_watchdog(uint8_t prescalar); - - /** - * @note: This value is automatically assigned based on the node address - * to reduce errors and increase throughput of the network. - * - * Sets the timeout period for individual payloads in milliseconds at staggered intervals. - * Payloads will be retried automatically until success or timeout - * Set to 0 to use the normal auto retry period defined by radio.setRetries() - * - */ - - uint32_t txTimeout; /**< Network timeout value */ - - /** - * This only affects payloads that are routed by one or more nodes. - * This specifies how long to wait for an ack from across the network. - * Radios sending directly to their parent or children nodes do not - * utilize this value. - */ - - uint16_t routeTimeout; /**< Timeout for routed payloads */ - + /** + * Return the number of failures and successes for all transmitted payloads, routed or sent directly + * @note This needs to be enabled via #define ENABLE_NETWORK_STATS in RF24Network_config.h + * + * @code + * bool fails, success; + * network.failures(&fails,&success); + * @endcode + * + */ + void failures(uint32_t *_fails, uint32_t *_ok); + + #if defined (RF24NetworkMulticast) + + /** + * Send a multicast message to multiple nodes at once + * Allows messages to be rapidly broadcast through the network + * + * Multicasting is arranged in levels, with all nodes on the same level listening to the same address + * Levels are assigned by network level ie: nodes 01-05: Level 1, nodes 011-055: Level 2 + * @see multicastLevel + * @see multicastRelay + * @param message Pointer to memory where the message is located + * @param len The size of the message + * @param level Multicast level to broadcast to + * @return Whether the message was successfully sent + */ + + bool multicast(RF24NetworkHeader& header,const void* message, uint16_t len, uint8_t level); + + + #endif + + /** + * Writes a direct (unicast) payload. This allows routing or sending messages outside of the usual routing paths. + * The same as write, but a physical address is specified as the last option. + * The payload will be written to the physical address, and routed as necessary by the recipient + */ + bool write(RF24NetworkHeader& header,const void* message, uint16_t len, uint16_t writeDirect); - /**@}*/ - /** - * @name Advanced Operation - * - * For advanced operation of the network - */ - /**@{*/ - - /** - * Return the number of failures and successes for all transmitted payloads, routed or sent directly - * @note This needs to be enabled via #define ENABLE_NETWORK_STATS in RF24Network_config.h - * - * @code - * bool fails, success; - * network.failures(&fails,&success); - * @endcode - * - */ - void failures(uint32_t *_fails, uint32_t *_ok); - -#if defined (RF24NetworkMulticast) - - /** - * Send a multicast message to multiple nodes at once - * Allows messages to be rapidly broadcast through the network - * - * Multicasting is arranged in levels, with all nodes on the same level listening to the same address - * Levels are assigned by network level ie: nodes 01-05: Level 1, nodes 011-055: Level 2 - * @see multicastLevel - * @see multicastRelay - * @param message Pointer to memory where the message is located - * @param len The size of the message - * @param level Multicast level to broadcast to - * @return Whether the message was successfully sent - */ - - bool multicast(RF24NetworkHeader& header,const void* message, uint16_t len, uint8_t level); + /** + * Sleep this node - For AVR devices only + * @note NEW - Nodes can now be slept while the radio is not actively transmitting. This must be manually enabled by uncommenting + * the #define ENABLE_SLEEP_MODE in RF24Network_config.h + * @note Setting the interruptPin to 255 will disable interrupt wake-ups + * @note The watchdog timer should be configured in setup() if using sleep mode. + * This function will sleep the node, with the radio still active in receive mode. + * + * The node can be awoken in two ways, both of which can be enabled simultaneously: + * 1. An interrupt - usually triggered by the radio receiving a payload. Must use pin 2 (interrupt 0) or 3 (interrupt 1) on Uno, Nano, etc. + * 2. The watchdog timer waking the MCU after a designated period of time, can also be used instead of delays to control transmission intervals. + * @code + * if(!network.available()){ network.sleepNode(1,0); } //Sleeps the node for 1 second or a payload is received + * + * Other options: + * network.sleepNode(0,0); // Sleep this node for the designated time period, or a payload is received. + * network.sleepNode(1,255); // Sleep this node for 1 cycle. Do not wake up until then, even if a payload is received ( no interrupt ) + * @endcode + * @see setup_watchdog() + * @param cycles: The node will sleep in cycles of 1s. Using 2 will sleep 2 WDT cycles, 3 sleeps 3WDT cycles... + * @param interruptPin: The interrupt number to use (0,1) for pins two and three on Uno,Nano. More available on Mega etc. + * @return True if sleepNode completed normally, after the specified number of cycles. False if sleep was interrupted + */ + bool sleepNode( unsigned int cycles, int interruptPin ); -#endif - - /** - * Writes a direct (unicast) payload. This allows routing or sending messages outside of the usual routing paths. - * The same as write, but a physical address is specified as the last option. - * The payload will be written to the physical address, and routed as necessary by the recipient - */ - bool write(RF24NetworkHeader& header,const void* message, uint16_t len, uint16_t writeDirect); - - /** - * Sleep this node - For AVR devices only - * @note NEW - Nodes can now be slept while the radio is not actively transmitting. This must be manually enabled by uncommenting - * the #define ENABLE_SLEEP_MODE in RF24Network_config.h - * @note Setting the interruptPin to 255 will disable interrupt wake-ups - * @note The watchdog timer should be configured in setup() if using sleep mode. - * This function will sleep the node, with the radio still active in receive mode. - * - * The node can be awoken in two ways, both of which can be enabled simultaneously: - * 1. An interrupt - usually triggered by the radio receiving a payload. Must use pin 2 (interrupt 0) or 3 (interrupt 1) on Uno, Nano, etc. - * 2. The watchdog timer waking the MCU after a designated period of time, can also be used instead of delays to control transmission intervals. - * @code - * if(!network.available()){ network.sleepNode(1,0); } //Sleeps the node for 1 second or a payload is received - * - * Other options: - * network.sleepNode(0,0); // Sleep this node for the designated time period, or a payload is received. - * network.sleepNode(1,255); // Sleep this node for 1 cycle. Do not wake up until then, even if a payload is received ( no interrupt ) - * @endcode - * @see setup_watchdog() - * @param cycles: The node will sleep in cycles of 1s. Using 2 will sleep 2 WDT cycles, 3 sleeps 3WDT cycles... - * @param interruptPin: The interrupt number to use (0,1) for pins two and three on Uno,Nano. More available on Mega etc. - * @return True if sleepNode completed normally, after the specified number of cycles. False if sleep was interrupted - */ - bool sleepNode( unsigned int cycles, int interruptPin ); - - - /** - * This node's parent address - * - * @return This node's parent address, or -1 if this is the base - */ - uint16_t parent() const; - - /** - * Provided a node address and a pipe number, will return the RF24Network address of that child pipe for that node - */ - uint16_t addressOfPipe( uint16_t node,uint8_t pipeNo ); - - /** - * @note Addresses are specified in octal: 011, 034 - * @return True if a supplied address is valid - */ - bool is_valid_address( uint16_t node ); + /** + * This node's parent address + * + * @return This node's parent address, or -1 if this is the base + */ + uint16_t parent() const; + + /** + * Provided a node address and a pipe number, will return the RF24Network address of that child pipe for that node + */ + uint16_t addressOfPipe( uint16_t node,uint8_t pipeNo ); + + /** + * @note Addresses are specified in octal: 011, 034 + * @return True if a supplied address is valid + */ + bool is_valid_address( uint16_t node ); - /**@}*/ - /** - * @name Deprecated - * - * Maintained for backwards compatibility - */ - /**@{*/ + /**@}*/ + /** + * @name Deprecated + * + * Maintained for backwards compatibility + */ + /**@{*/ + + /** + * Bring up the network on a specific radio frequency/channel. + * @note Use radio.setChannel() to configure the radio channel + * + * **Example 1:** Begin on channel 90 with address 0 (master node) + * @code + * network.begin(90,0); + * @endcode + * **Example 2:** Begin on channel 90 with address 01 (child of master) + * @code + * network.begin(90,01); + * @endcode + * **Example 3:** Begin on channel 90 with address 011 (child of 01, grandchild of master) + * @code + * network.begin(90,011); + * @endcode + * + * @param _channel The RF channel to operate on + * @param _node_address The logical address of this node + * + */ + void begin(uint8_t _channel, uint16_t _node_address ); + + /**@}*/ + /** + * @name External Applications/Systems + * + * Interface for External Applications and Systems ( RF24Mesh, RF24Ethernet ) + */ + /**@{*/ + + /** The raw system frame buffer of received data. */ + + uint8_t frame_buffer[MAX_FRAME_SIZE]; - /** - * Bring up the network on a specific radio frequency/channel. - * @note Use radio.setChannel() to configure the radio channel - * - * **Example 1:** Begin on channel 90 with address 0 (master node) - * @code - * network.begin(90,0); - * @endcode - * **Example 2:** Begin on channel 90 with address 01 (child of master) - * @code - * network.begin(90,01); - * @endcode - * **Example 3:** Begin on channel 90 with address 011 (child of 01, grandchild of master) - * @code - * network.begin(90,011); - * @endcode - * - * @param _channel The RF channel to operate on - * @param _node_address The logical address of this node - * - */ - void begin(uint8_t _channel, uint16_t _node_address ); - - /**@}*/ - /** - * @name External Applications/Systems - * - * Interface for External Applications and Systems ( RF24Mesh, RF24Ethernet ) - */ - /**@{*/ - - /** The raw system frame buffer of received data. */ - - uint8_t frame_buffer[MAX_FRAME_SIZE]; - - /** - * **Linux** <br> - * Data with a header type of EXTERNAL_DATA_TYPE will be loaded into a separate queue. - * The data can be accessed as follows: - * @code - * RF24NetworkFrame f; - * while(network.external_queue.size() > 0){ - * f = network.external_queue.front(); - * uint16_t dataSize = f.message_size; - * //read the frame message buffer - * memcpy(&myBuffer,&f.message_buffer,dataSize); - * network.external_queue.pop(); - * } - * @endcode - */ - + /** + * **Linux** <br> + * Data with a header type of EXTERNAL_DATA_TYPE will be loaded into a separate queue. + * The data can be accessed as follows: + * @code + * RF24NetworkFrame f; + * while(network.external_queue.size() > 0){ + * f = network.external_queue.front(); + * uint16_t dataSize = f.message_size; + * //read the frame message buffer + * memcpy(&myBuffer,&f.message_buffer,dataSize); + * network.external_queue.pop(); + * } + * @endcode + */ + + + + + #if !defined ( DISABLE_FRAGMENTATION ) + /** + * **ARDUINO** <br> + * The frag_ptr is only used with Arduino (not RPi/Linux) and is mainly used for external data systems like RF24Ethernet. When + * an EXTERNAL_DATA payload type is received, and returned from network.update(), the frag_ptr will always point to the starting + * memory location of the received frame. <br>This is used by external data systems (RF24Ethernet) to immediately copy the received + * data to a buffer, without using the user-cache. + * + * @see RF24NetworkFrame + * + * @code + * uint8_t return_type = network.update(); + * if(return_type == EXTERNAL_DATA_TYPE){ + * uint16_t size = network.frag_ptr->message_size; + * memcpy(&myDataBuffer,network.frag_ptr->message_buffer,network.frag_ptr->message_size); + * } + * @endcode + * Linux devices (defined as RF24_LINUX) currently cache all payload types, and do not utilize frag_ptr. + */ + RF24NetworkFrame* frag_ptr; + #endif -#if !defined ( DISABLE_FRAGMENTATION ) - /** - * **ARDUINO** <br> - * The frag_ptr is only used with Arduino (not RPi/Linux) and is mainly used for external data systems like RF24Ethernet. When - * an EXTERNAL_DATA payload type is received, and returned from network.update(), the frag_ptr will always point to the starting - * memory location of the received frame. <br>This is used by external data systems (RF24Ethernet) to immediately copy the received - * data to a buffer, without using the user-cache. - * - * @see RF24NetworkFrame - * - * @code - * uint8_t return_type = network.update(); - * if(return_type == EXTERNAL_DATA_TYPE){ - * uint16_t size = network.frag_ptr->message_size; - * memcpy(&myDataBuffer,network.frag_ptr->message_buffer,network.frag_ptr->message_size); - * } - * @endcode - * Linux devices (defined as RF24_LINUX) currently cache all payload types, and do not utilize frag_ptr. - */ - RF24NetworkFrame* frag_ptr; -#endif + /** + * Variable to determine whether update() will return after the radio buffers have been emptied (DEFAULT), or + * whether to return immediately when (most) system types are received. + * + * As an example, this is used with RF24Mesh to catch and handle system messages without loading them into the user cache. + * + * The following reserved/system message types are handled automatically, and not returned. + * + * | System Message Types <br> (Not Returned) | + * |-----------------------| + * | NETWORK_ADDR_RESPONSE | + * | NETWORK_ACK | + * | NETWORK_PING | + * | NETWORK_POLL <br>(With multicast enabled) | + * | NETWORK_REQ_ADDRESS | + * + */ + bool returnSysMsgs; - /** - * Variable to determine whether update() will return after the radio buffers have been emptied (DEFAULT), or - * whether to return immediately when (most) system types are received. - * - * As an example, this is used with RF24Mesh to catch and handle system messages without loading them into the user cache. - * - * The following reserved/system message types are handled automatically, and not returned. - * - * | System Message Types <br> (Not Returned) | - * |-----------------------| - * | NETWORK_ADDR_RESPONSE | - * | NETWORK_ACK | - * | NETWORK_PING | - * | NETWORK_POLL <br>(With multicast enabled) | - * | NETWORK_REQ_ADDRESS | - * - */ - bool returnSysMsgs; + /** + * Network Flags allow control of data flow + * + * Incoming Blocking: If the network user-cache is full, lets radio cache fill up. Radio ACKs are not sent when radio internal cache is full.<br> + * This behaviour may seem to result in more failed sends, but the payloads would have otherwise been dropped due to the cache being full.<br> + * + * | FLAGS | Value | Description | + * |-------|-------|-------------| + * |FLAG_HOLD_INCOMING| 1(bit_1) | INTERNAL: Set automatically when a fragmented payload will exceed the available cache | + * |FLAG_BYPASS_HOLDS| 2(bit_2) | EXTERNAL: Can be used to prevent holds from blocking. Note: Holds are disabled & re-enabled by RF24Mesh when renewing addresses. This will cause data loss if incoming data exceeds the available cache space| + * |FLAG_FAST_FRAG| 4(bit_3) | INTERNAL: Replaces the fastFragTransfer variable, and allows for faster transfers between directly connected nodes. | + * |FLAG_NO_POLL| 8(bit_4) | EXTERNAL/USER: Disables NETWORK_POLL responses on a node-by-node basis. | + * + */ + uint8_t networkFlags; + + private: - /** - * Network Flags allow control of data flow - * - * Incoming Blocking: If the network user-cache is full, lets radio cache fill up. Radio ACKs are not sent when radio internal cache is full.<br> - * This behaviour may seem to result in more failed sends, but the payloads would have otherwise been dropped due to the cache being full.<br> - * - * | FLAGS | Value | Description | - * |-------|-------|-------------| - * |FLAG_HOLD_INCOMING| 1(bit_1) | INTERNAL: Set automatically when a fragmented payload will exceed the available cache | - * |FLAG_BYPASS_HOLDS| 2(bit_2) | EXTERNAL: Can be used to prevent holds from blocking. Note: Holds are disabled & re-enabled by RF24Mesh when renewing addresses. This will cause data loss if incoming data exceeds the available cache space| - * |FLAG_FAST_FRAG| 4(bit_3) | INTERNAL: Replaces the fastFragTransfer variable, and allows for faster transfers between directly connected nodes. | - * - */ - uint8_t networkFlags; - -private: - - uint32_t txTime; + uint32_t txTime; + Timer mainTimer; + + bool write(uint16_t, uint8_t directTo); + bool write_to_pipe( uint16_t node, uint8_t pipe, bool multicast ); + uint8_t enqueue(RF24NetworkHeader *header); - bool write(uint16_t, uint8_t directTo); - bool write_to_pipe( uint16_t node, uint8_t pipe, bool multicast ); - uint8_t enqueue(RF24NetworkHeader *header); - - bool is_direct_child( uint16_t node ); - bool is_descendant( uint16_t node ); - - uint16_t direct_child_route_to( uint16_t node ); - //uint8_t pipe_to_descendant( uint16_t node ); - void setup_address(void); - bool _write(RF24NetworkHeader& header,const void* message, uint16_t len, uint16_t writeDirect); - - struct logicalToPhysicalStruct { - uint16_t send_node; - uint8_t send_pipe; - bool multicast; - }; - - bool logicalToPhysicalAddress(logicalToPhysicalStruct *conversionInfo); - - - RF24& radio; /**< Underlying radio driver, provides link/physical layers */ + bool is_direct_child( uint16_t node ); + bool is_descendant( uint16_t node ); + + uint16_t direct_child_route_to( uint16_t node ); + //uint8_t pipe_to_descendant( uint16_t node ); + void setup_address(void); + bool _write(RF24NetworkHeader& header,const void* message, uint16_t len, uint16_t writeDirect); + + struct logicalToPhysicalStruct{ + uint16_t send_node; + uint8_t send_pipe; + bool multicast; + }; + + bool logicalToPhysicalAddress(logicalToPhysicalStruct *conversionInfo); + + + RF24& radio; /**< Underlying radio driver, provides link/physical layers */ #if defined (DUAL_HEAD_RADIO) - RF24& radio1; + RF24& radio1; #endif -#if defined (RF24NetworkMulticast) - uint8_t multicast_level; +#if defined (RF24NetworkMulticast) + uint8_t multicast_level; #endif - uint16_t node_address; /**< Logical node address of this unit, 1 .. UINT_MAX */ - //const static int frame_size = 32; /**< How large is each frame over the air */ - uint8_t frame_size; - const static unsigned int max_frame_payload_size = MAX_FRAME_SIZE-sizeof(RF24NetworkHeader); - - -#if !defined (NUM_USER_PAYLOADS) -#define NUM_USER_PAYLOADS 5 -#endif - -#if defined (DISABLE_USER_PAYLOADS) - uint8_t frame_queue[1]; /**< Space for a small set of frames that need to be delivered to the app layer */ -#else - uint8_t frame_queue[MAIN_BUFFER_SIZE]; /**< Space for a small set of frames that need to be delivered to the app layer */ -#endif - - uint8_t* next_frame; /**< Pointer into the @p frame_queue where we should place the next received frame */ + uint16_t node_address; /**< Logical node address of this unit, 1 .. UINT_MAX */ + //const static int frame_size = 32; /**< How large is each frame over the air */ + uint8_t frame_size; + const static unsigned int max_frame_payload_size = MAX_FRAME_SIZE-sizeof(RF24NetworkHeader); -#if !defined ( DISABLE_FRAGMENTATION ) - RF24NetworkFrame frag_queue; - uint8_t frag_queue_message_buffer[MAX_PAYLOAD_SIZE]; //frame size + 1 -#endif - - //uint8_t frag_queue[MAX_PAYLOAD_SIZE + 11]; - //RF24NetworkFrame frag_queue; + + #if !defined (NUM_USER_PAYLOADS) + #define NUM_USER_PAYLOADS 5 + #endif + + #if defined (DISABLE_USER_PAYLOADS) + uint8_t frame_queue[1]; /**< Space for a small set of frames that need to be delivered to the app layer */ + #else + uint8_t frame_queue[MAIN_BUFFER_SIZE]; /**< Space for a small set of frames that need to be delivered to the app layer */ + #endif + + uint8_t* next_frame; /**< Pointer into the @p frame_queue where we should place the next received frame */ + + #if !defined ( DISABLE_FRAGMENTATION ) + RF24NetworkFrame frag_queue; + uint8_t frag_queue_message_buffer[MAX_PAYLOAD_SIZE]; //frame size + 1 + #endif - uint16_t parent_node; /**< Our parent's node address */ - uint8_t parent_pipe; /**< The pipe our parent uses to listen to us */ - uint16_t node_mask; /**< The bits which contain signfificant node address information */ - -#if defined ENABLE_NETWORK_STATS - static uint32_t nFails; - static uint32_t nOK; -#endif - + + //uint8_t frag_queue[MAX_PAYLOAD_SIZE + 11]; + //RF24NetworkFrame frag_queue; + + uint16_t parent_node; /**< Our parent's node address */ + uint8_t parent_pipe; /**< The pipe our parent uses to listen to us */ + uint16_t node_mask; /**< The bits which contain signfificant node address information */ + + #if defined ENABLE_NETWORK_STATS + static uint32_t nFails; + static uint32_t nOK; + #endif + public: - + }; @@ -869,7 +893,7 @@ * @section Purpose Purpose/Goal * * Original: Create an alternative to ZigBee radios for Arduino communication. - * + * * New: Enhance the current functionality for maximum efficiency, reliability, and speed * * Xbees are excellent little radios, backed up by a mature and robust standard @@ -884,10 +908,10 @@ * * @section Features Features * - * <b>Whats new? </b><br> + * <b>Whats new? </b><br> * @li New: (Dec 8) Merge of RPi and Arduino code. Finally moving closer to a stable release. Report issues at https://github.com/TMRh20/RF24Network/issues * @li New functionality: (Dec 8) Support for fragmented multicast payloads on both RPi and Arduino - * @li New functionality: (Nov 24) Fragmentation & reassembly supported on both RPi and Arduino + * @li New functionality: (Nov 24) Fragmentation & reassembly supported on both RPi and Arduino * @li Note: structure of network frames is changed, these are only used by external applications like RF24Ethernet and RF24toTUN, and for fragmentation * @li New functionality: User message types 1 through 64 will not receive a network ack * @@ -917,7 +941,7 @@ * @li <a href="https://github.com/TMRh20/RF24Network/archive/Development.zip">Download Current Development Package</a> * @li <a href="examples.html">Examples Page</a>. Start with <a href="helloworld_rx_8ino-example.html">helloworld_rx</a> and <a href="helloworld_tx_8ino-example.html">helloworld_tx</a>. * - * <b> Additional Information & Add-ons </b> + * <b> Additional Information & Add-ons </b> * @li <a href="https://github.com/TMRh20/RF24Mesh">RF24Mesh: Dynamic Mesh Layer for RF24Network Dev</a> * @li <a href="https://github.com/TMRh20/RF24Ethernet">RF24Ethernet: TCP/IP over RF24Network</a> * @li <a href="http://tmrh20.blogspot.com/2014/03/high-speed-data-transfers-and-wireless.html">My Blog: RF24 Optimization Overview</a> @@ -989,25 +1013,25 @@ * * @section Overview Overview * The nrf24 radio modules typically use a 40-bit address format, requiring 5-bytes of storage space per address, and allowing a wide - * array of addresses to be utilized. In addition, the radios are limited to direct communication with 6 other nodes while using the - * Enhanced-Shock-Burst (ESB) functionality of the radios. + * array of addresses to be utilized. In addition, the radios are limited to direct communication with 6 other nodes while using the + * Enhanced-Shock-Burst (ESB) functionality of the radios. * * RF24Network uses a simple method of data compression to store the addresses using only 2 bytes, in a format designed to represent the * network topology in an intuitive way. * See the <a href="Tuning.html"> Topology and Overview</a> page for more info regarding topology. * * @section Octal_Binary Decimal, Octal and Binary formats - * + * * Say we want to designate a logical address to a node, using a tree topology as defined by the manufacturer. - * In the simplest format, we could assign the first node the address of 1, the second 2 and so on. + * In the simplest format, we could assign the first node the address of 1, the second 2 and so on. * Since a single node can only connect to 6 other nodes (1 parent and 5 children) subnets need to be created if using more than 6 nodes.<br> * In this case the children of node 1 could simply be designated as 11,21,31,41, and 51<br> - * Children of node 2 could be designated as 12,22,32,42, and 52 - * + * Children of node 2 could be designated as 12,22,32,42, and 52 + * * The above example is exactly how RF24Network manages the addresses, but they are represented in Octal format. - * - * <b>Decimal, Octal and Binary</b> - * <table> + * + * <b>Decimal, Octal and Binary</b> + * <table> * <tr bgcolor="#a3b4d7" > * <td> Decimal </td> <td> Binary </td><td> Decimal </td> <td> Binary </td><td> Decimal </td> <td> Binary </td> * </tr><tr> @@ -1019,15 +1043,15 @@ * </tr> * </table> * - * - * Since the numbers 0-7 can be represented in exactly three bits, each digit is represented by exactly 3 bits when viewed in octal format. - * This allows a very simple method of managing addresses via masking and bit shifting. - * + * + * Since the numbers 0-7 can be represented in exactly three bits, each digit is represented by exactly 3 bits when viewed in octal format. + * This allows a very simple method of managing addresses via masking and bit shifting. + * * @section DisplayAddresses Displaying Addresses * * When using Arduino devices, octal addresses can be printed in the following manner: * @code - * uint16_t address = 0111; + * uint16_t address = 0111; * Serial.println(address,OCT); * @endcode * @@ -1038,7 +1062,7 @@ * @endcode * * See http://www.cplusplus.com/doc/hex/ for more information<br> - * See the <a href="Tuning.html"> Topology and Overview</a> page for more info regarding topology. + * See the <a href="Tuning.html"> Topology and Overview</a> page for more info regarding topology. * * @page AdvancedConfig Advanced Configuration * @@ -1063,12 +1087,12 @@ * @section General Understanding Radio Communication and Topology * When a transmission takes place from one radio module to another, the receiving radio will communicate * back to the sender with an acknowledgement (ACK) packet, to indicate success. If the sender does not - * receive an ACK, the radio automatically engages in a series of timed retries, at set intervals. The - * radios use techniques like addressing and numbering of payloads to manage this, but it is all done + * receive an ACK, the radio automatically engages in a series of timed retries, at set intervals. The + * radios use techniques like addressing and numbering of payloads to manage this, but it is all done * automatically by the nrf chip, out of sight from the user. * * When working over a radio network, some of these automated techniques can actually hinder data transmission to a degree. - * Retrying failed payloads over and over on a radio network can hinder communication for nearby nodes, or + * Retrying failed payloads over and over on a radio network can hinder communication for nearby nodes, or * reduce throughput and errors on routing nodes. * * Radios in this network are linked by <b>addresses</b> assigned to <b>pipes</b>. Each radio can listen @@ -1083,16 +1107,16 @@ * subnet below it, with up to 4 additional child nodes. The numbering scheme can also be related to IP addresses, * for purposes of understanding the topology via subnetting. Nodes can have 5 children if multicast is disabled. * - * Expressing RF24Network addresses in IP format: + * Expressing RF24Network addresses in IP format: * - * As an example, we could designate the master node in theory, as Address 10.10.10.10 <br> - * The children nodes of the master would be 10.10.10.1, 10.10.10.2, 10.10.10.3, 10.10.10.4 and 10.10.10.5 <br> - * The children nodes of 10.10.10.1 would be 10.10.1.1, 10.10.2.1, 10.10.3.1, 10.10.4.1 and 10.10.5.1 <br> - * + * As an example, we could designate the master node in theory, as Address 10.10.10.10 <br> + * The children nodes of the master would be 10.10.10.1, 10.10.10.2, 10.10.10.3, 10.10.10.4 and 10.10.10.5 <br> + * The children nodes of 10.10.10.1 would be 10.10.1.1, 10.10.2.1, 10.10.3.1, 10.10.4.1 and 10.10.5.1 <br> + * * In RF24Network, the master is just 00 <br> * Children of master are 01,02,03,04,05 <br> * Children of 01 are 011,021,031,041,051 <br> - * + * * @section Network Routing * * Routing of traffic is handled invisibly to the user, by the network layer. If the network addresses are @@ -1114,8 +1138,8 @@ * * Old Functionality: Node 00 sends to node 011 using auto-ack. Node 00 first sends to 01, 01 acknowledges. * Node 01 forwards the payload to 011 using auto-ack. If the payload fails between 01 and 011, node 00 has - * no way of knowing. - * + * no way of knowing. + * * @note When retrying failed payloads that have been routed, there is a chance of duplicate payloads if the network-ack * is not successful. In this case, it is left up to the user to manage retries and filtering of duplicate payloads. * @@ -1123,7 +1147,7 @@ * an acknowledgement is not required, so a user defined type of 0-64 should be used, to prevent the network from * responding with an acknowledgement. If not requesting a response, and wanting to know if the payload was successful * or not, users can utilize header types 65-127. - * + * * @section TuningOverview Tuning Overview * The RF24 radio modules are generally only capable of either sending or receiving data at any given * time, but have built-in auto-retry mechanisms to prevent the loss of data. These values are adjusted @@ -1179,13 +1203,13 @@ * * a: Master node configured with extended timeouts of .5 seconds, and increased retry delay: * @code - * radio.setRetries(11,15); - * network.txTimeout = 500; - * @endcode + * radio.setRetries(11,15); + * network.txTimeout = 500; + * @endcode * b: Second leaf node configured with a similar timeout period and retry delay: * @code - * radio.setRetries(8,15); - * network.txTimeout = 553; + * radio.setRetries(8,15); + * network.txTimeout = 553; * @endcode * c: First and third leaf nodes configured with default timeout periods or slightly increased timout periods. * @@ -1202,9 +1226,9 @@ * 4. Setup the radio and network like so: * * @code - * RF24 radio(7,8); // Using CE (7) and CS (8) for first radio - * RF24 radio1(4,5); // Using CE (4) and CS (5) for second radio - * RF24Network network(radio,radio1); // Set up the network using both radios + * RF24 radio(7,8); // Using CE (7) and CS (8) for first radio + * RF24 radio1(4,5); // Using CE (4) and CS (5) for second radio + * RF24Network network(radio,radio1); // Set up the network using both radios * * Then in setup(), call radio.begin(); and radio1.begin(); before network.begin(); * @endcode @@ -1250,10 +1274,12 @@ * @li Base node. The top of the tree node with no parents, only children. Typically this node * will bridge to another kind of network like Ethernet. ZigBee calls it a Co-ordinator node. * - * + * * * */ #endif // __RF24NETWORK_H__ + +