[ai] Many (memory) improvements, cleanup script, still problems
This commit is contained in:
@@ -111,7 +111,7 @@ void DirectoryNode::buildDirectoryTree(const char *currentPath)
|
||||
break;
|
||||
}
|
||||
|
||||
if (entry.isDirectory() && entry.name()[0] != '.' && strcmp(entry.name(), sys_dir.c_str()))
|
||||
if (entry.isDirectory() && entry.name()[0] != '.' && strcmp(entry.name(), sys_dir))
|
||||
{
|
||||
dirNames.push_back(String(entry.name()));
|
||||
}
|
||||
@@ -533,50 +533,6 @@ DirectoryNode *DirectoryNode::advanceToNextMP3(const String *currentGlobal)
|
||||
return this;
|
||||
}
|
||||
|
||||
String DirectoryNode::getDirectoryStructureHTML() const {
|
||||
// Calculate required size first (prevents reallocations)
|
||||
size_t htmlSize = calculateHTMLSize();
|
||||
String html;
|
||||
html.reserve(htmlSize); // Precise allocation - no wasted RAM
|
||||
|
||||
// Helper lambda to append without temporary Strings
|
||||
auto append = [&html](const __FlashStringHelper* fstr) {
|
||||
html += fstr;
|
||||
};
|
||||
auto appendId = [&html](uint32_t id) {
|
||||
html += id; // Direct numeric append (NO temporary String)
|
||||
};
|
||||
|
||||
if (name == "/") {
|
||||
append(F("<ul>\n"));
|
||||
}
|
||||
|
||||
if (name != "/") {
|
||||
append(F("<li data-id=\""));
|
||||
appendId(id);
|
||||
append(F("\"><b>"));
|
||||
html += name; // Still uses String, but unavoidable for dynamic content
|
||||
append(F("</b></li>\n"));
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < mp3Files.size(); i++) {
|
||||
append(F("<li data-id=\""));
|
||||
appendId(ids[i]);
|
||||
append(F("\">"));
|
||||
html += mp3Files[i]; // Dynamic file name
|
||||
append(F("</li>\n"));
|
||||
}
|
||||
|
||||
for (DirectoryNode* child : subdirectories) {
|
||||
html += child->getDirectoryStructureHTML();
|
||||
}
|
||||
|
||||
if (name == "/") {
|
||||
append(F("</ul>\n"));
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
void DirectoryNode::streamDirectoryHTML(Print &out) const {
|
||||
if (name == "/") {
|
||||
@@ -616,33 +572,6 @@ void DirectoryNode::streamDirectoryHTML(Print &out) const {
|
||||
}
|
||||
}
|
||||
|
||||
// NEW: Calculate exact required size first
|
||||
size_t DirectoryNode::calculateHTMLSize() const {
|
||||
size_t size = 0;
|
||||
|
||||
// Opening/closing tags
|
||||
if (name == "/") size += 6; // <ul>\n
|
||||
|
||||
// Current directory entry
|
||||
if (name != "/") {
|
||||
size += 22 + name.length() + 10; // <li...><b></b></li>\n + ID digits (est)
|
||||
}
|
||||
|
||||
// MP3 files
|
||||
for (size_t i = 0; i < mp3Files.size(); i++) {
|
||||
size += 16 + mp3Files[i].length() + 10; // <li...></li>\n + ID digits
|
||||
}
|
||||
|
||||
// Subdirectories
|
||||
for (DirectoryNode* child : subdirectories) {
|
||||
size += child->calculateHTMLSize();
|
||||
}
|
||||
|
||||
// Closing tag
|
||||
if (name == "/") size += 7; // </ul>\n
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
void DirectoryNode::appendIndentation(String &html, int level) const
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user