106 lines
2.4 KiB
C++
106 lines
2.4 KiB
C++
#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<String, MappingEntry> 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
|