Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 19 additions & 16 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,7 @@ ModuleLiveScripts moduleLiveScripts = ModuleLiveScripts(&server, &esp32sveltekit
ModuleChannels moduleChannels = ModuleChannels(&server, &esp32sveltekit);
ModuleMoonLightInfo moduleMoonLightInfo = ModuleMoonLightInfo(&server, &esp32sveltekit);

volatile xSemaphoreHandle effectSemaphore = xSemaphoreCreateBinary();
volatile xSemaphoreHandle driverSemaphore = xSemaphoreCreateBinary();
volatile xSemaphoreHandle lowLevelSemaphore = xSemaphoreCreateBinary();

TaskHandle_t effectTaskHandle = NULL;
TaskHandle_t driverTaskHandle = NULL;
Expand All @@ -128,20 +127,22 @@ void effectTask(void* pvParameters) {
for (;;) {
esp32sveltekit.lps++; // 🌙 todo: not moonlight specific?

if (xSemaphoreTake(effectSemaphore, pdMS_TO_TICKS(100)) == pdFALSE) {
if (xSemaphoreTake(lowLevelSemaphore, pdMS_TO_TICKS(100)) == pdFALSE) {
// EXT_LOGW(ML_TAG, "effectSemaphore wait too long"); //happens if no driver!, but let effects continue (for monitor) at 10 fps
//EXT_LOGW(ML_TAG, "effect: semaphore wait too long");
}
else {
layerP.loop(); // run all the effects of all virtual layers (currently only one layer)

layerP.loop(); // run all the effects of all virtual layers (currently only one layer)
static unsigned long last20ms = 0;
if (millis() - last20ms >= 20) {
last20ms = millis();
layerP.loop20ms();
}

static unsigned long last20ms = 0;
if (millis() - last20ms >= 20) {
last20ms = millis();
layerP.loop20ms();
xSemaphoreGive(lowLevelSemaphore);
}

xSemaphoreGive(driverSemaphore);

vTaskDelay(1); // yield to other tasks, 1 tick (~1ms)
}
}
Expand All @@ -152,12 +153,14 @@ void driverTask(void* pvParameters) {
// layerP.setup() done in effectTask

for (;;) {
xSemaphoreTake(driverSemaphore, pdMS_TO_TICKS(100));

layerP.loopDrivers();

xSemaphoreGive(effectSemaphore);
if (xSemaphoreTake(lowLevelSemaphore, pdMS_TO_TICKS(100)) == pdFALSE) {
//EXT_LOGW(ML_TAG, "driver: semaphore wait too long");
}
else {
layerP.loopDrivers();

xSemaphoreGive(lowLevelSemaphore);
}
vTaskDelay(1); // yield to other tasks, 1 tick (~1ms)
}
}
Expand Down Expand Up @@ -325,7 +328,7 @@ void setup() {
false);
#endif

xSemaphoreGive(effectSemaphore); // Allow effectTask to run first
xSemaphoreGive(lowLevelSemaphore);

// 🌙
xTaskCreateUniversal(effectTask, // task function
Expand Down