Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,12 +158,12 @@ The paths point to configuration files, not generated data. For example:

```yaml
data_files:
telemetry: "config/bern/telemetry_f1.json"
telemetry: "config/bern/trajectory_f1.json"
flight_declaration: "config/bern/flight_declaration.json"

scenarios:
"F1_happy_path":
telemetry: "config/bern/telemetry_f1.json" # Optional override
telemetry: "config/bern/trajectory_f1.json" # Optional override
flight_declaration: "config/bern/flight_declaration.json" # Optional override
```

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
12 changes: 6 additions & 6 deletions config/default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,20 @@ air_traffic_simulator_settings:
sensor_ids: ["a0b7d47e5eac45dc8cbaf47e6fe0e558"] # List of sensor IDs to use when 'multiple' is selected

data_files:
telemetry: "config/bern/telemetry_f1.json" # Path to flight declarations JSON file
trajectory: "config/bern/trajectory_f1.json" # Path to flight declarations JSON file
flight_declaration: "config/bern/flight_declaration.json" # Path to flight declarations JSON file
# geo_fence: "config/geo_fences.json" # Path to geo-fences

# List of test scenario IDs to execute
scenarios:
F1_happy_path:
telemetry: "config/bern/telemetry_f1.json"
trajectory: "config/bern/trajectory_f1.json"
F2_contingent_path:
telemetry: "config/bern/telemetry_f2.json"
trajectory: "config/bern/trajectory_f2.json"
F3_non_conforming_path:
telemetry: "config/bern/telemetry_f3.json"
# F5_non_conforming_path:
# telemetry: "config/bern/telemetry_f5.json"
trajectory: "config/bern/trajectory_f3.json"
# F5_non_conforming_path:
# trajectory: "config/bern/trajectory_f5.json"
opensky_live_data:
add_flight_declaration:
geo_fence_upload:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class AirTrafficSettings(BaseSettings):
def create_air_traffic_settings() -> AirTrafficSettings:
"""Factory function to create AirTrafficSettings from config after initialization."""
return AirTrafficSettings(
simulation_config_path=config.data_files.telemetry or "",
simulation_config_path=config.data_files.trajectory or "",
simulation_duration_seconds=config.air_traffic_simulator_settings.simulation_duration_seconds or 30,
number_of_aircraft=config.air_traffic_simulator_settings.number_of_aircraft or 2,
single_or_multiple_sensors=config.air_traffic_simulator_settings.single_or_multiple_sensors or "single",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -749,15 +749,15 @@ def close_heartbeat_websocket_connection(self, ws_connection: Any) -> None:
ws_connection.close()

@scenario_step("Setup Flight Declaration")
def setup_flight_declaration(self, flight_declaration_path: str, telemetry_path: str) -> None:
def setup_flight_declaration(self, flight_declaration_path: str, trajectory_path: str) -> None:
"""Generates data and uploads flight declaration."""
from openutm_verification.scenarios.common import (
generate_flight_declaration,
generate_telemetry,
)

flight_declaration = generate_flight_declaration(flight_declaration_path)
telemetry_states = generate_telemetry(telemetry_path)
telemetry_states = generate_telemetry(trajectory_path)

self.telemetry_states = telemetry_states

Expand All @@ -770,7 +770,7 @@ def setup_flight_declaration(self, flight_declaration_path: str, telemetry_path:
@contextmanager
def flight_declaration(self, data_files: DataFiles):
"""Context manager to setup and teardown a flight operation based on scenario config."""
self.setup_flight_declaration(data_files.flight_declaration, data_files.telemetry)
self.setup_flight_declaration(data_files.flight_declaration, data_files.trajectory)
try:
yield
finally:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def create_opensky_settings() -> OpenSkySettings:
return OpenSkySettings(
opensky_client_id=config.opensky.auth.client_id or "",
opensky_client_secret=config.opensky.auth.client_secret or "",
simulation_config_path=config.data_files.telemetry or "",
simulation_config_path=config.data_files.trajectory or "",
simulation_duration_seconds=30,
)

Expand Down
8 changes: 4 additions & 4 deletions src/openutm_verification/core/execution/config_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ class ReportingConfig(StrictBaseModel):
class DataFiles(StrictBaseModel):
"""Paths to data files used in the application."""

telemetry: Optional[str] = None
trajectory: Optional[str] = None
flight_declaration: Optional[str] = None
geo_fence: Optional[str] = None

@field_validator("telemetry", "flight_declaration", "geo_fence")
@field_validator("trajectory", "flight_declaration", "geo_fence")
@classmethod
def validate_path(cls, v: Optional[str]) -> Optional[str]:
"""Validate that path is a non-empty string if provided."""
Expand All @@ -91,8 +91,8 @@ def resolve_and_validate_path(path_str: str, field_name: str) -> str:
raise ValueError(f"{field_name} path is not a file: {resolved}")
return str(resolved)

if self.telemetry:
self.telemetry = resolve_and_validate_path(self.telemetry, "Telemetry")
if self.trajectory:
self.trajectory = resolve_and_validate_path(self.trajectory, "Trajectory")
if self.flight_declaration:
self.flight_declaration = resolve_and_validate_path(self.flight_declaration, "Flight declaration")
if self.geo_fence:
Expand Down
2 changes: 1 addition & 1 deletion src/openutm_verification/core/execution/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def data_files(scenario_id: ScenarioId) -> Generator[DataFiles, None, None]:
config = get_settings()
scenario_config = config.scenarios.get(scenario_id) or config.data_files
data = DataFiles(
telemetry=scenario_config.telemetry or config.data_files.telemetry,
trajectory=scenario_config.trajectory or config.data_files.trajectory,
flight_declaration=scenario_config.flight_declaration or config.data_files.flight_declaration,
geo_fence=scenario_config.geo_fence or config.data_files.geo_fence,
)
Expand Down
2 changes: 1 addition & 1 deletion src/openutm_verification/scenarios/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def generate_telemetry(config_path: str, duration: int = DEFAULT_TELEMETRY_DURAT
simulator_config = GeoJSONFlightsSimulatorConfiguration(geojson=geojson_data)
simulator = GeoJSONFlightsSimulator(simulator_config)

simulator.generate_flight_grid_and_path_points(altitude_of_ground_level_wgs_84=570)
simulator.generate_flight_grid_and_path_points(altitude_of_ground_level_wgs_84=120)
return simulator.generate_states(duration=duration)
except Exception as e:
logger.error(f"Failed to generate telemetry states from {config_path}: {e}")
Expand Down
1 change: 1 addition & 0 deletions src/openutm_verification/scenarios/test_f3_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def test_f3_non_conforming_path(fb_client: FlightBlenderClient, data_files: Data
"""
with fb_client.flight_declaration(data_files):
fb_client.update_operation_state(new_state=OperationState.ACTIVATED)
fb_client.wait_x_seconds(5)
fb_client.submit_telemetry(duration_seconds=20)
fb_client.check_operation_state(expected_state=OperationState.NONCONFORMING, duration_seconds=5)
fb_client.update_operation_state(new_state=OperationState.ENDED)