diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini index 49ff1054d..c11daed72 100644 --- a/arch/esp32/esp32.ini +++ b/arch/esp32/esp32.ini @@ -6,6 +6,7 @@ build_src_filter = ${arduino_base.build_src_filter} - - - upload_speed = 921600 debug_init_break = tbreak setup +monitor_filters = esp32_exception_decoder # Remove -DMYNEWT_VAL_BLE_HS_LOG_LVL=LOG_LEVEL_CRITICAL for low level BLE logging. # See library directory for BLE logging possible values: .pio/libdeps/tbeam/NimBLE-Arduino/src/log_common/log_common.h diff --git a/arch/esp32/esp32s3.ini b/arch/esp32/esp32s3.ini index 4e2817184..7828ea688 100644 --- a/arch/esp32/esp32s3.ini +++ b/arch/esp32/esp32s3.ini @@ -6,6 +6,7 @@ build_src_filter = upload_speed = 961200 monitor_speed = 115200 debug_init_break = tbreak setup +monitor_filters = esp32_exception_decoder # Remove -DMYNEWT_VAL_BLE_HS_LOG_LVL=LOG_LEVEL_CRITICAL for low level BLE logging. # See library directory for BLE logging possible values: .pio/libdeps/tbeam/NimBLE-Arduino/src/log_common/log_common.h diff --git a/src/FSCommon.cpp b/src/FSCommon.cpp index 5832a2acb..a4fa3c3ae 100644 --- a/src/FSCommon.cpp +++ b/src/FSCommon.cpp @@ -9,13 +9,13 @@ bool copyFile(const char* from, const char* to) File f1 = FSCom.open(from, FILE_O_READ); if (!f1){ - DEBUG_MSG("Failed to open file"); + DEBUG_MSG("Failed to open source file %s\n", from); return false; } File f2 = FSCom.open(to, FILE_O_WRITE); if (!f2) { - DEBUG_MSG("Failed to open file"); + DEBUG_MSG("Failed to open destination file %s\n", to); return false; } @@ -33,17 +33,25 @@ bool copyFile(const char* from, const char* to) bool renameFile(const char* pathFrom, const char* pathTo) { #ifdef FSCom +#ifdef ARCH_ESP32 + // rename was fixed for ESP32 IDF LittleFS in April + return FSCom.rename(pathFrom, pathTo); +#else if (copyFile(pathFrom, pathTo) && FSCom.remove(pathFrom) ) { return true; } else{ return false; } #endif +#endif } -void listDir(const char * dirname, uint8_t levels) +void listDir(const char * dirname, uint8_t levels, boolean del = false) { #ifdef FSCom +#if (defined(ARCH_ESP32) || defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)) + char buffer[255]; +#endif File root = FSCom.open(dirname, FILE_O_READ); if(!root){ return; @@ -56,55 +64,92 @@ void listDir(const char * dirname, uint8_t levels) while(file){ if(file.isDirectory() && !String(file.name()).endsWith(".")) { if(levels){ - listDir(file.name(), levels -1); +#ifdef ARCH_ESP32 + listDir(file.path(), levels -1, del); + if(del) { + DEBUG_MSG("Removing %s\n", file.path()); + strcpy(buffer, file.path()); + file.close(); + FSCom.rmdir(buffer); + } else { + file.close(); + } +#elif (defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)) + listDir(file.name(), levels -1, del); + if(del) { + DEBUG_MSG("Removing %s\n", file.name()); + strcpy(buffer, file.name()); + file.close(); + FSCom.rmdir(buffer); + } else { + file.close(); + } +#else + listDir(file.name(), levels -1, del); + file.close(); +#endif } } else { - DEBUG_MSG(" %s (%i Bytes)\n", file.name(), file.size()); +#ifdef ARCH_ESP32 + if(del) { + DEBUG_MSG("Deleting %s\n", file.path()); + strcpy(buffer, file.path()); + file.close(); + FSCom.remove(buffer); + } else { + DEBUG_MSG(" %s (%i Bytes)\n", file.path(), file.size()); + file.close(); + } +#elif (defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)) + if(del) { + DEBUG_MSG("Deleting %s\n", file.name()); + strcpy(buffer, file.name()); + file.close(); + FSCom.remove(buffer); + } else { + DEBUG_MSG(" %s (%i Bytes)\n", file.name(), file.size()); + file.close(); + } +#else + DEBUG_MSG(" %s (%i Bytes)\n", file.name(), file.size()); + file.close(); +#endif } - file.close(); file = root.openNextFile(); } - file.close(); +#ifdef ARCH_ESP32 + if(del) { + DEBUG_MSG("Removing %s\n", root.path()); + strcpy(buffer, root.path()); + root.close(); + FSCom.rmdir(buffer); + } else { + root.close(); + } +#elif (defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)) + if(del) { + DEBUG_MSG("Removing %s\n", root.name()); + strcpy(buffer, root.name()); + root.close(); + FSCom.rmdir(buffer); + } else { + root.close(); + } +#else + root.close(); +#endif #endif } void rmDir(const char * dirname) { #ifdef FSCom - File file = FSCom.open(dirname, FILE_O_READ); - if(!file){ - return; - } - if(!file.isDirectory()){ - file.close(); - FSCom.remove(file.name()); - // DEBUG_MSG("Remove FILE %s\n", file.name()); - return; - } - - file.rewindDirectory(); - while (true) { - File entry = file.openNextFile(); - if (!entry) { - break; - } - char dirpath[100]; // array to hold the result. - strcpy(dirpath, dirname); // copy string one into the result. - strcat(dirpath,"/"); // append string two to the result. - strcat(dirpath,entry.name()); // append string two to the result. - if(entry.isDirectory() && !String(entry.name()).endsWith(".")) { - entry.close(); - // DEBUG_MSG("Descend DIR %s\n", dirpath); - rmDir(dirpath); - } else { - entry.close(); - // DEBUG_MSG("Remove FILE %s\n", entry.name()); - FSCom.remove(entry.name()); - } - } - FSCom.rmdir(dirname); - // DEBUG_MSG("Remove DIR %s\n", dirname); - file.close(); +#if (defined(ARCH_ESP32) || defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)) + listDir(dirname, 10, true); +#elif defined(ARCH_NRF52) + // nRF52 implementation of LittleFS has a recursive delete function + FSCom.rmdir_r(dirname); +#endif #endif } @@ -116,8 +161,11 @@ void fsInit() DEBUG_MSG("ERROR filesystem mount Failed. Formatting...\n"); assert(0); // FIXME - report failure to phone } - +#ifdef ARCH_ESP32 + DEBUG_MSG("Filesystem files (%d/%d Bytes):\n", FSCom.usedBytes(), FSCom.totalBytes()); +#else DEBUG_MSG("Filesystem files:\n"); +#endif listDir("/", 10); #endif } diff --git a/src/FSCommon.h b/src/FSCommon.h index 38ca403b1..841fa5adb 100644 --- a/src/FSCommon.h +++ b/src/FSCommon.h @@ -40,6 +40,7 @@ using namespace Adafruit_LittleFS_Namespace; #endif void fsInit(); +bool copyFile(const char* from, const char* to); bool renameFile(const char* pathFrom, const char* pathTo); -void listDir(const char * dirname, uint8_t levels); +void listDir(const char * dirname, uint8_t levels, boolean del); void rmDir(const char * dirname); diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 23be64e74..14a435456 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -86,7 +86,7 @@ static char ourId[5]; GeoCoord geoCoord; // OEM Config File -static const char *oemConfigFile = "/prefs/oem.proto"; +static const char *oemConfigFile = "/oem/oem.proto"; OEMStore oemStore; #ifdef SHOW_REDRAWS diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 156017491..4e06d263a 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -431,7 +431,6 @@ bool saveProto(const char *filename, size_t protoSize, size_t objSize, const pb_ } else { okay = true; } - f.close(); // brief window of risk here ;-) @@ -454,7 +453,7 @@ void NodeDB::saveChannelsToDisk() #ifdef FSCom FSCom.mkdir("/prefs"); #endif - saveProto(channelFileName, ChannelFile_size, sizeof(ChannelFile), ChannelFile_fields, &channelFile); + saveProto(channelFileName, ChannelFile_size, sizeof(channelFile), ChannelFile_fields, &channelFile); } } @@ -484,7 +483,7 @@ void NodeDB::saveToDisk() config.has_power = true; config.has_network = true; config.has_bluetooth = true; - saveProto(configFileName, LocalConfig_size, sizeof(LocalConfig), LocalConfig_fields, &config); + saveProto(configFileName, LocalConfig_size, sizeof(config), LocalConfig_fields, &config); moduleConfig.has_canned_message = true; moduleConfig.has_external_notification = true; @@ -493,7 +492,7 @@ void NodeDB::saveToDisk() moduleConfig.has_serial = true; moduleConfig.has_store_forward = true; moduleConfig.has_telemetry = true; - saveProto(moduleConfigFileName, LocalModuleConfig_size, sizeof(LocalModuleConfig), LocalModuleConfig_fields, &moduleConfig); + saveProto(moduleConfigFileName, LocalModuleConfig_size, sizeof(moduleConfig), LocalModuleConfig_fields, &moduleConfig); saveChannelsToDisk(); } else { diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 240c23086..41f62062e 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -411,7 +411,7 @@ bool CannedMessageModule::saveProtoForModule() FS.mkdir("/prefs"); #endif - okay &= saveProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size, sizeof(CannedMessageModuleConfig), + okay &= saveProto(cannedMessagesConfigFile, CannedMessageModuleConfig_size, sizeof(cannedMessageModuleConfig), CannedMessageModuleConfig_fields, &cannedMessageModuleConfig); return okay; diff --git a/src/modules/CannedMessageModule.h b/src/modules/CannedMessageModule.h index 33f60dd61..784e40fc1 100644 --- a/src/modules/CannedMessageModule.h +++ b/src/modules/CannedMessageModule.h @@ -74,7 +74,7 @@ class CannedMessageModule : int currentMessageIndex = -1; cannedMessageModuleRunState runState = CANNED_MESSAGE_RUN_STATE_INACTIVE; char payload; - int cursor = 0; + unsigned int cursor = 0; String freetext = ""; // Text Buffer for Freetext Editor char messageStore[CANNED_MESSAGE_MODULE_MESSAGES_SIZE+1];