//#include //este para esp8266 #include #include "MqttDefines.h" #include "MqttVarManager.h" #include "MqttUtiles.h" #include #include MqttTopicAttay::MqttTopicAttay() { n=0; nst=0; def[0] = 0; } char* MqttTopicAttay::Get(int i) { if (i < 0 || i >= n) return def; return &str[(ind[i])]; } int MqttTopicAttay::Get(char *topic) { for(int i=0; i(int)0) { return i; } i=n; if (n >= MAXVAR) return-1; n=n+1; ind[i]=nst; nst=nst+strlen(topic)+1; if (nst > MAXSTR) { n--; return-1; } strcpy(Get(i), topic); return i; } //******************************************************************* MqttVar::MqttVar() { flags=0; val.f=0; topic=0; } //******************************************************************* MqttVarArray::MqttVarArray() { n=0; } MqttVar* MqttVarArray::Get(int i) { if (i < 0 || i >= n) { #ifdef DEBUG_PS Serial.print("qttVarArray:: Get var no encontrada: "); Serial.print(i); Serial.print(" n: "); Serial.println(i); #endif return NULL; } return &(data[i]); } MqttVar* MqttVarArray::GetVar(int itopic) { for(int i=0; i= MAXVAR) { #ifdef DEBUG_PS Serial.print("MqttVarArray::Add max var alcanzado: "); Serial.println(n); #endif return -1; } data[n]=*var; n++; return n-1; } //******************************************************************* MqttVarManager::MqttVarManager() { tiempo_var=0; SetTimeRefres(30); nListenner=0; for (int i=0; in; i++) { v=vars->Get(i); if((v->flags & f) && !strcmp(topics->Get(v->topic),buf)) { if(v->flags & MqttVar::FLOAT_VAR) { float ff=v->val.f; val.f=atof(payload); } else { int ii=v->val.i; val.i=atoi(payload); } SetVal(i, val); break;//suponemos solo una variable con el mismo topic } } //if(res>=0) // OnChange(res, isSet); return; } void MqttVarManager::loop() { if(MqttUtiles::pasa_incre(&tiempo_var, incre_tvar)) { #ifdef DEBUG_PS Serial.println("Procesa vars"); #endif PublicaVars(); } } void MqttVarManager::PublicaVar(int ivar) { char buffer_t[MAXTOPICVAR]; char buffer_p[MAXTOPICVAR]; MqttVar* v=vars->Get(ivar); if (v->flags & MqttVar::INTERNAL_VAR) return; else if(v->flags & MqttVar::CHANGE_VAR) { sprintf(buffer_t, "%s/set",topics->Get(v->topic)); #ifdef DEBUG_PS Serial.print("Publica /set var: "); Serial.println(buffer_t); #endif } else//in var { sprintf(buffer_t, "%s/get",topics->Get(v->topic)); #ifdef DEBUG_PS Serial.print("Publica get var: "); Serial.println(buffer_t); #endif } //Publica valor if(v->flags & MqttVar::FLOAT_VAR) dtostrf(v->val.f,3, 2, buffer_p); else sprintf(buffer_p, "%d", (int)v->val.i); client_qqtt->publish(buffer_t, buffer_p); } void MqttVarManager::PublicaVars() { byte f=MqttVar::IN_VAR; MqttVar* v; for(int i=0; in; i++) { v=vars->Get(i); if(v->flags & f) PublicaVar(i); } } void MqttVarManager::inicia(PubSubClient* client_mqtt) { client_qqtt=client_mqtt; } void MqttVarManager::Suscribe() { //suscribe a mqtt------------ char buffer_t[MAXTOPICVAR]; MqttVar* v; for(int i=0; in; i++) { v=vars->Get(i); if(v->flags & MqttVar::OUT_VAR)//suscribe al set { sprintf(buffer_t, "%s/set",topics->Get(v->topic)); client_qqtt->subscribe(buffer_t); } if(v->flags & MqttVar::PRIV_VAR)//suscribe al get { sprintf(buffer_t, "%s/get",topics->Get(v->topic)); client_qqtt->subscribe(buffer_t); } } } int MqttVarManager::AddVar(byte flags, char*topic) { MqttVar v; v.flags=flags; v.topic=topics->Add(topic); return vars->Add(&v); } int MqttVarManager::AddPrivadaVarFloat(char* topic) { return AddVar((byte)(MqttVar::PRIV_VAR | MqttVar::FLOAT_VAR | MqttVar::CHANGE_VAR | MqttVar::ACCION_VAR), topic); } int MqttVarManager::AddPrivadaVarInt(char* topic) { return AddVar((byte)(MqttVar::PRIV_VAR | MqttVar::CHANGE_VAR | MqttVar::ACCION_VAR), topic); } int MqttVarManager::AddInternalVarFloat( char* topic) { return AddVar((byte)(MqttVar::PRIV_VAR|MqttVar::FLOAT_VAR| MqttVar::CHANGE_VAR|MqttVar::ACCION_VAR | MqttVar::INTERNAL_VAR),topic); } int MqttVarManager::AddInternalVarInt( char* topic) { return AddVar((byte)(MqttVar::PRIV_VAR| MqttVar::CHANGE_VAR|MqttVar::ACCION_VAR | MqttVar::INTERNAL_VAR),topic); } int MqttVarManager::AddVirtualOutVarInt( char* topic) { return AddVar((byte)(MqttVar::IN_VAR|MqttVar::OUT_VAR|MqttVar::ACCION_VAR),topic); } MqttVar* MqttVarManager::Get(int i) { return vars->Get(i); } int MqttVarManager::GetId(char* topic) { #ifdef DEBUG_PS Serial.println("MqttVarManager::GetId"); #endif int itop= topics->Get(topic); #ifdef DEBUG_PS Serial.println("MqttVarManager::GetId busca var"); #endif for(int i=0;in; i++) { if(vars->Get(i)->topic==itop) return i; } #ifdef DEBUG_PS Serial.println("MqttVarManager::GetId variable no encontrada"); #endif return -1; } void MqttVarManager::OnChange(int ivar, bool publica) { #ifdef DEBUG_PS Serial.println("MqttVarManager::OnChange"); #endif if(publica) { MqttVar* v=vars->Get(ivar); byte f= MqttVar::ACCION_VAR; if(v->flags & f) { PublicaVar(ivar); } } for (int i=0; iOnVarChange(ivar); } } void MqttVarManager::AddListenner(MqttOnVarChangeListenner *pOnChangeListener) { onChangeListener[nListenner++]=pOnChangeListener; } void MqttVarManager::ResetVolatileVar() { for(int i=0; in; i++) { MqttVar* v=vars->Get(i); if(v->flags& MqttVar::VOLATILE_VAR) { if(v->flags & MqttVar::FLOAT_VAR) v->val.f=0; else v->val.i=0; } } } void MqttVarManager::InvierteVar(int ivar) { MqttVar* v=vars->Get(ivar); if(v->flags & MqttVar::FLOAT_VAR) { v->val.f=100.0-v->val.f; } else v->val.i=1-v->val.i; OnChange(ivar, true); } void MqttVarManager::SetVal(int ivar,MQTTvalor val) { #ifdef DEBUG_PS Serial.print("MqttVarManager::SetVal int i: "); Serial.print( val.i); Serial.print(" f: "); Serial.println( val.f); #endif MqttVar* v=vars->Get(ivar); bool cambia = false; if (v->flags & MqttVar::FLOAT_VAR) cambia = val.f != v->val.f; else cambia = val.i != v->val.i; v->val=val; if(cambia) OnChange(ivar, true); }