#include <stdio.h>
#include <stdlib.h>
#include <driver/gpio.h>
#include "esp_err.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define LED_PIN GPIO_NUM_21

#define TASK_1_NAME       "task 1"
#define TASK_1_STACK_SIZE (configMINIMAL_STACK_SIZE * 4)
#define TASK_1_PRIORITY   (tskIDLE_PRIORITY + 1)

#define TASK_2_NAME       "task 2"
#define TASK_2_STACK_SIZE (configMINIMAL_STACK_SIZE * 4)
#define TASK_2_PRIORITY   (tskIDLE_PRIORITY + 2)

// Declaração das funções
static void task_1(void *arg);
static void task_2(void *arg);

// Declaração dos handles
static TaskHandle_t xtask_handle_1 = NULL;
static TaskHandle_t xtask_handle_2 = NULL;

void app_main(void)
{
    BaseType_t xReturn = pdPASS;

    xReturn = xTaskCreate(&task_1,
                          TASK_1_NAME,
                          TASK_1_STACK_SIZE,
                          NULL,
                          TASK_1_PRIORITY,
                          &xtask_handle_1);

    if (xReturn != pdPASS || xtask_handle_1 == NULL) {
        printf("Erro ao criar a task 1\n");
    }

    xReturn = xTaskCreate(&task_2,
                          TASK_2_NAME,
                          TASK_2_STACK_SIZE,
                          NULL,
                          TASK_2_PRIORITY,
                          &xtask_handle_2);

    if (xReturn != pdPASS || xtask_handle_2 == NULL) {
        printf("Erro ao criar a task 2\n");
    }

    while (1) {
        vTaskDelay(pdMS_TO_TICKS(10000));
    }
}

static void task_1(void *arg)
{
    uint8_t count = 0;

    while (true) {
        if (count == 4) {
            vTaskSuspend(xtask_handle_2);
        }

        if (count > 9) {
            vTaskResume(xtask_handle_2);
        }

        count++;

        ESP_LOGE("main", "%s tick : %d count: %d", __func__, xTaskGetTickCount(), count);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

static void task_2(void *arg)
{
    gpio_pad_select_gpio(LED_PIN);
    gpio_set_direction (LED_PIN, GPIO_MODE_OUTPUT);

    while (true) {
        gpio_set_level(LED_PIN, 0);
        vTaskDelay(500 / portTICK_RATE_MS);
        gpio_set_level(LED_PIN, 1);
        vTaskDelay(500 / portTICK_RATE_MS);
    }
}
esp:0
esp:1
esp:2
esp:3
esp:4
esp:5
esp:6
esp:7
esp:8
esp:9
esp:10
esp:11
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:21
esp:26
esp:33
esp:34
esp:35
esp:36
esp:37
esp:38
esp:39
esp:40
esp:41
esp:42
esp:43
esp:44
esp:45
esp:46
esp:3V3.1
esp:GND.1
esp:3V3.2
esp:GND.7
esp:SDA
esp:SCL
esp:5V.1
esp:GND.3
esp:GND.2
esp:5V.2
esp:GND.4
esp:GND.5
esp:GND.6
esp:5V.3
esp:21.2
led1:A
led1:C
r1:1
r1:2