#!/usr/bin/env python3 import argparse parser = argparse.ArgumentParser() parser.add_argument("-a", "--all", dest="show_all_settings", action="store_true", help="show all settings") clargs = parser.parse_args() SHOWN_SETTINGS = { "image_background": "Background", "threshold": "Threshold", "project_axis": "Projection axis", "roi_background": "ROI Background", "roi_signal": "ROI Signal" } ENFORCED_SETTINGS = [ "image_background_enable", "image_threshold", "function" ] SCRIPT_NAME = "spectrometer.py" TITLE = "SCam" if not clargs.show_all_settings else "SCam Expert Mode" import itertools import wx try: from cam_server_client import PipelineClient except ImportError: from fake import PipelineClient from tools import EXPANDING, STRETCH, make_filled_vbox, make_filled_hbox from entrybutton import EntryButton from settings import SettingsList pc = PipelineClient("http://sf-daqsync-01:8889") si = pc.get_server_info() pls = si["active_instances"] if not clargs.show_all_settings: pls = (i for i in pls if "spec_db" in i) pls = sorted(pls) class MainFrame(wx.Frame): def __init__(self, parent=None, title=TITLE): super().__init__(parent, title=title) panel_main = MainPanel(self) self.sizer = sizer = make_filled_vbox([panel_main]) self.SetSizerAndFit(sizer) class MainPanel(wx.Panel): def __init__(self, parent): super().__init__(parent) self.instance = None self.camera = None self.cb_pls = cb_pls = wx.ComboBox(self, choices=pls) self.eb_bkg = eb_bkg = EntryButton(self, label="Background Images", value=100, button="Record Background") eb_bkg.Disable() self.entries = entries = SettingsList(self) self.btn_print = btn_print = wx.Button(self, label="Print") btn_print.Disable() self.btn_save = btn_save = wx.Button(self, label="Save") btn_save.Disable() cb_pls.Bind(wx.EVT_COMBOBOX, self.on_select) eb_bkg.button.Bind(wx.EVT_BUTTON, self.on_save_bkg) btn_print.Bind(wx.EVT_BUTTON, self.on_print) btn_save.Bind(wx.EVT_BUTTON, self.on_save_cfg) widgets = [btn_print, btn_save] btns_sizer = make_filled_hbox(widgets) widgets = [cb_pls, STRETCH, eb_bkg, STRETCH, entries, btns_sizer] sizer = make_filled_vbox(widgets, border=10) self.SetSizer(sizer) def on_save_bkg(self, event): num = self.eb_bkg.GetValue() bkgname = pc.collect_background(self.camera, num) self.entries.set("image_background", bkgname) print(bkgname) def on_select(self, event): self.entries.clear() self.instance = instance = self.cb_pls.GetValue() cfg = pc.get_instance_config(instance) print(cfg) self.camera = camera = cfg["camera_name"] self.orig_cfg = cfg name_mapping = None if not clargs.show_all_settings: self.orig_cfg = filter_dict(cfg, SHOWN_SETTINGS, ENFORCED_SETTINGS) name_mapping = SHOWN_SETTINGS check_incoming_cfg(cfg) cfg = filter_dict(cfg, SHOWN_SETTINGS) self.entries.update(cfg, name_mapping) # ensure background name is always set bkg_setting = self.entries["image_background"] if not bkg_setting.get_state(): latest_bkg = pc.get_latest_background(camera) bkg_setting.set_value(latest_bkg) self.eb_bkg.Enable() self.btn_print.Enable() self.btn_save.Enable() self._adjust_size() def _adjust_size(self): parent = self.GetParent() parent.sizer.Layout() parent.Fit() def make_cfg(self): cfg = self.entries.get() if not clargs.show_all_settings: cfg = check_outgoing_cfg(cfg) return cfg def on_print(self, event): old_cfg = self.orig_cfg new_cfg = self.make_cfg() print("\nold config:\n", old_cfg) print("\nnew config:\n", new_cfg) print("\nunchanged\n" if old_cfg == new_cfg else "\nchanged\n") def on_save_cfg(self, event): new_cfg = self.make_cfg() res = pc.set_instance_config(self.instance, new_cfg) print(res) def check_incoming_cfg(cfg): bkg_enable = cfg.get("image_background_enable") if bkg_enable not in (None, "passive"): printable_bkg_enable = printable(bkg_enable) print(f"Warning: found: image_background_enable = {printable_bkg_enable}, this will be set to None or \"passive\" upon saving") img_thresh = cfg.get("image_threshold") if img_thresh is not None: printable_img_thresh = printable(img_thresh) print(f"Warning: found: image_threshold = {printable_img_thresh}, this will be set to None upon saving") thresh = cfg.get("threshold") if thresh is None: print(f"Warning: found: threshold = None, will overwrite with value of image_threshold ({printable_img_thresh})") script = cfg.get("function") if script != SCRIPT_NAME: printable_script = printable(script) print(f"Warning: found: function = {printable_script}, this will be set to \"{SCRIPT_NAME}\" upon saving") def check_outgoing_cfg(cfg): bkg = cfg["image_background"] cfg["image_background_enable"] = "passive" if bkg else None cfg["image_threshold"] = None cfg["function"] = SCRIPT_NAME return cfg def printable(val): return repr(val).replace("'", '"') def filter_dict(d, *args): allkeys = itertools.chain.from_iterable(args) return {k: d.get(k) for k in allkeys} app = wx.App() frame = MainFrame() frame.Show() app.MainLoop()