#pragma once extern melody_attributes melody; bool timeToStop(unsigned long now); bool timeToPause(unsigned long now); bool timeToResume(unsigned long now); void durationTimer(void *param); // Timer task to control playback state void durationTimer(void *param) { // Task Setup // Task Loop while (true) { unsigned long now = millis(); if (timeToStop(now)) { melody.stop(); } else if (timeToPause(now)) { melody.pause(); } else if (timeToResume(now)) { melody.unpause(); } vTaskDelay(pdMS_TO_TICKS(1000)); // Check every 100ms } } // Check if it's time to stop playback bool timeToStop(unsigned long now) { if (melody.isPlaying) { uint64_t stopTime = melody.startTime + melody.duration; if (now >= stopTime) { Serial.println("TIMER: Total Duration Reached"); return true; } } return false; } // Check if it's time to pause playback bool timeToPause(unsigned long now) { if (melody.isPlaying && melody.loop_duration > 0) { uint64_t pauseTimeLimit = melody.loopStartTime + melody.loop_duration; Serial.printf("PTL: %lu // NOW: ",pauseTimeLimit); Serial.println(now); if (now >= pauseTimeLimit && !melody.isPaused) { Serial.println("TIMER: Segment Duration Reached"); melody.pauseTime = now; return true; } } return false; } // Check if it's time to resume playback bool timeToResume(unsigned long now) { if (melody.isPaused) { uint64_t resumeTime = melody.pauseTime + melody.interval; if (now >= resumeTime) { Serial.println("TIMER: Pause Duration Reached"); return true; } } return false; } void handlePlaybackCommands(char * command){ Serial.print("INCOMING COMMAND: "); Serial.println(command); if (command[0] == '1') { melody.play(); PublishMqtt("OK - PLAY"); } else if (command[0] == '0') { melody.forceStop(); PublishMqtt("OK - STOP"); } }