Le plus petit module — propriétés et éléments

Module d’exemple : hello.

Le modèle de données d’un module est une hiérarchie à deux niveaux :

  • une propriété (PropertyMulti) — un groupe nommé, avec un libellé, une permission, une position dans l’arborescence d’affichage ;
  • qui contient un ou plusieurs éléments (ElementBase et ses dérivés : ElementBool, ElementString, ElementInt…) — chacun une valeur typée individuelle.

C’est une différence importante avec INDI, où un “vecteur” (l’équivalent d’une propriété) ne contient que des éléments d’un seul type. Une propriété OST peut mélanger les types librement — voir Le catalogue des types.

Déclarer une propriété en JSON

{
"p":{
  "hello": {
    "label": "Hello",
    "permission": 0,
    "devcat": "",
    "group": "",
    "order": "1",
    "hasprofile": false,
    "e": {
      "message": {
        "type": "string",
        "label": "Message",
        "order": "1",
        "value": "Hello, world!"
      }
    }
  }
}
}
  • permission : 0 = lecture seule, 1 = écriture seule (jamais utilisé en pratique — voir plus loin), 2 = lecture/écriture.
  • devcat/group : position dans l’arborescence d’affichage côté client — premier niveau et sous-niveau. Laissés vides ici, une seule propriété n’a besoin d’aucun regroupement. Voir Mises à jour côté serveur pour leur usage concret, et Créer des propriétés dynamiquement pour le piège de nommage entre JSON et C++.
  • hasprofile : si cette propriété peut être sauvegardée/chargée comme profil nommé — voir Les profils.
  • e : les éléments de la propriété, par clé. Chaque élément a au minimum type, label, order.

Le constructeur du module n’a rien d’autre à faire que charger ce fichier :

Hello::Hello(QString name, QString label, QString profile, QVariantMap availableModuleLibs)
    : Basemodule(name, label, profile, availableModuleLibs)
{
    Q_INIT_RESOURCE(hello);
    loadOstPropertiesFromFile(":hello.json");
}

Et comme cette propriété est en lecture seule et que le module n’a aucune action à traiter, Hello n’a besoin de surcharger aucune méthode : l’implémentation par défaut (vide) de onExternalEvent() suffit.

WriteOnly n’est jamais utile

permission:1 (écriture seule) existe dans l’énumération mais n’a aucun usage réel dans le framework — aucun module du core ne l’utilise. Ignorez cette valeur.