El módulo más pequeño — propiedades y elementos

Módulo de ejemplo: hello.

El modelo de datos de un módulo es una jerarquía de dos niveles:

  • una propiedad (PropertyMulti) — un grupo con nombre, con una etiqueta, un permiso, una posición en el árbol de visualización;
  • que contiene uno o varios elementos (ElementBase y sus derivados: ElementBool, ElementString, ElementInt…) — cada uno un valor tipado individual.

Es una diferencia importante respecto a INDI, donde un “vector” (el equivalente de una propiedad) solo contiene elementos de un único tipo. Una propiedad OST puede mezclar los tipos libremente — ver El catálogo de tipos.

Declarar una propiedad 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 = solo lectura, 1 = solo escritura (nunca usado en la práctica — ver más abajo), 2 = lectura/escritura.
  • devcat/group: posición en el árbol de visualización del lado del cliente — primer nivel y subnivel. Dejados vacíos aquí, una sola propiedad no necesita ninguna agrupación. Ver Actualizaciones del lado del servidor para su uso concreto, y Crear propiedades dinámicamente para la trampa de nomenclatura entre JSON y C++.
  • hasprofile: si esta propiedad puede guardarse/cargarse como perfil nombrado — ver Los perfiles.
  • e: los elementos de la propiedad, por clave. Cada elemento tiene como mínimo type, label, order.

El constructor del módulo no tiene nada más que hacer que cargar este archivo:

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

Y como esta propiedad es de solo lectura y el módulo no tiene ninguna acción que procesar, Hello no necesita sobrecargar ningún método: la implementación por defecto (vacía) de onExternalEvent() es suficiente.

WriteOnly nunca es útil

permission:1 (solo escritura) existe en la enumeración pero no tiene ningún uso real en el framework — ningún módulo del core lo utiliza. Ignore este valor.