22 de noviembre de 2019

Callback Function - Arduino


A partir de C++11 se puede usar funciones invocables sin importar de que tipo sean, es decir, si es puntero de clase o una función suelta.

 Ejemplo:

Declaramos un tipo de dato, con los parámetros de la función:

typedef std::function<void(String,String)> IoTOnOffError; 

Esto es similar a:

typedef void(*IoTOnOffError)(String,String);

En una clase tenemos la declaración del ejemplo así:

La función/método que guarda el blanco a invocar:

void onError(IoTOnOffError _callback);

Y la variable que tiene el blanco:

IoTOnOffError _error_callback;


Para su invocación se puede llamar usando diferentes maneras, pero hay dos principales, función suelta o que el método corresponda a una clase.

Función suelta:

Se tiene declarada la función:

void error(String source, String error) {
  Serial.print(source + ": " + error);
  blink();
}

Y solo se inicializa de esta forma:

iotOnOff.onError(error);


De esta forma pasamos el nombre de la función, ya que coincide con la firma de IoTOnOffError

Método que corresponda a una clase:

void IotOnOff::error(String source, String error) {
  Serial.print(source + ": " + error);
}


Para inicializar el objeto usamos una funciona lambda, esto crea un método que invocara el llamado con el contexto del objeto:

clase_abc.onError([this](String source, String error) mutable { this->error(source, error); return;});



Ahora el llamado a la función se hace igual en todos los casos, se valida que este inicializada para proceder a su invocación:

 if (_error_callback) {
    _error_callback("ON_OFF", source + ": " + error);
  }


Se debe incluir:

#include <functional>


Notas y Referencias

No hay comentarios:

Publicar un comentario