Files
SCam/scam.py
2021-09-30 11:41:26 +02:00

204 lines
5.0 KiB
Python
Executable File

#!/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"
]
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()
ai = si["active_instances"]
pls = (i for i in ai if "psen_db" in i)
pls = sorted(pls)
class MainFrame(wx.Frame):
def __init__(self, parent=None, title="SCam"):
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="Save 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.instance = instance = self.cb_pls.GetValue()
cfg = pc.get_instance_config(instance)
print(cfg)
self.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)
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 "changed")
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})")
def check_outgoing_cfg(cfg):
bkg = cfg["image_background"]
cfg["image_background_enable"] = "passive" if bkg else None
cfg["image_threshold"] = None
return cfg
def printable(val):
return repr(val).replace("'", '"')
def filter_dict(d, *args):
allkeys = []
for keys in args:
allkeys.extend(keys)
res = {k: v for k, v in d.items() if k in allkeys}
for k in allkeys:
if k not in res:
res[k] = None
return res
app = wx.App()
frame = MainFrame()
frame.Show()
app.MainLoop()