
#ifndef MqttSensManagerDef
#define MqttSensManagerDef 1

/*
 * cambiar en lugar de a topic a variable----------
  SENS_DIGI_IN y SENS_ANALOG_IN
  publican un topic (set) con el valor correspondiente

 SENS_DIGI_OUT
 escuchara los set de un topic y publicara el get

 SENS_DHT22,//sensor temperatura y humedad
 
  sensor dobles de tipo SENS_ANALOG_IN
  publicaran set del topic asociado pñadiendo  /t/set /h/set
  para temperatura y humedad
  

   SENS_BMP180,//sensor presion
   sensor triple SENS_ANALOG_IN
   ublicaran set del topic asociado pñadiendo  /t/set /p/set /a/set
  para temperatura, presion, altitud

 */
 #include <SimpleDHT.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <PubSubClient.h>

class PubSubClient;
class MqttVarManager;
struct DhtExt
{
  byte ivarH;//puntero a variable humedad
  SimpleDHT22 *p;
};
struct BmpExt
{
  byte ivarP;
  byte ivarA;
  int pinScl;
  Adafruit_BMP085 *p;
};
struct DinEx
{
  volatile bool change;
};
union MqttInfEx//informacion extra segun sensor
{
  DhtExt dht;
  BmpExt bmp;
  DinEx din;
};
class MqttSensor
{
  public:
  
  enum Tipo_sens//indica el tipo de sensor
  {
      SENS_NO_ASIG=0,//sensor sin asignar
      SENS_DHT22,//sensor temperatura y humedad
      SENS_BMP180,//sensor presion
      SENS_ANALOG_IN,//sensor analogico in
      SENS_DIGI_IN,//sensor digital in (algo con 2 estados)
      SENS_DIGI_OUT,//sensor digital out
      SENS_DIGI_IN_PULSANTE//pensado para pulsadores (Publicara un put)
      //SENS_DIGI_IN_OUT//sensor doble de entrada y salida (dos pines que tienen que tener el mismo valor)
  };

  enum Tipo_flags//indica el tipo de sensor
  {
      FLAG_NEG=0x01,//indica que el resultado del sensor hay que negarlo (valor invertido)
      FLAG_INMED=0x02//indica que es un sensor de actualizacion inmediata (interruptores ...) (TODO)
      
      
  };
  
  
  byte tipo;//tipo sensor
  byte flags;//flags sensor
  int pin;//pin de conexion scl para bmp
  byte ivar;//indice a variable
  MqttInfEx ie;//informacion extra
  
  MqttSensor();
  
};

//array de sensores--------------------------------------------------------------
class MqttSensArray
{
  public:
  MqttSensor sens[12];//array de variables
  int n;
  
  
  MqttSensArray();

  MqttSensor* Get(int i);

  int Add(MqttSensor* var);
  
};

//array de sensores--------------------------------------------------------------
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion0();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion1();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion2();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion3();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion4();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion5();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion6();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion7();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion8();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion9();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion10();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion11();
 ICACHE_RAM_ATTR void MqttSensManagerInterrupcion12();
 
class MqttSensManager
{
  public:
  static MqttSensManager* pMqttSensManager;
  MqttSensArray sens;//array de variables
  MqttVarManager* vars;
  PubSubClient *client_qqtt;

  SimpleDHT22 cdht;//clase para leer de dht
  Adafruit_BMP085 *bmp;//clase bmp

  bool bloqueo_sens;//bloquea todos los sensores (para poder editarlos)

  int ind_interrup[13];
  int  n_inter;//numero de interrupciones


  unsigned long  tiempo_sens;
  unsigned long incre_tsens;
  
  MqttSensManager();

  void Config(MqttVarManager* varTopics);
  int Add(MqttSensor* var);
  
  void inicia();
  void loop();
  int OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado

  
  void AddSensor(MqttSensor* sens);
  //
  //funcion add sensor
  void AddHDT22(int pin, char* topic);
  void AddBMP180(int sda,int scl, char* topic);
  void AddDin(int pin, char* topic);//añade variable digital que se actualiza de manera instantanea
  void AddDinAccion(int pin, char* topic);//variable que solo publica en el cambio
  
  //funciones auxiliares------------
  
   MqttSensor* Get(int i);

   void inicia(int i);
  
  void procesaSens();
  void procesaInterrupciones();
  void procesaSensor(int i);
  
  //auxiliares de interrupciones-----------
  void ConfiguraInterrupcion(int i);
  void OnInterrupcion(int i);
 
};


/*
*/
#endif
