Se connecter à un device

Module d’exemple : helloindi — le plus petit IndiModule possible.

"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", ...) ajoute l’élément device dans la propriété devices — sa liste de valeurs ne propose que les devices présents sur le bus et exposant l’interface demandée.

Se connecter dès que le device apparaît

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

onNewDevice() est appelé pour chaque device qui apparaît sur le bus, pas seulement celui choisi — d’où la comparaison avant d’appeler connectDevice(). Un module réel attend en général une action explicite de l’utilisateur plutôt que de se connecter automatiquement comme ici ; ce raccourci n’est là que pour que l’exemple soit testable sans aucune interaction.

Refléter l’état de connexion

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() est appelé à chaque mise à jour de n’importe quelle propriété de n’importe quel device connecté — deux filtres sont donc systématiques : le device concerné, puis le nom de la propriété INDI (CONNECTION ici, un nom standard présent sur tout driver). INDI::PropertySwitch sw = property; est la vue typée habituelle d’un client INDI — rien de spécifique à OST.

onUpdateProperty(), pas updateProperty()

Voir la vue d’ensemble : onUpdateProperty() est le hook public pensé pour être surchargé. updateProperty() (protégé) n’est à surcharger que si le module a besoin d’un accès plus direct, comme pour une capture d’image — voir Capturer une image.