/** Check if result is plausible. If it is, an ok is send and the command is stored in queue. If not, a resend and ok is send. */ void GCode::checkAndPushCommand() { if(hasM()) { if(M==110) // Reset line number { lastLineNumber = actLineNumber; Com::printFLN(Com::tOk); waitingForResend = -1; return; } if(M==112) // Emergency kill - freeze printer { Commands::emergencyStop(); } #ifdef DEBUG_COM_ERRORS if(M==666) { lastLineNumber++; return; } #endif // DEBUG_COM_ERRORS } if(hasN()) { if((((lastLineNumber+1) & 0xffff)!=(actLineNumber&0xffff))) { if(waitingForResend<0) // after a resend, we have to skip the garbage in buffers, no message for this { if(Printer::debugErrors()) { Com::printF(Com::tExpectedLine,lastLineNumber+1); Com::printFLN(Com::tGot,actLineNumber); } requestResend(); // Line missing, force resend } else { --waitingForResend; commandsReceivingWritePosition = 0; Com::printFLN(Com::tSkip,actLineNumber); Com::printFLN(Com::tOk); } return; } lastLineNumber = actLineNumber; } pushCommand(); #ifdef ACK_WITH_LINENUMBER Com::printFLN(Com::tOkSpace,actLineNumber); #else Com::printFLN(Com::tOk); #endif wasLastCommandReceivedAsBinary = sendAsBinary; waitingForResend = -1; // everything is ok. }
/** \brief Print command on serial console */ void GCode::printCommand() { if(hasN()) { Com::print('N'); Com::print((int32_t)N); Com::print(' '); } if(hasM()) { Com::print('M'); Com::print((int)M); Com::print(' '); } if(hasG()) { Com::print('G'); Com::print((int)G); Com::print(' '); } if(hasT()) { Com::print('T'); Com::print((int)T); Com::print(' '); } if(hasX()) { Com::printF(Com::tX,X); } if(hasY()) { Com::printF(Com::tY,Y); } if(hasZ()) { Com::printF(Com::tZ,Z); } if(hasE()) { Com::printF(Com::tE,E,4); } if(hasF()) { Com::printF(Com::tF,F); } if(hasS()) { Com::printF(Com::tS,S); } if(hasP()) { Com::printF(Com::tP,P); } if(hasI()) { Com::printF(Com::tI,I); } if(hasJ()) { Com::printF(Com::tJ,J); } if(hasR()) { Com::printF(Com::tR,R); } if(hasString()) { Com::print(text); } Com::println(); }
/** Check if result is plausible. If it is, an ok is send and the command is stored in queue. If not, a resend and ok is send. */ void GCode::checkAndPushCommand() { if(hasM()) { if(M == 110) // Reset line number { lastLineNumber = actLineNumber; Com::printFLN(Com::tOk); waitingForResend = -1; return; } if(M == 112) // Emergency kill - freeze printer { Commands::emergencyStop(); } #ifdef DEBUG_COM_ERRORS if(M == 666) // force an communication error { lastLineNumber++; return; } else if(M == 668) { lastLineNumber = 0; // simulate a reset so lines are out of resend buffer } #endif // DEBUG_COM_ERRORS } if(hasN()) { if((((lastLineNumber + 1) & 0xffff) != (actLineNumber & 0xffff))) { if(static_cast<uint16_t>(lastLineNumber - actLineNumber) < 40) { // we have seen that line already. So we assume it is a repeated resend and we ignore it commandsReceivingWritePosition = 0; Com::printFLN(Com::tSkip,actLineNumber); Com::printFLN(Com::tOk); } else if(waitingForResend < 0) // after a resend, we have to skip the garbage in buffers, no message for this { if(Printer::debugErrors()) { Com::printF(Com::tExpectedLine, lastLineNumber + 1); Com::printFLN(Com::tGot, actLineNumber); } requestResend(); // Line missing, force resend } else { --waitingForResend; commandsReceivingWritePosition = 0; Com::printFLN(Com::tSkip, actLineNumber); Com::printFLN(Com::tOk); } return; } lastLineNumber = actLineNumber; } /* This test is not compatible with all hosts. Replaced by forbidding backward switch of protocols. else if(lastLineNumber && !(hasM() && M == 117)) { // once line number always line number! if(Printer::debugErrors()) { Com::printErrorFLN(PSTR("Missing linenumber")); } requestResend(); return; }*/ if(GCode::hasFatalError() && !(hasM() && M==999)) { GCode::reportFatalError(); } else { pushCommand(); } #ifdef DEBUG_COM_ERRORS if(hasM() && M == 667) return; // omit ok #endif #if ACK_WITH_LINENUMBER Com::printFLN(Com::tOkSpace, actLineNumber); #else Com::printFLN(Com::tOk); #endif wasLastCommandReceivedAsBinary = sendAsBinary; keepAlive(NotBusy); waitingForResend = -1; // everything is ok. }