Eine Property des Device widerspiegeln
Beispielmodul: helloindiwrite — bidirektionale Spiegelung von GEOGRAPHIC_COORD.ELEV (ein Montierungs-Simulator, immer verfügbar, sobald verbunden).
"mirror": {
"permission": 2,
"autoupdate": false,
"e": {
"elevation": {
"type": "float", "directedit": true, "autoupdate": false, "value": 0
}
}
}autoupdate:false auf beiden Ebenen (Element und Property) — siehe Auf einen Schreibzugriff reagieren und seine Falle des logischen ODER. Hier notwendig: der geschriebene Wert gehört nicht wirklich zum Datastore des Moduls, er hat nur Sinn, wenn er an das Device zurückgesendet wird. Ihn automatisch anzuwenden wäre irreführend — er würde als übernommen angezeigt, noch bevor das Device überhaupt etwas bestätigt hat.
Device → Modul
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);
}
}
}Dasselbe Schema wie helloindi: zuerst nach dem Device filtern, dann nach dem Namen der INDI-Property, hier GEOGRAPHIC_COORD (ein numerischer Standardvektor).
Modul → 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);
}Da nichts automatisch angewendet wird, muss der vom Client geschriebene Rohwert manuell aus event.data extrahiert werden — genau derselbe Mechanismus wie manualname in helloedit. sendModNewNumber(device, propriété, élément, valeur) sendet ihn anschließend über den INDI-Bus an das Device; es ist die tatsächliche Aktualisierung des echten GEOGRAPHIC_COORD.ELEV, die, über onUpdateProperty() oben zurückkommend, den Kreis schließt, indem sie den Wert in mirror.elevation bestätigt.