def api_list_models()

in deepracer_offroad_ws/webserver_pkg/webserver_pkg/models.py [0:0]


def api_list_models():
    """API to get all the models and their details, and sensor status to populate the
       model list drop down.

    Returns:
        dict: List of models and their status based on connected sensor information.
    """
    webserver_node = webserver_publisher_node.get_webserver_node()
    data = {
        "models": [],
        "sensor_status": {"camera_status": "error",
                          "stereo_status": "error",
                          "lidar_status": "error"}
        }
    try:
        ext_length = len(constants.MODEL_FILE_TYPE)
        disabled_models = list()
        sensor_status_info = dict()
        sensor_status_code, sensor_resp = get_sensor_status()
        if sensor_status_code == 0:
            sensor_status_info["camera_status"] = \
                "not_connected" if sensor_resp.single_camera_status == 1 else "connected"
            sensor_status_info["stereo_status"] = \
                "not_connected" if sensor_resp.stereo_camera_status == 1 else "connected"
            sensor_status_info["lidar_status"] = \
                "not_connected" if sensor_resp.lidar_status == 1 else "connected"
            data["sensor_status"] = sensor_status_info
        for root, _, filenames in os.walk(constants.MODEL_DIRECTORY_PATH):
            for file_name in fnmatch.filter(filenames, "*" + constants.MODEL_FILE_TYPE):
                model_folder_name = os.path.basename(root)
                if model_folder_name:
                    err_code, err_msg, model_metadata_content = \
                        read_model_metadata_file(os.path.join(
                                                    os.path.join(constants.MODEL_DIRECTORY_PATH,
                                                                 model_folder_name),
                                                    "model_metadata.json"))
                    model_metadata_sensors = None
                    training_algorithm = ""
                    action_space_type = ""
                    if err_code == 0:
                        err_code, err_msg, model_metadata_sensors = \
                            get_sensors(model_metadata_content)
                    if err_code == 0:
                        err_code, err_msg, training_algorithm = \
                            get_training_algorithm(model_metadata_content)
                    if err_code == 0:
                        err_code, err_msg, action_space_type = \
                            get_action_space_type(model_metadata_content)
                    if err_code == 0:
                        model_disabled = False
                        if sensor_status_code == 1:
                            model_disabled = True
                        else:
                            sensor_status, _ = verify_sensor_connection(model_metadata_sensors,
                                                                        sensor_resp)
                            model_disabled = sensor_status == 1
                        model = {"model_name": file_name[:-ext_length],
                                 "model_folder_name": model_folder_name,
                                 "model_training_algorithm":
                                 constants.TRAINING_ALGORITHM_NAME_MAPPING[
                                    constants.TrainingAlgorithms(training_algorithm)],
                                 "model_action_space_type":
                                 constants.ACTION_SPACE_TYPE_NAME_MAPPING[
                                    constants.ActionSpaceTypes(action_space_type)],
                                 "model_sensors":
                                 [constants.SENSOR_INPUT_NAME_MAPPING[
                                    constants.SensorInputKeys(sensor)]
                                     for sensor in model_metadata_sensors],
                                 "is_select_disabled": model_disabled}
                        if not model_disabled:
                            data["models"].append(model)
                        else:
                            disabled_models.append(model)
        data["models"] += disabled_models
    except AttributeError:
        webserver_node.get_logger().error("Model folder not found")
    except OSError:
        webserver_node.get_logger().error("Model not found")
    return jsonify(data)