#ifndef MAIN_H_ #define MAIN_H_ void stop(); void start(); bool playFile(const char* filename, uint32_t resumeFilePos = 0); void loop2(void* parameter); void id_song_action(AsyncWebServerRequest *request); void progress_action(AsyncWebServerRequest *request); void volume_action(AsyncWebServerRequest *request); boolean buttonPressed(const uint8_t pin); const String getSysDir(const String filename); /** * Helper routine to dump a byte array as hex values to Serial. */ void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } } String getRFIDString(byte uidByte[10]) { String uidString = String(uidByte[0]) + " " + String(uidByte[1]) + " " + String(uidByte[2]) + " " + String(uidByte[3]); return uidString; } void writeFile(fs::FS &fs, const char * path, const char * message){ Serial.printf("Writing file: %s\n", path); File file = fs.open(path, FILE_WRITE); if(!file){ Serial.println("Failed to open file for writing"); return; } if(file.print(message)){ Serial.println("File written"); } else { Serial.println("Write failed"); } file.close(); } unsigned long lastStart = 0; unsigned long lastInteraction = 0; boolean sleepSoundPlayed = false; boolean startupSoundPlayed = false; boolean continuousMode = false; uint8_t buttontoignore = 0; uint32_t lastVoltage = 0; uint loopCounter = 0; String lastUid = ""; uint16_t currentSongId = 0; uint32_t currentSongSeconds = 0; boolean continuePlaying = false; boolean prepareSleepMode = false; class DirectoryNode; // Mapping entry that stores target (file or folder) and playback mode: // 's' = single (default) - play only the selected song (or single file in folder) // 'f' = folder - play files inside the selected folder, then stop // 'c' = continuous - continuously play (like previous continuousMode) struct MappingEntry { String target; char mode; MappingEntry() : target(""), mode('s') {} MappingEntry(const String& t, char m) : target(t), mode(m) {} }; std::map rfid_map; // Folder-play helper: when a mapping requests "folder only" playback we keep // track of the folder root node so EOF handling can advance only inside that folder. bool folderModeActive = false; bool pendingSeek = false; uint32_t pendingSeekSeconds = 0; #endif