rename framework methods to camelCase
for easier distinction: - camelCase or singleword: framework method - snake_case: driver method (driver) parameters are lowercase, single word framework variables may have to start with uppercase letters to distinguish... Change-Id: I76536b6390324625b242c4f190553014c2ca61d6 Reviewed-on: https://forge.frm2.tum.de/review/20295 Tested-by: JenkinsCodeReview <bjoern_pedersen@frm2.tum.de> Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de> Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
parent
22ff707e51
commit
3eaa32d514
@ -16,7 +16,7 @@ Open questions
|
|||||||
-> needs Datatype for a function
|
-> needs Datatype for a function
|
||||||
* datatype for funcion: is argin a list anyway, or just one (structured) argument?
|
* datatype for funcion: is argin a list anyway, or just one (structured) argument?
|
||||||
(so far we use a list and argout is a single datatype (which may be stuctured))
|
(so far we use a list and argout is a single datatype (which may be stuctured))
|
||||||
* polling: vendor specific or do we propose a common way to handle it?
|
* polling: vendor specific or do we propose a common way to handle it?
|
||||||
(playground uses a per-device pollinterval. params may be polled less often)
|
(playground uses a per-device pollinterval. params may be polled less often)
|
||||||
* interface classes !!! (maybe with feature mixins like WindowTimeout?)
|
* interface classes !!! (maybe with feature mixins like WindowTimeout?)
|
||||||
* hardware access: unify? how?
|
* hardware access: unify? how?
|
||||||
@ -92,7 +92,7 @@ Documentation
|
|||||||
* transfer build docu into wiki via automated jobfile
|
* transfer build docu into wiki via automated jobfile
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Transfer of blobs via json
|
Transfer of blobs via json
|
||||||
--------------------------
|
--------------------------
|
||||||
|
@ -216,14 +216,14 @@ class Module(object):
|
|||||||
# defined even for non drivable (used for dynamic polling)
|
# defined even for non drivable (used for dynamic polling)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def early_init(self):
|
def earlyInit(self):
|
||||||
# may be overriden in derived classes to init stuff
|
# may be overriden in derived classes to init stuff
|
||||||
self.log.debug('empty %s.early_init()' % self.__class__.__name__)
|
self.log.debug('empty %s.earlyInit()' % self.__class__.__name__)
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
self.log.debug('empty %s.init_module()' % self.__class__.__name__)
|
self.log.debug('empty %s.initModule()' % self.__class__.__name__)
|
||||||
|
|
||||||
def start_module(self, started_callback):
|
def startModule(self, started_callback):
|
||||||
'''runs after init of all modules
|
'''runs after init of all modules
|
||||||
|
|
||||||
started_callback to be called when thread spawned by late_init
|
started_callback to be called when thread spawned by late_init
|
||||||
@ -231,7 +231,7 @@ class Module(object):
|
|||||||
might return a timeout value, if different from default
|
might return a timeout value, if different from default
|
||||||
'''
|
'''
|
||||||
|
|
||||||
self.log.debug('empty %s.start_module()' % self.__class__.__name__)
|
self.log.debug('empty %s.startModule()' % self.__class__.__name__)
|
||||||
started_callback()
|
started_callback()
|
||||||
|
|
||||||
|
|
||||||
@ -267,7 +267,7 @@ class Readable(Module):
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
def start_module(self, started_callback):
|
def startModule(self, started_callback):
|
||||||
'''start polling thread'''
|
'''start polling thread'''
|
||||||
mkthread(self.__pollThread, started_callback)
|
mkthread(self.__pollThread, started_callback)
|
||||||
|
|
||||||
@ -285,7 +285,7 @@ class Readable(Module):
|
|||||||
def __pollThread_inner(self, started_callback):
|
def __pollThread_inner(self, started_callback):
|
||||||
"""super simple and super stupid per-module polling thread"""
|
"""super simple and super stupid per-module polling thread"""
|
||||||
i = 0
|
i = 0
|
||||||
fastpoll = self.poll(i)
|
fastpoll = self.pollParams(i)
|
||||||
started_callback()
|
started_callback()
|
||||||
while True:
|
while True:
|
||||||
i += 1
|
i += 1
|
||||||
@ -294,21 +294,19 @@ class Readable(Module):
|
|||||||
except TypeError:
|
except TypeError:
|
||||||
time.sleep(min(self.pollinterval)
|
time.sleep(min(self.pollinterval)
|
||||||
if fastpoll else max(self.pollinterval))
|
if fastpoll else max(self.pollinterval))
|
||||||
fastpoll = self.poll(i)
|
fastpoll = self.pollParams(i)
|
||||||
|
|
||||||
def poll(self, nr=0):
|
def pollParams(self, nr=0):
|
||||||
# Just poll all parameters regularly where polling is enabled
|
# Just poll all parameters regularly where polling is enabled
|
||||||
for pname, pobj in self.accessibles.items():
|
for pname, pobj in self.parameters.items():
|
||||||
if not isinstance(pobj, Parameter):
|
|
||||||
continue
|
|
||||||
if not pobj.poll:
|
if not pobj.poll:
|
||||||
continue
|
continue
|
||||||
if nr % abs(int(pobj.poll)) == 0:
|
if nr % abs(int(pobj.poll)) == 0:
|
||||||
# poll every 'pobj.poll' iteration
|
# pollParams every 'pobj.pollParams' iteration
|
||||||
rfunc = getattr(self, 'read_' + pname, None)
|
rfunc = getattr(self, 'read_' + pname, None)
|
||||||
if rfunc:
|
if rfunc:
|
||||||
try:
|
try:
|
||||||
rfunc()
|
rfunc() # pylint: disable = not-callable
|
||||||
except Exception: # really all!
|
except Exception: # really all!
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -351,13 +349,11 @@ class Drivable(Writable):
|
|||||||
return 300 <= self.status[0] < 400
|
return 300 <= self.status[0] < 400
|
||||||
|
|
||||||
# improved polling: may poll faster if module is BUSY
|
# improved polling: may poll faster if module is BUSY
|
||||||
def poll(self, nr=0):
|
def pollParams(self, nr=0):
|
||||||
# poll status first
|
# poll status first
|
||||||
stat = self.read_status(0)
|
self.read_status(0)
|
||||||
fastpoll = stat[0] == self.Status.BUSY
|
fastpoll = self.isBusy()
|
||||||
for pname, pobj in self.accessibles.items():
|
for pname, pobj in self.parameters.items():
|
||||||
if not isinstance(pobj, Parameter):
|
|
||||||
continue
|
|
||||||
if not pobj.poll:
|
if not pobj.poll:
|
||||||
continue
|
continue
|
||||||
if pname == 'status':
|
if pname == 'status':
|
||||||
@ -370,7 +366,7 @@ class Drivable(Writable):
|
|||||||
rfunc = getattr(self, 'read_' + pname, None)
|
rfunc = getattr(self, 'read_' + pname, None)
|
||||||
if rfunc:
|
if rfunc:
|
||||||
try:
|
try:
|
||||||
rfunc()
|
rfunc() # pylint: disable = not-callable
|
||||||
except Exception: # really all!
|
except Exception: # really all!
|
||||||
pass
|
pass
|
||||||
return fastpoll
|
return fastpoll
|
||||||
|
@ -83,7 +83,7 @@ class Parameter(Accessible):
|
|||||||
|
|
||||||
poll can be:
|
poll can be:
|
||||||
- False (never poll this parameter)
|
- False (never poll this parameter)
|
||||||
- True (poll this ever pollinterval)
|
- True (poll this every pollinterval)
|
||||||
- positive int (poll every N(th) pollinterval)
|
- positive int (poll every N(th) pollinterval)
|
||||||
- negative int (normally poll every N(th) pollinterval, if module is busy, poll every pollinterval)
|
- negative int (normally poll every N(th) pollinterval, if module is busy, poll every pollinterval)
|
||||||
|
|
||||||
|
@ -185,18 +185,18 @@ class Server(object):
|
|||||||
for modname, modobj in self.modules.items():
|
for modname, modobj in self.modules.items():
|
||||||
self.log.info(u'registering module %r' % modname)
|
self.log.info(u'registering module %r' % modname)
|
||||||
self.dispatcher.register_module(modobj, modname, modobj.properties['export'])
|
self.dispatcher.register_module(modobj, modname, modobj.properties['export'])
|
||||||
# also call early_init on the modules
|
# also call earlyInit on the modules
|
||||||
modobj.early_init()
|
modobj.earlyInit()
|
||||||
|
|
||||||
# call init on each module after registering all
|
# call init on each module after registering all
|
||||||
for modname, modobj in self.modules.items():
|
for modname, modobj in self.modules.items():
|
||||||
modobj.init_module()
|
modobj.initModule()
|
||||||
|
|
||||||
start_events = []
|
start_events = []
|
||||||
for modname, modobj in self.modules.items():
|
for modname, modobj in self.modules.items():
|
||||||
event = threading.Event()
|
event = threading.Event()
|
||||||
# start_module must return either a timeout value or None (default 30 sec)
|
# startModule must return either a timeout value or None (default 30 sec)
|
||||||
timeout = modobj.start_module(started_callback=event.set) or 30
|
timeout = modobj.startModule(started_callback=event.set) or 30
|
||||||
start_events.append((time.time() + timeout, modname, event))
|
start_events.append((time.time() + timeout, modname, event))
|
||||||
self.log.info(u'waiting for modules being started')
|
self.log.info(u'waiting for modules being started')
|
||||||
for deadline, modname, event in sorted(start_events):
|
for deadline, modname, event in sorted(start_events):
|
||||||
|
@ -136,7 +136,7 @@ class Cryostat(CryoBase):
|
|||||||
special='content of special property'),
|
special='content of special property'),
|
||||||
)
|
)
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
self._stopflag = False
|
self._stopflag = False
|
||||||
self._thread = mkthread(self.thread)
|
self._thread = mkthread(self.thread)
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ class MagneticField(Drivable):
|
|||||||
'status' : Override(datatype=TupleOf(EnumType(Status), StringType())),
|
'status' : Override(datatype=TupleOf(EnumType(Status), StringType())),
|
||||||
}
|
}
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
self._state = Enum('state', idle=1, switch_on=2, switch_off=3, ramp=4).idle
|
self._state = Enum('state', idle=1, switch_on=2, switch_off=3, ramp=4).idle
|
||||||
self._heatswitch = self.DISPATCHER.get_module(self.heatswitch)
|
self._heatswitch = self.DISPATCHER.get_module(self.heatswitch)
|
||||||
_thread = threading.Thread(target=self._thread)
|
_thread = threading.Thread(target=self._thread)
|
||||||
@ -226,7 +226,7 @@ class SampleTemp(Drivable):
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
_thread = threading.Thread(target=self._thread)
|
_thread = threading.Thread(target=self._thread)
|
||||||
_thread.daemon = True
|
_thread.daemon = True
|
||||||
_thread.start()
|
_thread.start()
|
||||||
|
@ -134,8 +134,8 @@ class GarfieldMagnet(SequencerMixin, Drivable):
|
|||||||
raise ConfigError(self,
|
raise ConfigError(self,
|
||||||
'_current2field polynome not monotonic!')
|
'_current2field polynome not monotonic!')
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
super(GarfieldMagnet, self).init_module()
|
super(GarfieldMagnet, self).initModule()
|
||||||
self._enable = self.DISPATCHER.get_module(self.subdev_enable)
|
self._enable = self.DISPATCHER.get_module(self.subdev_enable)
|
||||||
self._symmetry = self.DISPATCHER.get_module(self.subdev_symmetry)
|
self._symmetry = self.DISPATCHER.get_module(self.subdev_symmetry)
|
||||||
self._polswitch = self.DISPATCHER.get_module(self.subdev_polswitch)
|
self._polswitch = self.DISPATCHER.get_module(self.subdev_polswitch)
|
||||||
|
@ -211,12 +211,12 @@ class PyTangoDevice(Module):
|
|||||||
self._com_warn(tries, name, err, info)
|
self._com_warn(tries, name, err, info)
|
||||||
sleep(self.comdelay)
|
sleep(self.comdelay)
|
||||||
|
|
||||||
def early_init(self):
|
def earlyInit(self):
|
||||||
# Wrap PyTango client creation (so even for the ctor, logging and
|
# Wrap PyTango client creation (so even for the ctor, logging and
|
||||||
# exception mapping is enabled).
|
# exception mapping is enabled).
|
||||||
self._createPyTangoDevice = self._applyGuardToFunc(
|
self._createPyTangoDevice = self._applyGuardToFunc(
|
||||||
self._createPyTangoDevice, 'constructor')
|
self._createPyTangoDevice, 'constructor')
|
||||||
super(PyTangoDevice, self).early_init()
|
super(PyTangoDevice, self).earlyInit()
|
||||||
|
|
||||||
@lazy_property
|
@lazy_property
|
||||||
def _dev(self):
|
def _dev(self):
|
||||||
@ -380,8 +380,8 @@ class AnalogInput(PyTangoDevice, Readable):
|
|||||||
The AnalogInput handles all devices only delivering an analogue value.
|
The AnalogInput handles all devices only delivering an analogue value.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def start_module(self, started_callback):
|
def startModule(self, started_callback):
|
||||||
super(AnalogInput, self).start_module(started_callback)
|
super(AnalogInput, self).startModule(started_callback)
|
||||||
# query unit from tango and update value property
|
# query unit from tango and update value property
|
||||||
attrInfo = self._dev.attribute_query('value')
|
attrInfo = self._dev.attribute_query('value')
|
||||||
# prefer configured unit if nothing is set on the Tango device, else
|
# prefer configured unit if nothing is set on the Tango device, else
|
||||||
@ -457,14 +457,14 @@ class AnalogOutput(PyTangoDevice, Drivable):
|
|||||||
_timeout = None
|
_timeout = None
|
||||||
_moving = False
|
_moving = False
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
super(AnalogOutput, self).init_module()
|
super(AnalogOutput, self).initModule()
|
||||||
# init history
|
# init history
|
||||||
self._history = [] # will keep (timestamp, value) tuple
|
self._history = [] # will keep (timestamp, value) tuple
|
||||||
self._timeout = None # keeps the time at which we will timeout, or None
|
self._timeout = None # keeps the time at which we will timeout, or None
|
||||||
|
|
||||||
def start_module(self, started_callback):
|
def startModule(self, started_callback):
|
||||||
super(AnalogOutput, self).start_module(started_callback)
|
super(AnalogOutput, self).startModule(started_callback)
|
||||||
# query unit from tango and update value property
|
# query unit from tango and update value property
|
||||||
attrInfo = self._dev.attribute_query('value')
|
attrInfo = self._dev.attribute_query('value')
|
||||||
# prefer configured unit if nothing is set on the Tango device, else
|
# prefer configured unit if nothing is set on the Tango device, else
|
||||||
@ -472,8 +472,8 @@ class AnalogOutput(PyTangoDevice, Drivable):
|
|||||||
if attrInfo.unit != 'No unit':
|
if attrInfo.unit != 'No unit':
|
||||||
self.accessibles['value'].unit = attrInfo.unit
|
self.accessibles['value'].unit = attrInfo.unit
|
||||||
|
|
||||||
def poll(self, nr=0):
|
def pollParams(self, nr=0):
|
||||||
super(AnalogOutput, self).poll(nr)
|
super(AnalogOutput, self).pollParams(nr)
|
||||||
while len(self._history) > 2:
|
while len(self._history) > 2:
|
||||||
# if history would be too short, break
|
# if history would be too short, break
|
||||||
if self._history[-1][0] - self._history[1][0] <= self.window:
|
if self._history[-1][0] - self._history[1][0] <= self.window:
|
||||||
@ -802,8 +802,8 @@ class NamedDigitalInput(DigitalInput):
|
|||||||
datatype=StringType(), export=False), # XXX:!!!
|
datatype=StringType(), export=False), # XXX:!!!
|
||||||
}
|
}
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
super(NamedDigitalInput, self).init_module()
|
super(NamedDigitalInput, self).initModule()
|
||||||
try:
|
try:
|
||||||
# pylint: disable=eval-used
|
# pylint: disable=eval-used
|
||||||
self.accessibles['value'].datatype = EnumType('value', **eval(self.mapping))
|
self.accessibles['value'].datatype = EnumType('value', **eval(self.mapping))
|
||||||
@ -827,8 +827,8 @@ class PartialDigitalInput(NamedDigitalInput):
|
|||||||
datatype=IntRange(0), default=1),
|
datatype=IntRange(0), default=1),
|
||||||
}
|
}
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
super(PartialDigitalInput, self).init_module()
|
super(PartialDigitalInput, self).initModule()
|
||||||
self._mask = (1 << self.bitwidth) - 1
|
self._mask = (1 << self.bitwidth) - 1
|
||||||
# self.accessibles['value'].datatype = IntRange(0, self._mask)
|
# self.accessibles['value'].datatype = IntRange(0, self._mask)
|
||||||
|
|
||||||
@ -869,8 +869,8 @@ class NamedDigitalOutput(DigitalOutput):
|
|||||||
datatype=StringType(), export=False),
|
datatype=StringType(), export=False),
|
||||||
}
|
}
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
super(NamedDigitalOutput, self).init_module()
|
super(NamedDigitalOutput, self).initModule()
|
||||||
try:
|
try:
|
||||||
# pylint: disable=eval-used
|
# pylint: disable=eval-used
|
||||||
self.accessibles['value'].datatype = EnumType('value', **eval(self.mapping))
|
self.accessibles['value'].datatype = EnumType('value', **eval(self.mapping))
|
||||||
@ -897,8 +897,8 @@ class PartialDigitalOutput(NamedDigitalOutput):
|
|||||||
datatype=IntRange(0), default=1),
|
datatype=IntRange(0), default=1),
|
||||||
}
|
}
|
||||||
|
|
||||||
def init_module(self):
|
def initModule(self):
|
||||||
super(PartialDigitalOutput, self).init_module()
|
super(PartialDigitalOutput, self).initModule()
|
||||||
self._mask = (1 << self.bitwidth) - 1
|
self._mask = (1 << self.bitwidth) - 1
|
||||||
# self.accessibles['value'].datatype = IntRange(0, self._mask)
|
# self.accessibles['value'].datatype = IntRange(0, self._mask)
|
||||||
# self.accessibles['target'].datatype = IntRange(0, self._mask)
|
# self.accessibles['target'].datatype = IntRange(0, self._mask)
|
||||||
|
@ -48,10 +48,10 @@ def test_Communicator():
|
|||||||
))()
|
))()
|
||||||
|
|
||||||
o = Communicator('communicator',logger, {}, srv)
|
o = Communicator('communicator',logger, {}, srv)
|
||||||
o.early_init()
|
o.earlyInit()
|
||||||
o.init_module()
|
o.initModule()
|
||||||
event = threading.Event()
|
event = threading.Event()
|
||||||
o.start_module(event.set)
|
o.startModule(event.set)
|
||||||
assert event.is_set() # event should be set immediately
|
assert event.is_set() # event should be set immediately
|
||||||
|
|
||||||
def test_ModuleMeta():
|
def test_ModuleMeta():
|
||||||
@ -139,9 +139,9 @@ def test_ModuleMeta():
|
|||||||
assert o not in params_found
|
assert o not in params_found
|
||||||
|
|
||||||
for o in objects:
|
for o in objects:
|
||||||
o.early_init()
|
o.earlyInit()
|
||||||
for o in objects:
|
for o in objects:
|
||||||
o.init_module()
|
o.initModule()
|
||||||
|
|
||||||
for o in objects:
|
for o in objects:
|
||||||
event = threading.Event()
|
event = threading.Event()
|
||||||
@ -153,6 +153,6 @@ def test_ModuleMeta():
|
|||||||
event.set()
|
event.set()
|
||||||
raise Exception("end test") # this will kill the polling thread on the second call
|
raise Exception("end test") # this will kill the polling thread on the second call
|
||||||
|
|
||||||
o.start_module(started_callback)
|
o.startModule(started_callback)
|
||||||
assert event2.wait(timeout=1)
|
assert event2.wait(timeout=1)
|
||||||
assert event.is_set()
|
assert event.is_set()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user