/
Hualilod
/
t114
Обзор
Документация
Войти
/
Hualilod
/
t114
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FsTestModule.cpp
142 строки
4 KB
Hualilod
create: FsTestModule.cpp, FsTestModule.h, Modules.cpp
01 июн 2026, 09:06
Верифицирован
01 июн 2026, 09:06
3614359
Код
Авторство
О чём код?
#include "FsTestModule.h" #include "configuration.h" #include "FSCommon.h" #include <Arduino.h> #include <Adafruit_LittleFS.h> using namespace Adafruit_LittleFS_Namespace; //static const char *TAG = "[FSTEST] "; FsTestModule::FsTestModule() : SinglePortModule("FsTest", meshtastic_PortNum_TEXT_MESSAGE_APP), concurrency::OSThread("FsTest") { // Период опроса потока (если у вас есть setInterval в OSThread — используйте его, // но в Meshtastic обычно достаточно возвращать период из runOnce()). } void FsTestModule::setup() { LOG_WARN("[FSTEST] setup()");// это не видится в log #ifdef FSCom logFsInfo(); // создаём каталог FSCom.mkdir("/logs"); // пишем тестовую строку char line[96]; snprintf(line, sizeof(line), "boot millis=%lu", (unsigned long)millis()); appendLine("/logs/fstest.txt", line); // читаем начало файла dumpHead("/logs/fstest.txt", 128); #else LOG_WARN("[FSTEST] FSCom not available in this build"); #endif } int32_t FsTestModule::runOnce() { LOG_WARN("[FSTEST] runOnce()"); #ifdef FSCom // Пишем строку раз в 5 секунд для отладки static uint32_t n = 0; char line[96]; snprintf(line, sizeof(line), "tick %lu: millis=%lu", (unsigned long)n++, (unsigned long)millis()); appendLine("/logs/fstest.txt", line); LOG_WARN("[FSTEST] write /logs/fstest.txt"); #endif return 5000; // 5 сек } void FsTestModule::logFsInfo() { #ifdef FSCom // В разных сборках FSCom может быть LittleFS с totalBytes/usedBytes, // а может не иметь этих методов. Поэтому делаем “мягкую” проверку через ifdef невозможна. // Просто сообщим, что FS доступна и попробуем открыть корень. LOG_WARN("[FSTEST] FSCom mounted OK"); auto root = FSCom.open("/"); if (!root) { LOG_WARN("[FSTEST] cannot open /"); return; } // Если open("/") даёт directory-объект, попробуем перечислить (если поддерживается) // На некоторых реализациях file.isDirectory() и openNextFile() есть. if (root.isDirectory()) { LOG_WARN("[FSTEST] listing /"); while (true) { auto f = root.openNextFile(); if (!f) break; LOG_WARN("[FSTEST] %s size=%lu", f.name(), (unsigned long)f.size()); f.close(); } } root.close(); #endif } void FsTestModule::appendLine(const char *path, const char *line) { #ifdef FSCom auto f = FSCom.open(path, FILE_O_WRITE); // в вашей сборке точно есть FILE_O_WRITE/FILE_O_READ if (!f) { // если файл не открылся, попробуем создать через FILE_O_WRITE + FILE_O_CREAT (если есть) LOG_WARN("[FSTEST] open write failed: %s", path); return; } // гарантируем дописывание f.seek(f.size()); f.print(line); f.print("\n"); f.close(); LOG_WARN("[FSTEST] appended: %s", path); #endif } void FsTestModule::dumpHead(const char *path, size_t maxBytes) { #ifdef FSCom auto f = FSCom.open(path, FILE_O_READ); if (!f) { LOG_WARN("[FSTEST] open read failed: %s", path); return; } LOG_WARN("[FSTEST] dump head %s size=%lu", path, (unsigned long)f.size()); size_t n = 0; char buf[65]; size_t bi = 0; while (f.available() && n < maxBytes) { int c = f.read(); if (c < 0) break; char ch = (c >= 32 && c <= 126) ? (char)c : '.'; buf[bi++] = ch; n++; if (bi == sizeof(buf) - 1) { buf[bi] = 0; LOG_WARN("[FSTEST] %s", buf); bi = 0; } } if (bi) { buf[bi] = 0; LOG_WARN("[FSTEST] %s", buf); } f.close(); #endif }