/* Exemplo de Semáforo - Exemplo de multitasking
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define LED_RED GPIO_NUM_5
#define LED_GREEN GPIO_NUM_2
#define LED_YELLOW GPIO_NUM_4
#define BTN_RED GPIO_NUM_13
struct led_task_parameters_t
{
gpio_num_t led_gpio;
TickType_t blink_time;
};
struct semaforo_normal_task_parameters_t
{
led_task_parameters_t red_led_gpio = {LED_RED, 5000};
led_task_parameters_t yellow_led_gpio = {LED_YELLOW, 5000};
led_task_parameters_t green_led_gpio = {LED_GREEN, 1500};
} semaforo_normal;
struct semaforo_noturno_task_parameters_t
{
led_task_parameters_t yellow_led_gpio = {LED_YELLOW, 500};
} semaforo_noturno;
struct semaforo_emergencia_task_parameters_t
{
led_task_parameters_t red_led_gpio = {LED_RED, 100000};
led_task_parameters_t yellow_led_gpio = {LED_YELLOW, 2500};
led_task_parameters_t green_led_gpio = {LED_GREEN, 0};
} semaforo_emergencia;
static led_task_parameters_t red_led_gpio = {LED_RED, 10000};
static led_task_parameters_t yellow_led_gpio = {LED_YELLOW, 5000};
static led_task_parameters_t green_led_gpio = {LED_GREEN, 10000};
void led_task(void *pvParameter)
{
gpio_num_t led_gpio = ((led_task_parameters_t *)pvParameter)->led_gpio;
TickType_t blink_time = ((led_task_parameters_t *)pvParameter)->blink_time;
uint8_t led_value = 0;
gpio_reset_pin(led_gpio);
gpio_set_direction(led_gpio, GPIO_MODE_OUTPUT);
while (1) {
gpio_set_level(led_gpio, led_value);
led_value = !led_value;
vTaskDelay(blink_time / portTICK_PERIOD_MS);
}
vTaskDelete( NULL );
}
void normal_task(void *pvParameter)
{
gpio_num_t r_led = ((semaforo_normal_task_parameters_t *)pvParameter)->red_led_gpio.led_gpio;
TickType_t r_blink_time = ((semaforo_normal_task_parameters_t *)pvParameter)->red_led_gpio.blink_time;
gpio_num_t y_led = ((semaforo_normal_task_parameters_t *)pvParameter)->yellow_led_gpio.led_gpio;
TickType_t y_blink_time = ((semaforo_normal_task_parameters_t *)pvParameter)->yellow_led_gpio.blink_time;
gpio_num_t g_led = ((semaforo_normal_task_parameters_t *)pvParameter)->green_led_gpio.led_gpio;
TickType_t g_blink_time = ((semaforo_normal_task_parameters_t *)pvParameter)->green_led_gpio.blink_time;
uint8_t r_led_value = 1;
uint8_t y_led_value = 0;
uint8_t g_led_value = 0;
gpio_reset_pin(r_led);
gpio_set_direction(r_led, GPIO_MODE_OUTPUT);
gpio_reset_pin(y_led);
gpio_set_direction(y_led, GPIO_MODE_OUTPUT);
gpio_reset_pin(g_led);
gpio_set_direction(g_led, GPIO_MODE_OUTPUT);
while (1) {
r_led_value = 1;
y_led_value = 0;
g_led_value = 0;
gpio_set_level(r_led, r_led_value);
gpio_set_level(y_led, y_led_value);
gpio_set_level(g_led, g_led_value);
vTaskDelay(r_blink_time / portTICK_PERIOD_MS);
r_led_value = 0;
y_led_value = 0;
g_led_value = 1;
gpio_set_level(r_led, r_led_value);
gpio_set_level(y_led, y_led_value);
gpio_set_level(g_led, g_led_value);
vTaskDelay(g_blink_time / portTICK_PERIOD_MS);
r_led_value = 0;
y_led_value = 1;
g_led_value = 0;
gpio_set_level(r_led, r_led_value);
gpio_set_level(g_led, g_led_value);
int i;
int i_max = 10;
for(i = 0; i < i_max; i++){
gpio_set_level(y_led, y_led_value);
y_led_value = !y_led_value;
vTaskDelay(y_blink_time / portTICK_PERIOD_MS / i_max);
}
}
vTaskDelete( NULL );
}
void noite_task(void *pvParameter)
{
gpio_num_t led_gpio = ((led_task_parameters_t *)pvParameter)->led_gpio;
TickType_t blink_time = 500;
uint8_t led_value = 0;
gpio_reset_pin(led_gpio);
gpio_set_direction(led_gpio, GPIO_MODE_OUTPUT);
while (1) {
gpio_set_level(led_gpio, led_value);
led_value = !led_value;
vTaskDelay(blink_time / portTICK_PERIOD_MS);
}
vTaskDelete( NULL );
}
volatile bool button_pressed = false;
static void gpio_isr_handler(void* arg)
{
button_pressed = true;
}
void button_config()
{
gpio_install_isr_service(0);
printf("configuring button\n");
gpio_reset_pin(BTN_RED);
gpio_set_direction(BTN_RED, GPIO_MODE_INPUT);
gpio_pullup_en(BTN_RED);
gpio_set_intr_type(BTN_RED, GPIO_INTR_POSEDGE);
gpio_isr_handler_add(BTN_RED, gpio_isr_handler, NULL);
printf("config complete\n");
}
void emergencia_task(void *pvParameter)
{
gpio_num_t r_led = ((semaforo_normal_task_parameters_t *)pvParameter)->red_led_gpio.led_gpio;
TickType_t r_blink_time = ((semaforo_normal_task_parameters_t *)pvParameter)->red_led_gpio.blink_time;
gpio_num_t y_led = ((semaforo_normal_task_parameters_t *)pvParameter)->yellow_led_gpio.led_gpio;
TickType_t y_blink_time = ((semaforo_normal_task_parameters_t *)pvParameter)->yellow_led_gpio.blink_time;
gpio_num_t g_led = ((semaforo_normal_task_parameters_t *)pvParameter)->green_led_gpio.led_gpio;
TickType_t g_blink_time = ((semaforo_normal_task_parameters_t *)pvParameter)->green_led_gpio.blink_time;
uint8_t r_led_value = 0;
uint8_t y_led_value = 1;
uint8_t g_led_value = 0;
gpio_reset_pin(r_led);
gpio_set_direction(r_led, GPIO_MODE_OUTPUT);
gpio_reset_pin(y_led);
gpio_set_direction(y_led, GPIO_MODE_OUTPUT);
gpio_reset_pin(g_led);
gpio_set_direction(g_led, GPIO_MODE_OUTPUT);
if (button_pressed) {
printf("*\n");
button_pressed = false;
//xTaskSuspend(xHandle_normal);
while (1) {
r_led_value = 0;
y_led_value = 1;
g_led_value = 0;
gpio_set_level(r_led, r_led_value);
gpio_set_level(g_led, g_led_value);
int i;
int i_max = 10;
for(i = 0; i < i_max; i++){
gpio_set_level(y_led, y_led_value);
y_led_value = !y_led_value;
vTaskDelay(y_blink_time / portTICK_PERIOD_MS / i_max);
}
r_led_value = 1;
y_led_value = 0;
g_led_value = 0;
gpio_set_level(r_led, r_led_value);
gpio_set_level(y_led, y_led_value);
gpio_set_level(g_led, g_led_value);
vTaskDelay(r_blink_time / portTICK_PERIOD_MS);
}
}
vTaskDelete( NULL );
}
extern "C" void app_main()
{
button_config();
TaskHandle_t xHandle_emergencia = NULL;
TaskHandle_t xHandle_normal = NULL;
xTaskCreate(
&noite_task, // task function
"yellow_led_noite_task", // task name
2048, // stack size in words
&yellow_led_gpio, // pointer to parameters
5, // priority
NULL); // out pointer to task handle
xTaskCreate(
&normal_task, // task function
"normal_task", // task name
2048, // stack size in words
&semaforo_normal, // pointer to parameters
5, // priority
&xHandle_normal); // out pointer to task handle
/*
xTaskCreate(
&emergencia_task, // task function
"emergencia_task", // task name
2048, // stack size in words
&semaforo_emergencia, // pointer to parameters
5, // priority
&xHandle_emergencia); // out pointer to task handle
*/
}