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
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario