using System; using System.Collections.Generic; namespace TrajectoryPlanningVisualization; public sealed class PlanningVisualizationStaticSnapshot { public PlanningVisualizationStaticSnapshot(string sessionNameChinese, VisualizationBounds worldBounds, VisualizationOccupancyGrid occupancyGrid, IReadOnlyList staticPolylines, IReadOnlyList staticMarkers, IReadOnlyList directionSegments, IReadOnlyList configurationGroups) { SessionNameChinese = VisualizationContract.RequireText(sessionNameChinese, nameof(sessionNameChinese)); WorldBounds = worldBounds ?? throw new ArgumentNullException(nameof(worldBounds)); OccupancyGrid = occupancyGrid; StaticPolylines = VisualizationContract.Copy(staticPolylines, nameof(staticPolylines)); StaticMarkers = VisualizationContract.Copy(staticMarkers, nameof(staticMarkers)); DirectionSegments = VisualizationContract.Copy(directionSegments, nameof(directionSegments)); ConfigurationGroups = VisualizationContract.Copy(configurationGroups, nameof(configurationGroups)); } public string SessionNameChinese { get; } public VisualizationBounds WorldBounds { get; } public VisualizationOccupancyGrid OccupancyGrid { get; } public IReadOnlyList StaticPolylines { get; } public IReadOnlyList StaticMarkers { get; } public IReadOnlyList DirectionSegments { get; } public IReadOnlyList ConfigurationGroups { get; } } public sealed class PlanningVisualizationDynamicSnapshot { public PlanningVisualizationDynamicSnapshot(long sequence, DateTimeOffset observedAtUtc, string sessionStateChinese, int activeSegmentIndex, string activeDirection, VisualizationPose vehiclePose, IReadOnlyList dynamicPolylines, IReadOnlyList dynamicMarkers, IReadOnlyList charts, IReadOnlyList statusValues, VisualizationCycleSummary cycleSummary) { Sequence = sequence; ObservedAtUtc = observedAtUtc; SessionStateChinese = VisualizationContract.RequireText(sessionStateChinese, nameof(sessionStateChinese)); ActiveSegmentIndex = activeSegmentIndex; ActiveDirection = VisualizationContract.RequireText(activeDirection, nameof(activeDirection)); VehiclePose = vehiclePose ?? throw new ArgumentNullException(nameof(vehiclePose)); DynamicPolylines = VisualizationContract.Copy(dynamicPolylines, nameof(dynamicPolylines)); DynamicMarkers = VisualizationContract.Copy(dynamicMarkers, nameof(dynamicMarkers)); Charts = VisualizationContract.Copy(charts, nameof(charts)); StatusValues = VisualizationContract.Copy(statusValues, nameof(statusValues)); CycleSummary = cycleSummary ?? throw new ArgumentNullException(nameof(cycleSummary)); } public long Sequence { get; } public DateTimeOffset ObservedAtUtc { get; } public string SessionStateChinese { get; } public int ActiveSegmentIndex { get; } public string ActiveDirection { get; } public VisualizationPose VehiclePose { get; } public IReadOnlyList DynamicPolylines { get; } public IReadOnlyList DynamicMarkers { get; } public IReadOnlyList Charts { get; } public IReadOnlyList StatusValues { get; } public VisualizationCycleSummary CycleSummary { get; } } public sealed class VisualizationCycleSummary { public VisualizationCycleSummary(long cycleVersion, DateTimeOffset occurredAtUtc, string status, bool published, double planningElapsedMilliseconds, int segmentIndex, string direction, string longitudinalMode, string terminalType, double? terminalVelocity, double? terminalAcceleration, string failureReason) { VisualizationContract.RequireFinite(planningElapsedMilliseconds, nameof(planningElapsedMilliseconds)); VisualizationContract.RequireFinite(terminalVelocity, nameof(terminalVelocity)); VisualizationContract.RequireFinite(terminalAcceleration, nameof(terminalAcceleration)); CycleVersion = cycleVersion; OccurredAtUtc = occurredAtUtc; Status = VisualizationContract.RequireText(status, nameof(status)); Published = published; PlanningElapsedMilliseconds = planningElapsedMilliseconds; SegmentIndex = segmentIndex; Direction = VisualizationContract.RequireText(direction, nameof(direction)); LongitudinalMode = VisualizationContract.RequireText(longitudinalMode, nameof(longitudinalMode)); TerminalType = VisualizationContract.RequireText(terminalType, nameof(terminalType)); TerminalVelocity = terminalVelocity; TerminalAcceleration = terminalAcceleration; FailureReason = VisualizationContract.RequireText(failureReason, nameof(failureReason)); } public long CycleVersion { get; } public DateTimeOffset OccurredAtUtc { get; } public string Status { get; } public bool Published { get; } public double PlanningElapsedMilliseconds { get; } public int SegmentIndex { get; } public string Direction { get; } public string LongitudinalMode { get; } public string TerminalType { get; } public double? TerminalVelocity { get; } public double? TerminalAcceleration { get; } public string FailureReason { get; } }