diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index 5ce0e67..fdb6be1 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -85,6 +85,7 @@ class MeshInterface: self.mask: Optional[int] = None # used in gpio read and gpio watch self.queueStatus: Optional[mesh_pb2.QueueStatus] = None self.queue: collections.OrderedDict = collections.OrderedDict() + self._localChannels = None def close(self): """Shutdown this interface""" @@ -705,6 +706,7 @@ class MeshInterface: self.myInfo = None self.nodes = {} # nodes keyed by ID self.nodesByNum = {} # nodes keyed by nodenum + self._localChannels = [] # empty until we start getting channels pushed from the device (during config) startConfig = mesh_pb2.ToRadio() self.configId = random.randint(0, 0xFFFFFFFF) @@ -786,7 +788,12 @@ class MeshInterface: Done with initial config messages, now send regular MeshPackets to ask for settings and channels """ - self.localNode.requestChannels() + # This is no longer necessary because the current protocol statemachine has already proactively sent us the locally visible channels + # self.localNode.requestChannels() + self.localNode.setChannels(self._localChannels) + + # the following should only be called after we have settings and channels + self._connected() # Tell everyone else we are ready to go def _handleQueueStatusFromRadio(self, queueStatus) -> None: self.queueStatus = queueStatus @@ -859,7 +866,8 @@ class MeshInterface: # stream API fromRadio.config_complete_id logging.debug(f"Config complete ID {self.configId}") self._handleConfigComplete() - + elif fromRadio.HasField("channel"): + self._handleChannel(fromRadio.channel) elif fromRadio.HasField("packet"): self._handlePacketFromRadio(fromRadio.packet) @@ -986,6 +994,10 @@ class MeshInterface: self.nodesByNum[nodeNum] = n return n + def _handleChannel(self, channel): + """During initial config the local node will proactively send all N (8) channels it knows""" + self._localChannels.append(channel) + def _handlePacketFromRadio(self, meshPacket, hack=False): """Handle a MeshPacket that just arrived from the radio diff --git a/meshtastic/node.py b/meshtastic/node.py index 156fbba..5dfc72c 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -72,6 +72,11 @@ class Node: print(f"Module preferences: {prefs}\n") self.showChannels() + def setChannels(self, channels): + """Set the channels for this node""" + self.channels = channels + self._fixupChannels() + def requestChannels(self): """Send regular MeshPackets to ask channels.""" logging.debug(f"requestChannels for nodeNum:{self.nodeNum}") @@ -654,7 +659,7 @@ class Node: """Fixup indexes and add disabled channels as needed""" # Add extra disabled channels as needed - # TODO: These 2 lines seem to not do anything. + # This is needed because the protobufs will have index **missing** if the channel number is zero for index, ch in enumerate(self.channels): ch.index = index # fixup indexes @@ -726,9 +731,6 @@ class Node: self.channels = self.partialChannels self._fixupChannels() - - # FIXME, the following should only be called after we have settings and channels - self.iface._connected() # Tell everyone else we are ready to go else: self._requestChannel(index + 1)