Reflejar una propiedad del device
Módulo de ejemplo: helloindiwrite — espejo bidireccional de GEOGRAPHIC_COORD.ELEV (un simulador de montura, siempre disponible en cuanto está conectado).
"mirror": {
"permission": 2,
"autoupdate": false,
"e": {
"elevation": {
"type": "float", "directedit": true, "autoupdate": false, "value": 0
}
}
}autoupdate:false en ambos niveles (elemento y propiedad) — ver Reaccionar a una escritura y su trampa del O lógico. Necesario aquí: el valor escrito no pertenece realmente al datastore del módulo, solo tiene sentido una vez devuelto al device. Aplicarlo automáticamente sería engañoso — se mostraría como adquirido antes incluso de que el device haya confirmado algo.
Device → módulo
void HelloIndiWrite::onUpdateProperty(INDI::Property property)
{
if (QString(property.getDeviceName()) != getString("devices", "device")) return;
if (QString(property.getName()) != "GEOGRAPHIC_COORD") return;
INDI::PropertyNumber n = property;
for (unsigned int i = 0; i < n.count(); i++)
{
if (QString(n[i].name) == "ELEV")
{
getEltFloat("mirror", "elevation")->setValue(n[i].value, true);
}
}
}El mismo esquema que helloindi: filtrar por el device y luego el nombre de la propiedad INDI, aquí GEOGRAPHIC_COORD (un vector numérico estándar).
Módulo → device
void HelloIndiWrite::onExternalEvent(OST::ExtEvent event)
{
if (event.ev != OST::ExtEvType::SV || event.prpkey != "mirror" || event.eltkey != "elevation") return;
QJsonObject o = event.data["m"].toObject()[getModuleName()].toObject();
double written = o["p"].toObject()["mirror"].toObject()["e"].toObject()["elevation"].toVariant().toDouble();
sendModNewNumber(getString("devices", "device"), "GEOGRAPHIC_COORD", "ELEV", written);
}Al no aplicarse nada automáticamente, el valor bruto escrito por el cliente debe extraerse a mano de event.data — exactamente el mismo mecanismo que manualname en helloedit. sendModNewNumber(device, propiedad, elemento, valor) lo envía luego al device a través del bus INDI; es la actualización efectiva del verdadero GEOGRAPHIC_COORD.ELEV la que, volviendo por onUpdateProperty() más arriba, cierra el bucle confirmando el valor en mirror.elevation.