lvgl 9.3.0 - LV_IMG_SET_SRC требует LV_REFR_NOW? Zip, но на основе LVGL 8.x (DEV).
мне удалось получить дисплей, работающий с LVGL 9.3.0, и слайд -шоу в основном работает (!), Включая двойную буферизацию. Все объекты LVGL выделяются в PSRAM.
При переключении изображений, однако, дисплей мерцает - поэтому я начал Googling и чат: почему он мерцает? Насколько я понимаю, я должен , который нуждается в том, что - lv_timer_handler (); должен обрабатывать это.
, но если я удалю lv_refr_now , изображения вообще не показаны. Редроу, но это тоже не работает.
Примечание: объект img создается только один раз в классе с использованием img = lv_image_create (lv_scr_act ()); , а затем повторно использовал в петле Slideshow с LV_IMG_SERC (iMg_SRC (iMg_SRC (img_src (iMg_src (img_src (img_s, и затем повторный PersistentPath); < /code>. < /p>
Что я делаю неправильно? < /p>
platformio.ini
lib_deps =
moononournation/GFX Library for Arduino@1.6.0
lvgl/lvgl@^9.3.0
< /code>
Slideshow.h
#pragma once
#include
#include
#include
#include "SDCardManager.h"
class Slideshow {
public:
Slideshow(SDCardManager *sdCardManager, const char* folderPath, uint32_t delayMs);
void begin();
void update();
private:
void showImage(const char* path);
SDCardManager *sdCardManager;
std::string folder;
std::vector files;
size_t currentIndex;
uint32_t lastSwitch;
uint32_t delay;
lv_obj_t* img;
};
< /code>
Slideshow.cpp
#include "Slideshow.h"
#include "SDCardManager.h"
#include
#include
Slideshow::Slideshow(SDCardManager *sdCardManager1, const char *folderPath,
uint32_t delayMs)
: sdCardManager(sdCardManager1), folder(folderPath), delay(delayMs) {}
void Slideshow::begin() {
img = lv_image_create(lv_scr_act());
lv_obj_center(img);
files = sdCardManager->listFilesRecursive(folder.c_str(), ".jpg");
currentIndex = static_cast(-1); // Noch kein Bild aktiv
lastSwitch = millis();
}
void Slideshow::update() {
if (millis() - lastSwitch >= delay && !files.empty()) {
currentIndex = (currentIndex + 1) % files.size();
String fn = "A:/" + String(files[currentIndex].c_str());
Serial.printf("Switching to image (%d): %s\n", currentIndex, fn.c_str());
showImage(fn.c_str());
lastSwitch = millis();
}
}
void Slideshow::showImage(const char *path) {
static char persistentPath[256];
strncpy(persistentPath, path, sizeof(persistentPath));
persistentPath[sizeof(persistentPath) - 1] = '\0'; // Sicher terminieren
lv_img_set_src(img, persistentPath);
// lv_obj_invalidate(img); // Hint from internet, but not working
lv_refr_now(NULL); // !!!!! Without refresh the images are not shown. But flickering !!!!!
}
< /code>
setup: < /p>
....
Serial.println("Setup complete.");
// I need to start own "loop" with larger HEAP to process JPEGs. I do not see any stackoverflow!!!!
// I already had debugging and prints within Slideshow.cpp to see heap and stack. Enough space!!!
xTaskCreatePinnedToCore(myLoopTask, "myLoopTask",
32768, // Stackgröße in Bytes (32kB)
NULL, 1, NULL,
1 // Core 1 z.B.
);
< /code>
loop: < /p>
void myLoopTask(void *param) {
for (;;) {
slideshow->update();
lvgl->loop(); // Here: calling lv_timer_handler(); (!)
vTaskDelay(pdMS_TO_TICKS(5));
}
}
void loop() {}
Подробнее здесь: https://stackoverflow.com/questions/797 ... v-refr-now