From ba3db180cdeb5c4d57ff9f25341b21868ca769ba Mon Sep 17 00:00:00 2001 From: nvlastik <69503129+nvlastik@users.noreply.github.com> Date: Mon, 25 Dec 2023 00:19:33 +0300 Subject: [PATCH 1/2] fix issue#5 --- firmware/microReader-v1.0/microReader-v1.0.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/microReader-v1.0/microReader-v1.0.ino b/firmware/microReader-v1.0/microReader-v1.0.ino index 117fd52..cd47cab 100644 --- a/firmware/microReader-v1.0/microReader-v1.0.ino +++ b/firmware/microReader-v1.0/microReader-v1.0.ino @@ -110,7 +110,7 @@ void loop() { uiTimer = millis(); // Сбрасываем таймер дисплея cursor = constrain(cursor - 1, 0, files - 1); // Двигаем курсор drawMainMenu(); // Обновляем главное меню - } else if (down.isClick() or up.isHold()) { // Если нажата или удержана кнопка вниз + } else if (down.isClick() or down.isHold()) { // Если нажата или удержана кнопка вниз uiTimer = millis(); // Сбрасываем таймер дисплея cursor = constrain(cursor + 1, 0, files - 1); // Двигаем курсор drawMainMenu(); // Обновляем главное меню From 9ade1844df97a054d7f5857fb5e3c66cf17206ed Mon Sep 17 00:00:00 2001 From: nvlastik <69503129+nvlastik@users.noreply.github.com> Date: Mon, 25 Dec 2023 00:30:16 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BA=D0=BE=D0=BB-=D0=B2=D0=B0=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit если загрузить большое количество файлов (>30), то читалка уже начинает лагать, т.к. ей нужно пройтись по файловой системе и найти название нужного файла. И так 6 раз (т.к. файлов на экране 6). Реализовано сохранение названий всех файлов в память. WARNING HOT FIX! После загрузки новых файлов необходимо перезапустить esp, т.к. не реализовано обновление названий в памяти. --- .../microReader-v1.0/microReader-v1.0.ino | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/firmware/microReader-v1.0/microReader-v1.0.ino b/firmware/microReader-v1.0/microReader-v1.0.ino index cd47cab..b2b2480 100644 --- a/firmware/microReader-v1.0/microReader-v1.0.ino +++ b/firmware/microReader-v1.0/microReader-v1.0.ino @@ -28,6 +28,7 @@ #define VBAT_FULL_MV 3600 // Напряжение питания при заряженном аккуме в (мВ) #define VBAT_EMPTY_MV 2600 // Напряжение питания при севшем аккуме в (мВ) #define _EB_DEB 25 // Дебаунс кнопок (мс) +#define MAX_FILENAME_SIZE 10 // Ограничение на длину файлов (!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! не превышать undefined behavior) /* =========================================== */ /* ============ Список библиотек ============= */ #include // Либа I2C @@ -59,6 +60,7 @@ byte files = 0; // Количество файло int batMv = 3000; // Напряжение питания ESP uint32_t uiTimer = 0; // Таймер таймаута дисплея uint32_t batTimer = 0; // Таймер опроса АКБ +char* file_names; /* =========================================== */ /* ============================ setup + loop ============================= */ @@ -97,6 +99,8 @@ void setup() { oled.setContrast(con); // Тут же задаем яркость оледа batMv = ESP.getVcc(); // Читаем напряжение питания files = getFilesCount(); // Читаем количество файлов + file_names = (char*)malloc(sizeof(byte) * files * MAX_FILENAME_SIZE); + fillFileNames(); uiTimer = millis(); // Сбрасываем таймер дисплея drawMainMenu(); // Рисуем главное меню } @@ -174,11 +178,36 @@ void action(GyverPortal& p) { // Подсос значений со стр /* ======================================================================= */ /* ========================== Работа с файлами =========================== */ String getFilenameByIndex(int idx) { // Вывод имени файла по номеру + String ans = ""; + for (int i = idx * sizeof(char) * MAX_FILENAME_SIZE; i < (idx + 1) * sizeof(char) * MAX_FILENAME_SIZE; i++){ + if (file_names[i] != '\0'){ + ans += file_names[i]; + } else { + break; + } + } + return ans; +// Dir root = LittleFS.openDir("/"); // Открываем директорию (корень) +// for (int i = 0; root.next(); i++) { // Шагаем по директории +// if (i != idx) continue; // Если не тот файл по номеру - в начало цикла +// return ("/" + root.fileName()); // Нужный файл - возвращаем имя + путь +// } +} + +void fillFileNames(){ Dir root = LittleFS.openDir("/"); // Открываем директорию (корень) - for (int i = 0; root.next(); i++) { // Шагаем по директории - if (i != idx) continue; // Если не тот файл по номеру - в начало цикла - return ("/" + root.fileName()); // Нужный файл - возвращаем имя + путь - } + int i = 0; + while (root.next()) { // Шагаем по директории + File file = root.openFile("r"); // Открываем файл для чтения + if (file){ + for (int j = 0; j < root.fileName().length(); j++){ + file_names[i * sizeof(char) * MAX_FILENAME_SIZE + j] = root.fileName()[j]; + } + file_names[i * sizeof(char) * MAX_FILENAME_SIZE + root.fileName().length()] = '\0'; + i++; + } // Если с файлом все ОК - инкремент + file.close(); // Закрываем файл + } } int getFilesCount(void) { // Вывод количества файлов в системе @@ -402,7 +431,7 @@ void enterToReadFile(void) { // Режим чтения down.tick(); if (ok.isClick()) { // Если ок нажат uiTimer = millis(); // Сбрасываем таймер дисплея - files = getFilesCount(); drawMainMenu(); // Смотрим количество файлов и рисуем главное меню + drawMainMenu(); // Смотрим количество файлов и рисуем главное меню file.close(); return; // Закрываем файл и выходим } else if (up.isClick() or up.isHold()) { // Если нажата или удержана вверх uiTimer = millis(); // Сбрасываем таймер дисплея