13.1.13. Ayarlar düzenleyicisi#

Birçok kamera uygulaması, bir programcı olmayan kişinin betiğe dokunmadan değiştirebileceği birkaç ayara ihtiyaç duyar – bir eşik, bir mod, bir Wi-Fi parolası. OpenMV Cam Ayarları Düzenleyicisi, IDE’nin bunun için aracıdır: bir JSON dosyası kontrolleri tanımlar, düzenleyici bu tanımı bir forma dönüştürür ve betiğiniz kaydedilen değerleri json.load() ile geri okur. Dosya hem yapılandırmadır hem de kendi düzenleyicisinin tanımıdır; böylece değerleri saklayan aynı yapılandırma, onları düzenlemek için GUI’yi de düzenler.

Araçlar → OpenMV Cam Settings Editor alt menüsü, üç eylemini barındırır.

  • Open OpenMV Cam Settings Config File, yapılandırmayı bağlı kameranın sürücüsünden okur ve düzenleyicide açar; kaydetmek onu kameraya geri yazar.

  • Open Config File, çevrimdışı bir yapılandırma hazırlamak için bilgisayarınızdaki bir .json dosyası için aynısını yapar.

  • Create Default Config diske bir başlangıç yapılandırması yazar ve açar – her denetim türünü kullanan, kendi uygulamanızın ihtiyaç duyduğu ayarlara indirgemeye hazır bir örnek.

The OpenMV Cam Settings Editor showing the default demo configuration -- Camera, Processing, Network, and System tabs, with the Camera tab's exposure and gain sliders, resolution and pixel-format dropdowns, mirror and flip checkboxes, and a digital-zoom slider, above the Save and Cancel buttons

Varsayılan yapılandırma açık haldeki ayarlar düzenleyicisi – JSON dosyasının denetimleri bir form olarak düzenlenmiş (sekmeler, kaydırıcılar, açılır menüler, onay kutuları), altta Save ve Cancel ile.#

13.1.13.1. Bir yapılandırma dosyasının anatomisi#

Bir yapılandırma dosyası, iki anahtarı olan tek bir JSON nesnesidir:

  • title (string, isteğe bağlı) – düzenleyici penceresinin başlığı. Varsayılan olarak OpenMV Cam Settings Editor.

  • controls (array, gerekli) – düzenleyicinin sırayla, bir formun satırları olarak oluşturduğu denetim nesnelerinin listesi. Bu, tüm grafik arayüzdür.

{
  "title": "Camera Settings",
  "controls": [
    { "type": "slider", "name": "threshold", "label": "Threshold", "value": 50 },
    { "type": "checkbox", "name": "draw_overlays", "label": "Draw Overlays", "value": true }
  ]
}

controls içindeki her giriş bir denetimdir – bir metin alanı, bir sayı, bir onay kutusu, bir açılır menü, bir kaydırıcı, bir grup, bir sekme şeridi, bir statik etiket vb. Onun type değeri widget’ı seçer; nesnenin geri kalanı onu yapılandırır. Düzenleyicinin tanımadığı anahtarlar dosya kaydedilirken dokunulmadan bırakılır, böylece kendi meta verilerinizi denetimlerin yanında dosyada tutabilirsiniz.

13.1.13.2. Her denetimin paylaştığı anahtarlar#

Her denetim nesnesi, type değeri ne olursa olsun bu anahtarları kabul eder:

  • type (string, gerekli) – hangi widget’ın oluşturulacağı, örneğin "slider" veya "combobox". Eksik veya tanınmayan bir type, tüm dosyayı bozmak yerine devre dışı bir Unknown control yer tutucusu oluşturur, dolayısıyla bir yazım hatası size formu değil, bir denetimi kaybettirir.

  • name (string) – sizin kullanımınız için bir tanımlayıcı. Düzenleyici onu asla okumaz; yalnızca korur. Her denetime benzersiz bir name verin, betiğiniz o denetimin kaydedilmiş değerini bulmak için onu kullanır.

  • label (string) – denetimin yanında veya üzerinde gösterilen metin. Çoğu denetim için bu zengin metindir – HTML etiketleri ve <a href> bağlantıları çalışır.

  • tooltip (string) – denetim için üzerine gelme metni.

  • enabled (boolean, varsayılan true) – denetimi soluk ve salt okunur göstermek için false olarak ayarlayın.

Kapsayıcı denetimleri (group, tabs) başlıkları için label yerine title kullanır ve tabs araç ipucunu sekme başına alır; farklar her denetimin sayfasında belirtilmiştir.

13.1.13.3. Değerleri kaydetme ve okuma#

Bir değer tutan bir denetim – bir onay kutusu, bir kaydırıcı, bir metin alanı – onu bir value anahtarında taşır. Save düğmesine tıkladığınızda, düzenleyici her denetimin geçerli value değerini doğrudan aynı denetim nesnesine, yerinde geri yazar ve dosyayı yeniden yazar. Dosya yapısını korur: hiçbir şey yerinden oynamaz, yalnızca value anahtarları değişir. name değerini değere eşleyen ayrı bir düz eşleme yoktur – değerler denetimlerin içinde, tanımlandıkları yerde bulunur.

Düzenin betiğiniz için önemli olmasının nedeni budur. controls ve tabs dizileri onları oluşturduğunuz sırayı korur, dolayısıyla dosya bir sözlük gibi ada göre indekslenemez – config["controls"]["threshold"] çalışmaz. Bu küçük yardımcı boşluğu doldurur: ona istediğiniz değere kadar olan adların yolunu verin, sizin için ağaçta gezinsin.

import json


def find(node, *path):
    """Return the control at a path of names; read its value with
    ["value"]. The tab strip and any unnamed group are transparent,
    so you list only the tabs and controls you gave a name."""
    for key in path:
        match = _child(node, key)
        if match is None:
            raise KeyError(key)
        node = match
    return node


def _child(node, key):
    for member in node.get("controls", []) + node.get("tabs", []):
        if member.get("name") == key or member.get("title") == key:
            return member
        if "name" not in member and ("controls" in member or "tabs" in member):
            match = _child(member, key)   # see through an unnamed group / the tab strip
            if match is not None:
                return match
    return None


with open("config.json") as file:
    config = json.load(file)

threshold = find(config, "threshold")["value"]

Yoldaki her adım bir denetimin name değeri veya bir sekmenin title değeridir (bir sekme kendine ait bir name almaz, yine de bir tane ekleyebilirsiniz ve korunur). Sekme şeridi ve adlandırmadığınız herhangi bir group saydamdır – find bunların içinden geçer – dolayısıyla yalnızca sekmeleri ve etiketlediğiniz denetimleri, iç içe geçmiş bir config[...][...] aramasına yakın bir şekilde listelersiniz. Adlandırılmış bir group kendi başına bir adımdır, dolayısıyla find onun onay kutusu değerini de döndürebilir. Bir yolun asla belirsiz olmaması için her denetime benzersiz bir name verin. Tam örnek iç içe geçmiş demo düzeninden değerleri okur.

Yapılandırma düz JSON olduğundan, betiğinizde hiçbir şey düzenleyiciye bağlı değildir – düzenleyici yalnızca betiğinizin zaten okuduğu dosyayı yazar. Bir cihaz, betik değerlerin düz bir okuyucusu olarak kalırken, yapılandırmasını ve onu değiştirmenin kullanıcı dostu bir yolunu taşıyabilir.

Bir denetim türü, girişini Save sırasında zorunlu kılar: mask veya regex içeren bir lineedit, metni geçersiz veya eksik olduğunda düzenleyicinin kaydetmesine izin vermez ve düzeltilecek alanları adlandırır. Diğer her denetim, siz düzenlerken girişi kısıtlar – bir kaydırıcı aralığından çıkamaz, bir spinbox sınırlarına kenetlenir – dolayısıyla kaydedilmiş bir dosya her zaman geçerlidir.

13.1.13.4. Yapılandırma dosyası referansı#

Denetim türleri, ne yaptıklarına göre gruplandırılmış olarak aşağıdaki sayfalarda belgelenmiştir.