Connettersi a un device

Modulo di esempio: helloindi — il più piccolo IndiModule possibile.

"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", ...) aggiunge l’elemento device nella proprietà devices — la sua lista di valori propone solo i device presenti sul bus ed esponenti l’interfaccia richiesta.

Connettersi non appena il device appare

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

onNewDevice() viene chiamato per ogni device che appare sul bus, non solo quello scelto — da qui il confronto prima di chiamare connectDevice(). Un modulo reale attende in generale un’azione esplicita dell’utente piuttosto che connettersi automaticamente come qui; questa scorciatoia è presente solo perché l’esempio sia testabile senza alcuna interazione.

Riflettere lo stato di connessione

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() viene chiamato a ogni aggiornamento di qualsiasi proprietà di qualsiasi device connesso — due filtri sono quindi sistematici: il device interessato, poi il nome della proprietà INDI (CONNECTION qui, un nome standard presente su ogni driver). INDI::PropertySwitch sw = property; è la vista tipizzata abituale di un client INDI — nulla di specifico a OST.

onUpdateProperty(), non updateProperty()

Vedi la panoramica: onUpdateProperty() è l’hook pubblico pensato per essere sovrascritto. updateProperty() (protetto) va sovrascritto solo se il modulo ha bisogno di un accesso più diretto, come per una capture d’immagine — vedi Catturare un’immagine.