Full example ============ *Create Default Config* writes the file below and opens it. It is a demo -- not a real device config -- built to exercise every control type at once: labels, both kinds of container, all seven value controls, the *options*/*values* mapping, a tristate checkbox, a hex spinbox, an input mask, a regex, a password field, and a disabled field. Read it alongside the reference pages to see each key in context, then strip it down to the settings your own application needs. .. code-block:: json { "title": "Camera Settings", "controls": [ { "type": "label", "align": "center", "text": "This is a demo configuration.
The controls below are examples that show off every setting type you can build — they are not a real device config. Replace them with the controls your own application needs, then edit the values, click Save, and read them back in your script with json.load(). See the documentation for details." }, { "type": "tabs", "tab_position": "north", "tabs": [ { "title": "Camera", "tooltip": "Sensor and capture settings", "controls": [ { "type": "label", "text": "Image capture" }, { "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": "Threshold", "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": "Network configuration" }, { "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": "Edit the values, then click Save." } ] } Reading it back --------------- You authored this layout, so you know the path to each value. With the ``find`` helper from the :doc:`overview `, name the tab and the control -- ``find`` steps through the tab strip and any unnamed group in between: .. code-block:: python 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" The *Manual Exposure* group has a *name*, so it is a step in the path -- and ``find(config, "Camera", "manual_exposure")`` reads its checkbox. The *Format* group has no *name*, so it is transparent: ``resolution`` is reached straight from the *Camera* tab. Note how the *combobox* with a *values* array returns the stored value (``"qvga"``), not the label the user picked (``"QVGA"``) -- exactly what a script wants to branch on.