// Get the amount of gcode buffer space we are going to report unsigned int Webserver::GetReportedGcodeBufferSpace() const { unsigned int temp = GetGcodeBufferSpace(); return (temp > maxReportedFreeBuf) ? maxReportedFreeBuf : (temp < minReportedFreeBuf) ? 0 : temp; }
// Process a received string of gcodes void Webserver::StoreGcodeData(const char* data, size_t len) { if (len > GetGcodeBufferSpace()) { platform->Message(HOST_MESSAGE, "Webserver: GCode buffer overflow.\n"); HandleReply("Webserver: GCode buffer overflow", true); } else { size_t remaining = gcodeBufLength - gcodeWriteIndex; if (len <= remaining) { memcpy(gcodeBuffer + gcodeWriteIndex, data, len); } else { memcpy(gcodeBuffer + gcodeWriteIndex, data, remaining); memcpy(gcodeBuffer, data + remaining, len - remaining); } gcodeWriteIndex = (gcodeWriteIndex + len) % gcodeBufLength; } }
void Webserver::ProcessGcode(const char* gc) { int8_t specialAction = 0; if(StringStartsWith(gc, "M30 ")) { specialAction = 1; } else if(StringStartsWith(gc, "M23 ")) { specialAction = 2; } else if(StringStartsWith(gc, "M112") && !isdigit(gc[4])) { specialAction = 3; } else if(StringStartsWith(gc, "M503") && !isdigit(gc[4])) { specialAction = 4; } if(specialAction != 0) // Delete or print a file? { switch (specialAction) { case 1: // Delete reprap.GetGCodes()->DeleteFile(&gc[4]); break; case 2: // print reprap.GetGCodes()->QueueFileToPrint(&gc[4]); break; case 3: reprap.EmergencyStop(); break; case 4: { FileStore *configFile = platform->GetFileStore(platform->GetSysDir(), platform->GetConfigFile(), false); if(configFile == NULL) { HandleReply("Configuration file not found", true); } else { char c; size_t i = 0; while(i < STRING_LENGTH && configFile->Read(c)) { gcodeReply[i++] = c; } configFile->Close(); gcodeReply[i] = 0; ++seq; } } break; } } else { // Copy the gcode to the buffer size_t len = strlen(gc) + 1; // number of characters to copy if (len > GetGcodeBufferSpace()) { platform->Message(HOST_MESSAGE, "Webserver: GCode buffer overflow.\n"); HandleReply("Webserver: GCode buffer overflow", true); } else { size_t remaining = gcodeBufLength - gcodeWriteIndex; if (len <= remaining) { memcpy(&gcodeBuffer[gcodeWriteIndex], gc, len); } else { memcpy(&gcodeBuffer[gcodeWriteIndex], gc, remaining); memcpy(gcodeBuffer, gc + remaining, len - remaining); } gcodeWriteIndex = (gcodeWriteIndex + len) % gcodeBufLength; } } }