130 lines
3.1 KiB
C++
130 lines
3.1 KiB
C++
/*#if ARDUINO >= 100
|
|
#include "Arduino.h"
|
|
#else
|
|
#include "WProgram.h"
|
|
#endif*/
|
|
#ifndef MqttvarManagerDef
|
|
#define MqttvarManagerDef 1
|
|
#include "MqttDefines.h"
|
|
|
|
|
|
class PubSubClient;
|
|
//array de topic
|
|
class MqttTopicAttay
|
|
{
|
|
char def[1];
|
|
public:
|
|
|
|
char str[MAXSTR];//topic de mqtt asociado
|
|
int ind[MAXVAR];
|
|
int nst;
|
|
int n;
|
|
MqttTopicAttay();
|
|
|
|
char* Get(int i);
|
|
int Get(char *topic);
|
|
int Add(char *topic);
|
|
|
|
};
|
|
|
|
union MQTTvalor
|
|
{
|
|
float f;
|
|
byte i;
|
|
};
|
|
|
|
class MqttVar
|
|
{
|
|
public:
|
|
enum TipoFlags//indica el tipo de sensor
|
|
{
|
|
OUT_VAR=0x01,//variable de salida (acepta set)
|
|
IN_VAR=0x02,//variable de entrada (publica get) (publica cada x tiempo)
|
|
PRIV_VAR=0x04,//variable privada de entrada (acepta get como si fueran set)
|
|
FLOAT_VAR=0x08,//variable en coma flotante
|
|
ACCION_VAR=0x10,//variable de accion (publica en cada cambio onchange si se le llama como publicar)
|
|
VOLATILE_VAR=0x20, //marca variable que una vez revisada se cambia internamente su valor (usado en desencadenadores para variables de accion)
|
|
CHANGE_VAR=0x40, //publica con set en lugar de get
|
|
INTERNAL_VAR = 0x80//no publica
|
|
};
|
|
|
|
public:
|
|
//generales---------------------------------------------------------------------
|
|
byte flags;
|
|
MQTTvalor val;//valor de la variable (tiene que ser union porque puede ser double)
|
|
byte topic;//topic de mqtt asociado
|
|
|
|
MqttVar();
|
|
};
|
|
|
|
|
|
//array de variables--------------------------------------------------------------
|
|
class MqttVarArray
|
|
{
|
|
public:
|
|
MqttVar data[MAXVAR];//array de variables
|
|
int n;
|
|
|
|
|
|
MqttVarArray();
|
|
|
|
MqttVar* Get(int i);
|
|
|
|
MqttVar* GetVar(int itopic);
|
|
|
|
int Add(MqttVar* var);
|
|
|
|
|
|
};
|
|
|
|
class MqttOnVarChangeListenner;
|
|
//manager de variables------------------------------------------------------
|
|
class MqttVarManager
|
|
{
|
|
MqttVarArray _v;
|
|
MqttTopicAttay _t;
|
|
MqttOnVarChangeListenner* onChangeListener[2];
|
|
int nListenner;
|
|
public:
|
|
|
|
MqttVarArray* vars;//variables mqtt
|
|
MqttTopicAttay* topics;
|
|
PubSubClient* client_qqtt;//cliente mqtt
|
|
|
|
unsigned long tiempo_var;
|
|
unsigned long incre_tvar;
|
|
|
|
MqttVarManager();
|
|
void config(MqttVarArray *vArray=NULL, MqttTopicAttay* t=NULL);
|
|
void SetTimeRefres(int seg);
|
|
|
|
void inicia(PubSubClient *client_qqtt);//inicia variables si hace falta
|
|
void Suscribe();//subscribe variables a mqtt
|
|
void OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado
|
|
void loop();//publica datos variables
|
|
|
|
|
|
//funciones auxiliares----------------------------
|
|
void AddListenner(MqttOnVarChangeListenner *pOnChangeListener);
|
|
MqttVar* Get(int i);
|
|
int GetId(char* topic);//devuelve el id de una variable
|
|
|
|
int AddVar(byte flags, char*topic);
|
|
int AddVirtualOutVarInt( char*topic);
|
|
int AddInternalVarFloat( char*topic);
|
|
int AddInternalVarInt( char*topic);
|
|
int AddPrivadaVarFloat(char* topic);
|
|
int AddPrivadaVarInt(char* topic);
|
|
void PublicaVars();
|
|
void PublicaVar(int ivar);
|
|
void OnChange(int ivar, bool publica);
|
|
|
|
void ResetVolatileVar();
|
|
void InvierteVar(int ivar);
|
|
void SetVal(int ivar,MQTTvalor val);
|
|
};
|
|
|
|
/*
|
|
*/
|
|
#endif
|