void CardReader::parsejson(SdBaseFile &file) { fileSize = file.fileSize(); filamentNeeded = 0.0; objectHeight = 0.0; firstlayerHeight = 0.0; layerHeight = 0.0; if (!file.isOpen()) return; bool genByFound = false, firstlayerHeightFound = false, layerHeightFound = false, filamentNeedFound = false; #if CPU_ARCH==ARCH_AVR #define GCI_BUF_SIZE 120 #else #define GCI_BUF_SIZE 1024 #endif // READ 4KB FROM THE BEGINNING char buf[GCI_BUF_SIZE]; for (int i = 0; i < 4096; i += GCI_BUF_SIZE - 50) { if(!file.seekSet(i)) break; file.read(buf, GCI_BUF_SIZE); if (!genByFound && findGeneratedBy(buf, generatedBy)) genByFound = true; if (!firstlayerHeightFound && findFirstLayerHeight(buf, firstlayerHeight)) firstlayerHeightFound = true; if (!layerHeightFound && findLayerHeight(buf, layerHeight)) layerHeightFound = true; if (!filamentNeedFound && findFilamentNeed(buf, filamentNeeded)) filamentNeedFound = true; if(genByFound && layerHeightFound && filamentNeedFound) goto get_objectHeight; } // READ 4KB FROM END for (int i = 0; i < 4096; i += GCI_BUF_SIZE - 50) { if(!file.seekEnd(-4096 + i)) break; file.read(buf, GCI_BUF_SIZE); if (!genByFound && findGeneratedBy(buf, generatedBy)) genByFound = true; if (!firstlayerHeightFound && findFirstLayerHeight(buf, firstlayerHeight)) firstlayerHeightFound = true; if (!layerHeightFound && findLayerHeight(buf, layerHeight)) layerHeightFound = true; if (!filamentNeedFound && findFilamentNeed(buf, filamentNeeded)) filamentNeedFound = true; if(genByFound && layerHeightFound && filamentNeedFound) goto get_objectHeight; } get_objectHeight: // MOVE FROM END UP IN 1KB BLOCKS UP TO 30KB for (int i = GCI_BUF_SIZE; i < 30000; i += GCI_BUF_SIZE - 50) { if(!file.seekEnd(-i)) break; file.read(buf, GCI_BUF_SIZE); if (findTotalHeight(buf, objectHeight)) break; } file.seekSet(0); }
//int8_t IniFile::readLine(SdBaseFile &file, char *buffer, size_t len, uint32_t &pos) IniFile::error_t IniFile::readLine(SdBaseFile &file, char *buffer, size_t len, uint32_t &pos) { if (!file.isOpen()) return errorFileNotOpen; if (len < 3) return errorBufferTooSmall; if (!file.seekSet(pos)) return errorSeekError; size_t bytesRead = file.read(buffer, len); if (!bytesRead) { buffer[0] = '\0'; //return 1; // done return errorEndOfFile; } for (size_t i = 0; i < bytesRead && i < len-1; ++i) { // Test for '\n' with optional '\r' too // if (endOfLineTest(buffer, len, i, '\n', '\r') if (buffer[i] == '\n' || buffer[i] == '\r') { char match = buffer[i]; char otherNewline = (match == '\n' ? '\r' : '\n'); // end of line, discard any trailing character of the other sort // of newline buffer[i] = '\0'; if (buffer[i+1] == otherNewline) ++i; pos += (i + 1); // skip past newline(s) //return (i+1 == bytesRead && !file.available()); return errorNoError; } } if (!file.available()) { // end of file without a newline buffer[bytesRead] = '\0'; // return 1; //done return errorEndOfFile; } buffer[len-1] = '\0'; // terminate the string return errorBufferTooSmall; }
void SDCard::JSONFileInfo(const char* filename) { SdBaseFile targetFile; GCodeFileInfo *info,tmpInfo; if (strlen(filename) == 0) { targetFile = file; info = &fileInfo; } else { if (!targetFile.open(fat.vwd(), filename, O_READ) || targetFile.isDir()) { Com::printF(Com::tJSONErrorStart); Com::printF(Com::tFileOpenFailed); Com::printFLN(Com::tJSONErrorEnd); return; } info = &tmpInfo; info->init(targetFile); } if (!targetFile.isOpen()) { Com::printF(Com::tJSONErrorStart); Com::printF(Com::tNotSDPrinting); Com::printFLN(Com::tJSONErrorEnd); return; } // {"err":0,"size":457574,"height":4.00,"layerHeight":0.25,"filament":[6556.3],"generatedBy":"Slic3r 1.1.7 on 2014-11-09 at 17:11:32"} Com::printF(Com::tJSONFileInfoStart); Com::print(info->fileSize); Com::printF(Com::tJSONFileInfoHeight); Com::print(info->objectHeight); Com::printF(Com::tJSONFileInfoLayerHeight); Com::print(info->layerHeight); Com::printF(Com::tJSONFileInfoFilament); Com::print(info->filamentNeeded); Com::printF(Com::tJSONFileInfoGeneratedBy); Com::print(info->generatedBy); Com::print('"'); if (strlen(filename) == 0) { Com::printF(Com::tJSONFileInfoName); file.printName(); Com::print('"'); } Com::print('}'); Com::println(); };