public override string ReadLine() { switch (state) { case State.passthrough: { string lineToSend = base.ReadLine(); if (lineToSend != null && lineToSend.StartsWith("M")) { // initial test is just to see if it is an M109 if (lineToSend.StartsWith("M109")) // extruder set and wait temp { if (lineToSend.Contains("F") || // If it has a control character F (auto temp) !lineToSend.Contains("S")) // if it is a reset (has no S temperature) { // don't replace it return(lineToSend); } // send an M104 instead waitWhenCooling = false; lineToSend = "M104" + lineToSend.Substring(4); GCodeFile.GetFirstNumberAfter("S", lineToSend, ref targetTemp); extruderIndex = 0; GCodeFile.GetFirstNumberAfter("T", lineToSend, ref extruderIndex); if (targetTemp > ignoreRequestIfBelowTemp) { state = State.waitingForExtruderTemp; timeHaveBeenAtTemp.Reset(); } else { Thread.Sleep(100); // sleep .1 second while waiting for temp return(""); // return nothing until we reach temp } } else if (lineToSend.StartsWith("M190")) // bed set and wait temp { // send an M140 instead bool gotR = GCodeFile.GetFirstNumberAfter("R", lineToSend, ref targetTemp); bool gotS = GCodeFile.GetFirstNumberAfter("S", lineToSend, ref targetTemp); if (gotR || gotS) { if (targetTemp > ignoreRequestIfBelowTemp) { waitWhenCooling = gotR; lineToSend = "M140 S" + targetTemp.ToString(); state = State.waitingForBedTemp; timeHaveBeenAtTemp.Reset(); } else { Thread.Sleep(100); // sleep .1 second while waiting for temp return(""); // return nothing until we reach temp } } else { Thread.Sleep(100); // sleep .1 second while waiting for temp return(""); // return nothing until we reach temp } } } return(lineToSend); } case State.waitingForExtruderTemp: { double extruderTemp = printerConnection.GetActualHotendTemperature((int)extruderIndex); bool tempWithinRange = extruderTemp >= targetTemp - sameTempRangeHotend && extruderTemp <= targetTemp + sameTempRangeHotend; if (tempWithinRange && !timeHaveBeenAtTemp.IsRunning) { timeHaveBeenAtTemp.Start(); } if (timeHaveBeenAtTemp.Elapsed.TotalSeconds > WaitAfterReachTempTime || printerConnection.PrintWasCanceled) { // switch to pass through and continue state = State.passthrough; return(""); } else { // send a wait command Thread.Sleep(100); // sleep .1 second while waiting for temp return(""); // return nothing until we reach temp } } case State.waitingForBedTemp: { double bedTemp = printerConnection.ActualBedTemperature; bool tempWithinRange; if (waitWhenCooling) { tempWithinRange = bedTemp >= targetTemp - sameTempRangeBed && bedTemp <= targetTemp + sameTempRangeBed; } else { tempWithinRange = bedTemp >= targetTemp - sameTempRangeBed; } // Added R code for M190 if (tempWithinRange && !timeHaveBeenAtTemp.IsRunning) { timeHaveBeenAtTemp.Start(); } if (timeHaveBeenAtTemp.Elapsed.TotalSeconds > WaitAfterReachTempTime || printerConnection.PrintWasCanceled) { // switch to pass through and continue state = State.passthrough; return(""); } else { // send a wait command Thread.Sleep(100); // sleep .1 second while waiting for temp return(""); // return nothing until we reach temp } } } return(null); }