void UpdateVesselInMasterStatusDisplay(Vessel vessel) { if (!masterStatus.ContainsKey(vessel.id)) { return; } var allPartsStatus = masterStatus[vessel.id].allPartsStatus; for (var i = 0; i < allPartsStatus.Count; i++) { var status = allPartsStatus[i]; ITestFlightCore core = status.flightCore; // Update the part status status.partStatus = core.GetPartStatus(); status.failures = core.GetActiveFailures(); status.flightData = core.GetFlightData(); double failureRate = core.GetBaseFailureRate(); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } status.momentaryFailureRate = failureRate; status.mtbfString = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999); status.runningTime = TestFlightUtil.FormatTime(core.GetBurnTime(), TestFlightUtil.TIMEFORMAT.SHORT_IDENTIFIER, false); allPartsStatus[i] = status; } }
internal double CalculateMomentaryFailureRate(String trigger) { trigger = trigger.ToLower().Trim(); double baseFailureRate = GetBaseFailureRate(); double totalModifiers = 1; for (int i = 0, momentaryFailureModifiersCount = momentaryFailureModifiers.Count; i < momentaryFailureModifiersCount; i++) { MomentaryFailureModifier mfm = momentaryFailureModifiers[i]; if (mfm.triggerName != trigger) { continue; } totalModifiers *= mfm.modifier; } double momentaryRate = baseFailureRate * totalModifiers; // Cache this value internally MomentaryFailureRate mfr = GetMomentaryFailureRate(trigger); if (mfr.valid) { momentaryFailureRates.Remove(mfr); mfr.failureRate = momentaryRate; momentaryFailureRates.Add(mfr); } else { mfr.valid = true; mfr.triggerName = trigger; mfr.failureRate = momentaryRate; momentaryFailureRates.Add(mfr); } return(momentaryRate); }
internal double CalculateMomentaryFailureRate(String trigger, String scope) { scope = scope.ToLower().Trim(); trigger = trigger.ToLower().Trim(); double baseFailureRate = GetBaseFailureRateForScope(scope); double totalModifiers = 1; foreach (MomentaryFailureModifier mfm in momentaryFailureModifiers) { if (mfm.scope == scope && mfm.triggerName == trigger) { totalModifiers *= mfm.modifier; } } double momentaryRate = baseFailureRate * totalModifiers; // Cache this value internally MomentaryFailureRate mfr = GetMomentaryFailureRate(trigger, scope); if (mfr.valid) { momentaryFailureRates.Remove(mfr); mfr.failureRate = momentaryRate; momentaryFailureRates.Add(mfr); } else { mfr.valid = true; mfr.scope = scope; mfr.triggerName = trigger; mfr.failureRate = momentaryRate; momentaryFailureRates.Add(mfr); } return(momentaryRate); }
internal MomentaryFailureRate GetMomentaryFailureRate(String trigger) { trigger = trigger.ToLower().Trim(); for (int i = 0, momentaryFailureRatesCount = momentaryFailureRates.Count; i < momentaryFailureRatesCount; i++) { MomentaryFailureRate mfRate = momentaryFailureRates[i]; if (mfRate.triggerName != trigger) { continue; } return(mfRate); } return(new MomentaryFailureRate()); }
public MomentaryFailureRate GetBestMomentaryFailureRate() { MomentaryFailureRate bestMFR; bestMFR = new MomentaryFailureRate(); bestMFR.valid = false; bestMFR.failureRate = double.MaxValue; foreach (MomentaryFailureRate mfr in momentaryFailureRates) { if (mfr.failureRate < bestMFR.failureRate) { bestMFR = mfr; } } return(bestMFR); }
// Get the momentary (IE current dynamic) failure rates (Can vary per reliability/failure modules) // These methods will let you get a list of all momentary rates or you can get the best (lowest chance of failure)/worst (highest chance of failure) rates public MomentaryFailureRate GetWorstMomentaryFailureRate() { MomentaryFailureRate worstMFR; worstMFR = new MomentaryFailureRate(); worstMFR.valid = false; worstMFR.failureRate = TestFlightUtil.MIN_FAILURE_RATE; foreach (MomentaryFailureRate mfr in momentaryFailureRates) { if (mfr.failureRate > worstMFR.failureRate) { worstMFR = mfr; } } return(worstMFR); }
void AddVesselToMasterStatusDisplay(Vessel vessel) { MasterStatusItem masterStatusItem = new MasterStatusItem(); masterStatusItem.vesselID = vessel.id; masterStatusItem.vesselName = vessel.GetName(); masterStatusItem.allPartsStatus = new List <PartStatus>(); masterStatus.Add(vessel.id, masterStatusItem); var parts = vessel.Parts; for (var j = 0; j < parts.Count; j++) { var partCores = parts[j].gameObject.GetComponents <TestFlightCore>(); foreach (var core in partCores) { if (!core.TestFlightEnabled) { continue; } PartStatus partStatus = new PartStatus(); partStatus.lastSeen = currentUTC; partStatus.flightCore = core; partStatus.partName = core.Title; partStatus.partID = vessel.parts[j].flightID; partStatus.partStatus = core.GetPartStatus(); // get any failures partStatus.failures = core.GetActiveFailures(); partStatus.flightData = core.GetFlightData(); double failureRate = core.GetBaseFailureRate(); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } partStatus.momentaryFailureRate = failureRate; partStatus.acknowledged = false; partStatus.mtbfString = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999); partStatus.runningTime = TestFlightUtil.FormatTime(core.GetBurnTime(), TestFlightUtil.TIMEFORMAT.SHORT_IDENTIFIER, false); masterStatus[vessel.id].allPartsStatus.Add(partStatus); } } }
public MomentaryFailureRate GetBestMomentaryFailureRateForScope(String scope) { scope = scope.ToLower().Trim(); MomentaryFailureRate bestMFR; bestMFR = new MomentaryFailureRate(); bestMFR.valid = false; bestMFR.failureRate = Double.MaxValue; foreach (MomentaryFailureRate mfr in momentaryFailureRates) { if (mfr.scope == scope && mfr.failureRate < bestMFR.failureRate) { bestMFR = mfr; } } return(bestMFR); }
public MomentaryFailureRate GetWorstMomentaryFailureRateForScope(String scope) { scope = scope.ToLower().Trim(); MomentaryFailureRate worstMFR; worstMFR = new MomentaryFailureRate(); worstMFR.valid = false; worstMFR.failureRate = TestFlightUtil.MIN_FAILURE_RATE; foreach (MomentaryFailureRate mfr in momentaryFailureRates) { if (mfr.scope == scope && mfr.failureRate > worstMFR.failureRate) { worstMFR = mfr; } } return(worstMFR); }
public MomentaryFailureRate GetBestMomentaryFailureRate() { MomentaryFailureRate bestMFR; bestMFR = new MomentaryFailureRate(); bestMFR.valid = false; bestMFR.failureRate = double.MaxValue; for (int i = 0, momentaryFailureRatesCount = momentaryFailureRates.Count; i < momentaryFailureRatesCount; i++) { MomentaryFailureRate mfr = momentaryFailureRates[i]; if (mfr.failureRate >= bestMFR.failureRate) { continue; } bestMFR = mfr; } return(bestMFR); }
public static double GetBestMomentaryFailureRate(Part part, string alias) { ITestFlightCore core = TestFlightInterface.GetCore(part, alias); if (core == null) { return(-1); } MomentaryFailureRate mfr = core.GetBestMomentaryFailureRate(); if (mfr.valid) { return(mfr.failureRate); } else { return(-1); } }
internal override void Update() { if (!isReady) { return; } if (!tfScenario.SettingsEnabled) { return; } if (masterStatus == null) { masterStatus = new Dictionary <Guid, MasterStatusItem>(); } currentUTC = Planetarium.GetUniversalTime(); // ensure out vessel list is up to date Profiler.BeginSample("CacheVessels"); CacheVessels(); Profiler.EndSample(); if (currentUTC >= lastMasterStatusUpdate + tfScenario.userSettings.masterStatusUpdateFrequency) { lastMasterStatusUpdate = currentUTC; Profiler.BeginSample("VerifyMasterStatus"); VerifyMasterStatus(); Profiler.EndSample(); } // process vessels Profiler.BeginSample("ProcessVessels"); knownVesselsEnumerator = knownVessels.GetEnumerator(); while (knownVesselsEnumerator.MoveNext()) { KeyValuePair <Guid, double> entry = knownVesselsEnumerator.Current; Vessel vessel = null; Profiler.BeginSample("FindVessel"); for (int i = 0; i < FlightGlobals.Vessels.Count; i++) { if (FlightGlobals.Vessels[i].id == entry.Key) { vessel = FlightGlobals.Vessels[i]; } } Profiler.EndSample(); if (vessel == null) { continue; } if (vessel.loaded) { Profiler.BeginSample("ProcessParts"); List <Part> parts = vessel.Parts; for (int j = 0; j < parts.Count; j++) { // Each KSP part can be composed of N virtual parts Profiler.BeginSample("Reset Core List"); cores.Clear(); Profiler.EndSample(); Profiler.BeginSample("Get Cores"); for (int k = 0; k < parts[j].Modules.Count; k++) { ITestFlightCore core = parts[j].Modules[k] as ITestFlightCore; if (core != null && core.TestFlightEnabled) { cores.Add(core.Alias); } } Profiler.EndSample(); //cores = TestFlightInterface.GetActiveCores(vessel.parts[j]); if (cores == null || cores.Count <= 0) { continue; } Profiler.BeginSample("ProcessCores"); for (int k = 0; k < cores.Count; k++) { ITestFlightCore core = TestFlightUtil.GetCore(vessel.parts[j], cores[k]); if (core == null) { continue; } // Poll for flight data and part status if (!(currentUTC >= lastDataPoll + tfScenario.userSettings.masterStatusUpdateFrequency)) { continue; } // Update or Add part status in Master Status if (masterStatus.ContainsKey(vessel.id)) { Profiler.BeginSample("MasterStatus Existing Vessel"); // Vessel is already in the Master Status, so check if part is in there as well int existingPartIndex = -1; Profiler.BeginSample("Find Part"); for (int msIndex = 0; msIndex < masterStatus[vessel.id].allPartsStatus.Count; msIndex++) { if (masterStatus[vessel.id].allPartsStatus[msIndex].partID != vessel.parts[j].flightID) { continue; } existingPartIndex = msIndex; break; } Profiler.EndSample(); if (existingPartIndex > -1) { Profiler.BeginSample("Existing Part"); //PartStatus partStatus = masterStatus[vessel.id].allPartsStatus[existingPartIndex]; PartStatus partStatus = new PartStatus(); partStatus.lastSeen = currentUTC; partStatus.flightCore = core; partStatus.partName = core.Title; partStatus.partID = vessel.parts[j].flightID; Profiler.BeginSample("Part - GetPartStatus"); partStatus.partStatus = core.GetPartStatus(); Profiler.EndSample(); // get any failures Profiler.BeginSample("Part - GetActiveFailures"); partStatus.failures = core.GetActiveFailures(); Profiler.EndSample(); Profiler.BeginSample("Part - GetFlightData"); partStatus.flightData = core.GetFlightData(); Profiler.EndSample(); Profiler.BeginSample("Part - GetBaseFailureRate"); double failureRate = core.GetBaseFailureRate(); Profiler.EndSample(); Profiler.BeginSample("Part - GetWorstMomentaryFailureRate"); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } Profiler.EndSample(); partStatus.momentaryFailureRate = failureRate; partStatus.acknowledged = false; Profiler.BeginSample("Part - FailureRateToMTBFString"); core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, false, 999, out partStatus.mtbfString); //partStatus.mtbfString = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999); Profiler.EndSample(); masterStatus[vessel.id].allPartsStatus[existingPartIndex] = partStatus; Profiler.EndSample(); } else { Profiler.BeginSample("New Part"); PartStatus partStatus = new PartStatus(); partStatus.lastSeen = currentUTC; partStatus.flightCore = core; partStatus.partName = core.Title; partStatus.partID = vessel.parts[j].flightID; partStatus.partStatus = core.GetPartStatus(); // get any failures partStatus.failures = core.GetActiveFailures(); partStatus.flightData = core.GetFlightData(); double failureRate = core.GetBaseFailureRate(); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } partStatus.momentaryFailureRate = failureRate; partStatus.acknowledged = false; core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, false, 999, out partStatus.mtbfString); masterStatus[vessel.id].allPartsStatus.Add(partStatus); Profiler.EndSample(); } Profiler.EndSample(); } else { Profiler.BeginSample("MasterStatus New Vessel"); // Vessel is not in the Master Status so create a new entry for it and add this part PartStatus partStatus = new PartStatus(); partStatus.lastSeen = currentUTC; partStatus.flightCore = core; partStatus.partName = core.Title; partStatus.partID = vessel.parts[j].flightID; partStatus.partStatus = core.GetPartStatus(); // get any failures partStatus.failures = core.GetActiveFailures(); partStatus.flightData = core.GetFlightData(); double failureRate = core.GetBaseFailureRate(); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } partStatus.momentaryFailureRate = failureRate; partStatus.acknowledged = false; partStatus.mtbfString = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999); MasterStatusItem masterStatusItem = new MasterStatusItem(); masterStatusItem.vesselID = vessel.id; masterStatusItem.vesselName = vessel.GetName(); masterStatusItem.allPartsStatus = new List <PartStatus>(); masterStatusItem.allPartsStatus.Add(partStatus); masterStatus.Add(vessel.id, masterStatusItem); Profiler.EndSample(); } } Profiler.EndSample(); } } Profiler.EndSample(); if (currentUTC >= lastDataPoll + tfScenario.userSettings.minTimeBetweenDataPoll) { lastDataPoll = currentUTC; } if (currentUTC >= lastFailurePoll + tfScenario.userSettings.minTimeBetweenFailurePoll) { lastFailurePoll = currentUTC; } } Profiler.EndSample(); }
internal override void Update() { if (!isReady) { return; } if (masterStatus == null) { masterStatus = new Dictionary <Guid, MasterStatusItem>(); } currentUTC = Planetarium.GetUniversalTime(); // ensure out vessel list is up to date CacheVessels(); if (currentUTC >= lastMasterStatusUpdate + tfScenario.userSettings.masterStatusUpdateFrequency) { lastMasterStatusUpdate = currentUTC; VerifyMasterStatus(); } // process vessels foreach (var entry in knownVessels) { Vessel vessel = FlightGlobals.Vessels.Find(v => v.id == entry.Key); if (vessel.loaded) { foreach (Part part in vessel.parts) { ITestFlightCore core = TestFlightUtil.GetCore(part); if (core != null) { // Poll for flight data and part status if (currentUTC >= lastDataPoll + tfScenario.userSettings.masterStatusUpdateFrequency) { TestFlightData currentFlightData = new TestFlightData(); currentFlightData.scope = core.GetScope(); currentFlightData.flightData = core.GetFlightData(); currentFlightData.flightTime = core.GetFlightTime(); PartStatus partStatus = new PartStatus(); partStatus.flightCore = core; partStatus.partName = TestFlightUtil.GetPartTitle(part); partStatus.partID = part.flightID; partStatus.flightData = currentFlightData.flightData; partStatus.flightTime = currentFlightData.flightTime; partStatus.partStatus = core.GetPartStatus(); partStatus.timeToRepair = core.GetRepairTime(); double failureRate = core.GetBaseFailureRate(); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } partStatus.momentaryFailureRate = failureRate; partStatus.repairRequirements = core.GetRequirementsTooltip(); partStatus.acknowledged = core.IsFailureAcknowledged(); partStatus.activeFailure = core.GetFailureModule(); partStatus.mtbfString = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999); // Update or Add part status in Master Status if (masterStatus.ContainsKey(vessel.id)) { // Vessel is already in the Master Status, so check if part is in there as well int numItems = masterStatus[vessel.id].allPartsStatus.Count(p => p.partID == part.flightID); int existingPartIndex; if (numItems == 1) { existingPartIndex = masterStatus[vessel.id].allPartsStatus.FindIndex(p => p.partID == part.flightID); masterStatus[vessel.id].allPartsStatus[existingPartIndex] = partStatus; } else if (numItems == 0) { masterStatus[vessel.id].allPartsStatus.Add(partStatus); } else { existingPartIndex = masterStatus[vessel.id].allPartsStatus.FindIndex(p => p.partID == part.flightID); masterStatus[vessel.id].allPartsStatus[existingPartIndex] = partStatus; Log("[ERROR] TestFlightManager: Found " + numItems + " matching parts in Master Status Display!"); } } else { // Vessel is not in the Master Status so create a new entry for it and add this part MasterStatusItem masterStatusItem = new MasterStatusItem(); masterStatusItem.vesselID = vessel.id; masterStatusItem.vesselName = vessel.GetName(); masterStatusItem.allPartsStatus = new List <PartStatus>(); masterStatusItem.allPartsStatus.Add(partStatus); masterStatus.Add(vessel.id, masterStatusItem); } PartFlightData data = tfScenario.GetFlightDataForPartName(TestFlightUtil.GetFullPartName(part)); if (data != null) { data.AddFlightData(part.name, currentFlightData); } else { data = new PartFlightData(); data.AddFlightData(TestFlightUtil.GetFullPartName(part), currentFlightData); tfScenario.SetFlightDataForPartName(TestFlightUtil.GetFullPartName(part), data); } } } } } if (currentUTC >= lastDataPoll + tfScenario.userSettings.minTimeBetweenDataPoll) { lastDataPoll = currentUTC; } if (currentUTC >= lastFailurePoll + tfScenario.userSettings.minTimeBetweenFailurePoll) { lastFailurePoll = currentUTC; } } }
internal override void Update() { if (!isReady) { return; } if (masterStatus == null) { masterStatus = new Dictionary <Guid, MasterStatusItem>(); } currentUTC = Planetarium.GetUniversalTime(); // ensure out vessel list is up to date CacheVessels(); if (currentUTC >= lastMasterStatusUpdate + tfScenario.userSettings.masterStatusUpdateFrequency) { lastMasterStatusUpdate = currentUTC; VerifyMasterStatus(); } // process vessels foreach (var entry in knownVessels) { Vessel vessel = FlightGlobals.Vessels.Find(v => v.id == entry.Key); if (vessel.loaded) { foreach (Part part in vessel.parts) { // Each KSP part can be composed of N virtual parts List <string> cores = TestFlightInterface.GetActiveCores(part); if (cores == null || cores.Count <= 0) { continue; } foreach (string activeCore in cores) { ITestFlightCore core = TestFlightUtil.GetCore(part, activeCore); if (core != null) { // Poll for flight data and part status if (currentUTC >= lastDataPoll + tfScenario.userSettings.masterStatusUpdateFrequency) { // Old data structure deprecated v1.3 PartStatus partStatus = new PartStatus(); partStatus.lastSeen = currentUTC; partStatus.flightCore = core; partStatus.partName = core.Title; partStatus.partID = part.flightID; partStatus.partStatus = core.GetPartStatus(); // get any failures partStatus.failures = core.GetActiveFailures(); partStatus.flightData = core.GetFlightData(); double failureRate = core.GetBaseFailureRate(); MomentaryFailureRate momentaryFailureRate = core.GetWorstMomentaryFailureRate(); if (momentaryFailureRate.valid && momentaryFailureRate.failureRate > failureRate) { failureRate = momentaryFailureRate.failureRate; } partStatus.momentaryFailureRate = failureRate; partStatus.acknowledged = false; partStatus.mtbfString = core.FailureRateToMTBFString(failureRate, TestFlightUtil.MTBFUnits.SECONDS, 999); // Update or Add part status in Master Status if (masterStatus.ContainsKey(vessel.id)) { // Vessel is already in the Master Status, so check if part is in there as well int numItems = masterStatus[vessel.id].allPartsStatus.Count(p => p.partID == part.flightID); int existingPartIndex; if (numItems == 1) { existingPartIndex = masterStatus[vessel.id].allPartsStatus.FindIndex(p => p.partID == part.flightID); masterStatus[vessel.id].allPartsStatus[existingPartIndex] = partStatus; } else if (numItems == 0) { masterStatus[vessel.id].allPartsStatus.Add(partStatus); } else { existingPartIndex = masterStatus[vessel.id].allPartsStatus.FindIndex(p => p.partID == part.flightID); masterStatus[vessel.id].allPartsStatus[existingPartIndex] = partStatus; Log("[ERROR] TestFlightManager: Found " + numItems + " matching parts in Master Status Display!"); } } else { // Vessel is not in the Master Status so create a new entry for it and add this part MasterStatusItem masterStatusItem = new MasterStatusItem(); masterStatusItem.vesselID = vessel.id; masterStatusItem.vesselName = vessel.GetName(); masterStatusItem.allPartsStatus = new List <PartStatus>(); masterStatusItem.allPartsStatus.Add(partStatus); masterStatus.Add(vessel.id, masterStatusItem); } } } } } } if (currentUTC >= lastDataPoll + tfScenario.userSettings.minTimeBetweenDataPoll) { lastDataPoll = currentUTC; } if (currentUTC >= lastFailurePoll + tfScenario.userSettings.minTimeBetweenFailurePoll) { lastFailurePoll = currentUTC; } } }