From 2c5208a8455672dcceca69eeab57388f019d6739 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Thu, 5 Apr 2018 12:44:51 -0700 Subject: [PATCH 1/2] Fixed bug with delayed heat turning off even after it has been set to on Made the print setup button have much better state logic Move all turn off heat logic to printer connection --- ApplicationView/ApplicationController.cs | 29 +--------- .../View3D/PrinterBar/PauseResumeButton.cs | 53 ++++++++----------- PrinterCommunication/PrinterConnection.cs | 41 +++++++++----- 3 files changed, 52 insertions(+), 71 deletions(-) diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index 9cf4719a4..be91dcdbc 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -735,34 +735,11 @@ namespace MatterHackers.MatterControl PrinterConnection.HeatTurningOffSoon.RegisterEvent((s, e) => { var printerConnection = ApplicationController.Instance.ActivePrinter.Connection; - bool anyHeatersAreOn = false; - for (int i=0; i { - EventHandler heatChanged = (s2, e2) => - { - printerConnection.ContinuWaitingToTurnOffHeaters = false; - }; - EventHandler stateChanged = (s2, e2) => - { - if (printerConnection.CommunicationState == CommunicationStates.PreparingToPrint - || printerConnection.PrinterIsPrinting) - { - printerConnection.ContinuWaitingToTurnOffHeaters = false; - }; - }; - - printerConnection.BedTemperatureSet.RegisterEvent(heatChanged, ref unregisterEvent); - printerConnection.HotendTemperatureSet.RegisterEvent(heatChanged, ref unregisterEvent); - printerConnection.CommunicationStateChanged.RegisterEvent(stateChanged, ref unregisterEvent); - var progressStatus = new ProgressStatus(); while (printerConnection.SecondsUntilTurnOffHeaters > 0 @@ -785,10 +762,6 @@ namespace MatterHackers.MatterControl printerConnection.ContinuWaitingToTurnOffHeaters = false; } - printerConnection.BedTemperatureSet.UnregisterEvent(heatChanged, ref unregisterEvent); - printerConnection.HotendTemperatureSet.UnregisterEvent(heatChanged, ref unregisterEvent); - printerConnection.CommunicationStateChanged.UnregisterEvent(stateChanged, ref unregisterEvent); - return Task.CompletedTask; }); } diff --git a/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs b/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs index 1e10e1d53..65d4cd35c 100644 --- a/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs +++ b/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs @@ -90,7 +90,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (e is StringEventArgs stringEvent && (stringEvent.Data == SettingsKey.z_probe_z_offset || stringEvent.Data == SettingsKey.print_leveling_data - || stringEvent.Data == SettingsKey.print_leveling_solution)) + || stringEvent.Data == SettingsKey.print_leveling_solution + || stringEvent.Data == SettingsKey.bed_temperature)) { SetButtonStates(); } @@ -109,57 +110,47 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { PrintLevelingData levelingData = printer.Settings.Helpers.GetPrintLevelingData(); + // If we don't have leveling data and we need it + bool showSetupButton = printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print) && levelingData != null; + // or we have leveling data but it needs to be recalculated + showSetupButton |= levelingData != null && !levelingData.HasBeenRunAndEnabled(printer); + switch (printer.Connection.CommunicationState) { + case CommunicationStates.FinishedPrint: case CommunicationStates.Connected: - if (levelingData != null && printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print) - && !levelingData.HasBeenRunAndEnabled(printer)) + if(showSetupButton) { - SetChildVisible(finishSetupButton, true); + finishSetupButton.Visible = true; + finishSetupButton.Enabled = true; + startPrintButton.Visible = false; } else { - SetChildVisible(startPrintButton, true); + startPrintButton.Visible = true; + startPrintButton.Enabled = true; + finishSetupButton.Visible = false; } break; case CommunicationStates.PrintingFromSd: case CommunicationStates.Printing: case CommunicationStates.Paused: - break; - - case CommunicationStates.FinishedPrint: - SetChildVisible(startPrintButton, true); - break; - default: - if (levelingData != null && printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print) - && !levelingData.HasBeenRunAndEnabled(printer)) + if (showSetupButton) { - SetChildVisible(finishSetupButton, false); + finishSetupButton.Visible = true; + finishSetupButton.Enabled = false; + startPrintButton.Visible = false; } else { - SetChildVisible(startPrintButton, false); + startPrintButton.Visible = true; + startPrintButton.Enabled = false; + finishSetupButton.Visible = false; } break; } } - - private void SetChildVisible(GuiWidget visibleChild, bool enabled) - { - foreach (var child in Children) - { - if (child == visibleChild) - { - child.Visible = true; - child.Enabled = enabled; - } - else - { - child.Visible = false; - } - } - } } } \ No newline at end of file diff --git a/PrinterCommunication/PrinterConnection.cs b/PrinterCommunication/PrinterConnection.cs index 08b0de272..0173f9473 100644 --- a/PrinterCommunication/PrinterConnection.cs +++ b/PrinterCommunication/PrinterConnection.cs @@ -744,6 +744,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication get => _targetBedTemperature; set { + ContinuWaitingToTurnOffHeaters = false; if (_targetBedTemperature != value) { _targetBedTemperature = value; @@ -1845,6 +1846,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication if (targetHotendTemperature[hotendIndex0Based] != temperature || forceSend) { + ContinuWaitingToTurnOffHeaters = false; targetHotendTemperature[hotendIndex0Based] = temperature; OnHotendTemperatureSet(new TemperatureEventArgs(hotendIndex0Based, temperature)); if (this.IsConnected) @@ -2421,6 +2423,25 @@ namespace MatterHackers.MatterControl.PrinterCommunication public int TurnOffHeatDelay { get; set; } = 60; + public bool AnyHeatIsOn + { + get + { + bool anyHeatIsOn = false; + // check if any temps are set + for (int i = 0; i < this.ExtruderCount; i++) + { + if (GetTargetHotendTemperature(i) > 0) + { + anyHeatIsOn = true; + break; + } + } + anyHeatIsOn |= TargetBedTemperature > 0; + return anyHeatIsOn; + } + } + public void TurnOffBedAndExtruders(TurnOff turnOffTime) { if (turnOffTime == TurnOff.Now) @@ -2446,21 +2467,17 @@ namespace MatterHackers.MatterControl.PrinterCommunication while (TimeHaveBeenWaitingToTurnOffHeaters.Elapsed.TotalSeconds < TurnOffHeatDelay && ContinuWaitingToTurnOffHeaters) { - bool anyHeatIsOn = false; - // check if any temps are set - for (int i = 0; i < this.ExtruderCount; i++) - { - if(GetTargetHotendTemperature(i) > 0) - { - anyHeatIsOn = true; - break; - } - } - anyHeatIsOn |= TargetBedTemperature > 0; - if(!anyHeatIsOn) + if (CommunicationState == CommunicationStates.PreparingToPrint + || PrinterIsPrinting) { ContinuWaitingToTurnOffHeaters = false; } + + if (!AnyHeatIsOn) + { + ContinuWaitingToTurnOffHeaters = false; + } + SecondsUntilTurnOffHeaters = ContinuWaitingToTurnOffHeaters ? Math.Max(0, TurnOffHeatDelay - TimeHaveBeenWaitingToTurnOffHeaters.Elapsed.TotalSeconds) : 0; Thread.Sleep(100); } From 46d076fc66f4d0e7867d5db7dc297f5963e592d4 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Thu, 5 Apr 2018 13:55:23 -0700 Subject: [PATCH 2/2] Refactoring print <-> setup... button to have better state --- ApplicationView/ApplicationController.cs | 24 ++++---- .../PrintLeveling/PrintLevelingData.cs | 57 ++++++++++++------- .../View3D/PrinterBar/PauseResumeButton.cs | 10 ++-- 3 files changed, 50 insertions(+), 41 deletions(-) diff --git a/ApplicationView/ApplicationController.cs b/ApplicationView/ApplicationController.cs index be91dcdbc..78b242a0e 100644 --- a/ApplicationView/ApplicationController.cs +++ b/ApplicationView/ApplicationController.cs @@ -196,10 +196,10 @@ namespace MatterHackers.MatterControl { UiThread.RunOnIdle(() => { - if(!string.IsNullOrEmpty(OemSettings.Instance.AffiliateCode) + if (!string.IsNullOrEmpty(OemSettings.Instance.AffiliateCode) && targetUri.Contains("matterhackers.com")) { - if(targetUri.Contains("?")) + if (targetUri.Contains("?")) { targetUri += $"&aff={OemSettings.Instance.AffiliateCode}"; } @@ -241,7 +241,7 @@ namespace MatterHackers.MatterControl internal void QueueForGeneration(Func func) { - lock(thumbsLock) + lock (thumbsLock) { if (thumbnailGenerator == null) { @@ -258,7 +258,7 @@ namespace MatterHackers.MatterControl { Thread.CurrentThread.Name = $"ThumbnailGeneration"; - while(!this.ApplicationExiting) + while (!this.ApplicationExiting) { Thread.Sleep(100); @@ -298,8 +298,8 @@ namespace MatterHackers.MatterControl thumbnailGenerator = null; } - public static Func> GetPrinterProfileAsync; - public static Func,Task> SyncPrinterProfiles; + public static Func> GetPrinterProfileAsync; + public static Func, Task> SyncPrinterProfiles; public static Func> GetPublicProfileList; public static Func> DownloadPublicProfileAsync; @@ -757,7 +757,7 @@ namespace MatterHackers.MatterControl printerConnection.TurnOffBedAndExtruders(TurnOff.Now); } - if(cancellationToken.IsCancellationRequested) + if (cancellationToken.IsCancellationRequested) { printerConnection.ContinuWaitingToTurnOffHeaters = false; } @@ -789,12 +789,9 @@ namespace MatterHackers.MatterControl { // run the print leveling wizard if we need to for this printer var printer = ApplicationController.Instance.ActivePrinters.Where(p => p.Connection == s).FirstOrDefault(); - if (printer != null - && (printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print) - || printer.Settings.GetValue(SettingsKey.print_leveling_enabled))) + if (printer != null) { - PrintLevelingData levelingData = printer.Settings.Helpers.GetPrintLevelingData(); - if (levelingData?.HasBeenRunAndEnabled(printer) != true) + if (PrintLevelingData.NeedsToBeRun(printer)) { UiThread.RunOnIdle(() => LevelWizardBase.ShowPrintLevelWizard(printer)); } @@ -1423,8 +1420,7 @@ namespace MatterHackers.MatterControl if (ActiveSliceSettings.Instance.GetValue(SettingsKey.print_leveling_required_to_print) || ActiveSliceSettings.Instance.GetValue(SettingsKey.print_leveling_enabled)) { - PrintLevelingData levelingData = ActiveSliceSettings.Instance.Helpers.GetPrintLevelingData(); - if (levelingData?.HasBeenRunAndEnabled(printer) != true) + if (PrintLevelingData.NeedsToBeRun(printer)) { LevelWizardBase.ShowPrintLevelWizard(printer); return; diff --git a/ConfigurationPage/PrintLeveling/PrintLevelingData.cs b/ConfigurationPage/PrintLeveling/PrintLevelingData.cs index 93e5eebad..701a15215 100644 --- a/ConfigurationPage/PrintLeveling/PrintLevelingData.cs +++ b/ConfigurationPage/PrintLeveling/PrintLevelingData.cs @@ -25,16 +25,32 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling { } - public bool HasBeenRunAndEnabled(PrinterConfig printer) + public static bool NeedsToBeRun(PrinterConfig printer) { + PrintLevelingData levelingData = printer.Settings.Helpers.GetPrintLevelingData(); + + var required = printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print); + if (required && levelingData == null) + { + // need but don't have data + return true; + } + + var enabled = ActiveSliceSettings.Instance.GetValue(SettingsKey.print_leveling_enabled); // check if leveling is turned on - if(!ActiveSliceSettings.Instance.GetValue(SettingsKey.print_leveling_enabled)) + if (required && !enabled) + { + // need but not turned on + return true; + } + + if(!required && !enabled) { return false; } // check that there are no duplicate points - var positionCounts = from x in SampledPositions + var positionCounts = from x in levelingData.SampledPositions group x by x into g let count = g.Count() orderby count descending @@ -44,14 +60,14 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling { if(x.Count > 1) { - return false; + return true; } } // check that the solution last measured is the currently selected solution - if(printer.Settings.GetValue(SettingsKey.print_leveling_solution) != LevelingSystem) + if(printer.Settings.GetValue(SettingsKey.print_leveling_solution) != levelingData.LevelingSystem) { - return false; + return true; } // check that the bed temperature at probe time was close enough to the current print bed temp @@ -60,47 +76,46 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling : 0; // check that it is within 10 degrees - if(Math.Abs(reqiredLevlingTemp - BedTemperature) > 10) + if(Math.Abs(reqiredLevlingTemp - levelingData.BedTemperature) > 10) { - return false; + return true; } - // check that the number of poins sampled is correct for the solution - switch (LevelingSystem) + switch (levelingData.LevelingSystem) { case LevelingSystem.Probe3Points: - if (SampledPositions.Count != 3) // different criteria for what is not initialized + if (levelingData.SampledPositions.Count != 3) // different criteria for what is not initialized { - return false; + return true; } break; case LevelingSystem.Probe7PointRadial: - if (SampledPositions.Count != 7) // different criteria for what is not initialized + if (levelingData.SampledPositions.Count != 7) // different criteria for what is not initialized { - return false; + return true; } break; case LevelingSystem.Probe13PointRadial: - if (SampledPositions.Count != 13) // different criteria for what is not initialized + if (levelingData.SampledPositions.Count != 13) // different criteria for what is not initialized { - return false; + return true; } break; case LevelingSystem.Probe3x3Mesh: - if (SampledPositions.Count != 9) // different criteria for what is not initialized + if (levelingData.SampledPositions.Count != 9) // different criteria for what is not initialized { - return false; + return true; } break; case LevelingSystem.Probe5x5Mesh: - if (SampledPositions.Count != 25) // different criteria for what is not initialized + if (levelingData.SampledPositions.Count != 25) // different criteria for what is not initialized { - return false; + return true; } break; @@ -108,7 +123,7 @@ namespace MatterHackers.MatterControl.ConfigurationPage.PrintLeveling throw new NotImplementedException(); } - return true; + return false; } public bool SamplesAreSame(List sampledPositions) diff --git a/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs b/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs index 65d4cd35c..a3bcc1e8b 100644 --- a/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs +++ b/PartPreviewWindow/View3D/PrinterBar/PauseResumeButton.cs @@ -91,7 +91,9 @@ namespace MatterHackers.MatterControl.PartPreviewWindow && (stringEvent.Data == SettingsKey.z_probe_z_offset || stringEvent.Data == SettingsKey.print_leveling_data || stringEvent.Data == SettingsKey.print_leveling_solution - || stringEvent.Data == SettingsKey.bed_temperature)) + || stringEvent.Data == SettingsKey.bed_temperature + || stringEvent.Data == SettingsKey.print_leveling_enabled + || stringEvent.Data == SettingsKey.print_leveling_required_to_print)) { SetButtonStates(); } @@ -108,12 +110,8 @@ namespace MatterHackers.MatterControl.PartPreviewWindow protected void SetButtonStates() { - PrintLevelingData levelingData = printer.Settings.Helpers.GetPrintLevelingData(); - // If we don't have leveling data and we need it - bool showSetupButton = printer.Settings.GetValue(SettingsKey.print_leveling_required_to_print) && levelingData != null; - // or we have leveling data but it needs to be recalculated - showSetupButton |= levelingData != null && !levelingData.HasBeenRunAndEnabled(printer); + bool showSetupButton = PrintLevelingData.NeedsToBeRun(printer); switch (printer.Connection.CommunicationState) {