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" pv_name = PV("SATES20-DYNA:NAME") pv_dtyp = PV("SATES20-DYNA:TYPE") pv_dtyp.get_ctrlvars() # without this, the enum returns only str(number) pv_list = PV("SATES20-DYNA:LIST") @toggle def cb_add(value=None, **kwargs): name = pv_name.get() if not name: log.info(f"add: ignoring name={repr(name)}") return dtyp = pv_dtyp.get(as_string=True) log.info(f"add: name={repr(name)} type={repr(dtyp)} {kwargs}") data = load_data(FN_ENTRIES) data[name] = dtyp save_data(data, FN_ENTRIES) mk_db(data, FN_DB_TMPL) log.info(f"data: {data}") pv_list.put(mk_printable_data(data)) @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.pop(name, None) save_data(data, FN_ENTRIES) mk_db(data, FN_DB_TMPL) log.info(f"data: {data}") pv_list.put(mk_printable_data(data)) @toggle def cb_clear(value=None, **kwargs): log.info(f"clear: {kwargs}") data = {} save_data(data, FN_ENTRIES) mk_db(data, FN_DB_TMPL) log.info(f"data: {data}") pv_list.put(mk_printable_data(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) pv_clear = PV("SATES20-DYNA:CLEAR") pv_clear.add_callback(cb_clear) def mk_printable_data(data): return "\n".join(f"{k} ({v})" for k, v in sorted(data.items()))