Conectarse a un device

Módulo de ejemplo: helloindi — el IndiModule más pequeño posible.

"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", ...) añade el elemento device en la propiedad devices — su lista de valores solo propone los devices presentes en el bus y que exponen la interfaz solicitada.

Conectarse en cuanto aparece el device

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

onNewDevice() se llama para cada device que aparece en el bus, no solo el elegido — de ahí la comparación antes de llamar a connectDevice(). Un módulo real normalmente espera una acción explícita del usuario en lugar de conectarse automáticamente como aquí; este atajo solo existe para que el ejemplo sea comprobable sin ninguna interacción.

Reflejar el estado de conexión

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() se llama en cada actualización de cualquier propiedad de cualquier device conectado — por eso se aplican sistemáticamente dos filtros: el device en cuestión, y luego el nombre de la propiedad INDI (CONNECTION aquí, un nombre estándar presente en todo driver). INDI::PropertySwitch sw = property; es la vista tipada habitual de un cliente INDI — nada específico de OST.

onUpdateProperty(), no updateProperty()

Ver la vista de conjunto: onUpdateProperty() es el hook público pensado para ser sobrecargado. updateProperty() (protegido) solo se debe sobrecargar si el módulo necesita un acceso más directo, como para una captura de imagen — ver Capturar una imagen.