Das kleinste Modul — Properties und Elemente

Beispielmodul: hello.

Das Datenmodell eines Moduls ist eine zweistufige Hierarchie:

  • eine Property (PropertyMulti) — eine benannte Gruppe mit einem Label, einer Permission und einer Position in der Anzeige-Hierarchie;
  • die eines oder mehrere Elemente (ElementBase und seine Ableitungen: ElementBool, ElementString, ElementInt…) enthält — jedes ein einzelner, typisierter Wert.

Das ist ein wichtiger Unterschied zu INDI, wo ein „Vektor" (das Äquivalent einer Property) nur Elemente eines einzigen Typs enthält. Eine OST-Property kann Typen frei mischen — siehe Der Typenkatalog.

Eine Property in JSON deklarieren

{
"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 = nur lesen, 1 = nur schreiben (in der Praxis nie verwendet — siehe weiter unten), 2 = lesen/schreiben.
  • devcat/group: Position in der Anzeige-Hierarchie auf Client-Seite — erste Ebene und Unterebene. Hier leer gelassen, da eine einzelne Property keine Gruppierung benötigt. Siehe Aktualisierungen serverseitig für ihre konkrete Verwendung und Properties dynamisch erzeugen für die Namensfalle zwischen JSON und C++.
  • hasprofile: ob diese Property als benanntes Profil gespeichert/geladen werden kann — siehe Die Profile.
  • e: die Elemente der Property, nach Schlüssel. Jedes Element hat mindestens type, label, order.

Der Konstruktor des Moduls muss nichts anderes tun, als diese Datei zu laden:

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

Und da diese Property nur lesbar ist und das Modul keine Aktion zu verarbeiten hat, muss Hello keine Methode überschreiben: die leere Standardimplementierung von onExternalEvent() reicht aus.

WriteOnly ist nie nützlich

permission:1 (nur schreiben) existiert in der Enumeration, hat aber keine reale Verwendung im Framework — kein Core-Modul nutzt es. Ignorieren Sie diesen Wert.