internal static void ProcessActivePumps() { // This routine acts as a queue // WHen a pump is set to IsPumOn = true, it will be processed by this routine. //Utilities.LogMessage("Entering: TransferPump.ProcessActivePumps", Utilities.LogType.Info, SMSettings.VerboseLogging); List <TransferPump> pumpsToRemove = new List <TransferPump>(); // this task runs every Update when active. try { List <TransferPump> .Enumerator tPumps = SMAddon.SmVessel.TransferPumps.GetEnumerator(); while (tPumps.MoveNext()) { if (tPumps.Current == null) { continue; } // Check Pump state: if (!tPumps.Current.IsPumpOn) { continue; } TransferPump pump = tPumps.Current; switch (pump.PumpStatus) { case PumpState.Off: //Utilities.LogMessage("Entering: TransferPump.ProcessActivePumps - Off", Utilities.LogType.Info, SMSettings.VerboseLogging); pump.TimeStamp = DateTime.Now; pump.Start(); pump.PumpStatus = PumpState.Start; break; case PumpState.Start: //Utilities.LogMessage("Entering: TransferPump.ProcessActivePumps - Start", Utilities.LogType.Info, SMSettings.VerboseLogging); // Calculate Elapsed. pump.Elapsed += (DateTime.Now - pump.TimeStamp).TotalSeconds; if (pump.Elapsed >= SMSound.SourcePumpStart.clip.length - 0.25) { pump.Run(); pump.PumpStatus = PumpState.Run; } break; case PumpState.Run: //Utilities.LogMessage("Entering: TransferPump.ProcessActivePumps - Run", Utilities.LogType.Info, SMSettings.VerboseLogging); // 1. Get Elapsed from last run double deltaT = (DateTime.Now - pump.TimeStamp).TotalSeconds; // 2. Lets wait long enough to get a resource volume worth moving pump.TimeStamp = DateTime.Now; pump.Running(deltaT); break; case PumpState.Stop: //Utilities.LogMessage("Entering: TransferPump.ProcessActivePumps - Stop", Utilities.LogType.Info, SMSettings.VerboseLogging); pump.Stop(); pump.PumpStatus = PumpState.Off; pumpsToRemove.Add(pump); break; } } tPumps.Dispose(); if (pumpsToRemove.Count <= 0) { return; } List <TransferPump> .Enumerator rpumps = pumpsToRemove.GetEnumerator(); while (rpumps.MoveNext()) { if (rpumps.Current == null) { continue; } SMAddon.SmVessel.TransferPumps.Remove(rpumps.Current); } rpumps.Dispose(); pumpsToRemove.Clear(); } catch (Exception ex) { if (!SMAddon.FrameErrTripped) { SMUtils.LogMessage( string.Format(" in TransferPump.ProcessActivePumps (repeating error). Error: {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), SMUtils.LogType.Error, true); SMAddon.FrameErrTripped = true; } } finally { PumpProcessOn = IsAnyPumpOn(); UpdateDisplayPumps(); } }