Skip to content
Snippets Groups Projects
Commit b0138c2c authored by Thomas Juerges's avatar Thomas Juerges
Browse files

Refactored the code

- State machine checks for properties that get their values from the OPC server.
- Refactored attribute names to be all lower case.
- Got rid of the two functions that enable/disable data fetching in the data thread.
parent 4d4911cb
No related branches found
No related tags found
No related merge requests found
......@@ -66,14 +66,14 @@ class StatsCrosslet(Device):
# property system.
self.debug_stream("Entering read_data loop.")
while self.stop_data_read_loop is False:
self.debug_stream("read_data is running...")
self.debug_stream("read_data is running, going to sleep for %fs..." % (self._pause_time))
threading.Event().wait(self._pause_time)
if self.data_acquisition_is_active is True:
try:
self.debug_stream("fetching data: subband = %d, integration_time = %d", self._subband, self._integration_time)
t, visibilities_list, rcu_modes = self.obj.call_method(self.record_cross, self._subband, self._integration_time)
self.debug_stream("fetching data done: t = %s, len(visibilities_list) = %d, len(rcu_modes) = %d", t, len(visibilities_list), len(rcu_modes))
self._time_stamp = t
self._time_stamp = t.isoformat()
visibilities = numpy.array(visibilities_list)[0] + 1j * numpy.array(visibilities_list[1])
self._visibilities_real = visibilities.real
self._visibilities_imag = visibilities.imag
......@@ -93,7 +93,7 @@ class StatsCrosslet(Device):
OPC_Server_Name = device_property(
dtype='DevString',
default_value="okeanos-kabel"
default_value="okeanos"
)
OPC_Server_Port = device_property(
......@@ -125,35 +125,36 @@ class StatsCrosslet(Device):
# Attributes
# ----------
Subband = attribute(
subband = attribute(
dtype='DevUShort',
access=AttrWriteType.READ_WRITE,
)
Integration_time = attribute(
integration_time = attribute(
dtype='DevDouble',
access=AttrWriteType.READ_WRITE,
)
Time_stamp = attribute(
time_stamp = attribute(
dtype='DevString',
)
Pause_time = attribute(
pause_time = attribute(
dtype='DevDouble',
access=AttrWriteType.READ_WRITE,
)
RCU_modes = attribute(
dtype=('DevString',),
rcu_modes = attribute(
dtype=('DevLong',),
max_dim_x=96,
)
Visibilities_imag = attribute(
visibilities_imag = attribute(
dtype=(('DevDouble',),),
max_dim_x=96, max_dim_y=96,
)
Visibilities_real = attribute(
visibilities_real = attribute(
dtype=(('DevDouble',),),
max_dim_x=96, max_dim_y=96,
)
......@@ -166,7 +167,6 @@ class StatsCrosslet(Device):
"""Initialises the attributes and properties of the StatsCrosslet."""
Device.init_device(self)
# PROTECTED REGION ID(StatsCrosslet.init_device) ENABLED START #
self.set_state(DevState.INIT)
# Set default values in the read/write attributes.
self._time_stamp = ''
self._rcu_modes = ('',)
......@@ -191,7 +191,7 @@ class StatsCrosslet(Device):
self.data_acquisition_is_active = False
self.stop_data_read_loop = False
self.data_read_loop.start()
self.set_state(DevState.ON)
self.set_state(DevState.INIT)
except Exception as e:
self.set_state(DevState.FAULT)
self.error_stream("Cannot connect to the OPC-UA server %s. Trace: %s" % (self.OPC_Server_Name, traceback.format_exc()))
......@@ -228,139 +228,101 @@ class StatsCrosslet(Device):
# Attributes methods
# ------------------
def read_Subband(self):
# PROTECTED REGION ID(StatsCrosslet.Subband_read) ENABLED START #
"""Return the Subband attribute."""
return self.__subband
# PROTECTED REGION END # // StatsCrosslet.Subband_read
def write_Subband(self, value):
# PROTECTED REGION ID(StatsCrosslet.Subband_write) ENABLED START #
"""Set the Subband attribute."""
pass
# PROTECTED REGION END # // StatsCrosslet.Subband_write
def is_Subband_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_Subband_allowed) ENABLED START #
if attr==attr.READ_REQ:
return self.get_state() not in [DevState.STANDBY]
else:
return self.get_state() not in [DevState.STANDBY]
# PROTECTED REGION END # // StatsCrosslet.is_Subband_allowed
def read_Integration_time(self):
# PROTECTED REGION ID(StatsCrosslet.Integration_time_read) ENABLED START #
"""Return the Integration_time attribute."""
return self.__integration_time
# PROTECTED REGION END # // StatsCrosslet.Integration_time_read
def is_Integration_time_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_Integration_time_allowed) ENABLED START #
return self.get_state() not in [DevState.ON,DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_Integration_time_allowed
def read_Time_stamp(self):
# PROTECTED REGION ID(StatsCrosslet.Time_stamp_read) ENABLED START #
"""Return the Time_stamp attribute."""
return self.__time_stamp
# PROTECTED REGION END # // StatsCrosslet.Time_stamp_read
def is_Time_stamp_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_Time_stamp_allowed) ENABLED START #
return self.get_state() not in [DevState.ON,DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_Time_stamp_allowed
def read_Pause_time(self):
# PROTECTED REGION ID(StatsCrosslet.Pause_time_read) ENABLED START #
"""Return the Pause_time attribute."""
return self.__pause_time
# PROTECTED REGION END # // StatsCrosslet.Pause_time_read
def write_Pause_time(self, value):
# PROTECTED REGION ID(StatsCrosslet.Pause_time_write) ENABLED START #
"""Set the Pause_time attribute."""
pass
# PROTECTED REGION END # // StatsCrosslet.Pause_time_write
def read_RCU_modes(self):
# PROTECTED REGION ID(StatsCrosslet.RCU_modes_read) ENABLED START #
"""Return the RCU_modes attribute."""
return self._rcu_modes
# PROTECTED REGION END # // StatsCrosslet.RCU_modes_read
def is_RCU_modes_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_RCU_modes_allowed) ENABLED START #
return self.get_state() not in [DevState.ON,DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_RCU_modes_allowed
def read_Visibilities_imag(self):
# PROTECTED REGION ID(StatsCrosslet.Visibilities_imag_read) ENABLED START #
"""Return the Visibilities_imag attribute."""
return self.__visibilities_imag
# PROTECTED REGION END # // StatsCrosslet.Visibilities_imag_read
def is_Visibilities_imag_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_Visibilities_imag_allowed) ENABLED START #
return self.get_state() not in [DevState.ON,DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_Visibilities_imag_allowed
def read_Visibilities_real(self):
# PROTECTED REGION ID(StatsCrosslet.Visibilities_real_read) ENABLED START #
"""Return the Visibilities_real attribute."""
return self.__visibilities_real
# PROTECTED REGION END # // StatsCrosslet.Visibilities_real_read
def is_Visibilities_real_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_Visibilities_real_allowed) ENABLED START #
return self.get_state() not in [DevState.ON,DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_Visibilities_real_allowed
def read_subband(self):
# PROTECTED REGION ID(StatsCrosslet.subband_read) ENABLED START #
"""Return the subband attribute."""
return self._subband
# PROTECTED REGION END # // StatsCrosslet.subband_read
def write_subband(self, value):
# PROTECTED REGION ID(StatsCrosslet.subband_write) ENABLED START #
"""Set the subband attribute."""
self._subband = value
# PROTECTED REGION END # // StatsCrosslet.subband_write
def read_integration_time(self):
# PROTECTED REGION ID(StatsCrosslet.integration_time_read) ENABLED START #
"""Return the integration_time attribute."""
if self.is_integration_time_allowed(True) is True:
return self._integration_time
# PROTECTED REGION END # // StatsCrosslet.integration_time_read
def write_integration_time(self, value):
# PROTECTED REGION ID(StatsCrosslet.integration_time_write) ENABLED START #
"""Set the integration_time attribute."""
if self.is_integration_time_allowed(True) is True:
self._integration_time = value
# PROTECTED REGION END # // StatsCrosslet.integration_time_write
def is_integration_time_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_integration_time_allowed) ENABLED START #
return self.get_state() not in [DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_integration_time_allowed
def read_time_stamp(self):
# PROTECTED REGION ID(StatsCrosslet.time_stamp_read) ENABLED START #
"""Return the time_stamp attribute."""
if self.is_time_stamp_allowed(True) is True:
return self._time_stamp
# PROTECTED REGION END # // StatsCrosslet.time_stamp_read
def is_time_stamp_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_time_stamp_allowed) ENABLED START #
return self.get_state() not in [DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_time_stamp_allowed
def read_pause_time(self):
# PROTECTED REGION ID(StatsCrosslet.pause_time_read) ENABLED START #
"""Return the pause_time attribute."""
return self._pause_time
# PROTECTED REGION END # // StatsCrosslet.pause_time_read
def write_pause_time(self, value):
# PROTECTED REGION ID(StatsCrosslet.pause_time_write) ENABLED START #
"""Set the pause_time attribute."""
self._pause_time = value
# PROTECTED REGION END # // StatsCrosslet.pause_time_write
def read_rcu_modes(self):
# PROTECTED REGION ID(StatsCrosslet.rcu_modes_read) ENABLED START #
"""Return the rcu_modes attribute."""
if self.is_rcu_modes_allowed(True) is True:
return self._rcu_modes
# PROTECTED REGION END # // StatsCrosslet.rcu_modes_read
def is_rcu_modes_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_rcu_modes_allowed) ENABLED START #
return self.get_state() not in [DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_rcu_modes_allowed
def read_visibilities_imag(self):
# PROTECTED REGION ID(StatsCrosslet.visibilities_imag_read) ENABLED START #
"""Return the visibilities_imag attribute."""
if self.is_visibilities_imag_allowed(True) is True:
return self._visibilities_imag
# PROTECTED REGION END # // StatsCrosslet.visibilities_imag_read
def is_visibilities_imag_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_visibilities_imag_allowed) ENABLED START #
return self.get_state() not in [DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_visibilities_imag_allowed
def read_visibilities_real(self):
# PROTECTED REGION ID(StatsCrosslet.visibilities_real_read) ENABLED START #
"""Return the visibilities_real attribute."""
if self.is_visibilities_real_allowed(True) is True:
return self._visibilities_real
# PROTECTED REGION END # // StatsCrosslet.visibilities_real_read
def is_visibilities_real_allowed(self, attr):
# PROTECTED REGION ID(StatsCrosslet.is_visibilities_real_allowed) ENABLED START #
return self.get_state() not in [DevState.OFF,DevState.INIT]
# PROTECTED REGION END # // StatsCrosslet.is_visibilities_real_allowed
# --------
# Commands
# --------
@command(
)
@DebugIt()
def start_acquisition(self):
# PROTECTED REGION ID(StatsCrosslet.start_acquisition) ENABLED START #
"""
Start the data acquisition of the station`s crosslet stats.
:param argin: 'DevULong'
:return:None
"""
if self.is_start_acquisition_allowed() is True:
self.data_acquisition_is_active = True
self.set_state(DevState.RUNNING)
# PROTECTED REGION END # // StatsCrosslet.start_acquisition
def is_start_acquisition_allowed(self):
# PROTECTED REGION ID(StatsCrosslet.is_start_acquisition_allowed) ENABLED START #
return self.get_state() not in [DevState.ON,DevState.OFF,DevState.STANDBY,DevState.RUNNING]
# PROTECTED REGION END # // StatsCrosslet.is_start_acquisition_allowed
@command(
)
@DebugIt()
def stop_acquisition(self):
# PROTECTED REGION ID(StatsCrosslet.stop_acquisition) ENABLED START #
"""
Stop the data acquisition.
:return:None
"""
if self.is_stop_acquisition_allowed() is True:
self.set_state(DevState.ON)
self.data_acquisition_is_active = False
# PROTECTED REGION END # // StatsCrosslet.stop_acquisition
def is_stop_acquisition_allowed(self):
# PROTECTED REGION ID(StatsCrosslet.is_stop_acquisition_allowed) ENABLED START #
return self.get_state() not in [DevState.ON,DevState.INIT,DevState.RUNNING]
# PROTECTED REGION END # // StatsCrosslet.is_stop_acquisition_allowed
@command(
)
@DebugIt()
......@@ -370,7 +332,8 @@ class StatsCrosslet(Device):
:return:None
"""
pass
self.data_acquisition_is_active = True
self.set_state(DevState.ON)
# PROTECTED REGION END # // StatsCrosslet.On
@command(
......@@ -397,18 +360,6 @@ class StatsCrosslet(Device):
pass
# PROTECTED REGION END # // StatsCrosslet.Remote
@command(
)
@DebugIt()
def Reset(self):
# PROTECTED REGION ID(StatsCrosslet.Reset) ENABLED START #
"""
:return:None
"""
pass
# PROTECTED REGION END # // StatsCrosslet.Reset
@command(
)
@DebugIt()
......@@ -418,7 +369,8 @@ class StatsCrosslet(Device):
:return:None
"""
pass
self.set_state(DevState.OFF)
self.data_acquisition_is_active = False
# PROTECTED REGION END # // StatsCrosslet.Off
@command(
......@@ -430,7 +382,8 @@ class StatsCrosslet(Device):
:return:None
"""
pass
self.set_state(DevState.INIT)
self.data_acquisition_is_active = False
# PROTECTED REGION END # // StatsCrosslet.Init
# ----------
......
......@@ -53,30 +53,6 @@
</argout>
<status abstract="true" inherited="true" concrete="true"/>
</commands>
<commands name="start_acquisition" description="Start the data acquisition of the station`s crosslet stats." execMethod="start_acquisition" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<excludedStates>OFF</excludedStates>
<excludedStates>RUNNING</excludedStates>
<excludedStates>FAULT</excludedStates>
</commands>
<commands name="stop_acquisition" description="Stop the data acquisition." execMethod="stop_acquisition" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<excludedStates>INIT</excludedStates>
<excludedStates>RUNNING</excludedStates>
<excludedStates>FAULT</excludedStates>
</commands>
<commands name="On" description="" execMethod="on" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
......@@ -104,15 +80,6 @@
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="Reset" description="" execMethod="reset" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="Off" description="" execMethod="off" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
......@@ -131,39 +98,35 @@
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<attributes name="Subband" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="subband" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:UShortType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>STANDBY</readExcludedStates>
<writeExcludedStates>STANDBY</writeExcludedStates>
</attributes>
<attributes name="Integration_time" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="integration_time" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>ON</readExcludedStates>
<readExcludedStates>OFF</readExcludedStates>
<readExcludedStates>INIT</readExcludedStates>
</attributes>
<attributes name="Time_stamp" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="time_stamp" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:StringType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>ON</readExcludedStates>
<readExcludedStates>OFF</readExcludedStates>
<readExcludedStates>INIT</readExcludedStates>
</attributes>
<attributes name="Pause_time" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<attributes name="pause_time" attType="Scalar" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
......@@ -171,36 +134,33 @@
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="RCU_modes" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="96" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:StringType"/>
<attributes name="rcu_modes" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="96" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:IntType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>ON</readExcludedStates>
<readExcludedStates>OFF</readExcludedStates>
<readExcludedStates>INIT</readExcludedStates>
</attributes>
<attributes name="Visibilities_imag" attType="Image" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="96" maxY="96" allocReadMember="true" isDynamic="false">
<attributes name="visibilities_imag" attType="Image" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="96" maxY="96" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>ON</readExcludedStates>
<readExcludedStates>OFF</readExcludedStates>
<readExcludedStates>INIT</readExcludedStates>
</attributes>
<attributes name="Visibilities_real" attType="Image" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="96" maxY="96" allocReadMember="true" isDynamic="false">
<attributes name="visibilities_real" attType="Image" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="96" maxY="96" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
<readExcludedStates>ON</readExcludedStates>
<readExcludedStates>OFF</readExcludedStates>
<readExcludedStates>INIT</readExcludedStates>
</attributes>
......@@ -213,9 +173,6 @@
<states name="INIT" description="">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</states>
<states name="RUNNING" description="">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</states>
<states name="FAULT" description="">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</states>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment