central point for status codes

Put status code definitions into frappy.datatypes.StatusType.
frappy.datatypes is anyway imported in servers and clients,
so this is a better place than frappy.modules.

Change-Id: I81dfc8a066f598fbd20854ed1a13b937b7facc8c
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30703
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2023-03-14 15:59:36 +01:00
parent 349c510555
commit 9bf187758b
5 changed files with 54 additions and 18 deletions

View File

@ -45,7 +45,7 @@ import re
from queue import Queue
from frappy.client import SecopClient
from frappy.errors import SECoPError
from frappy.datatypes import get_datatype
from frappy.datatypes import get_datatype, StatusType
main = sys.modules['__main__']
@ -130,7 +130,7 @@ class Module:
return '%s.%s = %s' % (self._name, pname, r)
def _isBusy(self):
return 300 <= self.status[0] < 400
return self.status[0] // 100 == StatusType.BUSY // 100
def _status_value_update(self, m, p, status, t, e):
if self._running:

View File

@ -27,7 +27,7 @@
# pylint: disable=unused-import
from frappy.datatypes import ArrayOf, BLOBType, BoolType, EnumType, \
FloatRange, IntRange, ScaledInteger, StringType, StructOf, TupleOf
FloatRange, IntRange, ScaledInteger, StringType, StructOf, TupleOf, StatusType
from frappy.lib.enum import Enum
from frappy.modules import Attached, Communicator, \
Done, Drivable, Feature, Module, Readable, Writable, HasAccessibles
@ -39,7 +39,22 @@ from frappy.persistent import PersistentMixin, PersistentParam
from frappy.rwhandler import ReadHandler, WriteHandler, CommonReadHandler, \
CommonWriteHandler, nopoll
ERROR = Drivable.Status.ERROR
WARN = Drivable.Status.WARN
BUSY = Drivable.Status.BUSY
IDLE = Drivable.Status.IDLE
DISABLED = StatusType.DISABLED
IDLE = StatusType.IDLE
STANDBY = StatusType.STANDBY
PREPARED = StatusType.PREPARED
WARN = StatusType.WARN
WARN_STANDBY = StatusType.WARN_STANDBY
WARN_PREPARED = StatusType.WARN_PREPARED
UNSTABLE = StatusType.UNSTABLE # no SECoP standard (yet)
BUSY = StatusType.BUSY
DISABLING = StatusType.DISABLING
INITIALIZING = StatusType.INITIALIZING
PREPARING = StatusType.PREPARING
STARTING = StatusType.STARTING
RAMPING = StatusType.RAMPING
STABILIZING = StatusType.STABILIZING
FINALIZING = StatusType.FINALIZING
ERROR = StatusType.ERROR
ERROR_STANDBY = StatusType.ERROR_STANDBY
ERROR_PREPARED = StatusType.ERROR_PREPARED

View File

@ -1243,6 +1243,26 @@ class LimitsType(TupleOf):
class StatusType(TupleOf):
# shorten initialisation and allow access to status enumMembers from status values
DISABLED = 0
IDLE = 100
STANDBY = 130
PREPARED = 150
WARN = 200
WARN_STANDBY = 230
WARN_PREPARED = 250
UNSTABLE = 270 # no SECoP standard (yet)
BUSY = 300
DISABLING = 310
INITIALIZING = 320
PREPARING = 340
STARTING = 360
RAMPING = 370
STABILIZING = 380
FINALIZING = 390
ERROR = 400
ERROR_STANDBY = 430
ERROR_PREPARED = 450
def __init__(self, enum):
super().__init__(EnumType(enum), StringType())
self._enum = enum

View File

@ -1,3 +1,4 @@
from frappy.datatypes import StatusType
from frappy.gui.qt import QIcon, Qt, QTreeWidget, QTreeWidgetItem, pyqtSignal
@ -70,7 +71,7 @@ class ModuleItem(QTreeWidgetItem):
return
if parameter == 'status':
if value.readerror:
self.setIcon(self.display[parameter], ModuleItem.statusIcon(400)) # 400=ERROR
self.setIcon(self.display[parameter], ModuleItem.statusIcon(StatusType.ERROR))
self.setText(self.display['status/text'], str(value.readerror))
else:
self.setIcon(self.display[parameter], ModuleItem.statusIcon(value.value[0].value))

View File

@ -764,16 +764,16 @@ class Readable(Module):
"""basic readable module"""
# pylint: disable=invalid-name
Status = Enum('Status',
IDLE=100,
WARN=200,
UNSTABLE=270,
ERROR=400,
DISABLED=0,
UNKNOWN=401,
IDLE=StatusType.IDLE,
WARN=StatusType.WARN,
UNSTABLE=270, # not SECoP standard. TODO: remove and adapt entangle
ERROR=StatusType.ERROR,
DISABLED=StatusType.DISABLED,
UNKNOWN=401, # not SECoP standard. TODO: remove and adapt entangle and epics
) #: status codes
value = Parameter('current value of the module', FloatRange())
status = Parameter('current status of the module', TupleOf(EnumType(Status), StringType()),
status = Parameter('current status of the module', StatusType(Status),
default=(Status.IDLE, ''))
pollinterval = Parameter('default poll interval', FloatRange(0.1, 120),
default=5, readonly=False, export=True)
@ -805,7 +805,7 @@ class Writable(Readable):
class Drivable(Writable):
"""basic drivable module"""
Status = Enum(Readable.Status, BUSY=300) #: status codes
Status = Enum(Readable.Status, BUSY=StatusType.BUSY) #: status codes
status = Parameter(datatype=StatusType(Status)) # override Readable.status
@ -814,14 +814,14 @@ class Drivable(Writable):
returns True when busy (also when finalizing)
"""
return 300 <= (status or self.status)[0] < 400
return StatusType.BUSY <= (status or self.status)[0] < StatusType.ERROR
def isDriving(self, status=None):
"""check for driving, treating status substates correctly
returns True when busy, but not finalizing
"""
return 300 <= (status or self.status)[0] < 390
return StatusType.BUSY <= (status or self.status)[0] < StatusType.FINALIZING
@Command(None, result=None)
def stop(self):