diff --git a/MatterControl.csproj b/MatterControl.csproj index 207b04518..c29d0278c 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -40,7 +40,6 @@ 2.0 v4.6.1 - 1.2.0 .\ @@ -474,6 +473,7 @@ + diff --git a/PrinterCommunication/Io/SendProgressStream.cs b/PrinterCommunication/Io/SendProgressStream.cs new file mode 100644 index 000000000..d6d8eb33b --- /dev/null +++ b/PrinterCommunication/Io/SendProgressStream.cs @@ -0,0 +1,69 @@ +/* +Copyright (c) 2015, Lars Brubaker +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using MatterHackers.MatterControl.DataStorage; +using MatterHackers.MatterControl.SlicerConfiguration; +using System; + +namespace MatterHackers.MatterControl.PrinterCommunication.Io +{ + public class SendProgressStream : GCodeStreamProxy + { + private double nextPercent = -1; + PrinterConfig printer; + PrintTask activePrintTask; + + public SendProgressStream(PrinterConfig printer, GCodeStream internalStream) + : base(internalStream) + { + this.printer = printer; + } + + public override string ReadLine() + { + if (printer.Settings.GetValue(SettingsKey.progress_reporting) != "None" + && printer.Connection.CommunicationState == CommunicationStates.Printing + && printer.Connection.activePrintTask != null + && printer.Connection.activePrintTask.PercentDone > nextPercent) + { + nextPercent = Math.Round(printer.Connection.activePrintTask.PercentDone) + 0.5; + if (printer.Settings.GetValue(SettingsKey.progress_reporting) == "M73") + { + return String.Format("M73 P{0:0}", printer.Connection.activePrintTask.PercentDone); + } + else + { + return String.Format("M117 Printing: {0:0}%", printer.Connection.activePrintTask.PercentDone); + } + } + + return base.ReadLine(); + } + } +} diff --git a/PrinterCommunication/PrinterConnection.cs b/PrinterCommunication/PrinterConnection.cs index 1b59ee7bc..03384c2f6 100644 --- a/PrinterCommunication/PrinterConnection.cs +++ b/PrinterCommunication/PrinterConnection.cs @@ -154,7 +154,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication private object locker = new object(); - private PrintTask activePrintTask; + public PrintTask activePrintTask; private double actualBedTemperature; @@ -187,17 +187,18 @@ namespace MatterHackers.MatterControl.PrinterCommunication private PrinterMove lastReportedPosition; private GCodeFileStream gCodeFileStream0 = null; - private PauseHandlingStream pauseHandlingStream1 = null; - private QueuedCommandsStream queuedCommandStream2 = null; - private MacroProcessingStream macroProcessingStream3 = null; - private RelativeToAbsoluteStream relativeToAbsoluteStream4 = null; - private PrintLevelingStream printLevelingStream5 = null; - private WaitForTempStream waitForTempStream6 = null; - private BabyStepsStream babyStepsStream7 = null; - private ExtrusionMultiplyerStream extrusionMultiplyerStream8 = null; - private FeedRateMultiplyerStream feedrateMultiplyerStream9 = null; - private RequestTemperaturesStream requestTemperaturesStream10 = null; - private ProcessWriteRegexStream processWriteRegExStream11 = null; + private SendProgressStream sendProgressStream1 = null; + private PauseHandlingStream pauseHandlingStream2 = null; + private QueuedCommandsStream queuedCommandStream3 = null; + private MacroProcessingStream macroProcessingStream4 = null; + private RelativeToAbsoluteStream relativeToAbsoluteStream5 = null; + private PrintLevelingStream printLevelingStream6 = null; + private WaitForTempStream waitForTempStream7 = null; + private BabyStepsStream babyStepsStream8 = null; + private ExtrusionMultiplyerStream extrusionMultiplyerStream9 = null; + private FeedRateMultiplyerStream feedrateMultiplyerStream10 = null; + private RequestTemperaturesStream requestTemperaturesStream11 = null; + private ProcessWriteRegexStream processWriteRegExStream12 = null; private GCodeStream totalGCodeStream = null; @@ -1679,7 +1680,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication return; } - pauseHandlingStream1.DoPause(PauseHandlingStream.PauseReason.UserRequested); + pauseHandlingStream2.DoPause(PauseHandlingStream.PauseReason.UserRequested); } } @@ -1707,7 +1708,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication } else { - pauseHandlingStream1.Resume(); + pauseHandlingStream2.Resume(); CommunicationState = CommunicationStates.Printing; } } @@ -1771,7 +1772,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication if (lineToWrite.Trim().Length > 0) { // insert the command into the printing queue at the head - queuedCommandStream2?.Add(lineToWrite, forceTopOfQueue); + queuedCommandStream3?.Add(lineToWrite, forceTopOfQueue); } } } @@ -2129,17 +2130,18 @@ namespace MatterHackers.MatterControl.PrinterCommunication if (this.RecoveryIsEnabled && activePrintTask != null) // We are resuming a failed print (do lots of interesting stuff). { - pauseHandlingStream1 = new PauseHandlingStream(printer, new PrintRecoveryStream(printer, gCodeFileStream0, activePrintTask.PercentDone)); + sendProgressStream1 = new SendProgressStream(printer, new PrintRecoveryStream(printer, gCodeFileStream0, activePrintTask.PercentDone)); // And increment the recovery count activePrintTask.RecoveryCount++; activePrintTask.Commit(); } else { - pauseHandlingStream1 = new PauseHandlingStream(printer, gCodeFileStream0); + sendProgressStream1 = new SendProgressStream(printer, gCodeFileStream0); } - firstStream = pauseHandlingStream1; + pauseHandlingStream2 = new PauseHandlingStream(printer, sendProgressStream1); + firstStream = pauseHandlingStream2; } else { @@ -2147,25 +2149,25 @@ namespace MatterHackers.MatterControl.PrinterCommunication firstStream = new NotPrintingStream(); } - queuedCommandStream2 = new QueuedCommandsStream(firstStream); - macroProcessingStream3 = new MacroProcessingStream(queuedCommandStream2, printer); - relativeToAbsoluteStream4 = new RelativeToAbsoluteStream(macroProcessingStream3); - printLevelingStream5 = new PrintLevelingStream(printer.Settings, relativeToAbsoluteStream4, true); - waitForTempStream6 = new WaitForTempStream(this, printLevelingStream5); - babyStepsStream7 = new BabyStepsStream(printer.Settings, waitForTempStream6, gcodeFilename == null ? 2000 : 1); + queuedCommandStream3 = new QueuedCommandsStream(firstStream); + macroProcessingStream4 = new MacroProcessingStream(queuedCommandStream3, printer); + relativeToAbsoluteStream5 = new RelativeToAbsoluteStream(macroProcessingStream4); + printLevelingStream6 = new PrintLevelingStream(printer.Settings, relativeToAbsoluteStream5, true); + waitForTempStream7 = new WaitForTempStream(this, printLevelingStream6); + babyStepsStream8 = new BabyStepsStream(printer.Settings, waitForTempStream7, gcodeFilename == null ? 2000 : 1); if (activePrintTask != null) { // make sure we are in the position we were when we stopped printing - babyStepsStream7.Offset = new Vector3(activePrintTask.PrintingOffsetX, activePrintTask.PrintingOffsetY, activePrintTask.PrintingOffsetZ); + babyStepsStream8.Offset = new Vector3(activePrintTask.PrintingOffsetX, activePrintTask.PrintingOffsetY, activePrintTask.PrintingOffsetZ); } - extrusionMultiplyerStream8 = new ExtrusionMultiplyerStream(babyStepsStream7); - feedrateMultiplyerStream9 = new FeedRateMultiplyerStream(extrusionMultiplyerStream8); - requestTemperaturesStream10 = new RequestTemperaturesStream(this, feedrateMultiplyerStream9); - processWriteRegExStream11 = new ProcessWriteRegexStream(this.printer.Settings, requestTemperaturesStream10, queuedCommandStream2); - totalGCodeStream = processWriteRegExStream11; + extrusionMultiplyerStream9 = new ExtrusionMultiplyerStream(babyStepsStream8); + feedrateMultiplyerStream10 = new FeedRateMultiplyerStream(extrusionMultiplyerStream9); + requestTemperaturesStream11 = new RequestTemperaturesStream(this, feedrateMultiplyerStream10); + processWriteRegExStream12 = new ProcessWriteRegexStream(this.printer.Settings, requestTemperaturesStream11, queuedCommandStream3); + totalGCodeStream = processWriteRegExStream12; // Force a reset of the printer checksum state (but allow it to be write regexed) - var transformedCommand = processWriteRegExStream11?.ProcessWriteRegEx("M110 N1"); + var transformedCommand = processWriteRegExStream12?.ProcessWriteRegEx("M110 N1"); if (transformedCommand != null) { foreach (var line in transformedCommand) @@ -2198,13 +2200,13 @@ namespace MatterHackers.MatterControl.PrinterCommunication // Only update the amount done if it is greater than what is recorded. // We don't want to mess up the resume before we actually resume it. if (activePrintTask != null - && babyStepsStream7 != null + && babyStepsStream8 != null && activePrintTask.PercentDone < currentDone) { activePrintTask.PercentDone = currentDone; - activePrintTask.PrintingOffsetX = (float)babyStepsStream7.Offset.X; - activePrintTask.PrintingOffsetY = (float)babyStepsStream7.Offset.Y; - activePrintTask.PrintingOffsetZ = (float)babyStepsStream7.Offset.Z; + activePrintTask.PrintingOffsetX = (float)babyStepsStream8.Offset.X; + activePrintTask.PrintingOffsetY = (float)babyStepsStream8.Offset.Y; + activePrintTask.PrintingOffsetZ = (float)babyStepsStream8.Offset.Z; activePrintTask?.Commit(); // Interval looks to be ~10ms @@ -2293,11 +2295,11 @@ namespace MatterHackers.MatterControl.PrinterCommunication { DetailedPrintingState = DetailedPrintingState.HomingAxis; } - else if (waitForTempStream6?.HeatingBed ?? false) + else if (waitForTempStream7?.HeatingBed ?? false) { DetailedPrintingState = DetailedPrintingState.HeatingBed; } - else if (waitForTempStream6?.HeatingExtruder ?? false) + else if (waitForTempStream7?.HeatingExtruder ?? false) { DetailedPrintingState = DetailedPrintingState.HeatingExtruder; } @@ -2620,21 +2622,21 @@ namespace MatterHackers.MatterControl.PrinterCommunication public void MacroStart() { - queuedCommandStream2?.Reset(); - macroProcessingStream3.Reset(); + queuedCommandStream3?.Reset(); + macroProcessingStream4.Reset(); } public void MacroCancel() { - babyStepsStream7?.CancelMoves(); - waitForTempStream6?.Cancel(); - queuedCommandStream2?.Cancel(); - macroProcessingStream3?.Cancel(); + babyStepsStream8?.CancelMoves(); + waitForTempStream7?.Cancel(); + queuedCommandStream3?.Cancel(); + macroProcessingStream4?.Cancel(); } public void MacroContinue() { - macroProcessingStream3?.Continue(); + macroProcessingStream4?.Continue(); } public class ReadThread @@ -2776,4 +2778,4 @@ namespace MatterHackers.MatterControl.PrinterCommunication public int Index0Based { get; } public double Temperature { get; } } -} \ No newline at end of file +} diff --git a/SlicerConfiguration/Settings/SettingsHelpers.cs b/SlicerConfiguration/Settings/SettingsHelpers.cs index 2feaf35b4..c99eb0d45 100644 --- a/SlicerConfiguration/Settings/SettingsHelpers.cs +++ b/SlicerConfiguration/Settings/SettingsHelpers.cs @@ -124,6 +124,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration public const string print_leveling_required_to_print = nameof(print_leveling_required_to_print); public const string print_leveling_solution = nameof(print_leveling_solution); public const string printer_name = nameof(printer_name); + public const string progress_reporting = nameof(progress_reporting); public const string publish_bed_image = nameof(publish_bed_image); public const string read_regex = nameof(read_regex); public const string recover_first_layer_speed = nameof(recover_first_layer_speed); diff --git a/SlicerConfiguration/SlicerMapping/SliceEngineMapping.cs b/SlicerConfiguration/SlicerMapping/SliceEngineMapping.cs index 695bee686..ae74e51a8 100644 --- a/SlicerConfiguration/SlicerMapping/SliceEngineMapping.cs +++ b/SlicerConfiguration/SlicerMapping/SliceEngineMapping.cs @@ -105,6 +105,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration SettingsKey.max_acceleration, SettingsKey.ip_address, SettingsKey.ip_port, + SettingsKey.progress_reporting, "load_filament_length", "trim_image", "clean_nozzle_image", diff --git a/StaticData/SliceSettings/Layouts.txt b/StaticData/SliceSettings/Layouts.txt index a63de5c43..c05978ad9 100644 --- a/StaticData/SliceSettings/Layouts.txt +++ b/StaticData/SliceSettings/Layouts.txt @@ -156,6 +156,8 @@ Printer recover_is_enabled recover_first_layer_speed recover_position_before_z_home + Other + progress_reporting Leveling Print Leveling print_leveling_solution diff --git a/StaticData/SliceSettings/Properties.json b/StaticData/SliceSettings/Properties.json index 9b4384bab..bf405d8db 100644 --- a/StaticData/SliceSettings/Properties.json +++ b/StaticData/SliceSettings/Properties.json @@ -1928,5 +1928,14 @@ "DataEditType": "STRING", "DefaultValue": "x,3000,y,3000,z,315,e0,150", "RebuildGCodeOnChange": false + }, + { + "SlicerConfigName": "progress_reporting", + "PresentationName": "Progress Reporting", + "HelpText": "Choose the command for showing the print progress on the printer's LCD screen, if it has one.", + "DataEditType": "LIST", + "ListValues": "None,M73,M117", + "DefaultValue": "M117", + "RebuildGCodeOnChange": false } ]