Il modulo più piccolo — proprietà ed elementi

Modulo di esempio: hello.

Il modello dei dati di un modulo è una gerarchia a due livelli:

  • una proprietà (PropertyMulti) — un gruppo con nome, un’etichetta, un permesso, una posizione nell’albero di visualizzazione;
  • che contiene uno o più elementi (ElementBase e le sue derivate: ElementBool, ElementString, ElementInt…) — ciascuno un valore tipizzato individuale.

È una differenza importante rispetto a INDI, dove un “vettore” (l’equivalente di una proprietà) contiene solo elementi di un unico tipo. Una proprietà OST può mescolare liberamente i tipi — vedi Il catalogo dei tipi.

Dichiarare una proprietà in 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 = solo lettura, 1 = solo scrittura (mai usato in pratica — vedi più avanti), 2 = lettura/scrittura.
  • devcat/group: posizione nell’albero di visualizzazione lato client — primo livello e sottolivello. Lasciati vuoti qui, una singola proprietà non ha bisogno di alcun raggruppamento. Vedi Aggiornamenti lato server per il loro uso concreto, e Creare proprietà dinamicamente per l’insidia di nomenclatura tra JSON e C++.
  • hasprofile: se questa proprietà può essere salvata/caricata come profilo con nome — vedi I profili.
  • e: gli elementi della proprietà, per chiave. Ogni elemento ha come minimo type, label, order.

Il costruttore del modulo non deve fare altro che caricare questo file:

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

E poiché questa proprietà è in sola lettura e il modulo non ha alcuna azione da gestire, Hello non ha bisogno di sovrascrivere alcun metodo: l’implementazione predefinita (vuota) di onExternalEvent() è sufficiente.

WriteOnly non è mai utile

permission:1 (sola scrittura) esiste nell’enumerazione ma non ha alcun uso reale nel framework — nessun modulo del core lo utilizza. Ignorate questo valore.