@@ -291,6 +291,27 @@ def sendPosition(self, latitude=0.0, longitude=0.0, altitude=0, timeSec=0,
291291 portNum = portnums_pb2 .PortNum .POSITION_APP ,
292292 wantAck = wantAck ,
293293 wantResponse = wantResponse )
294+
295+ def sendTraceRoute (self , dest , hopLimit ):
296+ r = mesh_pb2 .RouteDiscovery ()
297+ self .sendData (r , destinationId = dest , portNum = 70 , wantResponse = True , onResponse = self .onResponseTraceRoute )
298+ waitFactor = min (len (self .nodes )- 1 , hopLimit ) # extend timeout based on number of nodes, limit by configured hopLimit
299+ self .waitForTraceRoute (waitFactor )
300+
301+ def onResponseTraceRoute (self , p ):
302+ routeDiscovery = mesh_pb2 .RouteDiscovery ()
303+ routeDiscovery .ParseFromString (p ["decoded" ]["payload" ])
304+ asDict = google .protobuf .json_format .MessageToDict (routeDiscovery )
305+
306+ print ("Route traced:" )
307+ routeStr = self ._nodeNumToId (p ["to" ])
308+ if "route" in asDict :
309+ for nodeNum in asDict ["route" ]:
310+ routeStr += " --> " + self ._nodeNumToId (nodeNum )
311+ routeStr += " --> " + self ._nodeNumToId (p ["from" ])
312+ print (routeStr )
313+
314+ self ._acknowledgment .receivedTraceRoute = True
294315
295316 def _addResponseHandler (self , requestId , callback ):
296317 self .responseHandlers [requestId ] = ResponseHandler (callback )
@@ -365,6 +386,11 @@ def waitForAckNak(self):
365386 if not success :
366387 raise Exception ("Timed out waiting for an acknowledgment" )
367388
389+ def waitForTraceRoute (self , waitFactor ):
390+ success = self ._timeout .waitForTraceRoute (waitFactor , self ._acknowledgment )
391+ if not success :
392+ raise Exception ("Timed out waiting for traceroute" )
393+
368394 def getMyNodeInfo (self ):
369395 """Get info about my node."""
370396 if self .myInfo is None :
0 commit comments