// If the specified parameter character is found, fetch 'value' and set 'seen'. Otherwise leave value and seen alone. void GCodeBuffer::TryGetIValue(char c, int32_t& val, bool& seen) { if (Seen(c)) { val = GetIValue(); seen = true; } }
// Add a byte to the code being assembled. If false is returned, the code is // not yet complete. If true, it is complete and ready to be acted upon. bool GCodeBuffer::Put(char c) { if (c == ';') { inComment = true; } else if (c == '\n' || c == '\r' || c == 0) { gcodeBuffer[gcodePointer] = 0; if (reprap.Debug(moduleGcodes) && gcodeBuffer[0] != 0 && !writingFileDirectory) // Don't bother with blank/comment lines { reprap.GetPlatform()->MessageF(DEBUG_MESSAGE, "%s: %s\n", identity, gcodeBuffer); } // Deal with line numbers and checksums if (Seen('*')) { const int csSent = GetIValue(); const int csHere = CheckSum(); if (csSent != csHere) { if (Seen('N')) { snprintf(gcodeBuffer, GCODE_LENGTH, "M998 P%ld", GetIValue()); } Init(); return true; } // Strip out the line number and checksum gcodePointer = 0; while (gcodeBuffer[gcodePointer] != ' ' && gcodeBuffer[gcodePointer] != 0) { gcodePointer++; } // Anything there? if (gcodeBuffer[gcodePointer] == 0) { // No... gcodeBuffer[0] = 0; Init(); return false; } // Yes... gcodePointer++; int gp2 = 0; while (gcodeBuffer[gcodePointer] != '*' && gcodeBuffer[gcodePointer] != 0) { gcodeBuffer[gp2] = gcodeBuffer[gcodePointer++]; gp2++; } gcodeBuffer[gp2] = 0; } else if ((checksumRequired && machineState->previous == nullptr) || IsEmpty()) { // Checksum not found or buffer empty - cannot do anything gcodeBuffer[0] = 0; Init(); return false; } Init(); bufferState = GCodeBufferState::ready; return true; } else if (!inComment || writingFileDirectory) { gcodeBuffer[gcodePointer++] = c; if (gcodePointer >= (int)GCODE_LENGTH) { reprap.GetPlatform()->MessageF(GENERIC_MESSAGE, "Error: G-Code buffer '$s' length overflow\n", identity); gcodePointer = 0; gcodeBuffer[0] = 0; } } return false; }
bool GCodeBuffer::Put(char c) { bool result = false; gcodeBuffer[gcodePointer] = c; if(c == ';') inComment = true; if(c == '\n' || !c) { gcodeBuffer[gcodePointer] = 0; Init(); if(reprap.Debug() && gcodeBuffer[0]) // Don't bother with blank/comment lines { platform->Message(HOST_MESSAGE, identity); platform->Message(HOST_MESSAGE, gcodeBuffer); platform->Message(HOST_MESSAGE, "\n"); } // Deal with line numbers and checksums if(Seen('*')) { int csSent = GetIValue(); int csHere = CheckSum(); Seen('N'); if(csSent != csHere) { snprintf(gcodeBuffer, GCODE_LENGTH, "M998 P%d", GetIValue()); Init(); result = true; return result; } // Strip out the line number and checksum while(gcodeBuffer[gcodePointer] != ' ' && gcodeBuffer[gcodePointer]) gcodePointer++; // Anything there? if(!gcodeBuffer[gcodePointer]) { // No... gcodeBuffer[0] = 0; Init(); result = true; return result; } // Yes... gcodePointer++; int gp2 = 0; while(gcodeBuffer[gcodePointer] != '*' && gcodeBuffer[gcodePointer]) { gcodeBuffer[gp2] = gcodeBuffer[gcodePointer++]; gp2++; } gcodeBuffer[gp2] = 0; Init(); } result = true; } else { if(!inComment) gcodePointer++; } if(gcodePointer >= GCODE_LENGTH) { platform->Message(HOST_MESSAGE, "G Code buffer length overflow.\n"); gcodePointer = 0; gcodeBuffer[0] = 0; } return result; }