From 5ffe953c5c0e087facb28d961a9a63f8bffa818e Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Tue, 19 Jun 2018 11:16:14 +0200 Subject: [PATCH] commands must be specified explicitely no more automatic definition by just declaring do_ Change-Id: Ided91b5ae6fe657a6134f1cc14cc6484570a3646 Reviewed-on: https://forge.frm2.tum.de/review/18206 Tested-by: JenkinsCodeReview Reviewed-by: Markus Zolliker --- secop/modules.py | 24 ++++++++++++------------ secop_mlz/entangle.py | 8 ++++++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/secop/modules.py b/secop/modules.py index ea2c6b6..73fafe4 100644 --- a/secop/modules.py +++ b/secop/modules.py @@ -29,8 +29,6 @@ from __future__ import print_function # from these base classes (how to do this?) import time -import types -import inspect try: from six import add_metaclass # for py2/3 compat @@ -301,16 +299,9 @@ class ModuleMeta(type): setattr(newtype, 'commands', getattr(newtype, 'commands', {})) for attrname in attrs: if attrname.startswith('do_'): - if attrname[3:] in newtype.commands: - continue - value = getattr(newtype, attrname) - if isinstance(value, types.MethodType): - argspec = inspect.getargspec(value) - if argspec[0] and argspec[0][0] == 'self': - del argspec[0][0] - newtype.commands[attrname[3:]] = Command( - getattr(value, '__doc__'), argspec.args, - None) # XXX: how to find resulttype? + if attrname[3:] not in newtype.commands: + raise ProgrammingError('%r: command %r has to be specified ' + 'explicitly!' % (name, attrname[3:])) attrs['__constructed__'] = True return newtype @@ -549,6 +540,15 @@ class Drivable(Writable): """ Status = Enum(Readable.Status, BUSY=300) + + commands = { + 'stop': Command( + 'cease driving, go to IDLE state', + arguments=[], + result=None + ), + } + overrides = { 'status' : Override(datatype=TupleOf(EnumType(Status), StringType())), } diff --git a/secop_mlz/entangle.py b/secop_mlz/entangle.py index f53a0da..9da4014 100644 --- a/secop_mlz/entangle.py +++ b/secop_mlz/entangle.py @@ -173,6 +173,10 @@ class PyTangoDevice(Module): ), } + commands = { + 'reset': Command('Tango reset command', arguments=[], result=None), + } + tango_status_mapping = { PyTango.DevState.ON: Drivable.Status.IDLE, PyTango.DevState.ALARM: Drivable.Status.WARN, @@ -646,6 +650,10 @@ class Motor(Actuator): ), } + commands = { + 'reference': Command('Do a reference run', arguments=[], result=None), + } + def read_refpos(self, maxage=0): return float(self._getProperty('refpos'))