//inclusão de bibliotecas
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/queue.h>


//Definições de pré processamento
#define LED 2

//handle de filas
QueueHandle_t xFila, xFila1;

//handle de tarefas
TaskHandle_t taskDhtHandle, taskLcdHandle, taskHandle;

//protótipos da tarefas e funções auxiliares
void TaskDht(void *pvParameters);
void TaskLcd(void *pvParameters);

//declarções de variáveis do Rtos e genéricas
BaseType_t xSucessTaskDht, xSucessTaskLcd;

//Inicialização de hardware e parâmetros de software
void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  //criar fila
  xFila=xQueueCreate(10, sizeof(int8_t));
  //teste da criação da fila
  if(xFila==NULL)Serial.println("Criação da fila falhou");
  else Serial.println("Fila criada = xFila");

  //criar as tarefas
  xSucessTaskDht=xTaskCreatePinnedToCore(TaskDht,"TaskDht",configMINIMAL_STACK_SIZE+756,NULL,1,&taskDhtHandle,1);
  if(xSucessTaskDht==pdFAIL) Serial.println("Falha na criação da Task para o DHT");
  xSucessTaskLcd=xTaskCreatePinnedToCore(TaskLcd,"TaskLcd",configMINIMAL_STACK_SIZE+756,NULL,1,&taskLcdHandle,0);
  if(xSucessTaskLcd==pdFAIL) Serial.println("Falha na criação da Task para o LCD");
}

// funções recorrentes e tarefas
void loop() {
  digitalWrite(LED,!digitalRead(LED));
  vTaskDelay(pdMS_TO_TICKS(1000));
}


void TaskDht(void *PvParameters){
  int contador = 0;


  while (true)
  {
    if(contador<=10){
    xQueueSend(xFila,&contador,portMAX_DELAY);
    contador++;
    }
    else contador=0;
  }
  
}


void TaskLcd(void *pvParameters){
  int valorRecebido;
  while (true)
  {
    xQueueReceive(xFila,&valorRecebido,pdMS_TO_TICKS(500));
    Serial.println("o valor recebido: "+ String(valorRecebido)); 
    vTaskDelay(1000);
  }
}