From 7698c29f57deccc93296ae9c711ad6af2ea67575 Mon Sep 17 00:00:00 2001 From: TMRh20 Date: Sat, 23 Sep 2023 12:36:52 -0600 Subject: [PATCH] Fix for RF24Mesh Issue #214 --- RF24Network.cpp | 37 ++++++++++++++++++++++++++----------- RF24Network.h | 1 + 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/RF24Network.cpp b/RF24Network.cpp index 6facc0fc..db8abe64 100644 --- a/RF24Network.cpp +++ b/RF24Network.cpp @@ -92,7 +92,10 @@ void ESBNetwork::begin(uint8_t _channel, uint16_t _node_address) radio.setChannel(_channel); #if defined (multichannel) - baseChannel = radio.getChannel(); + baseChannel = USE_CURRENT_CHANNEL == 255 ? 97 : _channel; + //Serial.print("Base Chan:"); + //Serial.println(baseChannel); + networkChannel = baseChannel; #endif //radio.enableDynamicAck(); radio.setAutoAck(1); @@ -963,17 +966,29 @@ void ESBNetwork::logicalToPhysicalAddress(logicalToPhysicalStruct* conv } #endif - if (*directTo > TX_ROUTED) { - #if defined (multichannel) - newChannel = baseChannel; - #endif + if (*directTo > TX_ROUTED) { //Serial.println("txrouted"); + + #if defined (multichannel) + uint16_t node_mask_check = 0xFFFF; + uint8_t count = 0; + while (*to_node & node_mask_check) { + node_mask_check <<= 3; + count++; + } + //Serial.print("to_node"); + //Serial.println(*to_node, OCT); + + newChannel = (networkChannel + (5 * count)); + #endif + + pre_conversion_send_node = *to_node; *multicast = 1; //if(*directTo == USER_TX_MULTICAST || *directTo == USER_TX_TO_PHYSICAL_ADDRESS){ pre_conversion_send_pipe = 0; //} } - else if (is_descendant(*to_node)) { + else if (is_descendant(*to_node)) { //Serial.println("desc"); pre_conversion_send_pipe = 5; // Send to its listening pipe // If the node is a direct child, if (is_direct_child(*to_node)) { @@ -984,7 +999,7 @@ void ESBNetwork::logicalToPhysicalAddress(logicalToPhysicalStruct* conv // talk on our child's listening pipe, // and let the direct child relay it. else { - pre_conversion_send_node = direct_child_route_to(*to_node); + pre_conversion_send_node = direct_child_route_to(*to_node); //Serial.println("default"); } #if defined (multichannel) newChannel = baseChannel + 5; @@ -1026,7 +1041,7 @@ bool ESBNetwork::write_to_pipe(uint16_t node, uint8_t pipe, bool multic } #if defined (multichannel) radio.setChannel(baseChannel); - //Serial.print("Set channel"); + //Serial.print("Set channel write"); //Serial.println(baseChannel); #endif /* @@ -1095,9 +1110,9 @@ void ESBNetwork::setup_address(void) #endif #if defined (multichannel) radio.setChannel( (baseChannel + (_multicast_level * 5)) % 127); - baseChannel = radio.getChannel(); - //Serial.print("Set channel"); - //Serial.println(baseChannel + (_multicast_level *5)); + baseChannel = (baseChannel + (_multicast_level * 5)) % 127; + //Serial.print("Set Initial channel"); + //Serial.println(baseChannel); #endif diff --git a/RF24Network.h b/RF24Network.h index d44b2f65..0f39d57f 100644 --- a/RF24Network.h +++ b/RF24Network.h @@ -977,6 +977,7 @@ class ESBNetwork #if defined (multichannel) uint8_t baseChannel; + uint8_t networkChannel; #endif /** @} */