diff --git a/firmware/microReader-v1.0/microReader-v1.0.ino b/firmware/microReader-v1.0/microReader-v1.0.ino index 117fd52..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(); // Рисуем главное меню } @@ -110,7 +114,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(); // Обновляем главное меню @@ -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(); // Сбрасываем таймер дисплея