3#if defined(ROO_TESTING)
5#include "roo_testing/microcontrollers/esp32/fake_esp32.h"
9#if (defined(ESP_PLATFORM) || defined(ROO_TESTING)) && \
10 __has_include("esp_spiffs.h")
12#include "esp_spiffs.h"
13#include "esp_task_wdt.h"
16#if !defined(MLOG_roo_io_fs)
17#define MLOG_roo_io_fs 0
29const char* SpiffsFs::mountPoint()
const {
return mount_point_.c_str(); }
31void SpiffsFs::setMountPoint(
const char* mount_point) {
32 mount_point_ = mount_point;
35const char* SpiffsFs::partitionLabel()
const {
36 return has_partition_label_ ? partition_label_.c_str() :
nullptr;
39void SpiffsFs::setPartitionLabel(
const char* partition_label) {
40 has_partition_label_ = (partition_label !=
nullptr);
41 partition_label_ = partition_label;
44uint8_t SpiffsFs::maxOpenFiles()
const {
return max_open_files_; }
46void SpiffsFs::setMaxOpenFiles(uint8_t max_open_files) {
47 max_open_files_ = max_open_files;
50bool SpiffsFs::formatIfMountFailed()
const {
return format_if_mount_failed_; }
52void SpiffsFs::setFormatIfMountFailed(
bool format_if_mount_failed) {
53 format_if_mount_failed_ = format_if_mount_failed;
56MountImpl::MountResult SpiffsFs::mountImpl(std::function<
void()> unmount_fn) {
57 MLOG(roo_io_fs) <<
"Mounting SPIFFS";
58 std::string mount_base_path;
59#if defined(ROO_TESTING)
60 mount_base_path = FakeEsp32().fs_root();
62 mount_base_path.append(mount_point_);
64 esp_vfs_spiffs_conf_t conf = {
65 .base_path = mount_base_path.c_str(),
66 .partition_label = partitionLabel(),
67 .max_files = max_open_files_,
68 .format_if_mount_failed = format_if_mount_failed_};
70 esp_err_t ret = esp_vfs_spiffs_register(&conf);
71 if (ret == ESP_FAIL && format_if_mount_failed_) {
73 ret = esp_vfs_spiffs_register(&conf);
77 LOG(ERROR) <<
"Mounting SPIFFS failed! Error: " << esp_err_to_name(ret);
78 if (ret == ESP_ERR_NO_MEM) {
79 return MountImpl::MountError(kOutOfMemory);
81 return MountImpl::MountError(kGenericMountError);
84 return MountImpl::Mounted(std::unique_ptr<MountImpl>(
85 new PosixMountImpl(mount_base_path.c_str(),
false, unmount_fn)));
88void SpiffsFs::unmountImpl() {
89 MLOG(roo_io_fs) <<
"Unmounting SPIFFS";
90 esp_err_t err = esp_vfs_spiffs_unregister(partitionLabel());
92 LOG(ERROR) <<
"Unmounting SPIFFS failed! Error: " << esp_err_to_name(err);
95 mounted_partition_label_.clear();
100 esp_task_wdt_delete(xTaskGetIdleTaskHandleForCore(0));
102 esp_err_t err = esp_spiffs_format(partition_label_.c_str());
104 esp_task_wdt_add(xTaskGetIdleTaskHandleForCore(0));
107 LOG(ERROR) <<
"Formatting SpiffsFs failed! Error: " << esp_err_to_name(err);
113Filesystem::MediaPresence SpiffsFs::checkMediaPresence() {
114 if (isMounted())
return Filesystem::kMediaPresent;
117 return Filesystem::kMediaPresenceUnknown;
120SpiffsFs CreateSpiffsFs() {
return SpiffsFs(); }
122SpiffsFs SPIFFS = CreateSpiffsFs();
roo::basic_string_view< CharT, Traits > basic_string_view