Refléter une propriété du device
Module d’exemple : helloindiwrite — mirroir à double sens de GEOGRAPHIC_COORD.ELEV (un simulateur de monture, toujours disponible dès que connecté).
"mirror": {
"permission": 2,
"autoupdate": false,
"e": {
"elevation": {
"type": "float", "directedit": true, "autoupdate": false, "value": 0
}
}
}autoupdate:false aux deux niveaux (élément et propriété) — voir Réagir à une écriture et son piège de l’OU logique. Nécessaire ici : la valeur écrite n’appartient pas vraiment au datastore du module, elle n’a de sens que renvoyée vers le device. L’appliquer automatiquement serait trompeur — elle serait affichée comme acquise avant même que le device ait confirmé quoi que ce soit.
Device → module
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);
}
}
}Même schéma que helloindi : filtrer sur le device puis le nom de la propriété INDI, ici GEOGRAPHIC_COORD (un vecteur numérique standard).
Module → 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);
}Rien n’étant auto-appliqué, la valeur brute écrite par le client doit être extraite à la main de event.data — exactement le même mécanisme que manualname dans helloedit. sendModNewNumber(device, propriété, élément, valeur) l’envoie ensuite au device via le bus INDI ; c’est la mise à jour effective du vrai GEOGRAPHIC_COORD.ELEV qui, revenant par onUpdateProperty() ci-dessus, refermera la boucle en confirmant la valeur dans mirror.elevation.