renamed SATES21 -> SATES20
This commit is contained in:
8
SATES20-CPCL-DYNA/SATES20-CPCL-DYNA_fixed.subs
Normal file
8
SATES20-CPCL-DYNA/SATES20-CPCL-DYNA_fixed.subs
Normal file
@ -0,0 +1,8 @@
|
||||
file "SATES20-CPCL-DYNA_fixed.template" {
|
||||
pattern {
|
||||
SYSTEM
|
||||
}{
|
||||
SATES20-DYNA
|
||||
}
|
||||
}
|
||||
|
16
SATES20-CPCL-DYNA/SATES20-CPCL-DYNA_fixed.template
Normal file
16
SATES20-CPCL-DYNA/SATES20-CPCL-DYNA_fixed.template
Normal file
@ -0,0 +1,16 @@
|
||||
record(ai, "$(SYSTEM):IDN") {
|
||||
field(DESC, "Device ID")
|
||||
}
|
||||
|
||||
record(stringin, "$(SYSTEM):NEW") {
|
||||
field(DESC, "New")
|
||||
field(VAL, "")
|
||||
field(SCAN, "Passive")
|
||||
}
|
||||
|
||||
record(stringin, "$(SYSTEM):DEL") {
|
||||
field(DESC, "Delete")
|
||||
field(VAL, "")
|
||||
field(SCAN, "Passive")
|
||||
}
|
||||
|
12
SATES20-CPCL-DYNA/SATES20-CPCL-DYNA_startup.script
Normal file
12
SATES20-CPCL-DYNA/SATES20-CPCL-DYNA_startup.script
Normal file
@ -0,0 +1,12 @@
|
||||
epicsEnvSet("ENGINEER", "augustin_s")
|
||||
|
||||
require "stream"
|
||||
epicsEnvSet STREAM_PROTOCOL_PATH :protocols:./cfg
|
||||
|
||||
system "mkdir -p /ioc/data/SATES20-CPCL-DYNA"
|
||||
system "touch /ioc/data/SATES20-CPCL-DYNA/dynamic.template"
|
||||
|
||||
dbLoadTemplate("/ioc/SATES20-CPCL-DYNA/cfg/dynamic.subs")
|
||||
|
||||
system "python ./cfg/python/start.py &"
|
||||
|
8
SATES20-CPCL-DYNA/cfg/dynamic.subs
Normal file
8
SATES20-CPCL-DYNA/cfg/dynamic.subs
Normal file
@ -0,0 +1,8 @@
|
||||
file "/ioc/data/SATES20-CPCL-DYNA/dynamic.template" {
|
||||
pattern {
|
||||
SYSTEM
|
||||
}{
|
||||
SATES20-DYNA
|
||||
}
|
||||
}
|
||||
|
24
SATES20-CPCL-DYNA/cfg/python/data.py
Normal file
24
SATES20-CPCL-DYNA/cfg/python/data.py
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
def load_data(fn):
|
||||
try:
|
||||
with open(fn) as f:
|
||||
data = f.read().split("\n")
|
||||
data = set(data)
|
||||
data.discard("") #TODO
|
||||
except FileNotFoundError:
|
||||
data = set()
|
||||
return data
|
||||
|
||||
def save_data(data, fn):
|
||||
with open(fn, "w") as f:
|
||||
data = "\n".join(sorted(data))
|
||||
f.write(data)
|
||||
|
||||
def mk_db(data, fn):
|
||||
with open(fn, "w") as f:
|
||||
for name in data:
|
||||
entry = f'record(stringin, "$(SYSTEM):{name}") {{}}'
|
||||
f.write(entry)
|
||||
f.write("\n")
|
||||
|
||||
|
11
SATES20-CPCL-DYNA/cfg/python/log.py
Normal file
11
SATES20-CPCL-DYNA/cfg/python/log.py
Normal file
@ -0,0 +1,11 @@
|
||||
import logging
|
||||
|
||||
log = logging.getLogger("dynaPV")
|
||||
log.setLevel("INFO")
|
||||
|
||||
handler = logging.StreamHandler()
|
||||
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s: %(message)s")
|
||||
handler.setFormatter(formatter)
|
||||
log.addHandler(handler)
|
||||
|
||||
|
38
SATES20-CPCL-DYNA/cfg/python/pvs.py
Normal file
38
SATES20-CPCL-DYNA/cfg/python/pvs.py
Normal file
@ -0,0 +1,38 @@
|
||||
from epics import PV
|
||||
|
||||
from data import load_data, save_data, mk_db
|
||||
from log import log
|
||||
|
||||
|
||||
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)}")
|
||||
|
||||
def cb_del(value=None, **kwargs):
|
||||
log.info(f"del: value={repr(value)} {kwargs}")
|
||||
if not value:
|
||||
return
|
||||
data = load_data(FN_ENTRIES)
|
||||
data.discard(value)
|
||||
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)
|
||||
|
||||
|
8
SATES20-CPCL-DYNA/cfg/python/sigterm.py
Normal file
8
SATES20-CPCL-DYNA/cfg/python/sigterm.py
Normal file
@ -0,0 +1,8 @@
|
||||
import signal
|
||||
|
||||
def handler(*args, **kwargs):
|
||||
raise KeyboardInterrupt
|
||||
|
||||
signal.signal(signal.SIGTERM, handler)
|
||||
|
||||
|
15
SATES20-CPCL-DYNA/cfg/python/start.py
Normal file
15
SATES20-CPCL-DYNA/cfg/python/start.py
Normal file
@ -0,0 +1,15 @@
|
||||
from time import sleep, time
|
||||
|
||||
import pvs
|
||||
import sigterm
|
||||
|
||||
from log import log
|
||||
|
||||
try:
|
||||
while True:
|
||||
sleep(5)
|
||||
log.info("tick")
|
||||
except KeyboardInterrupt:
|
||||
log.info("bye")
|
||||
|
||||
|
6
SATES20-CPCL-DYNA/parameters.yaml
Normal file
6
SATES20-CPCL-DYNA/parameters.yaml
Normal file
@ -0,0 +1,6 @@
|
||||
ioc_host: satese-vserv-01
|
||||
ioc_port: 50505
|
||||
epics_version: 7.0.7
|
||||
cpu_architecture: x86_64
|
||||
os: RHEL8
|
||||
os_id: rhel
|
Reference in New Issue
Block a user