/*
* Program compiles successfully,
* blue led turn on but red doesn't also none of the leds blink, error possibly inside led tasks, alarm active =/= led state
* some changes to blue led task, no changes -> error somewhere else
*/
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#define LED_RED GPIO_NUM_5
#define LED_BLUE GPIO_NUM_4
#define BUTTON_ALARM_BLUE GPIO_NUM_14
#define BUTTON_ALARM_RED GPIO_NUM_27
#define BUTTON_ACK_ALARM_BLUE GPIO_NUM_22
#define BUTTON_ACK_ALARM_RED GPIO_NUM_23
static QueueHandle_t xQueue_red = NULL;
static QueueHandle_t xQueue_blue = NULL;
struct led_blink_task_params
{
gpio_num_t led_gpio;
TickType_t blink_time;
};
struct controll_task_params
{
gpio_num_t alarm_button_gpio;
gpio_num_t ack_button_gpio;
};
static led_blink_task_params red_led_blink_params = {LED_RED, 500};
static led_blink_task_params blue_led_blink_params = {LED_BLUE, 1000};
static controll_task_params red_controll_params = {BUTTON_ALARM_RED, BUTTON_ACK_ALARM_RED};
static controll_task_params blue_controll_params = {BUTTON_ALARM_BLUE, BUTTON_ACK_ALARM_BLUE};
void controlTaskRed(void *pvParameter)
{
uint8_t led_state = 0;
uint8_t prev_led_state;
gpio_num_t alarm_button_gpio = ((controll_task_params *)pvParameter)->alarm_button_gpio;
gpio_num_t ack_button_gpio = ((controll_task_params *)pvParameter)->ack_button_gpio;
while(true)
{
prev_led_state = led_state;
uint8_t alarm_pressed = gpio_get_level(alarm_button_gpio);
uint8_t ack_pressed = gpio_get_level(ack_button_gpio);
if (alarm_pressed == 1)
{
led_state = 1;
}
if (ack_pressed == 1)
{
led_state = 0;
}
if (prev_led_state != led_state)
{
//printf("[controlTaskRed] Led state change: %d\n",led_state);
xQueueSend(xQueue_red, &led_state, 0U);
}
//printf("[controlTaskRed] Led state: %d\n",led_state);
vTaskDelay(1 / portTICK_PERIOD_MS);
}
}
void controlTaskBlue(void *pvParameter)
{
uint8_t led_state = 0;
uint8_t prev_led_state;
gpio_num_t alarm_button_gpio = ((controll_task_params *)pvParameter)->alarm_button_gpio;
gpio_num_t ack_button_gpio = ((controll_task_params *)pvParameter)->ack_button_gpio;
while(true)
{
prev_led_state = led_state;
uint8_t alarm_pressed = gpio_get_level(alarm_button_gpio);
uint8_t ack_pressed = gpio_get_level(ack_button_gpio);
if (alarm_pressed == 1)
{
led_state = 1;
}
if (ack_pressed == 1)
{
led_state = 0;
}
if (prev_led_state != led_state)
{
//printf("[controlTaskBlue] Led state change: %d\n",led_state);
xQueueSend(xQueue_blue, &led_state, 0U);
}
vTaskDelay(1 / portTICK_PERIOD_MS);
}
}
void blinkTaskRed(void *pvParameter)
{
uint8_t led_value = 0;
uint8_t led_state = 0;
gpio_num_t led_gpio = ((led_blink_task_params *)pvParameter)->led_gpio;
TickType_t blink_time = ((led_blink_task_params *)pvParameter)->blink_time;
gpio_reset_pin(led_gpio);
gpio_set_direction(led_gpio, GPIO_MODE_OUTPUT);
while(true)
{
xQueueReceive(xQueue_red, &led_state, 1);
//printf("[blinkTaskRed] Led state: %d\n",led_state);
if (led_state)
{
gpio_set_level(led_gpio, led_value);
led_value = !led_value;
}else
{
led_value = 0;
gpio_set_level(led_gpio, led_value);
}
vTaskDelay(blink_time / portTICK_PERIOD_MS);
}
}
void blinkTaskBlue(void *pvParameter)
{
uint8_t led_value = 0;
uint8_t led_state = 0;
gpio_num_t led_gpio = ((led_blink_task_params *)pvParameter)->led_gpio;
TickType_t blink_time = ((led_blink_task_params *)pvParameter)->blink_time;
gpio_reset_pin(led_gpio);
gpio_set_direction(led_gpio, GPIO_MODE_OUTPUT);
while(true)
{
xQueueReceive(xQueue_blue, &led_state, 1);
//printf("[blinkTaskBlue] Led state: %d\n",led_state);
if (led_state)
{
gpio_set_level(led_gpio, led_value);
led_value = !led_value;
}else
{
led_value = 0;
gpio_set_level(led_gpio, led_value);
}
vTaskDelay(blink_time / portTICK_PERIOD_MS);
}
}
extern "C" void app_main()
{
// queues for passing data between tasks
xQueue_red = xQueueCreate(1, sizeof(uint8_t));
xQueue_blue = xQueueCreate(1, sizeof(uint8_t));
/* Controll tasks */
xTaskCreate(
&controlTaskRed,
"controlTaskRed",
2048,
&red_controll_params,
5,
NULL);
xTaskCreate(
&controlTaskBlue,
"controlTaskBlue",
2048,
&blue_controll_params,
5,
NULL);
/* Blink tasks */
xTaskCreate(
&blinkTaskRed,
"blinkTaskRed",
2048,
&red_led_blink_params,
5,
NULL);
xTaskCreate(
&blinkTaskBlue,
"blinkTaskBlue",
2048,
&blue_led_blink_params,
5,
NULL);
}