Merge pull request #2849 from jlewin/design_tools

Remove SliceSettings coupling from PrinterConnection
This commit is contained in:
johnlewin 2018-01-06 22:01:02 -08:00 committed by GitHub
commit 083d47eacf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 141 additions and 74 deletions

View file

@ -54,6 +54,7 @@ namespace MatterHackers.MatterControl
using System.Collections.Generic;
using MatterHackers.MatterControl.PrintLibrary;
using MatterHackers.Localizations;
using System.Text.RegularExpressions;
public class BedConfig
{
@ -628,9 +629,42 @@ namespace MatterHackers.MatterControl
this.Settings = settings;
this.Settings.printer = this;
// TODO: ActiveSliceSettings is not our Settings! Move SettingsChanged to instance rather than static
ActiveSliceSettings.SettingChanged.RegisterEvent(Printer_SettingChanged, ref unregisterEvents);
this.Connection.PrintFinished.RegisterEvent((s, e) =>
{
// clear single use setting on print completion
foreach (var keyValue in this.Settings.BaseLayer)
{
string currentValue = this.Settings.GetValue(keyValue.Key);
bool valueIsClear = currentValue == "0" | currentValue == "";
SliceSettingData data = SliceSettingsOrganizer.Instance.GetSettingsData(keyValue.Key);
if (data?.ResetAtEndOfPrint == true && !valueIsClear)
{
this.Settings.ClearValue(keyValue.Key);
}
}
}, ref unregisterEvents);
if (!string.IsNullOrEmpty(this.Settings.GetValue(SettingsKey.baud_rate)))
{
this.Connection.BaudRate = this.Settings.GetValue<int>(SettingsKey.baud_rate);
}
this.Connection.ConnectGCode = this.Settings.GetValue(SettingsKey.connect_gcode);
this.Connection.CancelGCode = this.Settings.GetValue(SettingsKey.cancel_gcode);
this.Connection.EnableNetworkPrinting = this.Settings.GetValue<bool>(SettingsKey.enable_network_printing);
this.Connection.AutoReleaseMotors = this.Settings.GetValue<bool>(SettingsKey.auto_release_motors);
this.Connection.RecoveryIsEnabled = this.Settings.GetValue<bool>(SettingsKey.recover_is_enabled);
this.Connection.ExtruderCount = this.Settings.GetValue<int>(SettingsKey.extruder_count);
this.Connection.SendWithChecksum = this.Settings.GetValue<bool>(SettingsKey.send_with_checksum);
this.Connection.ReadLineReplacementString = this.Settings.GetValue(SettingsKey.read_regex);
}
public PrinterViewState ViewState { get; } = new PrinterViewState();
private PrinterSettings _settings;
@ -748,6 +782,53 @@ namespace MatterHackers.MatterControl
this.ReloadSettings();
this.Bed.InvalidateBedMesh();
}
// Sync settings changes to printer connection
switch(stringEvent.Data)
{
case SettingsKey.feedrate_ratio:
this.Connection.FeedRateRatio = this.Settings.GetValue<double>(SettingsKey.feedrate_ratio);
break;
case SettingsKey.baud_rate:
if (!string.IsNullOrEmpty(this.Settings.GetValue(SettingsKey.baud_rate)))
{
this.Connection.BaudRate = this.Settings.GetValue<int>(SettingsKey.baud_rate);
}
break;
case SettingsKey.connect_gcode:
this.Connection.ConnectGCode = this.Settings.GetValue(SettingsKey.connect_gcode);
break;
case SettingsKey.cancel_gcode:
this.Connection.CancelGCode = this.Settings.GetValue(SettingsKey.cancel_gcode);
break;
case SettingsKey.enable_network_printing:
this.Connection.EnableNetworkPrinting = this.Settings.GetValue<bool>(SettingsKey.enable_network_printing);
break;
case SettingsKey.auto_release_motors:
this.Connection.AutoReleaseMotors = this.Settings.GetValue<bool>(SettingsKey.auto_release_motors);
break;
case SettingsKey.recover_is_enabled:
this.Connection.RecoveryIsEnabled = this.Settings.GetValue<bool>(SettingsKey.recover_is_enabled);
break;
case SettingsKey.extruder_count:
this.Connection.ExtruderCount = this.Settings.GetValue<int>(SettingsKey.extruder_count);
break;
case SettingsKey.send_with_checksum:
this.Connection.SendWithChecksum = this.Settings.GetValue<bool>(SettingsKey.send_with_checksum);
break;
case SettingsKey.read_regex:
this.Connection.ReadLineReplacementString = this.Settings.GetValue(SettingsKey.read_regex);
break;
}
}
}
}

View file

@ -1,5 +1,5 @@
/*
Copyright (c) 2014, Lars Brubaker
Copyright (c) 2018, Lars Brubaker, John Lewin
All rights reserved.
Redistribution and use in source and binary forms, with or without
@ -42,7 +42,6 @@ using MatterControl.Printing;
using MatterHackers.Agg;
using MatterHackers.MatterControl.DataStorage;
using MatterHackers.MatterControl.PrinterCommunication.Io;
using MatterHackers.MatterControl.SlicerConfiguration;
using MatterHackers.SerialPortCommunication;
using MatterHackers.SerialPortCommunication.FrostedSerial;
using MatterHackers.VectorMath;
@ -249,8 +248,6 @@ namespace MatterHackers.MatterControl.PrinterCommunication
private EventHandler unregisterEvents;
private double feedRateRatio = 1;
public PrinterConnection(PrinterConfig printer)
{
this.printer = printer;
@ -272,7 +269,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
ReadLineStartCallBacks.AddCallbackToKey("B:", ReadTemperatures); // smoothie
ReadLineContainsCallBacks.AddCallbackToKey("T0:", ReadTemperatures); // marlin
ReadLineContainsCallBacks.AddCallbackToKey("T:", ReadTemperatures); // repatier
ReadLineContainsCallBacks.AddCallbackToKey("T:", ReadTemperatures); // repetier
ReadLineStartCallBacks.AddCallbackToKey("SD printing byte", ReadSdProgress); // repetier
@ -328,15 +325,6 @@ namespace MatterHackers.MatterControl.PrinterCommunication
WriteLineStartCallBacks.AddCallbackToKey("M140", BedTemperatureWasWritenToPrinter);
WriteLineStartCallBacks.AddCallbackToKey("M190", BedTemperatureWasWritenToPrinter);
WriteLineStartCallBacks.AddCallbackToKey("T", ExtruderIndexSet);
ActiveSliceSettings.SettingChanged.RegisterEvent((s, e) =>
{
var eventArgs = e as StringEventArgs;
if (eventArgs?.Data == SettingsKey.feedrate_ratio)
{
feedRateRatio = this.printer.Settings.GetValue<double>(SettingsKey.feedrate_ratio);
}
}, ref unregisterEvents);
}
private void ExtruderIndexSet(object sender, EventArgs e)
@ -361,28 +349,57 @@ namespace MatterHackers.MatterControl.PrinterCommunication
}
}
public int BaudRate
// PrinterSettings/Options {{
public int BaudRate { get; set; } = 250000;
public double FeedRateRatio { get; set; } = 1;
public string ConnectGCode { get; set; } = "";
public string CancelGCode { get; set; } = "";
public int ExtruderCount { get; set; }
public bool SendWithChecksum { get; set; }
public bool EnableNetworkPrinting { get; set; }
public bool AutoReleaseMotors { get; set; }
public bool RecoveryIsEnabled { get; set; }
private List<(Regex Regex, string Replacement)> readLineReplacements = new List<(Regex Regex, string Replacement)>();
private string _readLineReplacementString = "";
public string ReadLineReplacementString
{
get
get => _readLineReplacementString;
set
{
int baudRate = 250000;
if (this.printer.Settings != null)
if (value != _readLineReplacementString)
{
try
_readLineReplacementString = value;
// Clear and rebuild the replacement list
readLineReplacements.Clear();
foreach (string regExLine in _readLineReplacementString.Split(new string[] { "\\n" }, StringSplitOptions.RemoveEmptyEntries))
{
if (!string.IsNullOrEmpty(printer.Settings.GetValue(SettingsKey.baud_rate)))
var matches = getQuotedParts.Matches(regExLine);
if (matches.Count == 2)
{
baudRate = Convert.ToInt32(printer.Settings.GetValue(SettingsKey.baud_rate));
var search = matches[0].Value.Substring(1, matches[0].Value.Length - 2);
var replace = matches[1].Value.Substring(1, matches[1].Value.Length - 2);
readLineReplacements.Add((new Regex(search, RegexOptions.Compiled), replace));
}
}
catch
{
}
}
return baudRate;
}
}
// PrinterSettings/Options }}
private bool communicationPossible = false;
public CommunicationStates CommunicationState
@ -473,19 +490,6 @@ namespace MatterHackers.MatterControl.PrinterCommunication
communicationState = value;
timeSinceStartedPrint.Stop();
PrintFinished.CallEvents(this, new NamedItemEventArgs(printer.Bed.EditContext.SourceItem.Name));
// clear single use setting on print completion
foreach (var keyValue in printer.Settings.BaseLayer)
{
string currentValue = printer.Settings.GetValue(keyValue.Key);
bool valueIsClear = currentValue == "0" | currentValue == "";
SliceSettingData data = SliceSettingsOrganizer.Instance.GetSettingsData(keyValue.Key);
if (data?.ResetAtEndOfPrint == true && !valueIsClear)
{
printer.Settings.ClearValue(keyValue.Key);
}
}
}
else
{
@ -799,9 +803,9 @@ namespace MatterHackers.MatterControl.PrinterCommunication
{
if (gCodeFileStream0?.GCodeFile?.LineCount > 0)
{
if (feedRateRatio != 0)
if (this.FeedRateRatio != 0)
{
return (int)(gCodeFileStream0.GCodeFile.TotalSecondsInPrint / feedRateRatio);
return (int)(gCodeFileStream0.GCodeFile.TotalSecondsInPrint / this.FeedRateRatio);
}
return (int)(gCodeFileStream0.GCodeFile.TotalSecondsInPrint);
@ -855,9 +859,10 @@ namespace MatterHackers.MatterControl.PrinterCommunication
public void Connect()
{
// TODO: Consider adding any conditions that would results in a connection failure to this initial test
// Start the process of requesting permission and exit if permission is not currently granted
if (!printer.Settings.GetValue<bool>(SettingsKey.enable_network_printing)
if (!this.EnableNetworkPrinting
&& !FrostedSerialPort.EnsureDeviceAccess())
{
// TODO: Consider calling OnConnectionFailed as we do below to fire events that indicate connection failed
@ -981,8 +986,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
TurnOffBedAndExtruders(); // make sure our ui and the printer agree and that the printer is in a known state (not heating).
haveReportedError = false;
QueueLine(
printer.Settings.GetValue(SettingsKey.connect_gcode));
QueueLine(this.ConnectGCode);
// Call global event
AnyConnectionSucceeded.CallEvents(this, null);
@ -1300,7 +1304,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
{
if (currentLineIndexToSend == allCheckSumLinesSent.Count)
{
// asking for the next line don't do anything, conitue with sending next instruction
// asking for the next line don't do anything, continue with sending next instruction
return;
}
// smoothie sends an N before the number and no ok
@ -1313,7 +1317,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
if (currentLineIndexToSend == allCheckSumLinesSent.Count)
{
// asking for the next line don't do anything, conitue with sending next instruction
// asking for the next line don't do anything, continue with sending next instruction
return;
}
@ -1712,7 +1716,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
public void ReleaseMotors(bool forceRelease = false)
{
if (forceRelease
|| this.printer.Settings.GetValue<bool>(SettingsKey.auto_release_motors))
|| this.AutoReleaseMotors)
{
QueueLine("M84");
}
@ -1829,31 +1833,12 @@ namespace MatterHackers.MatterControl.PrinterCommunication
#region ProcessRead
private static Regex getQuotedParts = new Regex(@"([""'])(\\?.)*?\1", RegexOptions.Compiled);
private string readRegexString = "";
private List<(Regex Regex, string Replacement)> ReadLineReplacements = new List<(Regex Regex, string Replacement)>();
private List<string> addedReadLines = new List<string>();
private string ProcessReadRegEx(string lineBeingRead)
{
if (readRegexString != printer.Settings.GetValue(SettingsKey.read_regex))
{
ReadLineReplacements.Clear();
string splitString = "\\n";
readRegexString = printer.Settings.GetValue(SettingsKey.read_regex);
foreach (string regExLine in readRegexString.Split(new string[] { splitString }, StringSplitOptions.RemoveEmptyEntries))
{
var matches = getQuotedParts.Matches(regExLine);
if (matches.Count == 2)
{
var search = matches[0].Value.Substring(1, matches[0].Value.Length - 2);
var replace = matches[1].Value.Substring(1, matches[1].Value.Length - 2);
ReadLineReplacements.Add((new Regex(search, RegexOptions.Compiled), replace));
}
}
}
var addedLines = new List<string>();
foreach (var item in ReadLineReplacements)
foreach (var item in readLineReplacements)
{
var splitReplacement = item.Replacement.Split(',');
if (splitReplacement.Length > 0)
@ -2020,13 +2005,14 @@ namespace MatterHackers.MatterControl.PrinterCommunication
{
lock (locker)
{
// get rid of all the gcode we have left to print
ClearQueuedGCode();
string cancelGCode = printer.Settings.GetValue(SettingsKey.cancel_gcode);
if (cancelGCode.Trim() != "")
if (!string.IsNullOrEmpty(this.CancelGCode))
{
// add any gcode we want to print while canceling
QueueLine(cancelGCode);
QueueLine(this.CancelGCode);
}
// let the process know we canceled not ended normally.
this.PrintWasCanceled = true;
@ -2149,7 +2135,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
{
gCodeFileStream0 = new GCodeFileStream(GCodeFile.Load(gcodeFilename, CancellationToken.None));
if (printer.Settings.GetValue<bool>(SettingsKey.recover_is_enabled)
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));
@ -2202,7 +2188,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
private void LoadGCodeToPrint(string gcodeFilename)
{
CreateStreamProcessors(gcodeFilename, printer.Settings.GetValue<bool>(SettingsKey.recover_is_enabled));
CreateStreamProcessors(gcodeFilename, this.RecoveryIsEnabled);
}
private void DoneLoadingGCodeToPrint()
@ -2308,7 +2294,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
private bool IsNetworkPrinting()
{
return printer.Settings.GetValue<bool>(SettingsKey.enable_network_printing);
return this.EnableNetworkPrinting;
}
private void OnAtxPowerStateChanged(bool enableAtxPower)
@ -2485,7 +2471,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
private void TurnOffBedAndExtruders()
{
for (int i = 0; i < printer.Settings.GetValue<int>(SettingsKey.extruder_count); i++)
for (int i = 0; i < this.ExtruderCount; i++)
{
SetTargetHotendTemperature(i, 0, true);
}
@ -2501,7 +2487,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication
KeepTrackOfAbsolutePostionAndDestination(lineToWrite);
if (this.printer.Settings.GetValue<bool>(SettingsKey.send_with_checksum))
if (this.SendWithChecksum)
{
// always send the reset line number without a checksum so that it is accepted
string lineWithCount;