in deepracer_follow_the_leader_ws/webserver_pkg/webserver_pkg/utility.py [0:0]
def call_service_sync(cli, req, timeout=10, sleep_time=0.01):
"""A wrapper function to call the services and wait for the results until timeout.
Args:
cli (rclpy.client.Client): Client object using which we call the service.
req (Request): Service request object.
timeout (int, optional): Time in seconds to keep checking for service call to
return result before removing the request. Defaults to 60.
sleep_time (float, optional): Time in seconds to sleep before each check for
returned result from service call. Defaults to 0.01.
Returns:
Response: The service response.
"""
webserver_node = webserver_publisher_node.get_webserver_node()
if cli.service_is_ready():
webserver_node.get_logger().info(f"Service call initiated: {cli.srv_name}")
future = cli.call_async(req)
sequence = -1
for seq, req_future in cli._pending_requests.items():
if req_future == future:
sequence = seq
break
webserver_node.get_logger().info(f"New request: {sequence} {cli.srv_name}")
elapsed_time = 0
while not future.done():
if elapsed_time == int(elapsed_time):
webserver_node.get_logger().info(f"Service call not finished: {sequence} {cli.srv_name}")
time.sleep(sleep_time)
elapsed_time += sleep_time
if elapsed_time >= timeout:
webserver_node.get_logger().info("Service call was not completed before timeout: "
f"{sequence} {cli.srv_name} {timeout}")
future.cancel()
if future.cancelled():
webserver_node.get_logger().error(f"Service was cancelled: {sequence} {cli.srv_name}")
return None
webserver_node.get_logger().info(f"Service call finished: {sequence} {cli.srv_name}")
if future.exception() is not None:
webserver_node.get_logger().error(f"Error while calling service: {sequence} - "
f"{cli.srv_name} - {future.exception()}")
return future.result()
else:
webserver_node.get_logger().info(f"Service is not ready: {cli.srv_name}")
return None