Free Heap when not on Message screen

This commit is contained in:
HarukiToreda 2025-10-15 03:06:59 -04:00
parent 62eaabc940
commit c8f3cbb0f9
5 changed files with 35 additions and 9 deletions

View File

@ -251,7 +251,7 @@ void MessageStore::saveToFlash()
void MessageStore::loadFromFlash()
{
liveMessages.clear();
std::deque<StoredMessage>().swap(liveMessages);
resetMessagePool(); // reset pool when loading
#ifdef FSCom
@ -289,7 +289,7 @@ void MessageStore::loadFromFlash() {}
// Clear all messages (RAM + persisted queue)
void MessageStore::clearAllMessages()
{
liveMessages.clear();
std::deque<StoredMessage>().swap(liveMessages);
resetMessagePool();
#ifdef FSCom

View File

@ -715,6 +715,23 @@ int32_t Screen::runOnce()
if (displayHeight == 0) {
displayHeight = dispdev->getHeight();
}
// Detect frame transitions and clear message cache when leaving text message screen
{
static int8_t lastFrameIndex = -1;
int8_t currentFrameIndex = ui->getUiState()->currentFrame;
int8_t textMsgIndex = framesetInfo.positions.textMessage;
if (lastFrameIndex != -1 && currentFrameIndex != lastFrameIndex) {
if (lastFrameIndex == textMsgIndex && currentFrameIndex != textMsgIndex) {
graphics::MessageRenderer::clearMessageCache();
}
}
lastFrameIndex = currentFrameIndex;
}
menuHandler::handleMenuSwitch(dispdev);
// Show boot screen for first logo_timeout seconds, then switch to normal operation.
@ -1320,9 +1337,6 @@ void Screen::showFrame(FrameDirection direction)
lastScreenTransition = millis();
setFastFramerate();
// Reset scroll state when switching away from text message screen
graphics::MessageRenderer::resetScrollState();
}
}

View File

@ -481,6 +481,7 @@ void menuHandler::messageResponseMenu()
} else if (selected == DismissAll) {
messageStore.clearAllMessages();
graphics::MessageRenderer::clearThreadRegistries();
graphics::MessageRenderer::clearMessageCache();
} else if (selected == DismissOldest) {
auto mode = graphics::MessageRenderer::getThreadMode();
int ch = graphics::MessageRenderer::getThreadChannel();
@ -919,9 +920,6 @@ void menuHandler::favoriteBaseMenu()
graphics::MessageRenderer::setThreadMode(graphics::MessageRenderer::ThreadMode::DIRECT, -1,
graphics::UIRenderer::currentFavoriteNodeNum);
// Reset scroll state for a fresh view
graphics::MessageRenderer::resetScrollState();
// Manually create and send a UIFrameEvent to trigger the jump
UIFrameEvent evt;
evt.action = UIFrameEvent::Action::SWITCH_TO_TEXTMESSAGE;

View File

@ -209,8 +209,19 @@ void resetScrollState()
scrollStartDelay = millis();
lastTime = millis();
didReset = false; // <-- now valid
didReset = false;
}
// Fully free cached message data from heap
void clearMessageCache()
{
std::vector<std::string>().swap(cachedLines);
std::vector<int>().swap(cachedHeights);
// Reset scroll so we rebuild cleanly next time we enter the screen
resetScrollState();
}
// Current thread state
static ThreadMode currentMode = ThreadMode::ALL;
static int currentChannel = -1;

View File

@ -60,6 +60,9 @@ void setThreadFor(const StoredMessage &sm, const meshtastic_MeshPacket &packet);
// Handles a new incoming/outgoing message: banner, wake, thread select, scroll reset
void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &packet);
// Clear Message Line Cache from Message Renderer
void clearMessageCache();
} // namespace MessageRenderer
} // namespace graphics
#endif