From 42e042811f754cf6de295dbf7d4c7d14d0072f8c Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Wed, 13 Nov 2024 21:53:49 +0100 Subject: [PATCH] switched to new PV names; added toggle logic --- SATES20-CPCL-DYNA/cfg/python/pvs.py | 49 ++++++++++++++++----------- SATES20-CPCL-DYNA/cfg/python/utils.py | 29 ++++++++++++++++ 2 files changed, 59 insertions(+), 19 deletions(-) create mode 100644 SATES20-CPCL-DYNA/cfg/python/utils.py diff --git a/SATES20-CPCL-DYNA/cfg/python/pvs.py b/SATES20-CPCL-DYNA/cfg/python/pvs.py index 3ac4304..bb70128 100644 --- a/SATES20-CPCL-DYNA/cfg/python/pvs.py +++ b/SATES20-CPCL-DYNA/cfg/python/pvs.py @@ -1,38 +1,49 @@ -from epics import PV +from epics import get_pv as PV from data import load_data, save_data, mk_db from log import log +from utils import toggle FN_ENTRIES = "/ioc/data/SATES20-CPCL-DYNA/entries" FN_DB_TMPL = "/ioc/data/SATES20-CPCL-DYNA/dynamic.template" -def cb_new(value=None, **kwargs): - log.info(f"new: value={repr(value)} {kwargs}") - if not value: - return - data = load_data(FN_ENTRIES) - data.add(value) - save_data(data, FN_ENTRIES) - mk_db(data, FN_DB_TMPL) - log.info(f"data: {sorted(data)}") +pv_name = PV("SATES20-DYNA:NAME") -def cb_del(value=None, **kwargs): - log.info(f"del: value={repr(value)} {kwargs}") - if not value: + +@toggle +def cb_add(value=None, **kwargs): + name = pv_name.get() + if not name: + log.info(f"add: ignoring name={repr(name)}") return + log.info(f"add: name={repr(name)} {kwargs}") data = load_data(FN_ENTRIES) - data.discard(value) + data.add(name) save_data(data, FN_ENTRIES) mk_db(data, FN_DB_TMPL) log.info(f"data: {sorted(data)}") -pv_new = PV("SATES20-DYNA:NEW") -pv_new.add_callback(cb_new) - -pv_del = PV("SATES20-DYNA:DEL") -pv_del.add_callback(cb_del) +@toggle +def cb_remove(value=None, **kwargs): + name = pv_name.get() + if not name: + log.info(f"remove: ignoring name={repr(name)}") + return + log.info(f"remove: name={repr(name)} {kwargs}") + data = load_data(FN_ENTRIES) + data.discard(name) + save_data(data, FN_ENTRIES) + mk_db(data, FN_DB_TMPL) + log.info(f"data: {sorted(data)}") + + +pv_add = PV("SATES20-DYNA:ADD") +pv_add.add_callback(cb_add) + +pv_remove = PV("SATES20-DYNA:REMOVE") +pv_remove.add_callback(cb_remove) diff --git a/SATES20-CPCL-DYNA/cfg/python/utils.py b/SATES20-CPCL-DYNA/cfg/python/utils.py new file mode 100644 index 0000000..3fa84b7 --- /dev/null +++ b/SATES20-CPCL-DYNA/cfg/python/utils.py @@ -0,0 +1,29 @@ +import functools +import threading + +from epics import get_pv as PV + +from log import log + + +def toggle(func): + @functools.wraps(func) + def wrapper(value=None, pvname=None, **kwargs): + fn = func.__name__ + if not value: + log.info(f"{fn}: ignoring value={repr(value)}") + return + + func(value=value, pvname=pvname, **kwargs) + + pv = PV(pvname) + call_later(pv.put, 0) + log.info(f"{fn}: done") + + return wrapper + + +def call_later(func, *args, **kwargs): + threading.Thread(target=func, args=args, kwargs=kwargs).start() + +