Added initial Melody Playback Ability

Now, controlled via MQTT a Playback of a melody can Start, Stop, Pause 
etc. 

Settings like speed, total duration, pauses etc can be set.
This commit is contained in:
2025-01-19 21:15:07 +02:00
parent 2cbbc8d591
commit a33f626dde
36 changed files with 4263 additions and 236 deletions

View File

@@ -1,71 +1,70 @@
#pragma once
extern volatile bool playing;
extern std::vector<uint16_t> melody_steps;
void playback(JsonDocument doc){
if (doc["playback"].as<bool>()){
playing = true;
Serial.println("START Playback!");
}
else if (doc["playback"].as<bool>()){
playing = false;
Serial.println("STOP Playback!");
}
}
void setMelodyAttributes(JsonDocument doc);
void loadMelodyInRAM(std::vector<uint16_t> &melody_steps);
void selectMelody(JsonDocument doc){
melody.name = doc["name"].as<const char*>(); // Convert to std::string
void setMelodyAttributes(JsonDocument doc){
melody.name = doc["name"].as<const char*>(); // Convert to std::string "name" : "eortastiko"
melody.id = doc["id"].as<uint16_t>();
melody.duration = doc["duration"].as<uint32_t>();
melody.infinite_play = doc["infinite"].as<bool>();
melody.interval_duration = doc["inter_dur"].as<uint16_t>();
melody.speed = doc["speed"].as<uint8_t>();
melody.interval = doc["interval"].as<uint32_t>();
melody.speed = doc["speed"].as<uint16_t>();
melody.loop_duration = doc["loop_dur"].as<uint32_t>();
Serial.printf("Name: %s, ID: %d, Duration: %lu, Inf: %s, Inter: %d, Speed: %d\n",
melody.name.c_str(),
melody.id,
melody.duration,
melody.infinite_play ? "true" : "false",
melody.interval_duration,
melody.speed);
// Print Just for Debugging Purposes
Serial.printf("Name: %s, ID: %d, Total Duration: %lu, Loop Duration: %lu, Interval: %d, Speed: %d, Inf: %s\n",
melody.name.c_str(),
melody.id,
melody.duration,
melody.loop_duration,
melody.interval,
melody.speed,
melody.infinite_play ? "true" : "false"
);
}
void handleJSON(String payload) {
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
void loadMelodyInRAM(std::vector<uint16_t> &melody_steps) {
// read the file and save in RAM
std::string filePath = "/" + melody.name + ".bin";
Serial.println("New Melody Selected !!!");
Serial.println("Reading data from file...");
//Serial.println(filePath);
File bin_file = SPIFFS.open(filePath.c_str(), "r");
if (!bin_file) {
Serial.println("Failed to Open File");
return;
}
selectMelody(doc);
playback(doc);
size_t fileSize = bin_file.size();
size_t steps = fileSize / 2;
melody_steps.resize(steps);
Serial.print("Opened File ! Size: ");
Serial.print(fileSize);
Serial.print(" Steps: ");
Serial.println(steps);
for (size_t i=0; i<steps; i++){
melody_steps[i] = bin_file.read() << 8 | bin_file.read();
}
for (size_t i=0; i<steps; i++){
Serial.print("Current Step: ");
Serial.printf("%03d // ", i);
Serial.print(" HEX Value: ");
Serial.printf("0x%04X\n", melody_steps[i]);
}
Serial.println("Closing File");
bin_file.close();
// closing the file
}
/*
possible topics:
vesper/client-id/control
/play
/stop
vesper/client-id/select_melody
vesper/client-id/update_melody
vesper/client-id/add_melody
*/