update ptable dset
This commit is contained in:
@ -209,7 +209,7 @@ class _ParamGroupInstance(object):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
class _ParamSup(object):
|
class _ParamSupBase(object):
|
||||||
def __init__(self, inst, rec, info):
|
def __init__(self, inst, rec, info):
|
||||||
self.inst, self.info = inst, info
|
self.inst, self.info = inst, info
|
||||||
# Determine which field to use to store the value
|
# Determine which field to use to store the value
|
||||||
@ -224,12 +224,15 @@ class _ParamSup(object):
|
|||||||
def allowScan(self, rec):
|
def allowScan(self, rec):
|
||||||
if self.inst.scan:
|
if self.inst.scan:
|
||||||
return self.inst.scan.add(rec)
|
return self.inst.scan.add(rec)
|
||||||
|
|
||||||
|
class _ParamSupGet(_ParamSupBase):
|
||||||
def process(self, rec, reason=None):
|
def process(self, rec, reason=None):
|
||||||
|
"""Read a value from the table into the record
|
||||||
|
"""
|
||||||
with self.inst.table.lock:
|
with self.inst.table.lock:
|
||||||
if reason is _INTERNAL:
|
nval, alrm = self.inst.value, self.inst.alarm
|
||||||
# sync table to record
|
self.inst.table.log.debug('%s -> %s (%s)', self.inst.name, rec.NAME, nval)
|
||||||
self.inst.table.log.debug('-> %s (%s)', rec.NAME, self.inst.value)
|
|
||||||
nval = self.inst.value
|
|
||||||
if nval is not None:
|
if nval is not None:
|
||||||
if self.vdata is None:
|
if self.vdata is None:
|
||||||
self.vfld.putval(nval)
|
self.vfld.putval(nval)
|
||||||
@ -238,21 +241,30 @@ class _ParamSup(object):
|
|||||||
nval = nval[:len(self.vdata)]
|
nval = nval[:len(self.vdata)]
|
||||||
self.vdata[:len(nval)] = nval
|
self.vdata[:len(nval)] = nval
|
||||||
self.vfld.putarraylen(len(nval))
|
self.vfld.putarraylen(len(nval))
|
||||||
if self.inst.alarm:
|
if alrm:
|
||||||
rec.setSevr(self.inst.alarm)
|
rec.setSevr(alrm)
|
||||||
else:
|
else:
|
||||||
# undefined value
|
# undefined value
|
||||||
rec.setSevr(INVALID_ALARM, UDF_ALARM)
|
rec.setSevr(INVALID_ALARM, UDF_ALARM)
|
||||||
|
|
||||||
|
class _ParamSupSet(_ParamSupGet):
|
||||||
|
def process(self, rec, reason=None):
|
||||||
|
"""Write a value from the record into the table
|
||||||
|
"""
|
||||||
|
if reason is _INTERNAL:
|
||||||
|
# sync table to record
|
||||||
|
super(_ParamSupSet,self).process(rec,reason)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# sync record to table
|
# sync record to table
|
||||||
self.inst.table.log.debug('<- %s (%s)', rec.NAME, rec.VAL)
|
self.inst.table.log.debug('%s <- %s (%s)', self.inst.name, rec.NAME, rec.VAL)
|
||||||
if self.vdata is None:
|
if self.vdata is None:
|
||||||
nval = self.vfld.getval()
|
nval = self.vfld.getval()
|
||||||
else:
|
else:
|
||||||
# A copy is made which can be used without locking the record
|
# A copy is made which can be used without locking the record
|
||||||
nval = self.vdata[:self.vfld.getarraylen()].copy()
|
nval = self.vdata[:self.vfld.getarraylen()].copy()
|
||||||
|
|
||||||
|
with self.inst.table.lock:
|
||||||
oval, self.inst.value = self.inst.value, nval
|
oval, self.inst.value = self.inst.value, nval
|
||||||
|
|
||||||
# Execute actions
|
# Execute actions
|
||||||
@ -273,7 +285,8 @@ class TableBase(object):
|
|||||||
>>>
|
>>>
|
||||||
"""
|
"""
|
||||||
log = LOG
|
log = LOG
|
||||||
ParamSupport = _ParamSup
|
ParamSupportGet = _ParamSupGet
|
||||||
|
ParamSupportSet = _ParamSupSet
|
||||||
def __init__(self, **kws):
|
def __init__(self, **kws):
|
||||||
self.name = kws.pop('name')
|
self.name = kws.pop('name')
|
||||||
if self.name in _tables:
|
if self.name in _tables:
|
||||||
@ -329,10 +342,20 @@ class TableBase(object):
|
|||||||
_tables[self.name] = self
|
_tables[self.name] = self
|
||||||
|
|
||||||
def build(rec, args):
|
def build(rec, args):
|
||||||
parts = args.split(None,2)
|
"""Device support pattern
|
||||||
table, param = parts[:2]
|
|
||||||
info = None if len(parts)<3 else parts[2]
|
"@devsup.ptable <tablename> set|get <param> [optional]"
|
||||||
|
"""
|
||||||
|
parts = args.split(None,3)
|
||||||
|
table, param = parts[0], parts[2]
|
||||||
|
info = None if len(parts)<4 else parts[3]
|
||||||
T = _tables[table]
|
T = _tables[table]
|
||||||
P = T._parameters[param]
|
P = T._parameters[param]
|
||||||
|
if parts[1]=='set':
|
||||||
|
return T.ParamSupportSet(P, rec, info)
|
||||||
|
elif parts[1]=='get':
|
||||||
|
return T.ParamSupportGet(P, rec, info)
|
||||||
|
else:
|
||||||
|
raise ValueError("Not set or get")
|
||||||
T.log.debug("Attaching ptable '%s, %s' to %s", T.name, P.name, rec.NAME)
|
T.log.debug("Attaching ptable '%s, %s' to %s", T.name, P.name, rec.NAME)
|
||||||
return T.ParamSupport(P, rec, info)
|
return T.ParamSupport(P, rec, info)
|
||||||
|
@ -39,4 +39,4 @@ Device Support
|
|||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
A general purpose device support is provided to access table parameters.
|
A general purpose device support is provided to access table parameters.
|
||||||
The input/output link format is "@devsup.ptable <tablename> <param> [optional]"
|
The input/output link format is "@devsup.ptable <tablename> set|get <param> [optional]"
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
record(ao, "$(P):A") {
|
record(ao, "$(P):A") {
|
||||||
field(DTYP, "Python Device")
|
field(DTYP, "Python Device")
|
||||||
field(OUT , "@devsup.ptable $(TNAME) A")
|
field(OUT , "@devsup.ptable $(TNAME) set A")
|
||||||
}
|
}
|
||||||
|
|
||||||
record(ao, "$(P):B") {
|
record(ao, "$(P):B") {
|
||||||
field(DTYP, "Python Device")
|
field(DTYP, "Python Device")
|
||||||
field(OUT , "@devsup.ptable $(TNAME) B")
|
field(OUT , "@devsup.ptable $(TNAME) set B")
|
||||||
}
|
}
|
||||||
|
|
||||||
record(ao, "$(P):C") {
|
record(ao, "$(P):C") {
|
||||||
field(DTYP, "Python Device")
|
field(DTYP, "Python Device")
|
||||||
field(OUT , "@$(TNAME) C")
|
field(OUT , "@$(TNAME) set C")
|
||||||
info("pySupportMod", "devsup.ptable")
|
info("pySupportMod", "devsup.ptable")
|
||||||
}
|
}
|
||||||
|
|
||||||
record(ai, "$(P):S") {
|
record(ai, "$(P):S") {
|
||||||
field(DTYP, "Python Device")
|
field(DTYP, "Python Device")
|
||||||
field(INP , "@devsup.ptable $(TNAME) S")
|
field(INP , "@devsup.ptable $(TNAME) get S")
|
||||||
field(SCAN, "I/O Intr")
|
field(SCAN, "I/O Intr")
|
||||||
field(PINI, "YES")
|
field(PINI, "YES")
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user