/*
Desenvolva o código multitarefas com o FreeRTOS que realiza as seguintes 
ações:

Tarefa 1: Pisca um LED com o período ajustado através de uma variável 
recebida por uma fila (Queue) vinda da Tarefa 3

Tarefa 2: Pisca um LED por 1 segundo, apenas quando a Tarefa 3 envia uma 
notificação

Tarefa 3: Realiza a leitura de uma entrada analógica (conectada a um 
potenciômetro) e utiliza o valor para configurar o tempo de delay (em ms) 
da Tarefa 1, enviando o valor de delay através de uma fila. O valor lido 
do ADC (0 - 4096) deve ser convertido em valores de 0 a 500 ms. Esta tarefa
é executada a cada 3 segundos. Quando o valor do potenciômetro estiver em 0,
 uma notificação deve ser enviada para a Tarefa 2.
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "freertos/semphr.h"


//#include "esp_log.h"

#define pinPot 36
#define LED2 GPIO_NUM_18

float valPot = 0.0;


xTaskHandle recep;
xQueueHandle ledAjust;

void lerPot(void *pvParams)
{
    while (true)
    {
       valPot = map(analogRead(pinPot), 0, 4096, 0, 500);
       printf("Valor potenciometro: %f\n", valPot);
       
       if(valPot == 0){
           xTaskNotify(recep, 10, eNoAction);
           vTaskDelay(2000 / portTICK_PERIOD_MS);
       }
    }
}

void task2(void *params)
{
    while(true)
    {
        ulong respostaTask2 = ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
        printf("Notificação recebida %lu \n", respostaTask2);
        gpio_set_level(LED2, 1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        gpio_set_level(LED2, 0);
        //vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void task1(void *params)
{
    while(true)
    {
        
    }
}

extern "C" void app_main(void)
{
    gpio_pad_select_gpio(LED2);                
    gpio_set_direction(LED2, GPIO_MODE_OUTPUT);// configura LED como saída digital    
    
    ledAjust = xQueueCreate(5, sizeof(float));

    xTaskCreate(&lerPot, "Leitura pot", 2048, NULL, 0, NULL);
    xTaskCreate(&task2, "Receptor", 2048, NULL, 0, &recep);
    //xTaskCreate(&task2, "Display", 2048, NULL, 0, NULL);
}