Relación maestro/esclavo

Módulos de ejemplo: hellomaster (el maestro) y helloslave (el esclavo).

Un módulo puede comandar a otro, elegido por instancia (su nombre, no su clase). Este mecanismo no requiere ningún hardware INDI — por eso se cubre aquí en lugar de en el capítulo siguiente.

Del lado del esclavo: declararse disponible

HelloSlave::HelloSlave(...)
    : Basemodule(...)
{
    giveMeAState();                       // propriété "signals" : état + description
    setStateEvent(OST::Idle, "idle", "", "");
    declareFamily("hello");               // famille arbitraire pour cette paire
}
  • giveMeAState() crea, a demanda (como todos los giveMeA*()), la propiedad signals (estado + descripción) — nada automático, un Basemodule desnudo no tiene esta propiedad por defecto.
  • setStateEvent(estado, descripción, evento, descripción-evento, ...) la actualiza de una sola vez.
  • declareFamily(nombre) inscribe el módulo en una familia — lo que alimenta automáticamente una lista de valores de controlador loadedFamilies-<nombre>, que cualquier maestro puede referenciar para dejar que el usuario elija una instancia. Sin ninguna relación con INDI: declareFamily() vive en el propio Basemodule.
void HelloSlave::onExternalEvent(OST::ExtEvent event)
{
    if (event.eltkey == "dowork")
    {
        setStateEvent(OST::Busy, "working", "dowork", "");
        getEltBool("actions", "dowork")->setValue(false, true);
        // ... travail réel ...
        setStateEvent(OST::Ok, "ready", "dowork", "");
    }
}

Del lado del maestro: elegir una instancia y comandar

"slaves": {
  "permission": 2,
  "hasprofile": true,
  "e": {
    "slavemodule": {
      "type": "string",
      "directedit": true, "autoupdate": true,
      "value": "helloslave",
      "listOfValues": "loadedFamilies-hello",
      "listOfValuesIsExternal": true
    }
  }
}
Buena práctica: la propiedad slaves es hasprofile:true

Qué esclavo comandar es una elección del usuario que debe sobrevivir a los reinicios — un maestro que la olvidara volvería a pedir su esclavo en cada recarga del módulo.

otherModuleSetValue(getString("slaves", "slavemodule"), "actions", "dowork", true);

otherModuleSetValue(instancia, propiedad, elemento, valor) envía, por nombre de instancia.

Observar lo que reporta el esclavo

void HelloMaster::onOtherModuleEvent(OST::EvType ev, QString mod, QString prp, QString elt, QVariant data, int line)
{
    if (mod != getString("slaves", "slavemodule")) return;
    if (ev != OST::EvType::ea || prp != "signals") return;

    QJsonObject o = data.toJsonValue().toObject()["e"].toObject();
    getEltLight("etat", "etat")->setValue(OST::IntToState(o["state"].toInt()), true);
}
Un evento difundido a todos, filtrado por cada uno

El controlador difunde el evento de cualquier módulo a todos los módulos cargados — no existe ninguna suscripción explícita que hacer. Le corresponde a onOtherModuleEvent() filtrar él mismo por mod (el nombre de la instancia que le interesa), como arriba.