예제 #1
0
        // Action Methods
        internal static void ResourceTransferProcess()
        {
            try
            {
                if (ResourceXferActive)
                {
                    double deltaT = 0;
                    flow_rate = SMSettings.FlowRate;

                    switch (XferState)
                    {
                        case ResourceXFERState.Off:
                            // reset counters
                            SMAddon.elapsed = 0;
                            foreach (TransferResource modResource in SMAddon.smController.ResourcesToXfer)
                            {
                                modResource.AmtXferredOld = 0;
                                modResource.XferTimeout = 0;
                            }

                            // Default sound license: CC-By-SA
                            // http://www.freesound.org/people/vibe_crc/sounds/59328/
                            string path1 = SMSettings.PumpSoundStart != null ? SMSettings.PumpSoundStart : "ShipManifest/Sounds/59328-1";
                            string path2 = SMSettings.PumpSoundRun != null ? SMSettings.PumpSoundRun : "ShipManifest/Sounds/59328-2";
                            string path3 = SMSettings.PumpSoundStop != null ? SMSettings.PumpSoundStop : "ShipManifest/Sounds/59328-3";

                            // Load Sounds, and Play Sound 1
                            SMAddon.LoadSounds("Pump", path1, path2, path3, SMSettings.PumpSoundVol);
                            XferState = ResourceXFERState.Start;
                            timestamp = DateTime.Now;
                            break;

                        case ResourceXFERState.Start:

                            // calculate elapsed.
                            SMAddon.elapsed += (DateTime.Now - TransferResource.timestamp).TotalSeconds;

                            // Play run sound when start sound is nearly done. (repeats)
                            if (SMAddon.elapsed >= SMAddon.source1.clip.length - 0.25)
                            {
                                SMAddon.source2.Play();
                                SMAddon.elapsed = 0;
                                XferState = ResourceXFERState.Run;
                            }
                            break;

                        case ResourceXFERState.Run:

                            //Run process:

                            // 1.  Get elapsed from last run
                            deltaT = (DateTime.Now - TransferResource.timestamp).TotalSeconds;
                            Utilities.LogMessage("ResourceTransferProcess - 1. DeltaT = " + deltaT.ToString(), "Info", SMSettings.VerboseLogging);
                            if (deltaT == 0)
                                return;
                            TransferResource.timestamp = DateTime.Now;

                            // 2.  Calculate amount to move based on flow rate and time delta
                            double deltaAmt = deltaT * act_flow_rate;

                            List<Part> PartsFrom = SMAddon.smController.SelectedPartsSource;
                            List<Part> PartsTo = SMAddon.smController.SelectedPartsTarget;
                            if (SMAddon.XferMode == SMAddon.XFERMode.TargetToSource)
                            {
                                // From is target on Interface...
                                PartsFrom = SMAddon.smController.SelectedPartsTarget;
                                PartsTo = SMAddon.smController.SelectedPartsSource;
                            }

                            foreach (TransferResource modResource in SMAddon.smController.ResourcesToXfer)
                            {

                                deltaAmt = deltaT * act_flow_rate * modResource.XferRatio;
                                Utilities.LogMessage("ResourceTransferProcess - 2a. Resource:  " + modResource.ResourceName + ", DeltaAmt = " + deltaAmt.ToString(), "Info", SMSettings.VerboseLogging);

                                // 3.  determine if enough resouce remains to drain
                                double FromAmtRemaining = modResource.FromAmtRemaining(SMAddon.XferMode);
                                if (deltaAmt > FromAmtRemaining)
                                    deltaAmt = FromAmtRemaining;

                                // 4.  Determine if enough capacity remains to fill
                                double ToAmtRemianCapacity = modResource.ToCapacityRemaining(SMAddon.XferMode);
                                if (deltaAmt > ToAmtRemianCapacity)
                                    deltaAmt = ToAmtRemianCapacity;

                                // 5.  Determine if move amount exceeds remaining move amount requested
                                deltaAmt = deltaAmt > (modResource.XferAmount(SMAddon.XferMode) - modResource.AmtXferred) ? (modResource.XferAmount(SMAddon.XferMode) - modResource.AmtXferred) : deltaAmt;

                                Utilities.LogMessage("ResourceTransferProcess - 2b. Resource:  " + modResource.ResourceName + ", Adj deltaAmt = " + deltaAmt.ToString(), "Info", SMSettings.VerboseLogging);

                                if (deltaAmt > 0)
                                {
                                    double deltaCharge = deltaAmt * SMSettings.FlowCost;
                                    // 6.  Drain Charge
                                    if (!ConsumeCharge(deltaCharge))
                                    {
                                        XferState = ResourceXFERState.Stop;
                                    }
                                    else
                                    {
                                        Utilities.LogMessage("ResourceTransferProcess - 3a. Resource:  " + modResource.ResourceName + ", Xferring DeltaAmt = " + deltaAmt.ToString(), "Info", SMSettings.VerboseLogging);
                                        // 7.  Get list of From parts & Drain Resource
                                        TransferResource.XferResource(PartsFrom, modResource, deltaAmt, SMAddon.XferMode, true);

                                        // 8.  Get list of To parts & Fill resource.
                                        TransferResource.XferResource(PartsTo, modResource, deltaAmt, SMAddon.XferMode, false);

                                        // 9.  Update transferred amount.
                                        modResource.AmtXferred += deltaAmt;
                                    }
                                }

                                Utilities.LogMessage("ResourceTransferProcess - 3b. Resource:  " + modResource.ResourceName + ", AmtXferred = " + modResource.AmtXferred.ToString(), "Info", SMSettings.VerboseLogging);
                                Utilities.LogMessage("ResourceTransferProcess - 3c. Resource:  " + modResource.ResourceName + ", SrcAmtRemaining = " + modResource.FromAmtRemaining(SMAddon.XferMode).ToString() + ", TgtCapRemaining = " + modResource.ToCapacityRemaining(SMAddon.XferMode), "Info", SMSettings.VerboseLogging);
                            }

                            // 10. determine if completed.
                            if (isXferComplete())
                                XferState = ResourceXFERState.Stop;
                            else
                            {
                                foreach (TransferResource modResource in SMAddon.smController.ResourcesToXfer)
                                {
                                    // activate timeout if we are stuck in a loop.
                                    if (modResource.AmtXferred != modResource.AmtXferredOld)
                                    {
                                        modResource.AmtXferredOld = modResource.AmtXferred;
                                        modResource.XferTimeout = 0;
                                    }
                                    else
                                    {
                                        modResource.XferTimeout += 1;
                                        if (modResource.XferTimeout >= 30)
                                        {
                                            XferState = ResourceXFERState.Stop;
                                            Utilities.LogMessage("ResourceTransferProcess - 4.  Timeout occurred!  Resource:  " + modResource.ResourceName + ", AmtXferred = " + modResource.AmtXferred.ToString(), "Error", true);
                                        }
                                    }
                                }
                            }
                            break;

                        case ResourceXFERState.Stop:

                            // play pump shutdown.
                            SMAddon.source2.Stop();
                            SMAddon.source3.Play();
                            SMAddon.elapsed = 0;
                            XferState = ResourceXFERState.Off;
                            foreach (TransferResource modResource in SMAddon.smController.ResourcesToXfer)
                            {
                                modResource.AmtXferred = 0;
                                modResource.srcXferAmount = TransferResource.CalcMaxXferAmt(SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedResources);
                                if (modResource.srcXferAmount < 0.0001)
                                    modResource.srcXferAmount = 0;
                                modResource.strTgtXferAmount = modResource.srcXferAmount.ToString();
                                modResource.tgtXferAmount = TransferResource.CalcMaxXferAmt(SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedResources);
                                if (modResource.tgtXferAmount < 0.0001)
                                    modResource.tgtXferAmount = 0;
                                modResource.strTgtXferAmount = modResource.tgtXferAmount.ToString();
                            }
                            ResourceXferActive = false;
                            break;
                    }
                    Utilities.LogMessage("ResourceTransferProcess - 5.  Transfer State:  " + XferState.ToString() + "...", "Info", SMSettings.VerboseLogging);
                }
            }
            catch (Exception ex)
            {
                if (!SMAddon.frameErrTripped)
                {
                    Utilities.LogMessage(string.Format(" in ResourceTransferProcess (repeating error).  Error:  {0} \r\n\r\n{1}", ex.Message, ex.StackTrace), "Error", true);
                    SMAddon.source2.Stop();
                    SMAddon.source3.Stop();
                    XferState = ResourceXFERState.Off;
                    foreach (TransferResource modResource in SMAddon.smController.ResourcesToXfer)
                    {
                        modResource.AmtXferred = 0;
                        modResource.srcXferAmount = TransferResource.CalcMaxXferAmt(SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedResources);
                        if (modResource.srcXferAmount < 0.0001)
                            modResource.srcXferAmount = 0;
                        modResource.strTgtXferAmount = modResource.srcXferAmount.ToString();
                        modResource.tgtXferAmount = TransferResource.CalcMaxXferAmt(SMAddon.smController.SelectedPartsTarget, SMAddon.smController.SelectedPartsSource, SMAddon.smController.SelectedResources);
                        if (modResource.tgtXferAmount < 0.0001)
                            modResource.tgtXferAmount = 0;
                        modResource.strTgtXferAmount = modResource.tgtXferAmount.ToString();
                    }
                    ResourceXferActive = false;
                    SMAddon.frameErrTripped = true;
                    throw ex;
                }
            }
        }
예제 #2
0
 internal static void ResourceTransferAbort()
 {
     XferState = ResourceXFERState.Stop;
 }