code: def call_rpc_external(self, address, rpc_id, arg_payload, timeout=10.0):
          
  
          self.verify_calling_thread(False, "call_rpc_external is for use **outside** of the event loop")
  
          response = CrossThreadResponse()
  
          self._loop.call_soon_threadsafe(self._rpc_queue.put_rpc, address, rpc_id, arg_payload, response)
  
          try:
              return response.wait(timeout)
          except RPCRuntimeError as err:
              return err.binary_error
docs: Call an RPC from outside of the event loop and block until it finishes.
  
          This is the main method by which a caller outside of the EmulationLoop
          can inject an RPC into the EmulationLoop and wait for it to complete.
          This method is synchronous so it blocks until the RPC completes or the
          timeout expires.
  
          Args:
              address (int): The address of the mock tile this RPC is for
              rpc_id (int): The number of the RPC
              payload (bytes): A byte string of payload parameters up to 20 bytes
              timeout (float): The maximum time to wait for the RPC to finish.
  
          Returns:
              bytes: The response payload from the RPC