def call_service_sync()

in deepracer_offroad_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