Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Difficulty accessing Spiffs filesystem with ESP-IDF #638

Open
SylvianHemus opened this issue Dec 25, 2023 · 1 comment
Open

Difficulty accessing Spiffs filesystem with ESP-IDF #638

SylvianHemus opened this issue Dec 25, 2023 · 1 comment

Comments

@SylvianHemus
Copy link

SylvianHemus commented Dec 25, 2023

This isn't a complaint about the project it's just a reflection from an end-user using the library in a non-standard development environment (custom emacs C++ IDE, esp-idf)

I think it's worth mentioning that it's unnecessarily difficult to access the spiffs mountpoint with vfs_api.cpp in the Arduino vfs library that Audio.cpp relies on. There's a lot less gymnastics to get it to just work with the esp-idf implementation of spiffs, and percentage wise trying to get SPIFFS.h to play nicely with the esp-idf configuration for spiffs (e.g., nonstandard data directory name such as spiffs_data) has been that largest bottleneck in my project with the least amount of sense to it

Here's an example of what I mean

FILE *file = fopen("/spiffs_data/load-test.txt", "r");
printf("Trying to call the spiffs data load test file read from audio.cpp, does it work? \n");
if(file ==NULL)
{													
printf("audio.cpp spiffsdata path isn't working \n");													ESP_LOGE(TAG,"audio.cpp spiffsdata File does not exist!");
} else {														printf("audio.cpp spiffsdata path is working! \n");
char line[256];														while(fgets(line, sizeof(line), file) != NULL)
{																printf(line);
}
 fclose(file); 
}

easy access, works as intended
(apologies for poor formatting, I use tabs and github has horrible spacing on them)

audio.connecttoFS(SPIFFS, "/spiffs_data/bell.mp3"); 

filesystem not mounted error. Now I need to check my imports, examine the arduino library code (IMO rather confusing to read because vfs_api.cpp references to _mountpoint variable that is difficult to locate, couldn't find it in .cpp or .h), spend many hours to figure out why it doesn't work for little reward.

One possible solution could be to simply state in the documentation how to pass the file bitstream to Audio.cpp directly, as this will cover many use-cases and isn't obvious to me.

If I take a look at SPIFFS.h in arduino/libraries, I see

class SPIFFSFS : public FS
{
public:
    SPIFFSFS();
    ~SPIFFSFS();
    bool begin(bool formatOnFail=false, const char * basePath="/spiffs", uint8_t maxOpenFiles=10, const char * partitionLabel=NULL);
    bool format();
    size_t totalBytes();
    size_t usedBytes();
    void end();

which seems to hardcode the path for the spiffs data directory to spiffs. Same for a reference to _mountpoint in vfs_api (but it's unclear whether mountpoint itself is hardcoded to /spiffs) But in esp-idf, you can make the path anything you want. In my case it's spiffs_data. That just isn't a good idea in my opinion. Perhaps that is more of a complaint for the arduino people

How I fixed my problem

  1. Ensure spiffs is the directory (not spiffs_data or similar)
  2. Do not declare normal esp_vfs_spiffs_register (will cause not mounted error even though it is mounted), probbaly need to report this to arduino devs
  3. call as following (e.g., files.cpp)
#include <stdio.h>
#include "FS.h"
#include "SPIFFS.h"
#include "esp_spiffs.h"
#include "esp_log.h"
#define TAG "spiffs"

void setup_filesystem(void) {


		printf("Trying to run with SPIFFS.h \n");
		if (SPIFFS.begin()) {
				printf("Spiffs began! \n");
				File writeFile = SPIFFS.open("/trying-to-access-this-shit.txt", "w");
				writeFile.print("Fucking annoying");
						vTaskDelay(1000);
						writeFile.close();
	 File arduinoFile = SPIFFS.open("/load-test.txt", "r");
		if (!arduinoFile) {
				printf("Arduino file not working sadly \n");
				return;
											} else {
						printf("Arduino file works! \n");
						//						printf(Arduinofile.read());
		
}
		} else {
				printf("Spiffs did not begin correctly");
		}

Import into audio.cpp

#import "files.cpp"
@edwardtfn
Copy link

@SylvianHemus, have you successfully ran this with ESP-IDF without using Arduino libraries?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants