From 4fe467ca3c3515a543e886d687001246f41a7faa Mon Sep 17 00:00:00 2001 From: Jonas Diemer Date: Fri, 19 Dec 2025 09:13:58 +0100 Subject: [PATCH] Randomly load Sleep Screen from /sleep/*bmp (if exists). --- src/activities/boot_sleep/SleepActivity.cpp | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/activities/boot_sleep/SleepActivity.cpp b/src/activities/boot_sleep/SleepActivity.cpp index 417a662..53f1cf6 100644 --- a/src/activities/boot_sleep/SleepActivity.cpp +++ b/src/activities/boot_sleep/SleepActivity.cpp @@ -2,18 +2,66 @@ #include +#include + #include "CrossPointSettings.h" #include "SD.h" #include "config.h" #include "images/CrossLarge.h" void SleepActivity::onEnter() { + // Check if we have a /sleep directory + auto dir = SD.open("/sleep"); + if (dir && dir.isDirectory()) { + std::vector files; + // collect all valid BMP files + for (File file = dir.openNextFile(); file; file = dir.openNextFile()) { + if (file.isDirectory()) { + file.close(); + continue; + } + auto filename = std::string(file.name()); + if (filename.substr(filename.length() - 4) != ".bmp") { + Serial.printf("[%lu] [Slp] Skipping non-.bmp file name: %s\n", millis(), file.name()); + file.close(); + continue; + } + Bitmap bitmap(file); + if (bitmap.parseHeaders() != BmpReaderError::Ok) { + Serial.printf("[%lu] [Slp] Skipping invalid BMP file: %s\n", millis(), file.name()); + file.close(); + continue; + } + files.emplace_back(filename); + file.close(); + } + int numFiles = files.size(); + if (numFiles > 0) { + // Generate a random number between 1 and numFiles + int randomFileIndex = random(numFiles); + auto filename = "/sleep/" + files[randomFileIndex]; + auto file = SD.open(filename.c_str()); + if (file) { + Serial.printf("[%lu] [Slp] Randomly loading: /sleep/%s\n", millis(), files[randomFileIndex].c_str()); + delay(100); + Bitmap bitmap(file); + if (bitmap.parseHeaders() == BmpReaderError::Ok) { + renderCustomSleepScreen(bitmap); + dir.close(); + return; + } + } + } + } + if (dir) dir.close(); + // Look for sleep.bmp on the root of the sd card to determine if we should // render a custom sleep screen instead of the default. auto file = SD.open("/sleep.bmp"); if (file) { Bitmap bitmap(file); if (bitmap.parseHeaders() == BmpReaderError::Ok) { + Serial.printf("[%lu] [Slp] Loading: /sleep.bmp\n", millis()); renderCustomSleepScreen(bitmap); return; }