|  |  | @ -367,7 +367,6 @@ static const char restartWebsite[] PROGMEM = "<p>Der Tonuino wird neu gestartet. | 
			
		
	
		
			
				
					|  |  |  | SPIClass spiSD(HSPI); | 
			
		
	
		
			
				
					|  |  |  | TaskHandle_t mp3Play; | 
			
		
	
		
			
				
					|  |  |  | TaskHandle_t rfid; | 
			
		
	
		
			
				
					|  |  |  | TaskHandle_t fileTaskHandle; | 
			
		
	
		
			
				
					|  |  |  | #ifdef NEOPIXEL_ENABLE
 | 
			
		
	
		
			
				
					|  |  |  |     TaskHandle_t LED; | 
			
		
	
		
			
				
					|  |  |  | #endif
 | 
			
		
	
	
		
			
				
					|  |  | @ -649,12 +648,8 @@ bool pathValid(const char *_fileItem) { | 
			
		
	
		
			
				
					|  |  |  |  * @param levels | 
			
		
	
		
			
				
					|  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  | char fileNameBuf[255]; | 
			
		
	
		
			
				
					|  |  |  | bool notifyOverWebsocket = true; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | //FIXME: This function blocks the websocket connection
 | 
			
		
	
		
			
				
					|  |  |  | void parseSDFileList(fs::FS &fs, const char * dirname, const char * parent, uint8_t levels){ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     // i/o is timing critical keep all stuff running
 | 
			
		
	
		
			
				
					|  |  |  |     esp_task_wdt_reset(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     yield(); | 
			
		
	
	
		
			
				
					|  |  | @ -687,11 +682,13 @@ void parseSDFileList(fs::FS &fs, const char * dirname, const char * parent, uint | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         strncpy(fileNameBuf, (char *) file.name(), sizeof(fileNameBuf) / sizeof(fileNameBuf[0])); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // we have a folder
 | 
			
		
	
		
			
				
					|  |  |  |         if(file.isDirectory()){ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             esp_task_wdt_reset(); | 
			
		
	
		
			
				
					|  |  |  |             if (pathValid(fileNameBuf)){ | 
			
		
	
		
			
				
					|  |  |  |                 sendWebsocketData(0, 31); | 
			
		
	
		
			
				
					|  |  |  |                 appendNodeToJSONFile(SD, DIRECTORY_INDEX_FILE, fileNameBuf, parent, "folder" ); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |                 // check for next subfolder
 | 
			
		
	
	
		
			
				
					|  |  | @ -699,21 +696,21 @@ void parseSDFileList(fs::FS &fs, const char * dirname, const char * parent, uint | 
			
		
	
		
			
				
					|  |  |  |                     parseSDFileList(fs, fileNameBuf, root.name(), levels -1); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             // we have a file
 | 
			
		
	
		
			
				
					|  |  |  |         // we have a file
 | 
			
		
	
		
			
				
					|  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             if (fileValid(fileNameBuf)){ | 
			
		
	
		
			
				
					|  |  |  |                 appendNodeToJSONFile(SD, DIRECTORY_INDEX_FILE, fileNameBuf, parent, "file" ); | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         vTaskDelay(portTICK_PERIOD_MS*50); | 
			
		
	
		
			
				
					|  |  |  |         file = root.openNextFile(); | 
			
		
	
		
			
				
					|  |  |  |         // i/o is timing critical keep all stuff running
 | 
			
		
	
		
			
				
					|  |  |  |         esp_task_wdt_reset(); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | // TODO: maybe this is not save with asyncWebserver
 | 
			
		
	
		
			
				
					|  |  |  | uint8_t runFileIndexing = 0; | 
			
		
	
		
			
				
					|  |  |  | uint8_t fileIndexingDone = 0; | 
			
		
	
		
			
				
					|  |  |  | /**
 | 
			
		
	
		
			
				
					|  |  |  |  *  Public function for creating file index json on SD-Card. | 
			
		
	
		
			
				
					|  |  |  |  *  It notifies the user client via websockets when the indexing | 
			
		
	
	
		
			
				
					|  |  | @ -724,22 +721,14 @@ void createJSONFileList(){ | 
			
		
	
		
			
				
					|  |  |  |     parseSDFileList(SD,  "/", NULL, FS_DEPTH); | 
			
		
	
		
			
				
					|  |  |  |     appendToFile(SD, DIRECTORY_INDEX_FILE, "]"); | 
			
		
	
		
			
				
					|  |  |  |     isFirstJSONtNode  =  true; | 
			
		
	
		
			
				
					|  |  |  |     sendWebsocketData(0, 30); | 
			
		
	
		
			
				
					|  |  |  |     sendWebsocketData(0,30); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | void fileHandlingTask(void *arguments){ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     while(true) { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if(runFileIndexing){ | 
			
		
	
		
			
				
					|  |  |  |             runFileIndexing = 0; | 
			
		
	
		
			
				
					|  |  |  |             //createJSONFileList();
 | 
			
		
	
		
			
				
					|  |  |  |             fileIndexingDone = 1; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         esp_task_wdt_reset(); | 
			
		
	
		
			
				
					|  |  |  |         vTaskDelay(portTICK_PERIOD_MS*150); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | void fileHandlingTask(void *arguments){ | 
			
		
	
		
			
				
					|  |  |  |     createJSONFileList(); | 
			
		
	
		
			
				
					|  |  |  |     esp_task_wdt_reset(); | 
			
		
	
		
			
				
					|  |  |  |     vTaskDelete( NULL ); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | // Measures voltage of a battery as per interval or after bootup (after allowing a few seconds to settle down)
 | 
			
		
	
	
		
			
				
					|  |  | @ -3028,6 +3017,7 @@ bool getWifiEnableStatusFromNVS(void) { | 
			
		
	
		
			
				
					|  |  |  |         prefsSettings.putUInt("enableWifi", 1); | 
			
		
	
		
			
				
					|  |  |  |         wifiStatus = 1; | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     return wifiStatus; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -3315,9 +3305,17 @@ bool processJsonRequest(char *_serialJson) { | 
			
		
	
		
			
				
					|  |  |  |         sendWebsocketData(0, 20); | 
			
		
	
		
			
				
					|  |  |  |         return false; | 
			
		
	
		
			
				
					|  |  |  |     } else if (doc.containsKey("refreshFileList")) { | 
			
		
	
		
			
				
					|  |  |  |         //createJSONFileList();
 | 
			
		
	
		
			
				
					|  |  |  |         runFileIndexing = 1; | 
			
		
	
		
			
				
					|  |  |  |         createJSONFileList(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         //TODO: we need a semaphore or mutex here to prevent
 | 
			
		
	
		
			
				
					|  |  |  |         //      a call when the task is still running
 | 
			
		
	
		
			
				
					|  |  |  |         xTaskCreate( | 
			
		
	
		
			
				
					|  |  |  |                 fileHandlingTask,          /* Task function. */ | 
			
		
	
		
			
				
					|  |  |  |                 "TaskTwo",        /* String with name of task. */ | 
			
		
	
		
			
				
					|  |  |  |                 10000,            /* Stack size in bytes. */ | 
			
		
	
		
			
				
					|  |  |  |                 NULL,             /* Parameter passed as input of the task */ | 
			
		
	
		
			
				
					|  |  |  |                 1,                /* Priority of the task. */ | 
			
		
	
		
			
				
					|  |  |  |                 NULL);            /* Task handle. */ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     return true; | 
			
		
	
	
		
			
				
					|  |  | @ -3342,7 +3340,6 @@ void sendWebsocketData(uint32_t client, uint8_t code) { | 
			
		
	
		
			
				
					|  |  |  |         object["refreshFileList"] = "ready"; | 
			
		
	
		
			
				
					|  |  |  |     }else if (code == 31){ | 
			
		
	
		
			
				
					|  |  |  |         object["indexingState"] = fileNameBuf; | 
			
		
	
		
			
				
					|  |  |  |         esp_task_wdt_reset(); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     char jBuf[255]; | 
			
		
	
	
		
			
				
					|  |  | @ -3353,7 +3350,6 @@ void sendWebsocketData(uint32_t client, uint8_t code) { | 
			
		
	
		
			
				
					|  |  |  |     } else { | 
			
		
	
		
			
				
					|  |  |  |         ws.printf(client, jBuf); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     notifyOverWebsocket = true; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -3929,18 +3925,6 @@ void setup() { | 
			
		
	
		
			
				
					|  |  |  |         1 /* Core where the task should run */ | 
			
		
	
		
			
				
					|  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     /**
 | 
			
		
	
		
			
				
					|  |  |  |      * SD Card File Indexing Task | 
			
		
	
		
			
				
					|  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |     xTaskCreatePinnedToCore( | 
			
		
	
		
			
				
					|  |  |  |         fileHandlingTask, /* Function to implement the task */ | 
			
		
	
		
			
				
					|  |  |  |         "fileHandlingTask", /* Name of the task */ | 
			
		
	
		
			
				
					|  |  |  |         2000,  /* Stack size in words */ | 
			
		
	
		
			
				
					|  |  |  |         NULL,  /* Task input parameter */ | 
			
		
	
		
			
				
					|  |  |  |         3,  /* Priority of the task */ | 
			
		
	
		
			
				
					|  |  |  |         &fileTaskHandle,  /* Task handle. */ | 
			
		
	
		
			
				
					|  |  |  |         1 /* Core where the task should run */ | 
			
		
	
		
			
				
					|  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     //esp_sleep_enable_ext0_wakeup((gpio_num_t) DREHENCODER_BUTTON, 0);
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -3979,7 +3963,6 @@ void setup() { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     Serial.print(F("Free heap: ")); | 
			
		
	
		
			
				
					|  |  |  |     Serial.println(ESP.getFreeHeap()); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -3997,13 +3980,6 @@ void loop() { | 
			
		
	
		
			
				
					|  |  |  |     sleepHandler(); | 
			
		
	
		
			
				
					|  |  |  |     deepSleepManager(); | 
			
		
	
		
			
				
					|  |  |  |     rfidPreferenceLookupHandler(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     /*
 | 
			
		
	
		
			
				
					|  |  |  |     if(fileIndexingDone){ | 
			
		
	
		
			
				
					|  |  |  |         fileIndexingDone = 0; | 
			
		
	
		
			
				
					|  |  |  |         sendWebsocketData(0,30); | 
			
		
	
		
			
				
					|  |  |  |     }*/ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if (wifiManager() == WL_CONNECTED) { | 
			
		
	
		
			
				
					|  |  |  |         #ifdef MQTT_ENABLE
 | 
			
		
	
		
			
				
					|  |  |  |             if (enableMqtt) { | 
			
		
	
	
		
			
				
					|  |  | 
 |