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 losgiveMeA*()), la propiedadsignals(estado + descripción) — nada automático, unBasemoduledesnudo 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 controladorloadedFamilies-<nombre>, que cualquier maestro puede referenciar para dejar que el usuario elija una instancia. Sin ninguna relación con INDI:declareFamily()vive en el propioBasemodule.
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
}
}
}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);
}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.