Mit einem Device verbinden

Beispielmodul: helloindi — das kleinstmögliche IndiModule.

"status": {
  "permission": 0,
  "e": {
    "connection": { "type": "light", "label": "Device connection" }
  }
}
HelloIndi::HelloIndi(...)
    : IndiModule(...)
{
    loadOstPropertiesFromFile(":helloindi.json");
    giveMeADevice("device", "Device", INDI::BaseDevice::GENERAL_INTERFACE);
}

giveMeADevice("device", ...) fügt das Element device zur Property devices hinzu — seine Werteliste bietet nur die Devices an, die auf dem Bus vorhanden sind und die angeforderte Schnittstelle bereitstellen.

Verbinden, sobald das Device erscheint

void HelloIndi::onNewDevice(INDI::BaseDevice dp)
{
    if (QString(dp.getDeviceName()) == getString("devices", "device"))
    {
        connectDevice(getString("devices", "device"));
    }
}

onNewDevice() wird für jedes Device aufgerufen, das auf dem Bus erscheint, nicht nur für das gewählte — daher der Vergleich vor dem Aufruf von connectDevice(). Ein reales Modul wartet in der Regel auf eine explizite Benutzeraktion, statt sich wie hier automatisch zu verbinden; diese Abkürzung dient nur dazu, das Beispiel ohne jegliche Interaktion testbar zu machen.

Den Verbindungsstatus widerspiegeln

void HelloIndi::onUpdateProperty(INDI::Property property)
{
    if (QString(property.getDeviceName()) != getString("devices", "device")) return;
    if (QString(property.getName()) != "CONNECTION") return;

    INDI::PropertySwitch sw = property;
    bool connected = false;
    for (unsigned int i = 0; i < sw.count(); i++)
    {
        if (QString(sw[i].name) == "CONNECT" && sw[i].s == ISS_ON) connected = true;
    }
    getEltLight("status", "connection")->setValue(connected ? OST::State::Ok : OST::State::Idle, true);
}

onUpdateProperty() wird bei jeder Aktualisierung jeder beliebigen Property jedes beliebigen verbundenen Devices aufgerufen — zwei Filter sind daher immer nötig: das betreffende Device, dann der Name der INDI-Property (hier CONNECTION, ein Standardname, der auf jedem Treiber vorhanden ist). INDI::PropertySwitch sw = property; ist die übliche typisierte Ansicht eines INDI-Clients — nichts OST-Spezifisches.

onUpdateProperty(), nicht updateProperty()

Siehe die Übersicht: onUpdateProperty() ist der öffentliche Hook, der zum Überschreiben gedacht ist. updateProperty() (protected) wird nur überschrieben, wenn das Modul einen direkteren Zugriff benötigt, wie bei einer Bildaufnahme — siehe Ein Bild aufnehmen.