add multi-unit settings example

This commit is contained in:
Michael Davidsaver
2013-03-31 19:17:34 -04:00
parent 40ff993e4f
commit a643dafdad
3 changed files with 87 additions and 1 deletions

View File

@ -30,3 +30,19 @@ record(longin, "$(P)async:cnt") {
field(INP , "@test4")
field(SCAN, "1 second")
}
record(ao, "$(P):A-SP") {
field(DTYP, "Raw Python Device")
field(OUT , "@test5 hello none")
}
record(ao, "$(P):B-SP") {
field(DTYP, "Raw Python Device")
field(OUT , "@test5 hello half")
}
record(ai, "$(P):A-RB") {
field(DTYP, "Raw Python Device")
field(INP , "@test5 hello none")
}

View File

@ -14,7 +14,7 @@ class Counter(object):
def process(self, rec, reason):
if reason is AsyncComplete:
rec.VAL = self.nextval
else:
self.nextval = rec.VAL+1
self.timer = threading.Timer(0.2, rec.asyncFinish, kwargs={'reason':AsyncComplete})

70
testApp/test5.py Normal file
View File

@ -0,0 +1,70 @@
import threading
from devsup.hooks import addHook
from devsup.util import Worker
from devsup.db import IOScanListThread
#(forwardfn, reversefn)
_fns = {
'none':(lambda x:x, lambda x:x),
'half':(lambda x:x*2.0, lambda x:x/2.0),
}
ReSync = object()
instances = {}
class UnitWorker(object):
def __init__(self, name):
super(UnitWorker,self).__init__()
self.name = name
self.scan = IOScanListThread()
self.scan.force = 0
self.worker = Worker()
addHook('AfterIocRunning', self.worker.start)
addHook('AtIocExit', self.worker.join)
def add(self, rec, unit, val):
self.worker.add(self.update, (rec, unit, val))
def update(self, rec, unit, val):
F, _ = _fns[unit]
V = F(val)
values = {}
for U,(F,R) in _fns.iteritems():
values[U] = R(V)
self.scan.interrupt(reason=values)
class UnitSupport(object):
def __init__(self, rec, args):
worker, self.unit = args.split(None, 1)
try:
W = instances[worker]
except KeyError:
W = UnitWorker(worker)
instances[worker] = W
self.worker = W
W.scan.add(rec)
def detach(self, rec):
self.worker.scan.remove(rec)
def process(self, rec, reason):
if reason is None:
self.worker.update(rec, self.unit, rec.VAL)
else:
try:
rec.VAL = reason[self.unit]
rec.UDF = 0
except:
rec.UDF = 1
raise
build = UnitSupport