add async example
This commit is contained in:
4
test.cmd
4
test.cmd
@ -8,6 +8,10 @@ devsup_registerRecordDeviceDriver(pdbbase)
|
||||
#evalPy "import devsup.hooks"
|
||||
#evalPy "devsup.hooks.debugHooks()"
|
||||
|
||||
evalPy "import test2"
|
||||
evalPy "test2.addDrv('AAAA')"
|
||||
evalPy "test2.addDrv('BBBB')"
|
||||
|
||||
dbLoadRecords("db/test1.db","P=md:")
|
||||
|
||||
iocInit()
|
||||
|
@ -4,3 +4,13 @@ record(longin, "$(P)li:cnt") {
|
||||
field(INP , "@test1 hello world")
|
||||
field(SCAN, "1 second")
|
||||
}
|
||||
|
||||
record(longin, "$(P)val:a") {
|
||||
field(DTYP, "Python Device")
|
||||
field(INP , "@test2 AAAA")
|
||||
}
|
||||
|
||||
record(longin, "$(P)val:b") {
|
||||
field(DTYP, "Python Device")
|
||||
field(INP , "@test2 AAAA")
|
||||
}
|
||||
|
65
testApp/test2.py
Normal file
65
testApp/test2.py
Normal file
@ -0,0 +1,65 @@
|
||||
|
||||
import threading, time
|
||||
from devsup.hooks import addHook
|
||||
|
||||
insts = {}
|
||||
|
||||
class Driver(threading.Thread):
|
||||
def __init__(self, name):
|
||||
super(Driver,self).__init__()
|
||||
self.name = name
|
||||
self._lock = threading.Lock()
|
||||
self._recs = set()
|
||||
self._run = True
|
||||
self._stop = threading.Event()
|
||||
self.value = 0
|
||||
addHook('AfterIocRunning', self.start)
|
||||
addHook('AtIocExit', self.stop)
|
||||
|
||||
def stop(self):
|
||||
print 'Stopping driver',self.name
|
||||
with self._lock:
|
||||
self._run = False
|
||||
self._stop.wait()
|
||||
print 'Finished with',self.value
|
||||
|
||||
def addrec(self, rec):
|
||||
with self._lock:
|
||||
self._recs.add(rec)
|
||||
def delrec(self, rec):
|
||||
with self._lock:
|
||||
self._recs.remove(rec)
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
while self._run:
|
||||
time.sleep(1.0)
|
||||
with self._lock:
|
||||
val = self.value
|
||||
self.value += 1
|
||||
for R in self._recs:
|
||||
R.record.scan(sync=True, reason=val)
|
||||
finally:
|
||||
self._stop.set()
|
||||
|
||||
def addDrv(name):
|
||||
print 'Create driver',name
|
||||
insts[name] = Driver(name)
|
||||
|
||||
class Device(object):
|
||||
def __init__(self, rec, drv):
|
||||
self.driver, self.record = drv, rec
|
||||
self.driver.addrec(self)
|
||||
self.val = rec.field('VAL')
|
||||
def detach(self, rec):
|
||||
self.driver.delrec(self)
|
||||
def process(self, rec, data):
|
||||
if data is None:
|
||||
print rec,'Someone processed me?'
|
||||
else:
|
||||
print rec,'update to',data
|
||||
self.val.putval(data)
|
||||
|
||||
def build(rec, args):
|
||||
drv = insts[args]
|
||||
return Device(rec, drv)
|
Reference in New Issue
Block a user