removed test code from prototyping
This commit is contained in:
@ -1,21 +0,0 @@
|
|||||||
from concurrent.futures import ThreadPoolExecutor
|
|
||||||
|
|
||||||
|
|
||||||
class Executor(ThreadPoolExecutor):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.futures = {}
|
|
||||||
|
|
||||||
def run(self, name, func, *args, **kwargs):
|
|
||||||
fut = self.submit(func, *args, **kwargs)
|
|
||||||
self.futures[name] = fut
|
|
||||||
return fut
|
|
||||||
|
|
||||||
def cleanup(self):
|
|
||||||
for name, fut in tuple(self.futures.items()):
|
|
||||||
if fut.done():
|
|
||||||
del self.futures[name]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
from pcaspy import Driver, SimpleServer
|
|
||||||
|
|
||||||
prefix = 'MTEST:'
|
|
||||||
pvdb = {
|
|
||||||
'RAND' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
class myDriver(Driver):
|
|
||||||
def __init__(self):
|
|
||||||
super(myDriver, self).__init__()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
server = SimpleServer()
|
|
||||||
server.createPV(prefix, pvdb)
|
|
||||||
driver = myDriver()
|
|
||||||
|
|
||||||
# process CA transactions
|
|
||||||
for i in range(100):
|
|
||||||
server.process(0.1)
|
|
||||||
|
|
||||||
print(1)
|
|
||||||
del server
|
|
||||||
print(2)
|
|
||||||
|
|
||||||
server = SimpleServer()
|
|
||||||
server.createPV(prefix, pvdb)
|
|
||||||
driver = myDriver()
|
|
||||||
|
|
||||||
# process CA transactions
|
|
||||||
for i in range(100):
|
|
||||||
server.process(0.1)
|
|
||||||
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
from pcaspy import Driver, SimpleServer
|
|
||||||
|
|
||||||
|
|
||||||
prefix1 = 'MTEST1:'
|
|
||||||
pvdb1 = {
|
|
||||||
'RAND1' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix2 = 'MTEST1:' #!!!
|
|
||||||
pvdb2 = {
|
|
||||||
'RAND2' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix3 = 'MTEST3:'
|
|
||||||
pvdb3 = {
|
|
||||||
'RAND3' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class myDriver(Driver):
|
|
||||||
def __init__(self):
|
|
||||||
super(myDriver, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
server = SimpleServer()
|
|
||||||
server.createPV(prefix1, pvdb1)
|
|
||||||
driver = myDriver()
|
|
||||||
|
|
||||||
print(1)
|
|
||||||
for i in range(300):
|
|
||||||
server.process(0.1)
|
|
||||||
|
|
||||||
server.createPV(prefix2, pvdb2)
|
|
||||||
driver = myDriver()
|
|
||||||
|
|
||||||
print(2)
|
|
||||||
for i in range(300):
|
|
||||||
server.process(0.1)
|
|
||||||
|
|
||||||
server.createPV(prefix3, pvdb3)
|
|
||||||
driver = myDriver()
|
|
||||||
|
|
||||||
print(3)
|
|
||||||
for i in range(300):
|
|
||||||
server.process(0.1)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
from time import sleep
|
|
||||||
import random
|
|
||||||
from threading import Thread
|
|
||||||
from pcaspy import Driver, SimpleServer
|
|
||||||
from pcaspy.driver import manager
|
|
||||||
|
|
||||||
|
|
||||||
prefix1 = 'MTEST1:'
|
|
||||||
pvdb1 = {
|
|
||||||
'RAND1' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix2 = 'MTEST2:'
|
|
||||||
pvdb2 = {
|
|
||||||
'RAND2' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix3 = 'MTEST3:'
|
|
||||||
pvdb3 = {
|
|
||||||
'RAND3' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class myDriver(Driver):
|
|
||||||
def __init__(self):
|
|
||||||
super(myDriver, self).__init__()
|
|
||||||
|
|
||||||
def read(self, reason):
|
|
||||||
if reason.startswith('RAND'):
|
|
||||||
value = random.random()
|
|
||||||
else:
|
|
||||||
value = self.getParam(reason)
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
class Mor:
|
|
||||||
|
|
||||||
def __init__(self, prefix, pvdb, wait_time=0.1):
|
|
||||||
self.wait_time = wait_time
|
|
||||||
self.server = SimpleServer()
|
|
||||||
self.server.createPV(prefix, pvdb)
|
|
||||||
self.driver = myDriver()
|
|
||||||
self.thread = Thread(target=self.run)
|
|
||||||
self.thread.start()
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.processing = True
|
|
||||||
self.running = True
|
|
||||||
n = 0
|
|
||||||
while self.running:
|
|
||||||
n += 1
|
|
||||||
if self.processing:
|
|
||||||
# print("proc", n)
|
|
||||||
self.server.process(self.wait_time)
|
|
||||||
else:
|
|
||||||
# print("pause proc", n)
|
|
||||||
sleep(self.wait_time)
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
self.running = False
|
|
||||||
self._sleep_after_change()
|
|
||||||
|
|
||||||
def stop_proc(self):
|
|
||||||
self.processing = False
|
|
||||||
self._sleep_after_change()
|
|
||||||
|
|
||||||
def start_proc(self):
|
|
||||||
self.processing = True
|
|
||||||
self._sleep_after_change()
|
|
||||||
|
|
||||||
def _sleep_after_change(self):
|
|
||||||
wait_time = self.wait_time * 1.1
|
|
||||||
sleep(wait_time)
|
|
||||||
|
|
||||||
def createPV(self, prefix, pvdb):
|
|
||||||
# self.stop_proc()
|
|
||||||
self.server.createPV(prefix, pvdb)
|
|
||||||
self.driver = myDriver()
|
|
||||||
# self.start_proc()
|
|
||||||
|
|
||||||
def deletePV(self, prefix, pvdb):
|
|
||||||
# self.stop_proc()
|
|
||||||
for n in pvdb:
|
|
||||||
del manager.pvs["default"][n]
|
|
||||||
del manager.pvf[prefix + n]
|
|
||||||
# self.start_proc()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
print("create", 1)
|
|
||||||
mor = Mor(prefix1, pvdb1)
|
|
||||||
sleep(15)
|
|
||||||
|
|
||||||
print("create", 2)
|
|
||||||
mor.createPV(prefix2, pvdb2)
|
|
||||||
sleep(15)
|
|
||||||
|
|
||||||
print("delete", 2)
|
|
||||||
mor.deletePV(prefix2, pvdb2)
|
|
||||||
sleep(15)
|
|
||||||
|
|
||||||
print("create", 2)
|
|
||||||
mor.createPV(prefix2, pvdb2)
|
|
||||||
sleep(15)
|
|
||||||
|
|
||||||
print("create", 3)
|
|
||||||
mor.createPV(prefix3, pvdb3)
|
|
||||||
sleep(15)
|
|
||||||
|
|
||||||
mor.stop()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
from pcaspy import Driver
|
|
||||||
from mor import Mor
|
|
||||||
|
|
||||||
prefix = 'MTEST:'
|
|
||||||
|
|
||||||
pvdb = {
|
|
||||||
'RAND' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
"NAME" : {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class myDriver(Driver):
|
|
||||||
def __init__(self, server):
|
|
||||||
self.server = server
|
|
||||||
super(myDriver, self).__init__()
|
|
||||||
|
|
||||||
def write(self, reason, value):
|
|
||||||
print("write", reason, value)
|
|
||||||
if reason == "NAME":
|
|
||||||
new_pvdb = {
|
|
||||||
value: {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.server.createPV(new_pvdb)
|
|
||||||
# self.server.restart()
|
|
||||||
return super().write(reason, value)
|
|
||||||
|
|
||||||
def read(self, reason):
|
|
||||||
value = self.getParam(reason)
|
|
||||||
print("read", reason, value)
|
|
||||||
return super().read(reason)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
server = Mor(prefix, pvdb, myDriver)
|
|
||||||
# server.createPV(pvdb)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,129 +0,0 @@
|
|||||||
from time import sleep
|
|
||||||
from datetime import datetime
|
|
||||||
from threading import Thread
|
|
||||||
from pcaspy import SimpleServer, Driver
|
|
||||||
from pcaspy.driver import manager, _ait_d as AIT_D
|
|
||||||
|
|
||||||
from context import Context
|
|
||||||
from utils import typename
|
|
||||||
|
|
||||||
|
|
||||||
INITIAL_PVDB = {
|
|
||||||
"START_TIME" : {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
D_AIT = {v:k for k, v in AIT_D.items()}
|
|
||||||
|
|
||||||
|
|
||||||
class DefaultDriver(Driver): #TODO: caget on START_TIME crashes without this subclass?!
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MorIOC(Context):
|
|
||||||
|
|
||||||
def __init__(self, prefix, DriverClass=DefaultDriver, wait_time=0.1):
|
|
||||||
print("init")
|
|
||||||
prefix = prefix.upper()
|
|
||||||
prefix = prefix if prefix.endswith(":") else prefix + ":"
|
|
||||||
|
|
||||||
self.prefix = prefix
|
|
||||||
self.DriverClass = DriverClass
|
|
||||||
self.wait_time = wait_time
|
|
||||||
|
|
||||||
self.server = SimpleServer()
|
|
||||||
self.server.createPV(prefix, INITIAL_PVDB)
|
|
||||||
self.driver = DriverClass()
|
|
||||||
|
|
||||||
now = datetime.now()
|
|
||||||
self.driver.setParam("START_TIME", str(now))
|
|
||||||
self.driver.updatePVs()
|
|
||||||
|
|
||||||
self.thread = Thread(target=self.run, daemon=True)
|
|
||||||
self.thread.start()
|
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.processing = True
|
|
||||||
self.running = True
|
|
||||||
n = 0
|
|
||||||
while self.running:
|
|
||||||
n += 1
|
|
||||||
if self.processing:
|
|
||||||
# print("proc", n)
|
|
||||||
self.server.process(self.wait_time)
|
|
||||||
else:
|
|
||||||
# print("pause proc", n)
|
|
||||||
sleep(self.wait_time)
|
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
self.running = False
|
|
||||||
self._sleep_after_change()
|
|
||||||
|
|
||||||
# def stop_proc(self):
|
|
||||||
# self.processing = False
|
|
||||||
# self._sleep_after_change()
|
|
||||||
|
|
||||||
# def start_proc(self):
|
|
||||||
# self.processing = True
|
|
||||||
# self._sleep_after_change()
|
|
||||||
|
|
||||||
def _sleep_after_change(self):
|
|
||||||
wait_time = self.wait_time * 1.1
|
|
||||||
sleep(wait_time)
|
|
||||||
|
|
||||||
|
|
||||||
def createPV(self, pvdb):
|
|
||||||
# self.stop_proc()
|
|
||||||
current_pvdb = self.driver.pvDB #TODO crash due to keyerror otherwise
|
|
||||||
self.server.createPV(self.prefix, pvdb)
|
|
||||||
self.driver = self.DriverClass()
|
|
||||||
self.driver.pvDB.update(current_pvdb)
|
|
||||||
# self.start_proc()
|
|
||||||
|
|
||||||
def deletePVs(self, pvdb):
|
|
||||||
# self.stop_proc()
|
|
||||||
for n in pvdb:
|
|
||||||
self.deletePV(n)
|
|
||||||
# self.start_proc()
|
|
||||||
|
|
||||||
def deletePV(self, name):
|
|
||||||
del manager.pvs["default"][name]
|
|
||||||
del manager.pvf[self.prefix + name]
|
|
||||||
|
|
||||||
|
|
||||||
def serve(self, **kwargs):
|
|
||||||
pvdb = {}
|
|
||||||
for name, value in kwargs.items():
|
|
||||||
name = name.upper()
|
|
||||||
dtype = typename(value)
|
|
||||||
if not name in manager.pvs["default"]:
|
|
||||||
print("will create", name)
|
|
||||||
pvdb[name] = {"type": dtype}
|
|
||||||
else:
|
|
||||||
pv = manager.pvs["default"][name]
|
|
||||||
pv_type = pv.info.type
|
|
||||||
pv_type = D_AIT[pv_type]
|
|
||||||
if pv_type != dtype:
|
|
||||||
print(f"type for {name} changed:", pv_type, "->", dtype) #TODO what should be done if this happens?
|
|
||||||
# self.deletePV(name)
|
|
||||||
# pvdb[name] = {"type": dtype}
|
|
||||||
if pvdb:
|
|
||||||
print("new PVs", pvdb)
|
|
||||||
self.createPV(pvdb)
|
|
||||||
for name, value in kwargs.items():
|
|
||||||
name = name.upper()
|
|
||||||
self.driver.setParam(name, value)
|
|
||||||
self.driver.updatePVs()
|
|
||||||
|
|
||||||
|
|
||||||
def host(self, **kwargs):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#TODO:
|
|
||||||
# - if pv name already contains :, don't prepend prefix?!
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
from time import sleep
|
|
||||||
from random import random, randint
|
|
||||||
|
|
||||||
from pcaspy import Driver
|
|
||||||
|
|
||||||
from morioc import MorIOC
|
|
||||||
|
|
||||||
|
|
||||||
pvdb1 = {
|
|
||||||
'RAND1' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
pvdb2 = {
|
|
||||||
'RAND2' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
pvdb3 = {
|
|
||||||
'RAND3' : {
|
|
||||||
'prec' : 3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class myDriver(Driver):
|
|
||||||
def __init__(self):
|
|
||||||
super(myDriver, self).__init__()
|
|
||||||
|
|
||||||
def read(self, reason):
|
|
||||||
if reason.startswith('RAND'):
|
|
||||||
value = random()
|
|
||||||
# self.setParam(reason, value)
|
|
||||||
# self.updatePVs()
|
|
||||||
else:
|
|
||||||
value = self.getParam(reason)
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
print("init")
|
|
||||||
mor = MorIOC("mtest", DriverClass=myDriver)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
print("create", 1)
|
|
||||||
mor.createPV(pvdb1)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
print("create", 2)
|
|
||||||
mor.createPV(pvdb2)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
print("delete", 2)
|
|
||||||
mor.deletePVs(pvdb2)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
print("create", 2)
|
|
||||||
mor.createPV(pvdb2)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
print("create", 3)
|
|
||||||
mor.createPV(pvdb3)
|
|
||||||
sleep(3)
|
|
||||||
|
|
||||||
mor.stop()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
from time import sleep
|
|
||||||
from random import random, randint
|
|
||||||
|
|
||||||
from morioc import MorIOC
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
mor = MorIOC("mtest")
|
|
||||||
|
|
||||||
for i in range(100):
|
|
||||||
mor.serve(
|
|
||||||
rand1 = random(),
|
|
||||||
rand2 = randint(100, 200),
|
|
||||||
rand3 = random() + 10
|
|
||||||
)
|
|
||||||
sleep(0.5)
|
|
||||||
|
|
||||||
# mor.serve(
|
|
||||||
# rand1 = random(),
|
|
||||||
# rand3 = randint(100, 200),
|
|
||||||
# rand2 = random() + 10
|
|
||||||
# )
|
|
||||||
# sleep(0.5)
|
|
||||||
|
|
||||||
mor.stop()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,103 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import gc
|
|
||||||
from time import sleep
|
|
||||||
from pcaspy import SimpleServer
|
|
||||||
from pcaspy.tools import ServerThread
|
|
||||||
from pcaspy.driver import cas
|
|
||||||
|
|
||||||
|
|
||||||
class KillWrapper:
|
|
||||||
|
|
||||||
def __init__(self, Wrapped, *args, **kwargs):
|
|
||||||
print("init")
|
|
||||||
self.Wrapped = Wrapped
|
|
||||||
self.args = args
|
|
||||||
self.kwargs = kwargs
|
|
||||||
self.init()
|
|
||||||
|
|
||||||
def init(self):
|
|
||||||
self.wrapped = self.Wrapped(*self.args, **self.kwargs)
|
|
||||||
|
|
||||||
def kill(self):
|
|
||||||
print("del")
|
|
||||||
del self.wrapped
|
|
||||||
sleep(1)
|
|
||||||
self.wrapped = None
|
|
||||||
sleep(1)
|
|
||||||
print("del'ed")
|
|
||||||
gc.collect()
|
|
||||||
sleep(2)
|
|
||||||
print("gc'ed")
|
|
||||||
self.init()
|
|
||||||
|
|
||||||
def __getattr__(self, name):
|
|
||||||
return getattr(self.wrapped, name)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Mor:
|
|
||||||
|
|
||||||
def __init__(self, prefix, pvdb, Driver):
|
|
||||||
self.prefix = prefix
|
|
||||||
self.Driver = Driver
|
|
||||||
self.server = None
|
|
||||||
self.driver = None
|
|
||||||
self.running = False
|
|
||||||
self.pvdb = pvdb
|
|
||||||
self.start()
|
|
||||||
|
|
||||||
def restart(self):
|
|
||||||
print("restart")
|
|
||||||
self.process = True
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
print("start")
|
|
||||||
self.server = server = KillWrapper(SimpleServer)
|
|
||||||
# server.setDebugLevel(4)
|
|
||||||
print(self.pvdb)
|
|
||||||
server.createPV(self.prefix, self.pvdb)
|
|
||||||
self.driver = KillWrapper(self.Driver, self)
|
|
||||||
|
|
||||||
# print("thread start")
|
|
||||||
# self.thread = thread = ServerThread(server)
|
|
||||||
# thread.start()
|
|
||||||
|
|
||||||
print("wait loop")
|
|
||||||
self.process = True
|
|
||||||
self.running = True
|
|
||||||
while self.running:
|
|
||||||
if self.process:
|
|
||||||
server.process(0.1)
|
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
print("stop")
|
|
||||||
# self.thread.stop()
|
|
||||||
# sleep(1)
|
|
||||||
# print(self.thread)
|
|
||||||
# del self.thread
|
|
||||||
# self.thread = None
|
|
||||||
|
|
||||||
self.process = False
|
|
||||||
sleep(0.2)
|
|
||||||
# del self.driver.server
|
|
||||||
# del self.driver
|
|
||||||
# self.driver = None
|
|
||||||
self.driver.kill()
|
|
||||||
self.server.kill()
|
|
||||||
# del self.server
|
|
||||||
# self.server = None
|
|
||||||
# gc.collect()
|
|
||||||
# print("sleeping start")
|
|
||||||
# sleep(2)
|
|
||||||
# print("sleeping done")
|
|
||||||
|
|
||||||
def createPV(self, new_pvdb):
|
|
||||||
print("createPV")
|
|
||||||
self.stop()
|
|
||||||
# self.pvdb.update(new_pvdb)
|
|
||||||
print(self.pvdb)
|
|
||||||
self.restart()
|
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user