libreria-arduino-timeouttask

Librería Arduino Timeout Task

La librería Timeout Task permite evaluar una determinada condición durante un intervalo de microsegundos especificado por el usuario, y ejecutar acciones en función del resultado obtenido durante la espera.

La clase Timeout Task está pensada para la ejecución de tareas costosas computacionalmente, sin que afecte al bucle de ejecución principal. Por ejemplo en comunicaciones, podemos esperar una señal de inicio durante un breve periodo y, si se recibe la señal, iniciar el proceso de recepción/envío propiamente dicho. Otro ejemplo podría ser comprobar si el estado de unas entradas es el esperado, y en caso afirmativo realizar un cálculo o iniciar un actuador.

Por otro lado, Timeout Task también es útil para implementar de forma sencilla un watchdog. Por ejemplo, encender un motor durante un cierto tiempo, y esperar que alcance un pulsador de fin de carrera. En caso de sobrepasar un tiempo razonable, detener el motor por seguridad.

Una instancia Timeout Task dispone de una condición y dos funciones de callback, OkCallback y TimeOutCallback. Al ejecutar la tarea, se evalúa la condición continuamente durante el tiempo especificado. Si en algún momento la condición es cierta, se ejecuta la función de OkCallback. Si, por el contrario, expira el tiempo de Timeout, se ejecuta la acción TimeOutCallback y se devuelve el flujo de control.

Se dispone de dos formas de uso de la librería. Una es instanciar un objeto de la clase TimeoutTask, y llamar a su método Run(). La forma alternativa es llamar directamente al método estático Run().

Manual de uso

Uso como objeto

La clase TimeoutTask puede instanciarse como un objeto a través de su constructor, y activarse con el método Run().

// Constructor
TimeoutTask(unsigned long timeout, bool(*conditionFunc)(), 
  void(*okCallback)(), 
  void(*timeoutCallback)())
{
}

// Ejecuta la TimeoutTask
void Run() const;

Uso con método estático

Alternativamente, podemos ejecutar la TimeoutTAsk a través del método estático Run().

static void Run(unsigned long timeout, 
  ConditionFunc conditionFunc, 
  CallbackAction okCallback, 
  CallbackAction timeoutCallback);

Ejemplos

La librería Timeout Task incluye los siguientes ejemplos para ilustrar su uso.

  • TimeoutTask: Ejemplo como instancia actuando como Timeout
#include "TimeoutTask.h"

const size_t dataLength = 10;
int data[dataLength];
const int bytesLengths = dataLength * sizeof data[0];

TimeoutTask timeoutTask(50000,
  []() { return Serial.available() >= dataLength; },
  []() { Serial.readBytes(reinterpret_cast<byte*>(data), dataLength * sizeof data[0]); },
  nullPtr);

void setup()
{
  timeoutTask.Run();
}

void loop()
{
}
  • StaticTimeOutTask: Ejemplo con método estático Run()
#include "TimeoutTask.h"

const size_t dataLength = 10;
int data[dataLength];
const int bytesLengths = dataLength * sizeof data[0];

void setup()
{
  TimeoutTask::Run(50000,
  []() { return Serial.available() >= dataLength; },
  []() { Serial.readBytes(reinterpret_cast<byte*>(data), dataLength * sizeof data[0]); },
  []() {});
}

void loop()
{
}
  • Watchdog: Ejemplo como método estático actuando como Watchdog
#include "TimeoutTask.h"

const int pinA = 8;
const int pinB = 9;

void moveActuator() {}

void stopActuator() {}

void setup()
{
  TimeoutTask::Run(10000,
  []() { return digitalRead(pinA) && digitalRead(pinB); },
  moveActuator,
  stopActuator);
}

void loop()
{
}

Instalación

  • Descargar la última versión desde GitHub
  • Descomprimir el archivo
  • Copiar en tu carpeta de librerías (normalmente Mis Documentos\Arduino\libraries)
  • Relanzar el IDE de Arduino

github-full