Skip to content

Commit

Permalink
Add Playlist feature
Browse files Browse the repository at this point in the history
  • Loading branch information
Aircoookie committed Nov 11, 2020
1 parent e28dbb3 commit 3425f2b
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 1 deletion.
4 changes: 4 additions & 0 deletions wled00/fcn_declare.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,10 @@ void setCronixie();
void _overlayCronixie();
void _drawOverlayCronixie();

//playlist.cpp
void loadPlaylist(JsonObject playlistObject);
void handlePlaylist();

//presets.cpp
bool applyPreset(byte index);
void savePreset(byte index, bool persist = true, const char* pname = nullptr, JsonObject saveobj = JsonObject());
Expand Down
5 changes: 5 additions & 0 deletions wled00/json.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

return stateResponse;
Expand Down
106 changes: 106 additions & 0 deletions wled00/playlist.cpp
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion wled00/presets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ bool applyPreset(byte index)

void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj)
{
if (index == 0) return;
if (index == 0 || index > 250) return;
bool docAlloc = fileDoc;
JsonObject sObj = saveobj;

Expand Down
1 change: 1 addition & 0 deletions wled00/wled.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ void WLED::loop()
ArduinoOTA.handle();
#endif
handleNightlight();
handlePlaylist();
yield();

handleHue();
Expand Down
2 changes: 2 additions & 0 deletions wled00/wled.h
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,8 @@ WLED_GLOBAL unsigned long presetCycledTime _INIT(0);
WLED_GLOBAL byte presetCycCurr _INIT(presetCycleMin);
WLED_GLOBAL bool saveCurrPresetCycConf _INIT(false);

WLED_GLOBAL int16_t currentPlaylist _INIT(0);

// realtime
WLED_GLOBAL byte realtimeMode _INIT(REALTIME_MODE_INACTIVE);
WLED_GLOBAL byte realtimeOverride _INIT(REALTIME_OVERRIDE_NONE);
Expand Down

0 comments on commit 3425f2b

Please sign in to comment.