/**************************************************************************** * startStreaming called by main-Prog * get complete GCode list and copy to streamingBuffer * initialize streaming * if startAtLine > 0 start with pause ****************************************************************************/ public void startStreaming(IList <string> gCodeList, int startAtLine, bool check = false) { grblCharacterCounting = Properties.Settings.Default.grblStreamingProtocol1 && !isMarlin; Logger.Info("Ser:{0} startStreaming at line:{1} ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼", iamSerial, startAtLine); // if (logEnable) LogPos.Info("(----- Start streaming {0} -----)", getTimeStampString()); if (grblCharacterCounting) { Logger.Info("Streaming Protocol: Character-Counting"); } else { Logger.Info("Streaming Protocol: Simple Send-Response"); } updateLogging(); grblBufferSize = grbl.RX_BUFFER_SIZE; //rx bufer size of grbl on arduino 127 grblBufferFree = grbl.RX_BUFFER_SIZE; Logger.Info("Set Buffer Free:{0} Size:{1}", grblBufferFree, grblBufferSize); if (Properties.Settings.Default.grblPollIntervalReduce) { timerSerial.Interval = grbl.pollInterval * 2; } else { timerSerial.Interval = grbl.pollInterval; } countMissingStatusReport = (int)(10000 / timerSerial.Interval); Logger.Info("Timer interval:{0} {1}", timerSerial.Interval, countMissingStatusReport); skipM30 = false; lastError = ""; countGrblError = 0; lastSentToCOM.Clear(); toolTable.init(); // fill structure rtbLog.Clear(); // check if other serial are still alive if (useSerial2) { try { if (!_serial_form2.serialPortOpen) { addToLog("[2nd serial port is not open]"); useSerial2 = false; } } catch { useSerial2 = false; } } if (useSerial3) { try { if (!_serial_form3.serialPortOpen) { addToLog("[3rd serial port is not open]"); useSerial3 = false; } } catch { useSerial3 = false; } } if (!check) { addToLog("[Start streaming - no echo]"); if (useSerial2) { addToLog("[Use serial 2]"); } if (useSerial3) { addToLog("[Use serial 3]"); } } else { addToLog("[Start code check]"); } saveLastPos(); if (replaceFeedRate) { addToLog("!!! Override Feed Rate"); } if (replaceSpindleSpeed) { addToLog("!!! Override Spindle Speed"); } isStreamingPause = false; isStreamingRequestPause = false; isStreamingCheck = check; streamingStateNow = grblStreaming.ok; lineStreamingPause = -1; // save line were M0 appeared for main GUI to show notification streamingBuffer.Clear(); // = new List<string>(); resetStreaming(); // startStreaming if (isStreamingCheck) { sendLine("$C"); // startStreaming check grblBufferSize = 100; // reduce size to avoid fake errors } countLoggerUpdate = (int)(10000 / timerSerial.Interval); timerSerial.Stop(); /***** collect subroutines, without resolving variables *****/ #region subroutines subroutines = new Dictionary <int, List <string> >(); string tmp; string[] gCode = gCodeList.ToArray <string>(); bool prg_end = false; for (int i = startAtLine; i < gCode.Length; i++) { if (gCode[i].Contains("M30")) { prg_end = true; continue; } if (!prg_end) { continue; } if (gCode[i].Contains("O")) { int cmdONr = gcode.getIntGCode('O', gCode[i]); if (cmdONr <= 0) { continue; } subroutines.Add(cmdONr, new List <string>()); Logger.Trace("Add subroutine O{0}", cmdONr); for (int k = i + 1; k < gCode.Length; k++) { if (gCode[k].IndexOf("M99") >= 0) { break; } if (gCode[k].IndexOf("M98") >= 0) { double pWord = findDouble("P", -1, gCode[k]); double lWord = findDouble("L", 1, gCode[k]); if (subroutines.ContainsKey((int)pWord)) { for (int repeat = 0; repeat < lWord; repeat++) { foreach (string subroutineLine in subroutines[(int)pWord]) // copy subroutine { subroutines[cmdONr].Add(subroutineLine); Logger.Trace(" sub in sub {0}", subroutineLine); } } } else { Logger.Error("Start stresaming Subroutine {0} not found", pWord); } } else { subroutines[cmdONr].Add(gCode[k]); Logger.Trace(" {0}", gCode[k]); } } } } /****************************************************************************/ #endregion lock (sendDataLock) { //string[] gCode = gCodeList.ToArray<string>(); //string tmp; double pWord, lWord;//, oWord; // string subline; bool tmpToolInSpindle = toolInSpindle; int cmdTNr = -1; bool foundM30 = false; for (int i = startAtLine; i < gCode.Length; i++) { tmp = cleanUpCodeLine(gCode[i]); if ((!string.IsNullOrEmpty(tmp)) && (tmp[0] != ';'))//trim lines and remove all empty lines and comment lines { int cmdMNr = gcode.getIntGCode('M', tmp); int cmdGNr = gcode.getIntGCode('G', tmp); cmdTNr = gcode.getIntGCode('T', tmp); /***** Subroutine? ********************************************************/ #region subroutine // if (tmp.IndexOf("M98") >= 0) // any subroutines? if (cmdMNr == 98) { pWord = findDouble("P", -1, tmp); lWord = findDouble("L", 1, tmp); if (subroutines.ContainsKey((int)pWord)) { for (int repeat = 0; repeat < lWord; repeat++) { foreach (string subroutineLine in subroutines[(int)pWord]) // copy subroutine { if (subroutineLine.Contains('#')) // check if variable neededs to be replaced { streamingBuffer.Add(insertVariable(subroutineLine), i); } else { streamingBuffer.Add(subroutineLine, i); // add gcode line to list to send } } } } else { Logger.Error("Subroutine {0} not found", pWord); } } #endregion /***** Subroutine ********************************************************/ else { if (grbl.unknownG.Contains(cmdGNr)) { streamingBuffer.SetSentLine("(" + tmp + " - unknown)"); // don't pass unkown GCode to GRBL because is unknown tmp = streamingBuffer.GetSentLine(); streamingBuffer.LineWasReceived(); addToLog(tmp); } if (cmdTNr >= 0) // T-word is allowed by grbl - no need to filter { setToolChangeCoordinates(cmdTNr, tmp); // update variables e.g. "gcodeVariable[TOAX]" from tool-table } if (cmdMNr == 6) // M06 is not allowed - remove { if (Properties.Settings.Default.ctrlToolChange) { insertToolChangeCode(i, ref tmpToolInSpindle); // insert external script-code and insert variables tmp = "(" + tmp + ")"; } } if (cmdMNr == 30) { if (skipM30) { tmp = "(" + tmp + ")"; } } streamingBuffer.Add(tmp, i); // add gcode line to list to send if (cmdMNr == 30) { foundM30 = true; break; } } } } if (!foundM30) { if (!skipM30) { streamingBuffer.Add("M30", gCode.Length - 1); // add end } } streamingBuffer.Add("($END)", gCode.Length - 1); // add gcode line to list to send streamingBuffer.Add("()", gCode.Length - 1); // add gcode line to list to send } // lock timerSerial.Start(); if (logEnable) { string startText = string.Format("( {0} )\r\n", getTimeStampString()); File.WriteAllText(Application.StartupPath + "\\logSendBuffer.nc", startText); // clear file File.WriteAllText(Application.StartupPath + "\\logStreamingBuffer.nc", startText); // clear file File.AppendAllLines(Application.StartupPath + "\\logStreamingBuffer.nc", streamingBuffer.Buffer); } isStreaming = true; updateControls(); if (startAtLine > 0) { pauseStreaming(); isStreamingPause = true; } else { waitForIdle = false; preProcessStreaming(); // 411 } } // startStreaming
/**************************************************************************** * startStreaming called by main-Prog * get complete GCode list and copy to streamingBuffer * initialize streaming * if startAtLine > 0 start with pause ****************************************************************************/ public void startStreaming(IList <string> gCodeList, int startAtLine, bool check = false) { grblCharacterCounting = Properties.Settings.Default.grblStreamingProtocol1 && !isMarlin; Logger.Info("Ser:{0} startStreaming at line:{1} ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼", iamSerial, startAtLine); if (grblCharacterCounting) { Logger.Info("Streaming Protocol: Character-Counting"); } else { Logger.Info("Streaming Protocol: Simple Send-Response"); } updateLogging(); grblBufferSize = grbl.RX_BUFFER_SIZE; //rx bufer size of grbl on arduino 127 grblBufferFree = grbl.RX_BUFFER_SIZE; Logger.Info("Set Buffer Free:{0} Size:{1}", grblBufferFree, grblBufferSize); if (Properties.Settings.Default.grblPollIntervalReduce) { timerSerial.Interval = grbl.pollInterval * 2; } else { timerSerial.Interval = grbl.pollInterval; } countMissingStatusReport = (int)(10000 / timerSerial.Interval); Logger.Info("Timer interval:{0} {1}", timerSerial.Interval, countMissingStatusReport); skipM30 = false; lastError = ""; countGrblError = 0; lastSentToCOM.Clear(); toolTable.init(); // fill structure rtbLog.Clear(); // check if other serial are still alive if (useSerial2) { try { if (!_serial_form2.serialPortOpen) { addToLog("[2nd serial port is not open]"); useSerial2 = false; } } catch { useSerial2 = false; } } if (useSerial3) { try { if (!_serial_form3.serialPortOpen) { addToLog("[3rd serial port is not open]"); useSerial3 = false; } } catch { useSerial3 = false; } } if (!check) { addToLog("[Start streaming - no echo]"); if (useSerial2) { addToLog("[Use serial 2]"); } if (useSerial3) { addToLog("[Use serial 3]"); } } else { addToLog("[Start code check]"); } saveLastPos(); if (replaceFeedRate) { addToLog("!!! Override Feed Rate"); } if (replaceSpindleSpeed) { addToLog("!!! Override Spindle Speed"); } isStreamingPause = false; isStreamingRequestPause = false; isStreamingCheck = check; streamingStateNow = grblStreaming.ok; lineStreamingPause = -1; // save line were M0 appeared for main GUI to show notification streamingBuffer.Clear(); // = new List<string>(); resetStreaming(); // startStreaming if (isStreamingCheck) { sendLine("$C"); // startStreaming check grblBufferSize = 100; // reduce size to avoid fake errors } countLoggerUpdate = (int)(10000 / timerSerial.Interval); timerSerial.Stop(); lock (sendDataLock) { string[] gCode = gCodeList.ToArray <string>(); string tmp; double pWord, lWord, oWord; string subline; bool tmpToolInSpindle = toolInSpindle; int cmdTNr = -1; bool foundM30 = false; for (int i = startAtLine; i < gCode.Length; i++) { tmp = cleanUpCodeLine(gCode[i]); if ((!string.IsNullOrEmpty(tmp)) && (tmp[0] != ';'))//trim lines and remove all empty lines and comment lines { int cmdMNr = gcode.getIntGCode('M', tmp); int cmdGNr = gcode.getIntGCode('G', tmp); cmdTNr = gcode.getIntGCode('T', tmp); /***** Subroutine? ********************************************************/ #region subroutine // if (tmp.IndexOf("M98") >= 0) // any subroutines? if (cmdMNr == 98) { pWord = findDouble("P", -1, tmp); lWord = findDouble("L", 1, tmp); int subStart = 0, subEnd = 0; if (pWord > 0) { oWord = -1; for (int si = i; si < gCode.Length; si++) // find subroutine { subline = gCode[si]; if (subline.IndexOf("O") >= 0) // find O-Word { oWord = findDouble("O", -1, subline); if (oWord == pWord) { subStart = si + 1; // note start of sub } } else // find end of sub { if (subStart > 0) // is match? { if (subline.IndexOf("M99") >= 0) { subEnd = si; break; } // note end of sub } } } if (subStart < subEnd) { for (int repeat = 0; repeat < lWord; repeat++) { for (int si = subStart; si < subEnd; si++) // copy subroutine { streamingBuffer.Add(gCode[si], si); } // add gcode line to list to send } } } } #endregion /***** Subroutine ********************************************************/ else { if (grbl.unknownG.Contains(cmdGNr)) { streamingBuffer.SetSentLine("(" + tmp + " - unknown)"); // don't pass unkown GCode to GRBL because is unknown tmp = streamingBuffer.GetSentLine(); streamingBuffer.LineWasReceived(); addToLog(tmp); } if (cmdTNr >= 0) // T-word is allowed by grbl - no need to filter { setToolChangeCoordinates(cmdTNr, tmp); } if (cmdMNr == 6) //M06 is not allowed - remove { if (Properties.Settings.Default.ctrlToolChange) { insertToolChangeCode(i, ref tmpToolInSpindle); tmp = "(" + tmp + ")"; } } if (cmdMNr == 30) { if (skipM30) { tmp = "(" + tmp + ")"; } } streamingBuffer.Add(tmp, i); // add gcode line to list to send if (cmdMNr == 30) { foundM30 = true; break; } } } } if (!foundM30) { if (!skipM30) { streamingBuffer.Add("M30", gCode.Length - 1); // add end } } streamingBuffer.Add("($END)", gCode.Length - 1); // add gcode line to list to send streamingBuffer.Add("()", gCode.Length - 1); // add gcode line to list to send } // lock timerSerial.Start(); isStreaming = true; updateControls(); if (startAtLine > 0) { pauseStreaming(); isStreamingPause = true; } else { waitForIdle = false; preProcessStreaming(); // 411 } } // startStreaming