Skip to content

Orientado a Eventos

Rhomb.IoT incorpora la librería Puf para desarrollo orientado a eventos. Se diseñó esta librería como parte del sistema modular, para permitir que distintos módulos se comuniquen entre si en los momentos oportunos.

La librería ofrece principalmente dos métodos:

  • Emitir un evento: puf::emit(uint8_t EV_NAME, uint8_t param);
  • Escuchar un evento: puf::on(uint8_t EV_NAME, uint8_t callback());

Para entender como funciona el sistema orientado a eventos de Rhomb.IoT vamos a poner de ejemplo el módulo de creación de mensajes, que se utiliza para crear los datos que se transmiten al servidor. Cuando se crea un mensaje se necesita que otros módulos añadan información al mensaje, por ejemplo el módulo de temperatura querrá añadir la ultima lectura de temperatura al mensaje, el módulo GPS querrá añadir la geolocalización, etc.

Resumiendo el código sucede lo siguiente:

// Archivo msg/msg.h

  // 1) informamos de que se quiere crear un mensaje de tipo "sensing"
  uint8_t createMessage () {
    puf::emit(EV_CREATE_MSG, EV_CUSTOM_MSG_SENSING);
  }

// En cualquier otro archivo.h:

  // 2 ) escuchamos el evento de creación de mensajes
  uint8_t init() {
    // Cuando se produzca este evento ejecutaremos el callback onCreateMsg
    puf::on(EV_CREATE_MSG, onCreateMsg);
  }
  // 3) se ejecuta el callback asignado al evento
  uint8_t onCreateMsg () {
    // In the original source, 23.5 is a value from a float var
    msg::add("temp", "23.5");
  }

En el anterior ejemplo, el módulo msg emite el evento EV_CREATE_MSG utilizando el método puf::emit(), en otra parte del código, otro módulo escucha este evento utilizando puf::on().

Existen una serie de eventos disponibles con un nombre determinado. Cualquier módulo puede emitir o escuchar un evento. Un módulo no puede crear sus propios eventos, si no que debe atender a los eventos que están creados por defecto.

En el archivo core/names.h se encuentra el listado de eventos disponibles:

// NOTA: Esta lista puede estar desactualizada, revisa la ultima versión del código
// PUF EVENTS
#define EV_CUSTOM 0x01
#define EV_BEFORE_LOOP 0x002
#define EV_AFTER_LOOP 0x03
#define EV_BEFORE_SLEEP 0x10
#define EV_AFTER_SLEEP 0x11
#define EV_INIT 0x20
#define EV_CHANGE_OPMODE 0x30
#define EV_TICK1 0x50
#define EV_TICK2 0x51
#define EV_CREATE_MSG 0x60
#define EV_MSG_CREATED 0x61
#define EV_MSG_TRANSMITTED 0x62
#define EV_MSG_FAILED 0x63
#define EV_ISR 0x70
#define EV_ERROR 0x80

// PUF CUSTOM EVENTS
#define EV_CUSTOM_DEVICE_NAME_SET 0x01
#define EV_CUSTOM_DEVICE_ID_SET 0x02
#define EV_CUSTOM_NET_READY 0x03
#define EV_CUSTOM_MSG_SENSING 0x04
#define EV_CUSTOM_MSG_LOGIN 0x05
#define EV_CUSTOM_MSG_ALERT 0x06
#define EV_CUSTOM_MSG_END 0x06
Event Description
EV_CUSTOM Un evento especial, el cual pasa al callback uno de los parámetros EV_CUSTOM_X disponibles
EV_BEFORE_LOOP Se ejecuta cada vez que entramos al loop del programa. Útil para realizar una operación de forma repetitiva y constante.
EV_AFTER_LOOP Se ejecuta antes de salir del loop. Luego de salir del loop se vuelve a entrar, por lo que seguidamente tras este evento se ejecutará EV_BEFORE_LOOP.
EV_BEFORE_SLEEP Se emite antes de iniciar el modo sleep. Los módulos pueden aprovechar esto para estalbecer configuraciones de bajo consumo.
EV_AFTER_SLEEP Al salir del modo sleep y volver al modo normal.
EV_INIT Tras un reset, cuando todos los módulos se han configurado. Wue un módulo esté configurado no implica que esté funcionando correctamente, por ejemplo el nódulo Net todavía no ha realizado una conexión a internet por lo que se desconoce si la red funciona correctamente.
EV_CHANGE_OPMODE Cada vez que se cambia el modo operacional.
EV_TICK1 Cuando se produce el intervalo de tiempo principal. Este intervalo se utiliza para el envío de mensajes al servidor.
EV_TICK2 Cuando se produce el intervalo de tiempo secundario.
EV_CREATE_MSG Cuando se va a crear un mensaje. Los módulos escuchan este evento para añadir información a los mensajes.
EV_MSG_CREATED Cuando el mensaje se ha creado. Se puede utilizar msg::getMessage(char* buf) para obtener el mensaje creado.
EV_MSG_TRANSMITTED Cuando el mensaje se ha transmitido al servidor.
EV_MSG_FAILED Cuando falla la transmisión de un mensaje
EV_ISR Cuando se produce una interrupción. El callback recibe como parámetro el número de pin que ocasiona la interrupción
EV_ERROR Cuando se produce algún error. El callback recibe como parámetro el código de error.

Uso de Memoria RAM

Puf utiliza memoria estática para definir cúantos eventos se pueden crear y cuantos callbacks puede contener cada evento.

Comments