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 (
ElementBasee 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 minimotype,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.