Skip to content

Commit

Permalink
Fix planner issues in symmetry
Browse files Browse the repository at this point in the history
  • Loading branch information
al2me6 committed Jan 3, 2022
1 parent 05dbf78 commit 87d5e11
Showing 1 changed file with 26 additions and 22 deletions.
48 changes: 26 additions & 22 deletions TestFlightReliability_EngineCycle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class TestFlightReliability_EngineCycle : TestFlightReliabilityBase
/// </summary>
[KSPField]
public FloatCurve continuousCycle;

/// <summary>
/// maximum rated cumulative run time of the engine over the entire lifecycle
/// </summary>
Expand All @@ -36,7 +36,7 @@ public class TestFlightReliability_EngineCycle : TestFlightReliabilityBase
/// </summary>
[KSPField(guiName = "Rated continuous burn time", groupName = "TestFlight_Plan", groupDisplayName = "TestFlight Planning", guiUnits = "s")]
public float ratedContinuousBurnTime;

[KSPField]
public string engineID = "";
[KSPField]
Expand All @@ -63,7 +63,7 @@ public class TestFlightReliability_EngineCycle : TestFlightReliabilityBase
public string totalRunTimeString;
[KSPField(guiName = "Current run time", groupName = "TestFlight", groupDisplayName = "TestFlight", guiActive = true)]
public string currentRunTimeString;

[KSPField(guiName = "Burn time", groupName = "TestFlight_Plan", groupDisplayName = "TestFlight Planning", guiActiveEditor = true, guiUnits = "s"),
UI_FloatRange(minValue = 0f, stepIncrement = 1f, scene = UI_Scene.Editor)]
public float plannerBurnTime;
Expand All @@ -80,7 +80,9 @@ public override void OnStart(StartState state)
engine.InitWithEngine(this.part, engineID);

Fields[nameof(plannerBurnTime)].uiControlEditor.onFieldChanged += onPlannerChanged;
Fields[nameof(plannerBurnTime)].uiControlEditor.onSymmetryFieldChanged += onPlannerChanged;
Fields[nameof(plannerContinuousBurnTime)].uiControlEditor.onFieldChanged += onPlannerChanged;
Fields[nameof(plannerContinuousBurnTime)].uiControlEditor.onSymmetryFieldChanged += onPlannerChanged;
if (ratedBurnTime == ratedContinuousBurnTime) plannerBurnTime = ratedBurnTime; // Set the total burn time slider to the rated burn time only if there isn't a continuous burn time.
plannerContinuousBurnTime = ratedContinuousBurnTime;
UpdatePlanner();
Expand All @@ -103,23 +105,23 @@ protected void UpdateCycle()
if (!core.IsPartOperating())
{
// engine is not running

// reset continuous run time
currentRunTime = 0;
}
else
{
// engine is running

// increase both continuous and cumulative run times
currentRunTime += deltaTime; // continuous
engineOperatingTime += deltaTime; // cumulative


// calculate total failure rate modifier
float cumulativeModifier = cycle.Evaluate((float)engineOperatingTime);
float continuousModifier = continuousCycle.Evaluate((float)currentRunTime);

core.SetTriggerMomentaryFailureModifier("EngineCycle", cumulativeModifier * continuousModifier, this);
}
}
Expand All @@ -138,20 +140,20 @@ public override void OnUpdate()
currentRunTimeString = $"{currentRunTime:N0}s/{ratedContinuousBurnTime}s";
totalRunTimeString = $"{engineOperatingTime:N0}s/{ratedBurnTime}s";

// We intentionally do NOT call our base class OnUpdate() because that would kick off a second round of
// failure checks which is already handled by the main Reliability module that should
// We intentionally do NOT call our base class OnUpdate() because that would kick off a second round of
// failure checks which is already handled by the main Reliability module that should
// already be on the part (This PartModule should be added in addition to the normal reliability module)
// base.OnUpdate();
}
public override void OnLoad(ConfigNode node)
{
base.OnLoad(node);
}

public override void SetActiveConfig(string alias)
{
base.SetActiveConfig(alias);

if (currentConfig == null) return;

// update current values with those from the current config node
Expand All @@ -162,7 +164,7 @@ public override void SetActiveConfig(string alias)
}
else
{
cycle.Add(0f,1f);
cycle.Add(0f, 1f);
}

continuousCycle = new FloatCurve();
Expand All @@ -186,10 +188,6 @@ public override void SetActiveConfig(string alias)
ratedContinuousBurnTime = ratedBurnTime;
}

((UI_FloatRange)(Fields[nameof(plannerBurnTime)].uiControlEditor)).maxValue = cycle.maxTime;
plannerBurnTime = Mathf.Clamp(plannerBurnTime, 0f, cycle.maxTime);
((UI_FloatRange)(Fields[nameof(plannerContinuousBurnTime)].uiControlEditor)).maxValue = continuousCycle.maxTime;
plannerContinuousBurnTime = Mathf.Clamp(plannerContinuousBurnTime, 1f, continuousCycle.maxTime);
UpdatePlanner();
}

Expand Down Expand Up @@ -242,7 +240,7 @@ public override float GetRatedTime(string configuration, RatingScope ratingScope
return nodeBurnTime;
}
break;

case RatingScope.Continuous:
if (configNode.HasValue("ratedContinuousBurnTime"))
{
Expand All @@ -257,8 +255,8 @@ public override float GetRatedTime(string configuration, RatingScope ratingScope

return base.GetRatedTime(configuration, ratingScope);
}



public override float GetRatedTime(RatingScope ratingScope)
{
Expand Down Expand Up @@ -333,6 +331,13 @@ public override List<string> GetTestFlightInfo(float reliabilityAtTime)

protected void UpdatePlanner()
{
if (core == null) return;

((UI_FloatRange)(Fields[nameof(plannerBurnTime)].uiControlEditor)).maxValue = cycle.maxTime;
plannerBurnTime = Mathf.Clamp(plannerBurnTime, 0f, cycle.maxTime);
((UI_FloatRange)(Fields[nameof(plannerContinuousBurnTime)].uiControlEditor)).maxValue = continuousCycle.maxTime;
plannerContinuousBurnTime = Mathf.Clamp(plannerContinuousBurnTime, 1f, continuousCycle.maxTime);

bool hasContinuousBurnTime = ratedBurnTime != ratedContinuousBurnTime;

Fields[nameof(ratedContinuousBurnTime)].guiActiveEditor = hasContinuousBurnTime;
Expand All @@ -341,12 +346,12 @@ protected void UpdatePlanner()

float burnTime = hasContinuousBurnTime ? plannerContinuousBurnTime : plannerBurnTime;

var instantaneousFailureRateMult = (Func<float, float>)((t) =>
Func<float, float> instantaneousFailureRateMult = (t) =>
{
float mult = cycle.Evaluate(hasContinuousBurnTime ? t + plannerBurnTime : t);
if (hasContinuousBurnTime) mult *= continuousCycle.Evaluate(t);
return Mathf.Max(mult, 1f);
});
};

// Cumulative survival chance at time T = 1 - F(T) = $exp(-\int_0^T h(t)dt)$.
// Since the base failure rate is constant, we can pull it out of the integral.
Expand All @@ -355,4 +360,3 @@ protected void UpdatePlanner()
}
}
}

0 comments on commit 87d5e11

Please sign in to comment.