feat: format EM observation diagnostics
This commit is contained in:
+40
@@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
using MultiWheelC.TrajectoryPlanning.EMPlanner;
|
||||||
|
|
||||||
|
namespace MultiWheelC.TrajectoryPlanning.TrajectoryObservation;
|
||||||
|
|
||||||
|
public sealed class TrajectoryObservationDiagnostic
|
||||||
|
{
|
||||||
|
public TrajectoryObservationDiagnostic(string text)
|
||||||
|
{
|
||||||
|
Text = text ?? string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Text { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TrajectoryObservationDiagnostics
|
||||||
|
{
|
||||||
|
public static TrajectoryObservationDiagnostic Create(PlanningCycleResult latestCycle,
|
||||||
|
TimeSpan elapsed, bool planningInFlight, EmTrajectory publishedTrajectory)
|
||||||
|
{
|
||||||
|
if (latestCycle == null)
|
||||||
|
return new TrajectoryObservationDiagnostic(planningInFlight
|
||||||
|
? "planning status=pending"
|
||||||
|
: "planning status=not-started");
|
||||||
|
|
||||||
|
string text = "planning cycle=" + latestCycle.Version.ToString(CultureInfo.InvariantCulture) +
|
||||||
|
" status=" + latestCycle.Result.Status +
|
||||||
|
" published=" + latestCycle.Published +
|
||||||
|
" elapsed=" + Math.Max(0d, elapsed.TotalMilliseconds).ToString("F0", CultureInfo.InvariantCulture) +
|
||||||
|
"ms";
|
||||||
|
if (planningInFlight)
|
||||||
|
text += "\nreplan=pending";
|
||||||
|
if (publishedTrajectory != null)
|
||||||
|
text += "\ntrajectory=" + publishedTrajectory.Metadata.TrajectoryId;
|
||||||
|
if (!string.IsNullOrWhiteSpace(latestCycle.Result.FailureReason))
|
||||||
|
text += "\nreason=" + latestCycle.Result.FailureReason;
|
||||||
|
return new TrajectoryObservationDiagnostic(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ internal static class TrajectoryObservationChecks
|
|||||||
VerifiesGearSwitchWaitStateForWorldPresentation();
|
VerifiesGearSwitchWaitStateForWorldPresentation();
|
||||||
VerifiesLsAndStUsePublishedTrajectoryData();
|
VerifiesLsAndStUsePublishedTrajectoryData();
|
||||||
VerifiesPresentationTextDescribesObservationWithoutSendingCommand();
|
VerifiesPresentationTextDescribesObservationWithoutSendingCommand();
|
||||||
|
VerifiesPlanningDiagnosticsKeepRawFailureReason();
|
||||||
VerifiesLsPresentationUsesPathSOnHorizontalAxis();
|
VerifiesLsPresentationUsesPathSOnHorizontalAxis();
|
||||||
VerifiesRollingRequestUsesOnePublishedTrajectorySnapshot();
|
VerifiesRollingRequestUsesOnePublishedTrajectorySnapshot();
|
||||||
FreezesBootstrapVehicleForRollingRequests();
|
FreezesBootstrapVehicleForRollingRequests();
|
||||||
@@ -459,6 +460,31 @@ internal static class TrajectoryObservationChecks
|
|||||||
"observer presentation LS projection failures");
|
"observer presentation LS projection failures");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void VerifiesPlanningDiagnosticsKeepRawFailureReason()
|
||||||
|
{
|
||||||
|
var failed = new PlanningCycleResult(
|
||||||
|
4L,
|
||||||
|
new PlanningCycleIdentity(3L, "diagnostic-reference", 7L, string.Empty, 0),
|
||||||
|
new EmPlanningResult(EmPlanningStatus.CorridorInfeasible, null,
|
||||||
|
"map=3;reference=diagnostic-reference;state=7;previous=;segment=0;reason=no connected corridor"),
|
||||||
|
false,
|
||||||
|
"map=3;reference=diagnostic-reference;state=7;previous=;segment=0;reason=no connected corridor");
|
||||||
|
|
||||||
|
TrajectoryObservationDiagnostic diagnostic = TrajectoryObservationDiagnostics.Create(
|
||||||
|
failed, TimeSpan.FromMilliseconds(18d), false, null);
|
||||||
|
|
||||||
|
Verification.True(diagnostic.Text.Contains("cycle=4"), "diagnostic has cycle version");
|
||||||
|
Verification.True(diagnostic.Text.Contains("status=CorridorInfeasible"), "diagnostic preserves raw status");
|
||||||
|
Verification.True(diagnostic.Text.Contains("published=False"), "diagnostic preserves publish state");
|
||||||
|
Verification.True(diagnostic.Text.Contains("elapsed=18ms"), "diagnostic preserves elapsed time");
|
||||||
|
Verification.True(diagnostic.Text.Contains("reason=map=3;reference=diagnostic-reference"),
|
||||||
|
"diagnostic preserves planner failure reason");
|
||||||
|
|
||||||
|
TrajectoryObservationDiagnostic pending = TrajectoryObservationDiagnostics.Create(
|
||||||
|
null, TimeSpan.Zero, true, null);
|
||||||
|
Verification.Equal("planning status=pending", pending.Text, "diagnostic reports pending before completion");
|
||||||
|
}
|
||||||
|
|
||||||
private static void VerifiesLsPresentationUsesPathSOnHorizontalAxis()
|
private static void VerifiesLsPresentationUsesPathSOnHorizontalAxis()
|
||||||
{
|
{
|
||||||
TrajectoryObservationCharts charts = TrajectoryObservationCharts.Build(
|
TrajectoryObservationCharts charts = TrajectoryObservationCharts.Build(
|
||||||
|
|||||||
Reference in New Issue
Block a user