Beispiel #1
0
        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);
        }