|
@ -256,6 +256,9 @@ AsyncEventSource events("/events"); |
|
|
// Audio/mp3
|
|
|
// Audio/mp3
|
|
|
#ifndef SD_MMC_1BIT_MODE
|
|
|
#ifndef SD_MMC_1BIT_MODE
|
|
|
SPIClass spiSD(HSPI); |
|
|
SPIClass spiSD(HSPI); |
|
|
|
|
|
fs::FS FSystem = (fs::FS)SD; |
|
|
|
|
|
#else
|
|
|
|
|
|
fs::FS FSystem = (fs::FS)SD_MMC; |
|
|
#endif
|
|
|
#endif
|
|
|
TaskHandle_t mp3Play; |
|
|
TaskHandle_t mp3Play; |
|
|
TaskHandle_t rfid; |
|
|
TaskHandle_t rfid; |
|
@ -562,11 +565,7 @@ void parseSDFileList(fs::FS &fs, const char * dirname, const char * parent, uint |
|
|
esp_task_wdt_reset(); |
|
|
esp_task_wdt_reset(); |
|
|
if (pathValid(fileNameBuf)) { |
|
|
if (pathValid(fileNameBuf)) { |
|
|
sendWebsocketData(0, 31); |
|
|
sendWebsocketData(0, 31); |
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
appendNodeToJSONFile(SD_MMC, DIRECTORY_INDEX_FILE, fileNameBuf, parent, "folder" ); |
|
|
|
|
|
#else
|
|
|
|
|
|
appendNodeToJSONFile(SD, DIRECTORY_INDEX_FILE, fileNameBuf, parent, "folder" ); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
appendNodeToJSONFile(FSystem, DIRECTORY_INDEX_FILE, fileNameBuf, parent, "folder" ); |
|
|
// check for next subfolder
|
|
|
// check for next subfolder
|
|
|
if(levels){ |
|
|
if(levels){ |
|
|
parseSDFileList(fs, fileNameBuf, root.name(), levels -1); |
|
|
parseSDFileList(fs, fileNameBuf, root.name(), levels -1); |
|
@ -590,15 +589,9 @@ void parseSDFileList(fs::FS &fs, const char * dirname, const char * parent, uint |
|
|
// Public function for creating file-index json on SD-card. It notifies the user-client
|
|
|
// Public function for creating file-index json on SD-card. It notifies the user-client
|
|
|
// via websockets when the indexing is done.
|
|
|
// via websockets when the indexing is done.
|
|
|
void createJSONFileList() { |
|
|
void createJSONFileList() { |
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
createFile(SD_MMC, DIRECTORY_INDEX_FILE, "["); |
|
|
|
|
|
parseSDFileList(SD_MMC, "/", NULL, FS_DEPTH); |
|
|
|
|
|
appendToFile(SD_MMC, DIRECTORY_INDEX_FILE, "]"); |
|
|
|
|
|
#else
|
|
|
|
|
|
createFile(SD, DIRECTORY_INDEX_FILE, "["); |
|
|
|
|
|
parseSDFileList(SD, "/", NULL, FS_DEPTH); |
|
|
|
|
|
appendToFile(SD, DIRECTORY_INDEX_FILE, "]"); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
createFile(FSystem, DIRECTORY_INDEX_FILE, "["); |
|
|
|
|
|
parseSDFileList(FSystem, "/", NULL, FS_DEPTH); |
|
|
|
|
|
appendToFile(FSystem, DIRECTORY_INDEX_FILE, "]"); |
|
|
isFirstJSONtNode = true; |
|
|
isFirstJSONtNode = true; |
|
|
sendWebsocketData(0,30); |
|
|
sendWebsocketData(0,30); |
|
|
} |
|
|
} |
|
@ -1542,11 +1535,7 @@ void playAudio(void *parameter) { |
|
|
#ifdef NEOPIXEL_ENABLE
|
|
|
#ifdef NEOPIXEL_ENABLE
|
|
|
showRewind = true; |
|
|
showRewind = true; |
|
|
#endif
|
|
|
#endif
|
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
audio.connecttoFS(SD_MMC, *(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
|
|
|
#else
|
|
|
|
|
|
audio.connecttoSD(*(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
audio.connecttoFS(FSystem, *(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
loggerNl((char *) FPSTR(trackStart), LOGLEVEL_INFO); |
|
|
loggerNl((char *) FPSTR(trackStart), LOGLEVEL_INFO); |
|
|
trackCommand = 0; |
|
|
trackCommand = 0; |
|
|
continue; |
|
|
continue; |
|
@ -1669,21 +1658,13 @@ void playAudio(void *parameter) { |
|
|
playProperties.playlistFinished = false; |
|
|
playProperties.playlistFinished = false; |
|
|
} else { |
|
|
} else { |
|
|
// Files from SD
|
|
|
// Files from SD
|
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
if (!SD_MMC.exists(*(playProperties.playlist + playProperties.currentTrackNumber))) { // Check first if file/folder exists
|
|
|
|
|
|
#else
|
|
|
|
|
|
if (!SD.exists(*(playProperties.playlist + playProperties.currentTrackNumber))) { // Check first if file/folder exists
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
if (!FSystem.exists(*(playProperties.playlist + playProperties.currentTrackNumber))) { // Check first if file/folder exists
|
|
|
snprintf(logBuf, serialLoglength, "Datei/Ordner '%s' existiert nicht", *(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
snprintf(logBuf, serialLoglength, "Datei/Ordner '%s' existiert nicht", *(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
loggerNl(logBuf, LOGLEVEL_ERROR); |
|
|
loggerNl(logBuf, LOGLEVEL_ERROR); |
|
|
playProperties.trackFinished = true; |
|
|
playProperties.trackFinished = true; |
|
|
continue; |
|
|
continue; |
|
|
} else { |
|
|
} else { |
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
audio.connecttoFS(SD_MMC, *(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
|
|
|
#else
|
|
|
|
|
|
audio.connecttoSD(*(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
audio.connecttoFS(FSystem, *(playProperties.playlist + playProperties.currentTrackNumber)); |
|
|
#ifdef NEOPIXEL_ENABLE
|
|
|
#ifdef NEOPIXEL_ENABLE
|
|
|
showPlaylistProgress = true; |
|
|
showPlaylistProgress = true; |
|
|
#endif
|
|
|
#endif
|
|
@ -2403,11 +2384,7 @@ void trackQueueDispatcher(const char *_itemToPlay, const uint32_t _lastPlayPos, |
|
|
publishMqtt((char *) FPSTR(topicPlaymodeState), playProperties.playMode, false); |
|
|
publishMqtt((char *) FPSTR(topicPlaymodeState), playProperties.playMode, false); |
|
|
#endif
|
|
|
#endif
|
|
|
if (_playMode != WEBSTREAM) { |
|
|
if (_playMode != WEBSTREAM) { |
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
musicFiles = returnPlaylistFromSD(SD_MMC.open(filename)); |
|
|
|
|
|
#else
|
|
|
|
|
|
musicFiles = returnPlaylistFromSD(SD.open(filename)); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
musicFiles = returnPlaylistFromSD(FSystem.open(filename)); |
|
|
} else { |
|
|
} else { |
|
|
musicFiles = returnPlaylistFromWebstream(filename); |
|
|
musicFiles = returnPlaylistFromWebstream(filename); |
|
|
} |
|
|
} |
|
@ -3133,11 +3110,7 @@ wl_status_t wifiManager(void) { |
|
|
snprintf(logBuf, serialLoglength, "Aktuelle IP: %d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]); |
|
|
snprintf(logBuf, serialLoglength, "Aktuelle IP: %d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]); |
|
|
loggerNl(logBuf, LOGLEVEL_NOTICE); |
|
|
loggerNl(logBuf, LOGLEVEL_NOTICE); |
|
|
#ifdef FTP_ENABLE
|
|
|
#ifdef FTP_ENABLE
|
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
ftpSrv.begin(SD_MMC, ftpUser, ftpPassword); |
|
|
|
|
|
#else
|
|
|
|
|
|
ftpSrv.begin(ftpUser, ftpPassword); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
ftpSrv.begin(FSystem, ftpUser, ftpPassword); |
|
|
#endif
|
|
|
#endif
|
|
|
} else { // Starts AP if WiFi-connect wasn't successful
|
|
|
} else { // Starts AP if WiFi-connect wasn't successful
|
|
|
accessPointStart((char *) FPSTR(accessPointNetworkSSID), apIP, apNetmask); |
|
|
accessPointStart((char *) FPSTR(accessPointNetworkSSID), apIP, apNetmask); |
|
@ -3522,11 +3495,7 @@ void webserverStart(void) { |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
wServer.on("/files", HTTP_GET, [](AsyncWebServerRequest *request) { |
|
|
wServer.on("/files", HTTP_GET, [](AsyncWebServerRequest *request) { |
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
request->send(SD_MMC, DIRECTORY_INDEX_FILE, "application/json"); |
|
|
|
|
|
#else
|
|
|
|
|
|
request->send(SD, DIRECTORY_INDEX_FILE, "application/json"); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
request->send(FSystem, DIRECTORY_INDEX_FILE, "application/json"); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
wServer.onNotFound(notFound); |
|
|
wServer.onNotFound(notFound); |
|
@ -3568,11 +3537,7 @@ void webserverStart(void) { |
|
|
return NULL; |
|
|
return NULL; |
|
|
} |
|
|
} |
|
|
namespace_ID = FindNsID (nvs, _namespace) ; // Find ID of our namespace in NVS
|
|
|
namespace_ID = FindNsID (nvs, _namespace) ; // Find ID of our namespace in NVS
|
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
File backupFile = SD_MMC.open(_destFile, FILE_WRITE); |
|
|
|
|
|
#else
|
|
|
|
|
|
File backupFile = SD.open(_destFile, FILE_WRITE); |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
File backupFile = FSystem.open(_destFile, FILE_WRITE); |
|
|
if (!backupFile) { |
|
|
if (!backupFile) { |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
@ -4051,17 +4016,10 @@ void setup() { |
|
|
/**
|
|
|
/**
|
|
|
* Create empty Index json file when no file exists. |
|
|
* Create empty Index json file when no file exists. |
|
|
*/ |
|
|
*/ |
|
|
#ifdef SD_MMC_1BIT_MODE
|
|
|
|
|
|
if(!fileExists(SD_MMC,DIRECTORY_INDEX_FILE)){ |
|
|
|
|
|
createFile(SD_MMC,DIRECTORY_INDEX_FILE,"[]"); |
|
|
|
|
|
ESP.restart(); |
|
|
|
|
|
} |
|
|
|
|
|
#else
|
|
|
|
|
|
if(!fileExists(SD,DIRECTORY_INDEX_FILE)){ |
|
|
|
|
|
createFile(SD,DIRECTORY_INDEX_FILE,"[]"); |
|
|
|
|
|
ESP.restart(); |
|
|
|
|
|
} |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
if(!fileExists(FSystem,DIRECTORY_INDEX_FILE)){ |
|
|
|
|
|
createFile(FSystem,DIRECTORY_INDEX_FILE,"[]"); |
|
|
|
|
|
ESP.restart(); |
|
|
|
|
|
} |
|
|
bootComplete = true; |
|
|
bootComplete = true; |
|
|
|
|
|
|
|
|
Serial.print(F("Free heap: ")); |
|
|
Serial.print(F("Free heap: ")); |
|
|