

#include "Sensores.h"

void SensorDht::process()
    {
      if (!Utiles::isTime(&tt, TIMER_DHT)) //solo actualiza cada 2 segundos
        return;

      //Necesita unos cuantos intentos para estar operativo
      for (int i = 0; i < TRIES_DHT; i++)
      {
        if (StaticSimpleDHT.read2(pindht, &t, &h, NULL) != SimpleDHTErrSuccess)
        {
          delay(WAIT_TRIES_DHT);
          continue;
        }
        else
        {
          //Utiles::printCOM("Leido DHT");
          i = TRIES_DHT;
        }
      }
    }

    //Inicializa el sensor
    SensorDht::SensorDht(int pinSensor)
    {
      pindht = pinSensor;
      tt = millis();
    }

    //Devuelve el valor de Humedad
    float SensorDht::GetH()
    {
      process();
      return h;
    }
    //Devuelve el valor de Temperatura
    float SensorDht::GetT()
    {
      process();
      return t;
    }
	//------------------------------------------------------------------------------------------------------------
	 void SensorBMP::process()
    {
      if (!Utiles::isTime(&tt, TIMER_BMP)) //solo actualiza cada 2 segundos
        return;

      if (! bmp.performReading()) {
        Utiles::printCOM("Fallo al leer sensor BMP :(");
        return;
      }

      t = bmp.temperature;
      p = bmp.pressure / 100.0;
      a = bmp.readAltitude(SEALEVELPRESSURE_HPA);

     // Utiles::printCOM("Leido BMP");
    }

    //Inicializa el sensor
    SensorBMP::SensorBMP(int pin_sck_bmp, int pin_miso_bmp, int pin_mosi_bmp, int pin_cs_bmp )
    {
      tt = millis();
      if (! bmp.begin_SPI(pin_cs_bmp, pin_sck_bmp, pin_miso_bmp, pin_mosi_bmp))
        Utiles::printCOM("No se ha encontrado sensor BMP");

      bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
      bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
      bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
      bmp.setOutputDataRate(BMP3_ODR_50_HZ);
    }

    //Devuelve el valor de Presion
    float SensorBMP::GetP()
    {
      process();
      return p;
    }
    //Devuelve el valor de Temperatura
    float SensorBMP::GetT()
    {
      process();
      return t;
    }
    //Devuelve el valor de Altitud
    float SensorBMP::GetA()
    {
      process();
      return a;
    }
	
		//------------------------------------------------------------------------------------------------------------
		
	SensorAcelerometro::SensorAcelerometro()
    {
      accel = Adafruit_LSM303_Accel_Unified(54321);
      mag = Adafruit_LSM303_Mag_Unified(12345);
    }

    bool SensorAcelerometro::Init()
    {
      if (!accel.begin())
      {
        return false;
      }

      mag.enableAutoRange(true);
      if (!mag.begin())
      {
        return false;
      }
      return true;
    }

    void SensorAcelerometro::process()
    {
      if (!Utiles::isTime(&tt, TIMER_ACELER)) //solo actualiza cada 2 segundos
        return;
      accel.getEvent(&event_a);
      mag.getEvent(&event_m);
    }

    float SensorAcelerometro::GetAx()//m/s^2
    {
      process();
      return event_a.acceleration.x;
    }
    float SensorAcelerometro::GetAy()//m/s^2
    {
      process();
      return event_a.acceleration.y;
    }
    float SensorAcelerometro::GetAz()//m/s^2
    {
      process();
      return event_a.acceleration.z;
    }
    float SensorAcelerometro::GetMx()//Gauss
    {
      process();
      return event_m.magnetic.x;
    }
    float SensorAcelerometro::GetMy()//Gauss
    {
      process();
      return event_m.magnetic.y;
    }
    float SensorAcelerometro::GetMz()//Gauss
    {
      process();
      return event_m.magnetic.z;
    }
