#include <Arduino.h>
//#include <FreeRTOS.h>
//#include <DHT.h>
#include <dht.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

#define DHTPIN GPIO_NUM_4
#define DHTTYPE DHT22
const int portaLDR = GPIO_NUM_35;


float temperature = 0.0;
float luz = 0.0;
float ax,ay,az = 0.0;
float gx,gy,gz = 0.0;
int LEDPIN = 2;
String  ledState = "OFF";

//prototipos das funcoes
/*
void lerDHT11(void* parametro);
void lerMPU(void* parametro);
void lerBH(void* parametro);
*/
void taskColetaDados(void* parametro);
//void exibirLeitura(void* parametro);
void taskEnviaDados(void* parametro);


//objetos dos sensores
Adafruit_MPU6050 mpu;
//DHT dht(DHTPIN, DHTTYPE);
dht DHT;

//manipuladores das filas

QueueHandle_t LeituraSensores;

typedef char mensagem_t[40];

//config das filas

const uint numeroDeItensDaFila = 5;
const uint tamanhoDeCadaItem = sizeof(mensagem_t) / sizeof(mensagem_t);


void setup() {
  pinMode(LEDPIN, OUTPUT);
  pinMode(portaLDR, INPUT);
  pinMode(DHTPIN, INPUT);
  Serial.begin(115200);
  Wire.begin();

  //Inicializa DHT11
  //dht.begin();

  // Inicializa servidor
  //connectToWifi();
  //server.begin();
  delay(1000);
  //beginServer();

  //criacao das filas
  LeituraSensores = xQueueCreate(numeroDeItensDaFila, tamanhoDeCadaItem);

  //Criacao das tarefas

  xTaskCreatePinnedToCore(
    taskColetaDados,
    "Ler Sensores",
    2000,
    NULL,
    1,
    NULL,
    APP_CPU_NUM
  );

  xTaskCreatePinnedToCore(
    taskEnviaDados,
    "Envia dados",
    2000,
    NULL,
    1,
    NULL,
    APP_CPU_NUM
  );

}

void loop() {
  vTaskDelete(NULL);
}

void taskColetaDados(void* parametro){
  float h = 0.0, t = 0.0;
  float lux = 0.0;
  mensagem_t mensagemEnviadaSensores;
  while(1){
    DHT.read22(DHTPIN);
    sensors_event_t a, g, temp;
    mpu.getEvent(&a, &g, &temp);
    ax = a.acceleration.x;
    ay = a.acceleration.y;
    az = a.acceleration.z;
    gx = g.gyro.x;
    gy = g.gyro.y;
    gz = g.gyro.z;

    luz = analogRead(portaLDR);

    vTaskDelay(3000/portTICK_PERIOD_MS);
    /*
    h = dht.readHumidity();
    t = dht.readTemperature();
    */
    t = DHT.temperature;
    h = DHT.humidity;

    temperature = t;
/*
    if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
    */
    Serial.print("Temperatura(°C)/Umidade(%): ");
    Serial.print(t);
    Serial.print("/");
    Serial.println(h);
    Serial.print("Luz(lx): ");
    Serial.println(lux);
    //char msgSens[80] = "%f %f %f %f %f %f %f %f";
    sprintf(mensagemEnviadaSensores, "valores: %f %f %f %f %f %f %f %f",ax,gx,ay,gy,az,gz,t,luz);
    //mensagemEnviadaSensores = "Funciona";
    if(!xQueueSend(LeituraSensores, &mensagemEnviadaSensores, 5000)){
      Serial.println("Não foi possível enviar a mensagem, a fila está cheia!");
    }
  }
}

void taskEnviaDados(void* parametro){
  mensagem_t mensagemRecebida;
  while(1){
    if(xQueueReceive(LeituraSensores, &mensagemRecebida, 5000)){
      Serial.println(mensagemRecebida);      
  }
    else{
      Serial.println("Nenhuma mensagem disponível na fila.");
    }
    vTaskDelay(6000/portTICK_PERIOD_MS);
  }
}