Got one of the dual extruder switching tests passing

Tool change stream tracking requested temps
Made printer use settings for settings rather than keeping a copy
Moved getting a line without checksum to GCodeFile so it can be re-used
This commit is contained in:
Lars Brubaker 2019-03-25 17:55:52 -07:00 committed by LarsBrubaker
parent e7fe7bb8da
commit cae6a7679b
8 changed files with 112 additions and 156 deletions

View file

@ -49,6 +49,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io
private int requestedTool;
enum SendStates { Normal, WaitingForMove, SendingBefore }
private SendStates SendState = SendStates.Normal;
private double[] targetTemps = new double[4];
public ToolChangeStream(PrinterConfig printer, GCodeStream internalStream, QueuedCommandsStream queuedCommandsStream)
: base(printer, internalStream)
@ -80,6 +81,15 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io
return lineToSend;
}
if (lineToSend.StartsWith("M109") || lineToSend.StartsWith("M104"))
{
int toolTemp = 0;
int toolIndex = activeTool;
GCodeFile.GetFirstNumberAfter("T", lineToSend, ref toolIndex);
GCodeFile.GetFirstNumberAfter("S", lineToSend, ref toolTemp);
targetTemps[toolIndex] = toolTemp;
}
// check if any of the heaters we will be switching to need to start heating
ManageReHeating(lineToSend);
@ -173,31 +183,16 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io
// If there is enough time before we will use this tool again, lower the temp by the inactive_cool_down
else if (nextTimeThisTool > timeToReheat)
{
var targetTemp = PrintingTemperature(activeTool);
var targetTemp = targetTemps[activeTool];
targetTemp = Math.Max(0, targetTemp - printer.Settings.GetValue<double>(SettingsKey.inactive_cool_down));
gcode.AppendLine($"M104 T{activeTool} S{targetTemp}");
if (targetTemp != printer.Connection.GetTargetHotendTemperature(activeTool))
{
gcode.AppendLine($"M104 T{activeTool} S{targetTemp}");
}
}
}
}
double PrintingTemperature(int toolIndex)
{
switch(toolIndex)
{
default:
return printer.Settings.GetValue<double>(SettingsKey.temperature);
case 1:
return printer.Settings.GetValue<double>(SettingsKey.temperature1);
case 2:
return printer.Settings.GetValue<double>(SettingsKey.temperature2);
case 3:
return printer.Settings.GetValue<double>(SettingsKey.temperature3);
}
}
private void ManageReHeating(string line)
{
var timeToReheat = printer.Settings.GetValue<double>(SettingsKey.seconds_to_reheat);
@ -207,7 +202,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io
for (int i = 0; i < extruderCount; i++)
{
var nextToolChange = printer.Connection.NextToolChange(i);
var targetTemp = printer.Settings.Helpers.ExtruderTargetTemperature(i);
var targetTemp = targetTemps[i];
if (nextToolChange.toolIndex >= 0
&& nextToolChange.time < timeToReheat
&& printer.Connection.GetTargetHotendTemperature(i) != targetTemp)
@ -248,7 +243,7 @@ namespace MatterHackers.MatterControl.PrinterCommunication.Io
var gcode = new StringBuilder();
// If the printer is heating, make sure we are at temp before switching extruders
var nextToolTargetTemp = PrintingTemperature(requestedTool);
var nextToolTargetTemp = targetTemps[requestedTool];
var currentPrinterTargeTemp = printer.Connection.GetTargetHotendTemperature(requestedTool);
if (currentPrinterTargeTemp > 0
&& printer.Connection.GetActualHotendTemperature(requestedTool) < nextToolTargetTemp - 3)