diff --git a/src/main.cpp b/src/main.cpp index 64f3529d..8a143488 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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; @@ -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) } } @@ -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) } } @@ -325,7 +328,7 @@ void setup() { false); #endif - xSemaphoreGive(effectSemaphore); // Allow effectTask to run first + xSemaphoreGive(lowLevelSemaphore); // 🌙 xTaskCreateUniversal(effectTask, // task function