From 8fdf84068db7c527cf48a2eb378815fa3f682172 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 7 Jun 2021 21:05:31 +0200 Subject: [PATCH] Optimisations. --- wled00/playlist.cpp | 72 ++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/wled00/playlist.cpp b/wled00/playlist.cpp index cf9df4bc..190e2fdc 100644 --- a/wled00/playlist.cpp +++ b/wled00/playlist.cpp @@ -10,31 +10,32 @@ typedef struct PlaylistEntry { uint16_t tr; } ple; -bool playlistEndless = false; -int8_t playlistRepeat = 1; -byte playlistEndPreset = 0; -byte *playlistEntries = nullptr; -byte playlistLen; -int8_t playlistIndex = -1; -uint16_t playlistEntryDur = 0; +bool playlistEndless = false; +int8_t playlistRepeat = 1; +byte playlistEndPreset = 0; +PlaylistEntry *playlistEntries = nullptr; +byte playlistLen; +int8_t playlistIndex = -1; +uint16_t playlistEntryDur = 0; void shufflePlaylist() { int currentIndex = playlistLen; - - PlaylistEntry temporaryValue, *entries = reinterpret_cast(playlistEntries); + PlaylistEntry temporaryValue; // While there remain elements to shuffle... while (currentIndex--) { // Pick a random element... int randomIndex = random(0, currentIndex); // And swap it with the current element. - temporaryValue = entries[currentIndex]; - entries[currentIndex] = entries[randomIndex]; - entries[randomIndex] = temporaryValue; + temporaryValue = playlistEntries[currentIndex]; + playlistEntries[currentIndex] = playlistEntries[randomIndex]; + playlistEntries[randomIndex] = temporaryValue; } + DEBUG_PRINTLN(F("Playlist shuffle.")); } + void unloadPlaylist() { if (playlistEntries != nullptr) { delete[] playlistEntries; @@ -42,8 +43,10 @@ void unloadPlaylist() { } currentPlaylist = playlistIndex = -1; playlistLen = playlistEntryDur = 0; + DEBUG_PRINTLN(F("Playlist unloaded.")); } + void loadPlaylist(JsonObject playlistObj) { unloadPlaylist(); @@ -51,58 +54,58 @@ void loadPlaylist(JsonObject playlistObj) { playlistLen = presets.size(); if (playlistLen == 0) return; if (playlistLen > 100) playlistLen = 100; - uint16_t dataSize = sizeof(ple) * playlistLen; - playlistEntries = new byte[dataSize]; - PlaylistEntry* entries = reinterpret_cast(playlistEntries); + + playlistEntries = new PlaylistEntry[playlistLen]; + if (playlistEntries == nullptr) return; byte it = 0; for (int ps : presets) { if (it >= playlistLen) break; - entries[it].preset = ps; + playlistEntries[it].preset = ps; it++; } it = 0; JsonArray durations = playlistObj["dur"]; if (durations.isNull()) { - entries[0].dur = playlistObj["dur"] | 100; + playlistEntries[0].dur = playlistObj["dur"] | 100; it = 1; } else { for (int dur : durations) { if (it >= playlistLen) break; - entries[it].dur = dur; + playlistEntries[it].dur = (dur > 0) ? dur : presetCycleTime; it++; } } - for (int i = it; i < playlistLen; i++) entries[i].dur = entries[it -1].dur; + for (int i = it; i < playlistLen; i++) playlistEntries[i].dur = playlistEntries[it -1].dur; it = 0; - JsonArray tr = playlistObj["transition"]; + JsonArray tr = playlistObj[F("transition")]; if (tr.isNull()) { - entries[0].tr = playlistObj["transition"] | (transitionDelay / 100); + playlistEntries[0].tr = playlistObj[F("transition")] | (transitionDelay / 100); it = 1; } else { for (int transition : tr) { if (it >= playlistLen) break; - entries[it].tr = transition; + playlistEntries[it].tr = transition; it++; } } - for (int i = it; i < playlistLen; i++) entries[i].tr = entries[it -1].tr; + for (int i = it; i < playlistLen; i++) playlistEntries[i].tr = playlistEntries[it -1].tr; playlistRepeat = playlistObj[F("repeat")] | 0; playlistEndPreset = playlistObj[F("end")] | 0; - playlistEndless = playlistRepeat < 1; - if (playlistEndless && playlistRepeat==0) playlistRepeat = 1; // it will never decrement + if (playlistRepeat <= 0) playlistRepeat--; // make it endless (-2 == endless & random) currentPlaylist = 0; //TODO here we need the preset ID where the playlist is saved + DEBUG_PRINTLN(F("Playlist loaded.")); } void handlePlaylist() { if (currentPlaylist < 0 || playlistEntries == nullptr || presetCyclingEnabled) return; - + if (millis() - presetCycledTime > (100*playlistEntryDur)) { presetCycledTime = millis(); if (bri == 0 || nightlightActive) return; @@ -116,19 +119,14 @@ void handlePlaylist() { } // playlist roll-over if (!playlistIndex) { - if (!playlistEndless) playlistRepeat--; // decrease repeat count on each index reset if not an endless playlist - if (playlistRepeat < 0) {// playlistRepeat < 0 => endless loop with shuffling presets - shufflePlaylist(); // shuffle playlist and start over - } + // playlistRepeat < 0 => endless loop + if (playlistRepeat > 0) playlistRepeat--; // decrease repeat count on each index reset if not an endless playlist + if (playlistRepeat < -1) shufflePlaylist(); // shuffle playlist and start over } - PlaylistEntry* entries = reinterpret_cast(playlistEntries); - jsonTransitionOnce = true; - transitionDelayTemp = entries[playlistIndex].tr * 100; - - applyPreset(entries[playlistIndex].preset); - playlistEntryDur = entries[playlistIndex].dur; - if (playlistEntryDur == 0) playlistEntryDur = 10; + transitionDelayTemp = playlistEntries[playlistIndex].tr * 100; + playlistEntryDur = playlistEntries[playlistIndex].dur; + applyPreset(playlistEntries[playlistIndex].preset); } }