// 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; } } }
internal static void ResourceTransferAbort() { XferState = ResourceXFERState.Stop; }