Riflettere una proprietà del device
Modulo di esempio: helloindiwrite — mirroring bidirezionale di GEOGRAPHIC_COORD.ELEV (un simulatore di montatura, sempre disponibile non appena connesso).
"mirror": {
"permission": 2,
"autoupdate": false,
"e": {
"elevation": {
"type": "float", "directedit": true, "autoupdate": false, "value": 0
}
}
}autoupdate:false a entrambi i livelli (elemento e proprietà) — vedi Reagire a una scrittura e la sua insidia dell’OR logico. Necessario qui: il valore scritto non appartiene davvero al datastore del modulo, ha senso solo rinviato al device. Applicarlo automaticamente sarebbe ingannevole — verrebbe mostrato come acquisito prima ancora che il device abbia confermato qualcosa.
Device → modulo
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);
}
}
}Stesso schema di helloindi: filtrare sul device poi sul nome della proprietà INDI, qui GEOGRAPHIC_COORD (un vettore numerico standard).
Modulo → 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);
}Non essendo nulla auto-applicato, il valore grezzo scritto dal client deve essere estratto a mano da event.data — esattamente lo stesso meccanismo di manualname in helloedit. sendModNewNumber(device, proprietà, elemento, valore) lo invia poi al device tramite il bus INDI; è l’aggiornamento effettivo del vero GEOGRAPHIC_COORD.ELEV che, ritornando tramite onUpdateProperty() sopra, chiuderà il ciclo confermando il valore in mirror.elevation.