diff --git a/PrinterCommunication/Io/ExtrusionMultiplyerStream.cs b/PrinterCommunication/Io/ExtrusionMultiplyerStream.cs index 503e9c42d..fccb4861d 100644 --- a/PrinterCommunication/Io/ExtrusionMultiplyerStream.cs +++ b/PrinterCommunication/Io/ExtrusionMultiplyerStream.cs @@ -1,5 +1,5 @@ /* -Copyright (c) 2015, Lars Brubaker +Copyright (c) 2017, Lars Brubaker, John Lewin All rights reserved. Redistribution and use in source and binary forms, with or without @@ -27,56 +27,77 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ +using System; +using MatterHackers.Agg.UI; using MatterHackers.GCodeVisualizer; +using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.VectorMath; namespace MatterHackers.MatterControl.PrinterCommunication.Io { - public class ExtrusionMultiplyerStream : GCodeStreamProxy - { - private double currentActualExtrusionPosition = 0; - private double previousGcodeRequestedExtrusionPosition = 0; + public class ExtrusionMultiplyerStream : GCodeStreamProxy + { + private double currentActualExtrusionPosition = 0; + private double previousGcodeRequestedExtrusionPosition = 0; - public ExtrusionMultiplyerStream(GCodeStream internalStream) - : base(internalStream) - { - } + private EventHandler unregisterEvents; - public double ExtrusionRatio { get; set; } = 1; + public ExtrusionMultiplyerStream(GCodeStream internalStream) + : base(internalStream) + { + this.ExtrusionRatio = ActiveSliceSettings.Instance.GetValue(SettingsKey.extrusion_ratio); - public override string ReadLine() - { - return ApplyExtrusionMultiplier(internalStream.ReadLine()); - } + ActiveSliceSettings.SettingChanged.RegisterEvent((s, e) => + { + var eventArgs = e as StringEventArgs; + if (eventArgs?.Data == SettingsKey.extrusion_ratio) + { + this.ExtrusionRatio = ActiveSliceSettings.Instance.GetValue(SettingsKey.extrusion_ratio); + } + }, ref unregisterEvents); + } - private string ApplyExtrusionMultiplier(string lineBeingSent) - { - if (lineBeingSent != null) - { - if (LineIsMovement(lineBeingSent)) - { - double gcodeRequestedExtrusionPosition = 0; - if (GCodeFile.GetFirstNumberAfter("E", lineBeingSent, ref gcodeRequestedExtrusionPosition)) - { - double delta = gcodeRequestedExtrusionPosition - previousGcodeRequestedExtrusionPosition; - double newActualExtruderPosition = currentActualExtrusionPosition + delta * ExtrusionRatio; - lineBeingSent = GCodeFile.ReplaceNumberAfter('E', lineBeingSent, newActualExtruderPosition); - previousGcodeRequestedExtrusionPosition = gcodeRequestedExtrusionPosition; - currentActualExtrusionPosition = newActualExtruderPosition; - } - } - else if (lineBeingSent.StartsWith("G92")) - { - double gcodeRequestedExtrusionPosition = 0; - if (GCodeFile.GetFirstNumberAfter("E", lineBeingSent, ref gcodeRequestedExtrusionPosition)) - { - previousGcodeRequestedExtrusionPosition = gcodeRequestedExtrusionPosition; - currentActualExtrusionPosition = gcodeRequestedExtrusionPosition; - } - } - } + public double ExtrusionRatio { get; set; } - return lineBeingSent; - } - } + public override string ReadLine() + { + return ApplyExtrusionMultiplier(internalStream.ReadLine()); + } + + private string ApplyExtrusionMultiplier(string lineBeingSent) + { + if (lineBeingSent != null) + { + if (LineIsMovement(lineBeingSent)) + { + double gcodeRequestedExtrusionPosition = 0; + if (GCodeFile.GetFirstNumberAfter("E", lineBeingSent, ref gcodeRequestedExtrusionPosition)) + { + double delta = gcodeRequestedExtrusionPosition - previousGcodeRequestedExtrusionPosition; + double newActualExtruderPosition = currentActualExtrusionPosition + delta * ExtrusionRatio; + lineBeingSent = GCodeFile.ReplaceNumberAfter('E', lineBeingSent, newActualExtruderPosition); + previousGcodeRequestedExtrusionPosition = gcodeRequestedExtrusionPosition; + currentActualExtrusionPosition = newActualExtruderPosition; + } + } + else if (lineBeingSent.StartsWith("G92")) + { + double gcodeRequestedExtrusionPosition = 0; + if (GCodeFile.GetFirstNumberAfter("E", lineBeingSent, ref gcodeRequestedExtrusionPosition)) + { + previousGcodeRequestedExtrusionPosition = gcodeRequestedExtrusionPosition; + currentActualExtrusionPosition = gcodeRequestedExtrusionPosition; + } + } + } + + return lineBeingSent; + } + + public override void Dispose() + { + unregisterEvents?.Invoke(null, null); + base.Dispose(); + } + } } \ No newline at end of file diff --git a/PrinterCommunication/Io/FeedRateMultiplyerStream.cs b/PrinterCommunication/Io/FeedRateMultiplyerStream.cs index c3fb62cc0..62a5538ec 100644 --- a/PrinterCommunication/Io/FeedRateMultiplyerStream.cs +++ b/PrinterCommunication/Io/FeedRateMultiplyerStream.cs @@ -1,5 +1,5 @@ /* -Copyright (c) 2015, Lars Brubaker +Copyright (c) 2017, Lars Brubaker, John Lewin All rights reserved. Redistribution and use in source and binary forms, with or without @@ -27,8 +27,9 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ -using MatterHackers.GCodeVisualizer; -using MatterHackers.VectorMath; +using System; +using MatterHackers.Agg.UI; +using MatterHackers.MatterControl.SlicerConfiguration; namespace MatterHackers.MatterControl.PrinterCommunication.Io { @@ -37,12 +38,24 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io protected PrinterMove lastDestination = new PrinterMove(); public PrinterMove LastDestination { get { return lastDestination; } } + private EventHandler unregisterEvents; + public FeedRateMultiplyerStream(GCodeStream internalStream) : base(internalStream) { + this.FeedRateRatio = ActiveSliceSettings.Instance.GetValue(SettingsKey.feedrate_ratio); + + ActiveSliceSettings.SettingChanged.RegisterEvent((s, e) => + { + var eventArgs = e as StringEventArgs; + if (eventArgs?.Data == SettingsKey.feedrate_ratio) + { + this.FeedRateRatio = ActiveSliceSettings.Instance.GetValue(SettingsKey.feedrate_ratio); + } + }, ref unregisterEvents); } - public double FeedRateRatio { get; set; } = 1; + public double FeedRateRatio { get; set; } public override void SetPrinterPosition(PrinterMove position) { @@ -69,5 +82,11 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io return lineToSend; } + + public override void Dispose() + { + unregisterEvents?.Invoke(null, null); + base.Dispose(); + } } } \ No newline at end of file diff --git a/PrinterCommunication/Io/GCodeFileStream.cs b/PrinterCommunication/Io/GCodeFileStream.cs index 14698bfbd..f1bed7473 100644 --- a/PrinterCommunication/Io/GCodeFileStream.cs +++ b/PrinterCommunication/Io/GCodeFileStream.cs @@ -27,40 +27,41 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ +using System; using MatterHackers.GCodeVisualizer; using MatterHackers.VectorMath; namespace MatterHackers.MatterControl.PrinterCommunication.Io { - public class GCodeFileStream : GCodeStream - { - public GCodeFile FileStreaming { get; private set; } - private int printerCommandQueueLineIndex = -1; + public class GCodeFileStream : GCodeStream + { + public GCodeFile FileStreaming { get; private set; } + private int printerCommandQueueLineIndex = -1; - public GCodeFileStream(GCodeFile fileStreaming, int startLine = 0) - { - this.FileStreaming = fileStreaming; - printerCommandQueueLineIndex = startLine; - } + public GCodeFileStream(GCodeFile fileStreaming, int startLine = 0) + { + this.FileStreaming = fileStreaming; + printerCommandQueueLineIndex = startLine; + } - public int LineIndex { get { return printerCommandQueueLineIndex; } } + public int LineIndex { get { return printerCommandQueueLineIndex; } } - public override void Dispose() - { - } + public override void Dispose() + { + } - public override string ReadLine() - { - if (printerCommandQueueLineIndex < FileStreaming.LineCount) - { - return FileStreaming.Instruction(printerCommandQueueLineIndex++).Line; - } + public override string ReadLine() + { + if (printerCommandQueueLineIndex < FileStreaming.LineCount) + { + return FileStreaming.Instruction(printerCommandQueueLineIndex++).Line; + } - return null; - } + return null; + } - public override void SetPrinterPosition(PrinterMove position) - { - } - } + public override void SetPrinterPosition(PrinterMove position) + { + } + } } \ No newline at end of file diff --git a/Tests/MatterControl.Tests/MatterControl/GCodeStreamTests.cs b/Tests/MatterControl.Tests/MatterControl/GCodeStreamTests.cs index 039ada2db..96c5af79d 100644 --- a/Tests/MatterControl.Tests/MatterControl/GCodeStreamTests.cs +++ b/Tests/MatterControl.Tests/MatterControl/GCodeStreamTests.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using System.Diagnostics; using MatterHackers.Agg; using MatterHackers.Agg.PlatformAbstract; +using MatterHackers.GCodeVisualizer; using MatterHackers.MatterControl.PrinterCommunication.Io; using MatterHackers.MatterControl.SlicerConfiguration; using MatterHackers.MatterControl.Tests.Automation; @@ -40,7 +41,7 @@ using NUnit.Framework; namespace MatterControl.Tests.MatterControl { [TestFixture] - public class GCodeMaxLengthStreamTests + public class GCodeStreamTests { [Test, Category("GCodeStream")] public void MaxLengthStreamTests() @@ -417,6 +418,36 @@ namespace MatterControl.Tests.MatterControl Assert.AreEqual(expectedLine, actualLine, "Unexpected response from PauseHandlingStream"); } } + + [Test, Category("GCodeStream")] + public void FeedRateStreamTracksSettings() + { + StaticData.Instance = new FileSystemStaticData(TestContext.CurrentContext.ResolveProjectPath(4, "StaticData")); + MatterControlUtilities.OverrideAppDataLocation(TestContext.CurrentContext.ResolveProjectPath(4)); + + var gcodeStream = new FeedRateMultiplyerStream(new TestGCodeStream(new string[0])); + + Assert.AreEqual(1, gcodeStream.FeedRateRatio, "FeedRateRatio should default to 1"); + + ActiveSliceSettings.Instance.SetValue(SettingsKey.feedrate_ratio, "0.3"); + + Assert.AreEqual(0.3, gcodeStream.FeedRateRatio, "FeedRateRatio should remain synced with PrinterSettings"); + } + + [Test, Category("GCodeStream")] + public void ExtrusionRateStreamTracksSettings() + { + StaticData.Instance = new FileSystemStaticData(TestContext.CurrentContext.ResolveProjectPath(4, "StaticData")); + MatterControlUtilities.OverrideAppDataLocation(TestContext.CurrentContext.ResolveProjectPath(4)); + + var gcodeStream = new ExtrusionMultiplyerStream(new TestGCodeStream(new string[0])); + + Assert.AreEqual(1, gcodeStream.ExtrusionRatio, "ExtrusionRatio should default to 1"); + + ActiveSliceSettings.Instance.SetValue(SettingsKey.extrusion_ratio, "0.3"); + + Assert.AreEqual(0.3, gcodeStream.ExtrusionRatio, "ExtrusionRatio should remain synced with PrinterSettings"); + } } public class TestGCodeStream : GCodeStream