Exemple #1
0
        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();
            }
        }