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; }