//queue method
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#define LED_GPIO 2
#define INITIAL_DELAY_MS 1000
#define DELAY_INCREMENT_MS 5000
#define THRESHOLD_MS 10000 // Total run time before delay change
QueueHandle_t delayQueue; // Queue to send updated delay (in ticks)
void blink_task(void *pvParam) {
gpio_reset_pin(LED_GPIO);
gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
TickType_t delayTicks = pdMS_TO_TICKS(INITIAL_DELAY_MS);
xQueueOverwrite(delayQueue, &delayTicks); // Prime queue with initial delay
while (1) {
// Check if queue has a new delay value
TickType_t newDelay;
if (xQueueReceive(delayQueue, &newDelay, 0) == pdTRUE) {
delayTicks = newDelay;
}
// Blink LED ON
gpio_set_level(LED_GPIO, 1);
vTaskDelay(delayTicks);
// Blink LED OFF
gpio_set_level(LED_GPIO, 0);
vTaskDelay(delayTicks);
}
}
void timer_task(void *pvParam) {
// Wait for 10 seconds
vTaskDelay(pdMS_TO_TICKS(THRESHOLD_MS));
// Send upgraded delay
TickType_t upgradedDelay = pdMS_TO_TICKS(INITIAL_DELAY_MS + DELAY_INCREMENT_MS);
xQueueOverwrite(delayQueue, &upgradedDelay);
vTaskDelete(NULL); // Optional: self-destruct the timer task
}
void app_main(void) {
delayQueue = xQueueCreate(1, sizeof(TickType_t)); // Queue holds 1 delay value
xTaskCreate(blink_task, "Blink Task", 2048, NULL, 5, NULL);
xTaskCreate(timer_task, "Timer Task", 1024, NULL, 6, NULL);
}