mirror of
https://github.com/wled/WLED.git
synced 2025-07-23 10:46:33 +00:00
Add Playlist feature
This commit is contained in:
parent
e28dbb3b93
commit
3425f2bf34
@ -147,6 +147,10 @@ void setCronixie();
|
|||||||
void _overlayCronixie();
|
void _overlayCronixie();
|
||||||
void _drawOverlayCronixie();
|
void _drawOverlayCronixie();
|
||||||
|
|
||||||
|
//playlist.cpp
|
||||||
|
void loadPlaylist(JsonObject playlistObject);
|
||||||
|
void handlePlaylist();
|
||||||
|
|
||||||
//presets.cpp
|
//presets.cpp
|
||||||
bool applyPreset(byte index);
|
bool applyPreset(byte index);
|
||||||
void savePreset(byte index, bool persist = true, const char* pname = nullptr, JsonObject saveobj = JsonObject());
|
void savePreset(byte index, bool persist = true, const char* pname = nullptr, JsonObject saveobj = JsonObject());
|
||||||
|
@ -255,6 +255,11 @@ bool deserializeState(JsonObject root)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JsonObject playlist = root[F("playlist")];
|
||||||
|
if (!playlist.isNull()) {
|
||||||
|
loadPlaylist(playlist); return stateResponse;
|
||||||
|
}
|
||||||
|
|
||||||
colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : NOTIFIER_CALL_MODE_DIRECT_CHANGE);
|
colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : NOTIFIER_CALL_MODE_DIRECT_CHANGE);
|
||||||
|
|
||||||
return stateResponse;
|
return stateResponse;
|
||||||
|
106
wled00/playlist.cpp
Normal file
106
wled00/playlist.cpp
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#include "wled.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handles playlists, timed sequences of presets
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct PlaylistEntry {
|
||||||
|
uint8_t preset;
|
||||||
|
uint16_t dur;
|
||||||
|
uint16_t tr;
|
||||||
|
} ple;
|
||||||
|
|
||||||
|
byte playlistRepeat = 1;
|
||||||
|
byte playlistEndPreset = 0;
|
||||||
|
|
||||||
|
uint8_t* playlistEntries;
|
||||||
|
|
||||||
|
byte playlistLen;
|
||||||
|
int8_t playlistIndex = -1;
|
||||||
|
|
||||||
|
uint16_t playlistEntryDur = 0;
|
||||||
|
|
||||||
|
void loadPlaylist(JsonObject playlistObj) {
|
||||||
|
delete playlistEntries;
|
||||||
|
playlistIndex = -1; playlistEntryDur = 0;
|
||||||
|
JsonArray presets = playlistObj["ps"];
|
||||||
|
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<PlaylistEntry*>(playlistEntries);
|
||||||
|
|
||||||
|
byte it = 0;
|
||||||
|
for (int ps : presets) {
|
||||||
|
if (it >= playlistLen) break;
|
||||||
|
entries[it].preset = ps;
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
|
||||||
|
it = 0;
|
||||||
|
JsonArray durations = playlistObj["dur"];
|
||||||
|
if (durations.isNull()) {
|
||||||
|
entries[0].dur = playlistObj["dur"] | 100;
|
||||||
|
it = 1;
|
||||||
|
} else {
|
||||||
|
for (int dur : durations) {
|
||||||
|
if (it >= playlistLen) break;
|
||||||
|
entries[it].dur = dur;
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = it; i < playlistLen; i++) entries[i].dur = entries[it -1].dur;
|
||||||
|
|
||||||
|
it = 0;
|
||||||
|
JsonArray tr = playlistObj["transition"];
|
||||||
|
if (tr.isNull()) {
|
||||||
|
entries[0].tr = playlistObj["transition"] | (transitionDelay / 100);
|
||||||
|
it = 1;
|
||||||
|
} else {
|
||||||
|
for (int transition : tr) {
|
||||||
|
if (it >= playlistLen) break;
|
||||||
|
entries[it].tr = transition;
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = it; i < playlistLen; i++) entries[i].tr = entries[it -1].tr;
|
||||||
|
|
||||||
|
playlistRepeat = playlistObj[F("repeat")] | 0;
|
||||||
|
playlistEndPreset = playlistObj[F("end")] | 0;
|
||||||
|
|
||||||
|
currentPlaylist = 0; //TODO here we need the preset ID where the playlist is saved
|
||||||
|
}
|
||||||
|
|
||||||
|
void handlePlaylist()
|
||||||
|
{
|
||||||
|
if (currentPlaylist < 0 || playlistEntries == nullptr || presetCyclingEnabled) return;
|
||||||
|
|
||||||
|
if (millis() - presetCycledTime > (100*playlistEntryDur))
|
||||||
|
{
|
||||||
|
presetCycledTime = millis();
|
||||||
|
if (bri == 0 || nightlightActive) return;
|
||||||
|
|
||||||
|
playlistIndex++;
|
||||||
|
if (playlistIndex >= playlistLen) {
|
||||||
|
playlistIndex = 0;
|
||||||
|
if (playlistRepeat == 1) { //stop
|
||||||
|
currentPlaylist = -1;
|
||||||
|
delete playlistEntries;
|
||||||
|
playlistEntries = nullptr;
|
||||||
|
if (playlistEndPreset) applyPreset(playlistEndPreset);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (playlistRepeat > 1) playlistRepeat--;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlaylistEntry* entries = reinterpret_cast<PlaylistEntry*>(playlistEntries);
|
||||||
|
|
||||||
|
jsonTransitionOnce = true;
|
||||||
|
transitionDelayTemp = entries[playlistIndex].tr * 100;
|
||||||
|
|
||||||
|
applyPreset(entries[playlistIndex].preset);
|
||||||
|
playlistEntryDur = entries[playlistIndex].dur;
|
||||||
|
if (playlistEntryDur == 0) playlistEntryDur = 10;
|
||||||
|
}
|
||||||
|
}
|
@ -36,7 +36,7 @@ bool applyPreset(byte index)
|
|||||||
|
|
||||||
void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj)
|
void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj)
|
||||||
{
|
{
|
||||||
if (index == 0) return;
|
if (index == 0 || index > 250) return;
|
||||||
bool docAlloc = fileDoc;
|
bool docAlloc = fileDoc;
|
||||||
JsonObject sObj = saveobj;
|
JsonObject sObj = saveobj;
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ void WLED::loop()
|
|||||||
ArduinoOTA.handle();
|
ArduinoOTA.handle();
|
||||||
#endif
|
#endif
|
||||||
handleNightlight();
|
handleNightlight();
|
||||||
|
handlePlaylist();
|
||||||
yield();
|
yield();
|
||||||
|
|
||||||
handleHue();
|
handleHue();
|
||||||
|
@ -436,6 +436,8 @@ WLED_GLOBAL unsigned long presetCycledTime _INIT(0);
|
|||||||
WLED_GLOBAL byte presetCycCurr _INIT(presetCycleMin);
|
WLED_GLOBAL byte presetCycCurr _INIT(presetCycleMin);
|
||||||
WLED_GLOBAL bool saveCurrPresetCycConf _INIT(false);
|
WLED_GLOBAL bool saveCurrPresetCycConf _INIT(false);
|
||||||
|
|
||||||
|
WLED_GLOBAL int16_t currentPlaylist _INIT(0);
|
||||||
|
|
||||||
// realtime
|
// realtime
|
||||||
WLED_GLOBAL byte realtimeMode _INIT(REALTIME_MODE_INACTIVE);
|
WLED_GLOBAL byte realtimeMode _INIT(REALTIME_MODE_INACTIVE);
|
||||||
WLED_GLOBAL byte realtimeOverride _INIT(REALTIME_OVERRIDE_NONE);
|
WLED_GLOBAL byte realtimeOverride _INIT(REALTIME_OVERRIDE_NONE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user