13.1.13.4.4. Vollständiges Beispiel#

Create Default Config schreibt die untenstehende Datei und öffnet sie. Es ist eine Demonstration – keine echte Gerätekonfiguration – die darauf ausgelegt ist, jeden Steuerelementtyp auf einmal vorzuführen: Labels, beide Arten von Container, alle sieben Wert-Steuerelemente, die options/values-Zuordnung, ein Tristate-Kontrollkästchen, ein Hex-Spinbox, eine Eingabemaske, einen regulären Ausdruck, ein Passwortfeld und ein deaktiviertes Feld. Lesen Sie sie zusammen mit den Referenzseiten, um jeden Schlüssel im Kontext zu sehen, und reduzieren Sie sie dann auf die Einstellungen, die Ihre eigene Anwendung benötigt.

{
  "title": "Camera Settings",
  "controls": [
    {
      "type": "label",
      "align": "center",
      "text": "<b>This is a demo configuration.</b><br/>The controls below are examples that show off every setting type you can build &mdash; they are <i>not</i> a real device config. Replace them with the controls your own application needs, then edit the values, click <b>Save</b>, and read them back in your script with <code>json.load()</code>. See the <a href='https://docs.openmv.io'>documentation</a> for details."
    },
    {
      "type": "tabs",
      "tab_position": "north",
      "tabs": [
        {
          "title": "Camera",
          "tooltip": "Sensor and capture settings",
          "controls": [
            { "type": "label", "text": "<b>Image capture</b>" },
            {
              "type": "group",
              "title": "Manual Exposure",
              "checkable": true,
              "name": "manual_exposure",
              "value": false,
              "controls": [
                { "type": "slider", "name": "exposure_us", "label": "Exposure", "value": 10000, "min": 0, "max": 33000, "step": 100, "suffix": " us", "ticks": 5500, "tooltip": "Shutter time in microseconds" },
                { "type": "slider", "name": "gain_db", "label": "Gain", "value": 8, "min": 0, "max": 24, "suffix": " dB", "ticks": 4 }
              ]
            },
            {
              "type": "group",
              "title": "Format",
              "controls": [
                { "type": "combobox", "name": "resolution", "label": "Resolution", "value": "qvga", "options": ["QQVGA", "QVGA", "VGA"], "values": ["qqvga", "qvga", "vga"] },
                { "type": "combobox", "name": "pixformat", "label": "Pixel Format", "value": 1, "options": ["Grayscale", "RGB565"] },
                { "type": "checkbox", "name": "h_mirror", "label": "Horizontal Mirror", "value": false },
                { "type": "checkbox", "name": "v_flip", "label": "Vertical Flip", "value": false },
                { "type": "slider", "name": "digital_zoom", "label": "Digital Zoom", "value": 1, "min": 1, "max": 8, "prefix": "x", "ticks": 1 }
              ]
            }
          ]
        },
        {
          "title": "Processing",
          "tooltip": "Detection and overlays",
          "controls": [
            {
              "type": "group",
              "title": "Detection",
              "controls": [
                { "type": "radio", "name": "mode", "label": "Mode", "value": "idle", "options": ["Idle", "Track", "Record"], "values": ["idle", "track", "record"], "orientation": "horizontal" },
                { "type": "slider", "name": "threshold", "label": "<b>Threshold</b>", "value": 50, "min": 0, "max": 100, "suffix": " %", "ticks": 25 },
                { "type": "spinbox", "name": "min_area", "label": "Min Area", "value": 100, "min": 0, "max": 10000, "suffix": " px", "special_value_text": "Off", "group_separator": true },
                { "type": "doublespinbox", "name": "sensitivity", "label": "Sensitivity", "value": 50, "min": 0, "max": 100, "step": 0.5, "decimals": 1, "suffix": " %", "special_value_text": "Auto" },
                { "type": "checkbox", "name": "draw_overlays", "label": "Draw Overlays", "value": true }
              ]
            },
            {
              "type": "group",
              "title": "Recording",
              "controls": [
                { "type": "radio", "name": "quality", "label": "Quality", "value": 1, "options": ["Low", "Medium", "High"] },
                { "type": "checkbox", "name": "capture_mode", "label": "Capture (off / single / continuous)", "tristate": true, "value": 1 }
              ]
            }
          ]
        },
        {
          "title": "Network",
          "tooltip": "Wi-Fi and server",
          "controls": [
            { "type": "label", "text": "<i>Network configuration</i>" },
            {
              "type": "group",
              "title": "Wi-Fi",
              "checkable": true,
              "name": "wifi_enabled",
              "value": true,
              "controls": [
                { "type": "lineedit", "name": "wifi_ssid", "label": "SSID", "value": "", "placeholder": "Network name", "max_length": 32, "clear_button": true },
                { "type": "lineedit", "name": "wifi_password", "label": "Password", "value": "", "password": true, "clear_button": true },
                { "type": "lineedit", "name": "static_ip", "label": "Static IP", "value": "192.168.001.100", "mask": "000.000.000.000;_", "tooltip": "Set to 0.0.0.0 for DHCP" }
              ]
            },
            {
              "type": "group",
              "title": "Server",
              "controls": [
                { "type": "spinbox", "name": "server_port", "label": "Port", "value": 8080, "min": 0, "max": 65535, "group_separator": true },
                { "type": "lineedit", "name": "hostname", "label": "Hostname", "value": "openmv-cam", "regex": "[A-Za-z0-9-]+", "placeholder": "letters, digits, dashes", "clear_button": true }
              ]
            }
          ]
        },
        {
          "title": "System",
          "tooltip": "Device and power",
          "controls": [
            {
              "type": "group",
              "title": "Device",
              "controls": [
                { "type": "lineedit", "name": "device_name", "label": "Device Name", "value": "openmv-cam", "clear_button": true },
                { "type": "combobox", "name": "led", "label": "LED", "value": 0, "options": ["Off", "Red", "Green", "Blue"] },
                { "type": "spinbox", "name": "i2c_address", "label": "I2C Address", "value": 48, "min": 0, "max": 255, "base": 16, "prefix": "0x" },
                { "type": "lineedit", "name": "firmware", "label": "Firmware", "value": "4.5.0", "enabled": false }
              ]
            },
            {
              "type": "group",
              "title": "Power",
              "controls": [
                { "type": "radio", "name": "power_mode", "label": "Power Mode", "value": "balanced", "options": ["Performance", "Balanced", "Low Power"], "values": ["perf", "balanced", "low"] },
                { "type": "slider", "name": "led_brightness", "label": "LED Brightness", "value": 80, "min": 0, "max": 100, "suffix": " %", "ticks": 20 }
              ]
            },
            {
              "type": "group",
              "title": "Storage",
              "controls": [
                { "type": "doublespinbox", "name": "storage_limit", "label": "Storage Limit", "value": 1024.5, "min": 0, "max": 65536, "step": 0.5, "decimals": 1, "prefix": "max ", "suffix": " MB", "group_separator": true }
              ]
            }
          ]
        }
      ]
    },
    {
      "type": "label",
      "align": "right",
      "text": "<i>Edit the values, then click Save.</i>"
    }
  ]
}

13.1.13.4.4.1. Zurücklesen#

Sie haben dieses Layout erstellt, daher kennen Sie den Pfad zu jedem Wert. Mit dem Helfer find aus der Übersicht benennen Sie den Tab und das Steuerelement – find durchläuft die Tab-Leiste und jede unbenannte Gruppe dazwischen:

enabled = find(config, "Camera", "manual_exposure")["value"]                   # the group's checkbox
exposure = find(config, "Camera", "manual_exposure", "exposure_us")["value"]   # 10000
resolution = find(config, "Camera", "resolution")["value"]                     # "qvga"

Die Manual Exposure-Gruppe hat einen name, also ist sie ein Schritt im Pfad – und find(config, "Camera", "manual_exposure") liest ihr Kontrollkästchen. Die Format-Gruppe hat keinen name, also ist sie transparent: resolution wird direkt von der Camera-Registerkarte aus erreicht.

Beachten Sie, wie die combobox mit einem values-Array den gespeicherten Wert ("qvga") zurückgibt, nicht die vom Benutzer gewählte Beschriftung ("QVGA") – genau das, worauf ein Skript verzweigen möchte.