From 22ba8ba55799b62b77c69c78db61fb8eee7516bf Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 6 Jan 2017 15:17:00 +0000 Subject: [PATCH 01/44] Rename plankton_emulators to lewis_emulators because framework name has changed --- lewis_emulators/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 lewis_emulators/__init__.py diff --git a/lewis_emulators/__init__.py b/lewis_emulators/__init__.py new file mode 100644 index 0000000..3be6bd2 --- /dev/null +++ b/lewis_emulators/__init__.py @@ -0,0 +1 @@ +from __future__ import absolute_import \ No newline at end of file From 9b4fefac5b15572f40c008790490e05ead0aa39e Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Tue, 16 May 2017 14:24:02 +0100 Subject: [PATCH 02/44] Allow connection to back dorr. Add AMINT2-L tests --- tests/amint2l.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tests/amint2l.py diff --git a/tests/amint2l.py b/tests/amint2l.py new file mode 100644 index 0000000..453cb34 --- /dev/null +++ b/tests/amint2l.py @@ -0,0 +1,58 @@ +import unittest + +from utils.channel_access import ChannelAccess +from utils.testing import get_running_lewis_and_ioc + + +class Amint2lTests(unittest.TestCase): + """ + Tests for the AM Int2-L + """ + + def setUp(self): + self._lewis, self._ioc = get_running_lewis_and_ioc("amint2l") + + self.ca = ChannelAccess() + self.ca.wait_for("AMINT2L_01:PRESSURE") + + def _set_pressure(self, expected_pressure): + self._lewis.backdoor_set_on_device("pressure", expected_pressure) + self._ioc.set_simulated_value("AMINT2L_01:PRESSURE:SIM", expected_pressure) + + def test_GIVEN_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): + expected_pressure = 1.23 + self._set_pressure(expected_pressure) + + self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) + self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_NONE) + + def test_GIVEN_negative_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): + expected_pressure = -123.34 + self._set_pressure(expected_pressure) + + self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) + + def test_GIVEN_pressure_with_no_decimal_places_set_WHEN_read_THEN_pressure_is_as_expected(self): + expected_pressure = 7 + self._set_pressure(expected_pressure) + + self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) + + def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): + expected_pressure = "OR" + self._set_pressure(expected_pressure) + + self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_CALC) + self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Over Range") + + def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): + expected_pressure = "UR" + self._set_pressure(expected_pressure) + + self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_CALC) + self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Under Range") + + def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): + self._lewis.backdoor_set_on_device("pressure", None) + + self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_DISCONNECTED) From b071dad69799ea5f513ec172a9ed223876cffc31 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Tue, 16 May 2017 14:25:28 +0100 Subject: [PATCH 03/44] Add AMInt2-L emmulator and factor out command builder. --- lewis_emulators/amint2l/__init__.py | 3 + lewis_emulators/amint2l/constants.py | 8 +++ lewis_emulators/amint2l/device.py | 68 +++++++++++++++++++ .../amint2l/interfaces/__init__.py | 3 + .../amint2l/interfaces/stream_interface.py | 49 +++++++++++++ lewis_emulators/amint2l/states.py | 12 ++++ 6 files changed, 143 insertions(+) create mode 100644 lewis_emulators/amint2l/__init__.py create mode 100644 lewis_emulators/amint2l/constants.py create mode 100644 lewis_emulators/amint2l/device.py create mode 100644 lewis_emulators/amint2l/interfaces/__init__.py create mode 100644 lewis_emulators/amint2l/interfaces/stream_interface.py create mode 100644 lewis_emulators/amint2l/states.py diff --git a/lewis_emulators/amint2l/__init__.py b/lewis_emulators/amint2l/__init__.py new file mode 100644 index 0000000..87d46bf --- /dev/null +++ b/lewis_emulators/amint2l/__init__.py @@ -0,0 +1,3 @@ +from .device import SimulatedAmint2l + +__all__ = ['SimulatedAmint2l'] diff --git a/lewis_emulators/amint2l/constants.py b/lewis_emulators/amint2l/constants.py new file mode 100644 index 0000000..b48d98b --- /dev/null +++ b/lewis_emulators/amint2l/constants.py @@ -0,0 +1,8 @@ +""" +Constants associated with device +""" + +# Address of the AM Int2-l +ADDRESS_HIGH = "A" +ADDRESS_LOW = "B" +ADDRESS = "{0}{1}".format(ADDRESS_HIGH, ADDRESS_LOW) diff --git a/lewis_emulators/amint2l/device.py b/lewis_emulators/amint2l/device.py new file mode 100644 index 0000000..4f869c5 --- /dev/null +++ b/lewis_emulators/amint2l/device.py @@ -0,0 +1,68 @@ +from collections import OrderedDict + +from lewis.devices import StateMachineDevice +from .states import DefaultState + + +class SimulatedAmint2l(StateMachineDevice): + """ + Simulated AM Int2-L pressure transducer + """ + + def _initialize_data(self): + + """ + + Sets the initial state of the device + + """ + + self._pressure = 2.0 + + def _get_state_handlers(self): + + """ + + Returns: states and their names + + """ + return { + DefaultState.NAME: DefaultState(), + } + + def _get_initial_state(self): + """ + + Returns: the name of the initial state + + """ + return DefaultState.NAME + + def _get_transition_handlers(self): + + """ + + Returns: the state transitions + + """ + + return OrderedDict([ + ]) + + @property + def pressure(self): + """ + + Returns: the pressure + + """ + return self._pressure + + @pressure.setter + def pressure(self, pressure): + """ + + :param pressure: set the pressure + :return: + """ + self._pressure = pressure diff --git a/lewis_emulators/amint2l/interfaces/__init__.py b/lewis_emulators/amint2l/interfaces/__init__.py new file mode 100644 index 0000000..3108e65 --- /dev/null +++ b/lewis_emulators/amint2l/interfaces/__init__.py @@ -0,0 +1,3 @@ +from .stream_interface import Amint2lStreamInterface + +__all__ = ['Amint2lStreamInterface'] \ No newline at end of file diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py new file mode 100644 index 0000000..f670591 --- /dev/null +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -0,0 +1,49 @@ +import re + +from lewis.adapters.stream import StreamAdapter, Cmd + +from lewis_emulators.amint2l.constants import ADDRESS_HIGH, ADDRESS_LOW +from lewis_emulators.utils.command_builder import CmdBuilder + + +class Amint2lStreamInterface(StreamAdapter): + """ + Stream interface for the serial port + """ + + commands = { + CmdBuilder("get_pressure").stx(). + escape("{address_high}{address_low}r".format(address_high=ADDRESS_HIGH, address_low=ADDRESS_LOW)).build() + } + + in_terminator = chr(3) + out_terminator = chr(3) + + def handle_error(self, request, error): + """ + If command is not recognised print and error + + Args: + request: requested string + error: problem + + """ + print "An error occurred at request " + repr(request) + ": " + repr(error) + + def get_pressure(self): + + """ + Gets the current pressure + + Returns: pressure in correct format if pressure has a value; if None returns None as if it is disconnected + + """ + + if self._device.pressure is None: + return None + else: + try: + return "{stx}{pressure:+8.3f}".format(stx=chr(2), pressure=self._device.pressure) + except ValueError: + # pressure contains string probably OR (over range) or UR (under range) + return "{stx}{pressure:8s}".format(stx=chr(2), pressure=self._device.pressure) diff --git a/lewis_emulators/amint2l/states.py b/lewis_emulators/amint2l/states.py new file mode 100644 index 0000000..d9e8716 --- /dev/null +++ b/lewis_emulators/amint2l/states.py @@ -0,0 +1,12 @@ +from lewis.core.statemachine import State + + +class DefaultState(State): + """ + Device is in default state. + + """ + NAME = 'Default' + + + From 79f3b3067640f5a3bfe0b0a7201deb1b65b2f8cc Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Wed, 17 May 2017 11:32:23 +0100 Subject: [PATCH 04/44] Add test for disconnect. Allow running in recsim mode. --- tests/amint2l.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index 453cb34..97d8833 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -1,6 +1,8 @@ import unittest +from unittest import skipIf from utils.channel_access import ChannelAccess +from utils.ioc_launcher import IOCRegister from utils.testing import get_running_lewis_and_ioc @@ -17,7 +19,7 @@ def setUp(self): def _set_pressure(self, expected_pressure): self._lewis.backdoor_set_on_device("pressure", expected_pressure) - self._ioc.set_simulated_value("AMINT2L_01:PRESSURE:SIM", expected_pressure) + self._ioc.set_simulated_value("AMINT2L_01:SIM:PRESSURE", expected_pressure) def test_GIVEN_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): expected_pressure = 1.23 @@ -38,6 +40,7 @@ def test_GIVEN_pressure_with_no_decimal_places_set_WHEN_read_THEN_pressure_is_as self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) + @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): expected_pressure = "OR" self._set_pressure(expected_pressure) @@ -45,6 +48,7 @@ def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_CALC) self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Over Range") + @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): expected_pressure = "UR" self._set_pressure(expected_pressure) @@ -52,7 +56,10 @@ def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_CALC) self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Under Range") + @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): self._lewis.backdoor_set_on_device("pressure", None) + # Setting none simulates no response from device which is like pulling the serial cable. Disconnecting the + # emulator using the backdoor makes the record go udf not timeout which is what the actual device does. self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_DISCONNECTED) From 23c47c673362a46e8e713d8f62e3e94a83aea3f1 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Wed, 17 May 2017 14:17:27 +0100 Subject: [PATCH 05/44] if ignore is empty do not use it --- lewis_emulators/amint2l/constants.py | 8 -------- lewis_emulators/amint2l/device.py | 1 + .../amint2l/interfaces/stream_interface.py | 17 ++++++++--------- 3 files changed, 9 insertions(+), 17 deletions(-) delete mode 100644 lewis_emulators/amint2l/constants.py diff --git a/lewis_emulators/amint2l/constants.py b/lewis_emulators/amint2l/constants.py deleted file mode 100644 index b48d98b..0000000 --- a/lewis_emulators/amint2l/constants.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Constants associated with device -""" - -# Address of the AM Int2-l -ADDRESS_HIGH = "A" -ADDRESS_LOW = "B" -ADDRESS = "{0}{1}".format(ADDRESS_HIGH, ADDRESS_LOW) diff --git a/lewis_emulators/amint2l/device.py b/lewis_emulators/amint2l/device.py index 4f869c5..b4d5dc8 100644 --- a/lewis_emulators/amint2l/device.py +++ b/lewis_emulators/amint2l/device.py @@ -18,6 +18,7 @@ def _initialize_data(self): """ self._pressure = 2.0 + self.address = "AB" def _get_state_handlers(self): diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index f670591..4235f88 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -1,8 +1,4 @@ -import re - -from lewis.adapters.stream import StreamAdapter, Cmd - -from lewis_emulators.amint2l.constants import ADDRESS_HIGH, ADDRESS_LOW +from lewis.adapters.stream import StreamAdapter from lewis_emulators.utils.command_builder import CmdBuilder @@ -12,8 +8,7 @@ class Amint2lStreamInterface(StreamAdapter): """ commands = { - CmdBuilder("get_pressure").stx(). - escape("{address_high}{address_low}r".format(address_high=ADDRESS_HIGH, address_low=ADDRESS_LOW)).build() + CmdBuilder("get_pressure").stx().arg("[A-Fa-f0-9]+").escape("r").build() } in_terminator = chr(3) @@ -30,15 +25,19 @@ def handle_error(self, request, error): """ print "An error occurred at request " + repr(request) + ": " + repr(error) - def get_pressure(self): + def get_pressure(self, address): """ Gets the current pressure + :param address: address of request Returns: pressure in correct format if pressure has a value; if None returns None as if it is disconnected """ - + if address.upper() != self._device.address.upper(): + print "unknown address {0}".format(address) + return None + print str(self._device.pressure) if self._device.pressure is None: return None else: From a0f34422313f460a8a46f9ea822296d9e4202cd2 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Wed, 17 May 2017 14:18:40 +0100 Subject: [PATCH 06/44] Allow macros to be set for IOCs --- tests/amint2l.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/amint2l.py b/tests/amint2l.py index 97d8833..e577495 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -5,6 +5,12 @@ from utils.ioc_launcher import IOCRegister from utils.testing import get_running_lewis_and_ioc +# Internal Address of device (must be 2 characters) +ADDRESS = "01" + +# MACROS to use for the IOC +MACROS = {"ADDR": ADDRESS} + class Amint2lTests(unittest.TestCase): """ @@ -16,6 +22,7 @@ def setUp(self): self.ca = ChannelAccess() self.ca.wait_for("AMINT2L_01:PRESSURE") + self._lewis.backdoor_set_on_device("address", ADDRESS) def _set_pressure(self, expected_pressure): self._lewis.backdoor_set_on_device("pressure", expected_pressure) @@ -27,6 +34,7 @@ def test_GIVEN_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_NONE) + self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "No Error") def test_GIVEN_negative_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): expected_pressure = -123.34 From bb2613b26702c5edcc00b78286c48590e07f0e06 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Tue, 16 May 2017 14:25:28 +0100 Subject: [PATCH 07/44] Add AMInt2-L emmulator and factor out command builder. --- lewis_emulators/amint2l/__init__.py | 3 + lewis_emulators/amint2l/constants.py | 8 +++ lewis_emulators/amint2l/device.py | 68 +++++++++++++++++++ .../amint2l/interfaces/__init__.py | 3 + .../amint2l/interfaces/stream_interface.py | 49 +++++++++++++ lewis_emulators/amint2l/states.py | 12 ++++ 6 files changed, 143 insertions(+) create mode 100644 lewis_emulators/amint2l/__init__.py create mode 100644 lewis_emulators/amint2l/constants.py create mode 100644 lewis_emulators/amint2l/device.py create mode 100644 lewis_emulators/amint2l/interfaces/__init__.py create mode 100644 lewis_emulators/amint2l/interfaces/stream_interface.py create mode 100644 lewis_emulators/amint2l/states.py diff --git a/lewis_emulators/amint2l/__init__.py b/lewis_emulators/amint2l/__init__.py new file mode 100644 index 0000000..87d46bf --- /dev/null +++ b/lewis_emulators/amint2l/__init__.py @@ -0,0 +1,3 @@ +from .device import SimulatedAmint2l + +__all__ = ['SimulatedAmint2l'] diff --git a/lewis_emulators/amint2l/constants.py b/lewis_emulators/amint2l/constants.py new file mode 100644 index 0000000..b48d98b --- /dev/null +++ b/lewis_emulators/amint2l/constants.py @@ -0,0 +1,8 @@ +""" +Constants associated with device +""" + +# Address of the AM Int2-l +ADDRESS_HIGH = "A" +ADDRESS_LOW = "B" +ADDRESS = "{0}{1}".format(ADDRESS_HIGH, ADDRESS_LOW) diff --git a/lewis_emulators/amint2l/device.py b/lewis_emulators/amint2l/device.py new file mode 100644 index 0000000..4f869c5 --- /dev/null +++ b/lewis_emulators/amint2l/device.py @@ -0,0 +1,68 @@ +from collections import OrderedDict + +from lewis.devices import StateMachineDevice +from .states import DefaultState + + +class SimulatedAmint2l(StateMachineDevice): + """ + Simulated AM Int2-L pressure transducer + """ + + def _initialize_data(self): + + """ + + Sets the initial state of the device + + """ + + self._pressure = 2.0 + + def _get_state_handlers(self): + + """ + + Returns: states and their names + + """ + return { + DefaultState.NAME: DefaultState(), + } + + def _get_initial_state(self): + """ + + Returns: the name of the initial state + + """ + return DefaultState.NAME + + def _get_transition_handlers(self): + + """ + + Returns: the state transitions + + """ + + return OrderedDict([ + ]) + + @property + def pressure(self): + """ + + Returns: the pressure + + """ + return self._pressure + + @pressure.setter + def pressure(self, pressure): + """ + + :param pressure: set the pressure + :return: + """ + self._pressure = pressure diff --git a/lewis_emulators/amint2l/interfaces/__init__.py b/lewis_emulators/amint2l/interfaces/__init__.py new file mode 100644 index 0000000..3108e65 --- /dev/null +++ b/lewis_emulators/amint2l/interfaces/__init__.py @@ -0,0 +1,3 @@ +from .stream_interface import Amint2lStreamInterface + +__all__ = ['Amint2lStreamInterface'] \ No newline at end of file diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py new file mode 100644 index 0000000..f670591 --- /dev/null +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -0,0 +1,49 @@ +import re + +from lewis.adapters.stream import StreamAdapter, Cmd + +from lewis_emulators.amint2l.constants import ADDRESS_HIGH, ADDRESS_LOW +from lewis_emulators.utils.command_builder import CmdBuilder + + +class Amint2lStreamInterface(StreamAdapter): + """ + Stream interface for the serial port + """ + + commands = { + CmdBuilder("get_pressure").stx(). + escape("{address_high}{address_low}r".format(address_high=ADDRESS_HIGH, address_low=ADDRESS_LOW)).build() + } + + in_terminator = chr(3) + out_terminator = chr(3) + + def handle_error(self, request, error): + """ + If command is not recognised print and error + + Args: + request: requested string + error: problem + + """ + print "An error occurred at request " + repr(request) + ": " + repr(error) + + def get_pressure(self): + + """ + Gets the current pressure + + Returns: pressure in correct format if pressure has a value; if None returns None as if it is disconnected + + """ + + if self._device.pressure is None: + return None + else: + try: + return "{stx}{pressure:+8.3f}".format(stx=chr(2), pressure=self._device.pressure) + except ValueError: + # pressure contains string probably OR (over range) or UR (under range) + return "{stx}{pressure:8s}".format(stx=chr(2), pressure=self._device.pressure) diff --git a/lewis_emulators/amint2l/states.py b/lewis_emulators/amint2l/states.py new file mode 100644 index 0000000..d9e8716 --- /dev/null +++ b/lewis_emulators/amint2l/states.py @@ -0,0 +1,12 @@ +from lewis.core.statemachine import State + + +class DefaultState(State): + """ + Device is in default state. + + """ + NAME = 'Default' + + + From a4dcbf557f7814fc96ba78412065898e8c2ecfdb Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Wed, 17 May 2017 14:17:27 +0100 Subject: [PATCH 08/44] if ignore is empty do not use it --- lewis_emulators/amint2l/constants.py | 8 -------- lewis_emulators/amint2l/device.py | 1 + .../amint2l/interfaces/stream_interface.py | 17 ++++++++--------- 3 files changed, 9 insertions(+), 17 deletions(-) delete mode 100644 lewis_emulators/amint2l/constants.py diff --git a/lewis_emulators/amint2l/constants.py b/lewis_emulators/amint2l/constants.py deleted file mode 100644 index b48d98b..0000000 --- a/lewis_emulators/amint2l/constants.py +++ /dev/null @@ -1,8 +0,0 @@ -""" -Constants associated with device -""" - -# Address of the AM Int2-l -ADDRESS_HIGH = "A" -ADDRESS_LOW = "B" -ADDRESS = "{0}{1}".format(ADDRESS_HIGH, ADDRESS_LOW) diff --git a/lewis_emulators/amint2l/device.py b/lewis_emulators/amint2l/device.py index 4f869c5..b4d5dc8 100644 --- a/lewis_emulators/amint2l/device.py +++ b/lewis_emulators/amint2l/device.py @@ -18,6 +18,7 @@ def _initialize_data(self): """ self._pressure = 2.0 + self.address = "AB" def _get_state_handlers(self): diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index f670591..4235f88 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -1,8 +1,4 @@ -import re - -from lewis.adapters.stream import StreamAdapter, Cmd - -from lewis_emulators.amint2l.constants import ADDRESS_HIGH, ADDRESS_LOW +from lewis.adapters.stream import StreamAdapter from lewis_emulators.utils.command_builder import CmdBuilder @@ -12,8 +8,7 @@ class Amint2lStreamInterface(StreamAdapter): """ commands = { - CmdBuilder("get_pressure").stx(). - escape("{address_high}{address_low}r".format(address_high=ADDRESS_HIGH, address_low=ADDRESS_LOW)).build() + CmdBuilder("get_pressure").stx().arg("[A-Fa-f0-9]+").escape("r").build() } in_terminator = chr(3) @@ -30,15 +25,19 @@ def handle_error(self, request, error): """ print "An error occurred at request " + repr(request) + ": " + repr(error) - def get_pressure(self): + def get_pressure(self, address): """ Gets the current pressure + :param address: address of request Returns: pressure in correct format if pressure has a value; if None returns None as if it is disconnected """ - + if address.upper() != self._device.address.upper(): + print "unknown address {0}".format(address) + return None + print str(self._device.pressure) if self._device.pressure is None: return None else: From 46693bfd10b6d7978a6a14c1a79859453fd035ae Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Wed, 24 May 2017 16:39:54 +0100 Subject: [PATCH 09/44] Make initial timeout longer than usual to give the IOC time to start --- tests/amint2l.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index e577495..1b6ca65 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -21,7 +21,7 @@ def setUp(self): self._lewis, self._ioc = get_running_lewis_and_ioc("amint2l") self.ca = ChannelAccess() - self.ca.wait_for("AMINT2L_01:PRESSURE") + self.ca.wait_for("AMINT2L_01:PRESSURE", timeout=30) self._lewis.backdoor_set_on_device("address", ADDRESS) def _set_pressure(self, expected_pressure): From b770b13e7eeaac44e77db8c1a2a02accd7d1b3f2 Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Thu, 1 Jun 2017 09:49:18 +0100 Subject: [PATCH 10/44] Update __init__.py --- lewis_emulators/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lewis_emulators/__init__.py b/lewis_emulators/__init__.py index 3be6bd2..c396168 100644 --- a/lewis_emulators/__init__.py +++ b/lewis_emulators/__init__.py @@ -1 +1 @@ -from __future__ import absolute_import \ No newline at end of file +from __future__ import absolute_import From da34b1f2505d67e82ec596c60b73c94ebf08191e Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Fri, 2 Jun 2017 17:11:31 +0100 Subject: [PATCH 11/44] Fix the amlint2l so it passes after the alarm check change. Now only check for one value. --- tests/amint2l.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index e577495..02900de 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -53,7 +53,7 @@ def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): expected_pressure = "OR" self._set_pressure(expected_pressure) - self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_CALC) + self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_INVALID) self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Over Range") @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") @@ -61,7 +61,7 @@ def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): expected_pressure = "UR" self._set_pressure(expected_pressure) - self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_CALC) + self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_INVALID) self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Under Range") @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") @@ -70,4 +70,4 @@ def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): # Setting none simulates no response from device which is like pulling the serial cable. Disconnecting the # emulator using the backdoor makes the record go udf not timeout which is what the actual device does. - self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_DISCONNECTED) + self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_INVALID) From 44348aacc8af950cb6f089c8998ff811864443ce Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Thu, 8 Jun 2017 12:12:55 +0100 Subject: [PATCH 12/44] Corrected docstrings --- tests/amint2l.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index 02900de..3303f82 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -14,7 +14,7 @@ class Amint2lTests(unittest.TestCase): """ - Tests for the AM Int2-L + Tests for the AM Int2-L. """ def setUp(self): From e2fea098607036a16b1241079d2b53d7d892da67 Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Thu, 8 Jun 2017 12:28:08 +0100 Subject: [PATCH 13/44] Tidied up the formatting for a lot of files --- lewis_emulators/__init__.py | 2 +- lewis_emulators/amint2l/device.py | 27 +++---------------- .../amint2l/interfaces/__init__.py | 2 +- lewis_emulators/amint2l/states.py | 4 --- 4 files changed, 6 insertions(+), 29 deletions(-) diff --git a/lewis_emulators/__init__.py b/lewis_emulators/__init__.py index 3be6bd2..c396168 100644 --- a/lewis_emulators/__init__.py +++ b/lewis_emulators/__init__.py @@ -1 +1 @@ -from __future__ import absolute_import \ No newline at end of file +from __future__ import absolute_import diff --git a/lewis_emulators/amint2l/device.py b/lewis_emulators/amint2l/device.py index b4d5dc8..b4dc1a2 100644 --- a/lewis_emulators/amint2l/device.py +++ b/lewis_emulators/amint2l/device.py @@ -6,63 +6,44 @@ class SimulatedAmint2l(StateMachineDevice): """ - Simulated AM Int2-L pressure transducer + Simulated AM Int2-L pressure transducer. """ def _initialize_data(self): - """ - - Sets the initial state of the device - + Sets the initial state of the device. """ - self._pressure = 2.0 self.address = "AB" def _get_state_handlers(self): - """ - Returns: states and their names - """ - return { - DefaultState.NAME: DefaultState(), - } + return {DefaultState.NAME: DefaultState()} def _get_initial_state(self): """ - Returns: the name of the initial state - """ return DefaultState.NAME def _get_transition_handlers(self): - """ - Returns: the state transitions - """ - - return OrderedDict([ - ]) + return OrderedDict() @property def pressure(self): """ - Returns: the pressure - """ return self._pressure @pressure.setter def pressure(self, pressure): """ - :param pressure: set the pressure :return: """ diff --git a/lewis_emulators/amint2l/interfaces/__init__.py b/lewis_emulators/amint2l/interfaces/__init__.py index 3108e65..1e1decf 100644 --- a/lewis_emulators/amint2l/interfaces/__init__.py +++ b/lewis_emulators/amint2l/interfaces/__init__.py @@ -1,3 +1,3 @@ from .stream_interface import Amint2lStreamInterface -__all__ = ['Amint2lStreamInterface'] \ No newline at end of file +__all__ = ['Amint2lStreamInterface'] diff --git a/lewis_emulators/amint2l/states.py b/lewis_emulators/amint2l/states.py index d9e8716..c2beedf 100644 --- a/lewis_emulators/amint2l/states.py +++ b/lewis_emulators/amint2l/states.py @@ -4,9 +4,5 @@ class DefaultState(State): """ Device is in default state. - """ NAME = 'Default' - - - From 0be47f23c8497ceb6936e0091dc0bc40df995feb Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Thu, 31 Aug 2017 16:13:20 +0100 Subject: [PATCH 14/44] Add HLG emulator --- lewis_emulators/amint2l/interfaces/stream_interface.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 4235f88..180f27c 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -1,7 +1,9 @@ from lewis.adapters.stream import StreamAdapter -from lewis_emulators.utils.command_builder import CmdBuilder +from lewis.core.logging import has_log +from lewis_emulators.utils.command_builder import CmdBuilder +@has_log class Amint2lStreamInterface(StreamAdapter): """ Stream interface for the serial port @@ -23,7 +25,7 @@ def handle_error(self, request, error): error: problem """ - print "An error occurred at request " + repr(request) + ": " + repr(error) + self.log.error("An error occurred at request " + repr(request) + ": " + repr(error)) def get_pressure(self, address): @@ -35,9 +37,9 @@ def get_pressure(self, address): """ if address.upper() != self._device.address.upper(): - print "unknown address {0}".format(address) + self.log.error("unknown address {0}".format(address)) return None - print str(self._device.pressure) + self.log.info("Pressure: {0}".format(self._device.pressure)) if self._device.pressure is None: return None else: From 8facd1097e9934a023482f5da5cd88f2a05b8fef Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Fri, 1 Sep 2017 10:12:24 +0100 Subject: [PATCH 15/44] Add prefix into ioc launcher and waitfor into launcher Prefix was needed in the set simulated value so added to launcher This then enabled check that IOC isn't running and wait for ioc to start as part of the launcher. --- tests/amint2l.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index f320972..4900d8c 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -11,6 +11,9 @@ # MACROS to use for the IOC MACROS = {"ADDR": ADDRESS} +# Device prefix +DEVICE_PREFIX = "AMINT2L_01" + class Amint2lTests(unittest.TestCase): """ @@ -20,49 +23,48 @@ class Amint2lTests(unittest.TestCase): def setUp(self): self._lewis, self._ioc = get_running_lewis_and_ioc("amint2l") - self.ca = ChannelAccess() - self.ca.wait_for("AMINT2L_01:PRESSURE", timeout=30) + self.ca = ChannelAccess(device_prefix=DEVICE_PREFIX) self._lewis.backdoor_set_on_device("address", ADDRESS) def _set_pressure(self, expected_pressure): self._lewis.backdoor_set_on_device("pressure", expected_pressure) - self._ioc.set_simulated_value("AMINT2L_01:SIM:PRESSURE", expected_pressure) + self._ioc.set_simulated_value("SIM:PRESSURE", expected_pressure) def test_GIVEN_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): expected_pressure = 1.23 self._set_pressure(expected_pressure) - self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) - self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_NONE) - self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "No Error") + self.ca.assert_that_pv_is("PRESSURE", expected_pressure) + self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_NONE) + self.ca.assert_that_pv_is("RANGE:ERROR", "No Error") def test_GIVEN_negative_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): expected_pressure = -123.34 self._set_pressure(expected_pressure) - self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) + self.ca.assert_that_pv_is("PRESSURE", expected_pressure) def test_GIVEN_pressure_with_no_decimal_places_set_WHEN_read_THEN_pressure_is_as_expected(self): expected_pressure = 7 self._set_pressure(expected_pressure) - self.ca.assert_that_pv_is("AMINT2L_01:PRESSURE", expected_pressure) + self.ca.assert_that_pv_is("PRESSURE", expected_pressure) @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): expected_pressure = "OR" self._set_pressure(expected_pressure) - self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_INVALID) - self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Over Range") + self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_is("RANGE:ERROR", "Over Range") @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): expected_pressure = "UR" self._set_pressure(expected_pressure) - self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_INVALID) - self.ca.assert_that_pv_is("AMINT2L_01:RANGE:ERROR", "Under Range") + self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_is("RANGE:ERROR", "Under Range") @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): @@ -70,4 +72,4 @@ def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): # Setting none simulates no response from device which is like pulling the serial cable. Disconnecting the # emulator using the backdoor makes the record go udf not timeout which is what the actual device does. - self.ca.assert_pv_alarm_is("AMINT2L_01:PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) From 621decf3c4d89e8af7491acf441c6c226d19b978 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Fri, 1 Sep 2017 16:58:37 +0100 Subject: [PATCH 16/44] Revert "Add HLG emulator" This reverts commit 0be47f23c8497ceb6936e0091dc0bc40df995feb. --- lewis_emulators/amint2l/interfaces/stream_interface.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 180f27c..4235f88 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -1,9 +1,7 @@ from lewis.adapters.stream import StreamAdapter -from lewis.core.logging import has_log - from lewis_emulators.utils.command_builder import CmdBuilder -@has_log + class Amint2lStreamInterface(StreamAdapter): """ Stream interface for the serial port @@ -25,7 +23,7 @@ def handle_error(self, request, error): error: problem """ - self.log.error("An error occurred at request " + repr(request) + ": " + repr(error)) + print "An error occurred at request " + repr(request) + ": " + repr(error) def get_pressure(self, address): @@ -37,9 +35,9 @@ def get_pressure(self, address): """ if address.upper() != self._device.address.upper(): - self.log.error("unknown address {0}".format(address)) + print "unknown address {0}".format(address) return None - self.log.info("Pressure: {0}".format(self._device.pressure)) + print str(self._device.pressure) if self._device.pressure is None: return None else: From 33f33c7c5665c161c10c90d91c8b196da21b2697 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Thu, 31 Aug 2017 16:13:20 +0100 Subject: [PATCH 17/44] Add HLG emulator --- lewis_emulators/amint2l/interfaces/stream_interface.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 4235f88..180f27c 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -1,7 +1,9 @@ from lewis.adapters.stream import StreamAdapter -from lewis_emulators.utils.command_builder import CmdBuilder +from lewis.core.logging import has_log +from lewis_emulators.utils.command_builder import CmdBuilder +@has_log class Amint2lStreamInterface(StreamAdapter): """ Stream interface for the serial port @@ -23,7 +25,7 @@ def handle_error(self, request, error): error: problem """ - print "An error occurred at request " + repr(request) + ": " + repr(error) + self.log.error("An error occurred at request " + repr(request) + ": " + repr(error)) def get_pressure(self, address): @@ -35,9 +37,9 @@ def get_pressure(self, address): """ if address.upper() != self._device.address.upper(): - print "unknown address {0}".format(address) + self.log.error("unknown address {0}".format(address)) return None - print str(self._device.pressure) + self.log.info("Pressure: {0}".format(self._device.pressure)) if self._device.pressure is None: return None else: From 256fe33d675b2905d2505eccf6d2997e65957b80 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Mon, 25 Sep 2017 11:10:39 +0100 Subject: [PATCH 18/44] Lewis import changed at v1.0.3 --- lewis_emulators/amint2l/interfaces/stream_interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 180f27c..13930f8 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -1,10 +1,10 @@ -from lewis.adapters.stream import StreamAdapter +from lewis.adapters.stream import StreamInterface from lewis.core.logging import has_log from lewis_emulators.utils.command_builder import CmdBuilder @has_log -class Amint2lStreamInterface(StreamAdapter): +class Amint2lStreamInterface(StreamInterface): """ Stream interface for the serial port """ From 44554f47238e2051bf1fc921eb8a79f05a00e718 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Mon, 25 Sep 2017 11:13:57 +0100 Subject: [PATCH 19/44] Framework versions need to be specified in latest verion of Lewis --- lewis_emulators/amint2l/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lewis_emulators/amint2l/__init__.py b/lewis_emulators/amint2l/__init__.py index 87d46bf..3563da5 100644 --- a/lewis_emulators/amint2l/__init__.py +++ b/lewis_emulators/amint2l/__init__.py @@ -1,3 +1,4 @@ from .device import SimulatedAmint2l +framework_version = '1.1.1' __all__ = ['SimulatedAmint2l'] From 7e77866884a1648a2530a48ed8df0238c93fe8bc Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Mon, 25 Sep 2017 12:25:41 +0100 Subject: [PATCH 20/44] Pin emulators to latest version --- lewis_emulators/amint2l/__init__.py | 3 ++- lewis_emulators/lewis_versions.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 lewis_emulators/lewis_versions.py diff --git a/lewis_emulators/amint2l/__init__.py b/lewis_emulators/amint2l/__init__.py index 3563da5..39cb613 100644 --- a/lewis_emulators/amint2l/__init__.py +++ b/lewis_emulators/amint2l/__init__.py @@ -1,4 +1,5 @@ from .device import SimulatedAmint2l +from ..lewis_versions import LEWIS_LATEST -framework_version = '1.1.1' +framework_version = LEWIS_LATEST __all__ = ['SimulatedAmint2l'] diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py new file mode 100644 index 0000000..79a658b --- /dev/null +++ b/lewis_emulators/lewis_versions.py @@ -0,0 +1,2 @@ +LEWIS_1_1_1 = "1.1.1" +LEWIS_LATEST = LEWIS_1_1_1 \ No newline at end of file From e04f1082249c7a03d59bd549437ec1ba899c0434 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Mon, 8 Jan 2018 14:08:50 +0000 Subject: [PATCH 21/44] Refactor starting emulators/iocs --- tests/amint2l.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index 4900d8c..2a03b21 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -2,18 +2,29 @@ from unittest import skipIf from utils.channel_access import ChannelAccess -from utils.ioc_launcher import IOCRegister +from utils.ioc_launcher import IOCRegister, get_default_ioc_dir +from utils.lewis_launcher import LewisRegister from utils.testing import get_running_lewis_and_ioc # Internal Address of device (must be 2 characters) ADDRESS = "01" -# MACROS to use for the IOC -MACROS = {"ADDR": ADDRESS} - # Device prefix DEVICE_PREFIX = "AMINT2L_01" +IOCS = [ + { + "name": DEVICE_PREFIX, + "directory": get_default_ioc_dir("AMINT2L"), + "macros": { + "DEVICE": "L0", + "ADDR": ADDRESS, + }, + "emulator": "amint2l", + "emulator_protocol": "stream", + }, +] + class Amint2lTests(unittest.TestCase): """ @@ -21,7 +32,8 @@ class Amint2lTests(unittest.TestCase): """ def setUp(self): - self._lewis, self._ioc = get_running_lewis_and_ioc("amint2l") + self._lewis = LewisRegister.get_running("amint2l") + self._ioc = IOCRegister.get_running("AMINT2L_01") self.ca = ChannelAccess(device_prefix=DEVICE_PREFIX) self._lewis.backdoor_set_on_device("address", ADDRESS) From e1873dfecc32236720be6b1ced15fda1ea1308ce Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Tue, 9 Jan 2018 14:04:49 +0000 Subject: [PATCH 22/44] refactor --- tests/amint2l.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index 2a03b21..e45362d 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -17,7 +17,6 @@ "name": DEVICE_PREFIX, "directory": get_default_ioc_dir("AMINT2L"), "macros": { - "DEVICE": "L0", "ADDR": ADDRESS, }, "emulator": "amint2l", @@ -34,6 +33,8 @@ class Amint2lTests(unittest.TestCase): def setUp(self): self._lewis = LewisRegister.get_running("amint2l") self._ioc = IOCRegister.get_running("AMINT2L_01") + self.assertIsNotNone(self._lewis) + self.assertIsNotNone(self._ioc) self.ca = ChannelAccess(device_prefix=DEVICE_PREFIX) self._lewis.backdoor_set_on_device("address", ADDRESS) From 77546b1b4d3ed4266a0620e9a28f9e5707d8ec72 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Wed, 10 Jan 2018 17:28:59 +0000 Subject: [PATCH 23/44] Upgrade some emulators to new style --- tests/amint2l.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index e45362d..bf0f3b6 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -1,10 +1,8 @@ import unittest -from unittest import skipIf from utils.channel_access import ChannelAccess -from utils.ioc_launcher import IOCRegister, get_default_ioc_dir -from utils.lewis_launcher import LewisRegister -from utils.testing import get_running_lewis_and_ioc +from utils.ioc_launcher import get_default_ioc_dir +from utils.testing import skip_if_recsim, get_running_lewis_and_ioc # Internal Address of device (must be 2 characters) ADDRESS = "01" @@ -31,8 +29,7 @@ class Amint2lTests(unittest.TestCase): """ def setUp(self): - self._lewis = LewisRegister.get_running("amint2l") - self._ioc = IOCRegister.get_running("AMINT2L_01") + self._lewis, self._ioc = get_running_lewis_and_ioc("amint2l", DEVICE_PREFIX) self.assertIsNotNone(self._lewis) self.assertIsNotNone(self._ioc) @@ -63,7 +60,7 @@ def test_GIVEN_pressure_with_no_decimal_places_set_WHEN_read_THEN_pressure_is_as self.ca.assert_that_pv_is("PRESSURE", expected_pressure) - @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") + @skip_if_recsim("In rec sim this test fails") def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): expected_pressure = "OR" self._set_pressure(expected_pressure) @@ -71,7 +68,7 @@ def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) self.ca.assert_that_pv_is("RANGE:ERROR", "Over Range") - @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") + @skip_if_recsim("In rec sim this test fails") def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): expected_pressure = "UR" self._set_pressure(expected_pressure) @@ -79,7 +76,7 @@ def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) self.ca.assert_that_pv_is("RANGE:ERROR", "Under Range") - @skipIf(IOCRegister.uses_rec_sim, "In rec sim this test fails") + @skip_if_recsim("In rec sim this test fails") def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): self._lewis.backdoor_set_on_device("pressure", None) # Setting none simulates no response from device which is like pulling the serial cable. Disconnecting the From b9ccd88e976edabf0236fc0956edd183f58a22e8 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Thu, 11 Jan 2018 15:12:54 +0000 Subject: [PATCH 24/44] Convert rest of tests --- tests/amint2l.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index bf0f3b6..a2c895a 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -18,7 +18,6 @@ "ADDR": ADDRESS, }, "emulator": "amint2l", - "emulator_protocol": "stream", }, ] From f4532147fcb41c68ad9b6761b514b77ade8664ee Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Wed, 17 Jan 2018 10:00:22 +0000 Subject: [PATCH 25/44] Use python rather than batch files --- tests/amint2l.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/amint2l.py b/tests/amint2l.py index a2c895a..4ffda9e 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -1,5 +1,6 @@ import unittest +from utils.test_modes import TestModes from utils.channel_access import ChannelAccess from utils.ioc_launcher import get_default_ioc_dir from utils.testing import skip_if_recsim, get_running_lewis_and_ioc @@ -22,6 +23,9 @@ ] +TEST_MODES = [TestModes.RECSIM, TestModes.DEVSIM] + + class Amint2lTests(unittest.TestCase): """ Tests for the AM Int2-L. From 794b180cca61b9c0d9c32fbebe12a81748a0e625 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Thu, 18 Jan 2018 17:14:14 +0000 Subject: [PATCH 26/44] Use better setup of device for amint2L so it canbe a good example --- lewis_emulators/amint2l/device.py | 17 +------------- .../amint2l/interfaces/stream_interface.py | 22 +++++++++++-------- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/lewis_emulators/amint2l/device.py b/lewis_emulators/amint2l/device.py index b4dc1a2..79e4ff2 100644 --- a/lewis_emulators/amint2l/device.py +++ b/lewis_emulators/amint2l/device.py @@ -13,7 +13,7 @@ def _initialize_data(self): """ Sets the initial state of the device. """ - self._pressure = 2.0 + self.pressure = 2.0 self.address = "AB" def _get_state_handlers(self): @@ -33,18 +33,3 @@ def _get_transition_handlers(self): Returns: the state transitions """ return OrderedDict() - - @property - def pressure(self): - """ - Returns: the pressure - """ - return self._pressure - - @pressure.setter - def pressure(self, pressure): - """ - :param pressure: set the pressure - :return: - """ - self._pressure = pressure diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 13930f8..3457993 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -9,13 +9,17 @@ class Amint2lStreamInterface(StreamInterface): Stream interface for the serial port """ - commands = { - CmdBuilder("get_pressure").stx().arg("[A-Fa-f0-9]+").escape("r").build() - } - in_terminator = chr(3) out_terminator = chr(3) + def __init__(self): + + super(Amint2lStreamInterface, self).__init__() + self.commands = { + CmdBuilder(self.get_pressure).stx().arg("[A-Fa-f0-9]+").escape("r").build() + } + self.device = self._device + def handle_error(self, request, error): """ If command is not recognised print and error @@ -36,15 +40,15 @@ def get_pressure(self, address): Returns: pressure in correct format if pressure has a value; if None returns None as if it is disconnected """ - if address.upper() != self._device.address.upper(): + if address.upper() != self.device.address.upper(): self.log.error("unknown address {0}".format(address)) return None - self.log.info("Pressure: {0}".format(self._device.pressure)) - if self._device.pressure is None: + self.log.info("Pressure: {0}".format(self.device.pressure)) + if self.device.pressure is None: return None else: try: - return "{stx}{pressure:+8.3f}".format(stx=chr(2), pressure=self._device.pressure) + return "{stx}{pressure:+8.3f}".format(stx=chr(2), pressure=self.device.pressure) except ValueError: # pressure contains string probably OR (over range) or UR (under range) - return "{stx}{pressure:8s}".format(stx=chr(2), pressure=self._device.pressure) + return "{stx}{pressure:8s}".format(stx=chr(2), pressure=self.device.pressure) From 0ef9ae8a4affeffba05516a27c82a2af1315e079 Mon Sep 17 00:00:00 2001 From: John-Holt-Tessella Date: Fri, 26 Jan 2018 15:21:19 +0000 Subject: [PATCH 27/44] Add disconnect and tidy code for rework --- .../amint2l/interfaces/stream_interface.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 3457993..71092d6 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -1,8 +1,13 @@ +""" +Stream device for amint2l +""" + from lewis.adapters.stream import StreamInterface from lewis.core.logging import has_log from lewis_emulators.utils.command_builder import CmdBuilder + @has_log class Amint2lStreamInterface(StreamInterface): """ @@ -18,7 +23,6 @@ def __init__(self): self.commands = { CmdBuilder(self.get_pressure).stx().arg("[A-Fa-f0-9]+").escape("r").build() } - self.device = self._device def handle_error(self, request, error): """ @@ -40,15 +44,15 @@ def get_pressure(self, address): Returns: pressure in correct format if pressure has a value; if None returns None as if it is disconnected """ - if address.upper() != self.device.address.upper(): + if address.upper() != self._device.address.upper(): self.log.error("unknown address {0}".format(address)) return None - self.log.info("Pressure: {0}".format(self.device.pressure)) - if self.device.pressure is None: + self.log.info("Pressure: {0}".format(self._device.pressure)) + if self._device.pressure is None: return None else: try: - return "{stx}{pressure:+8.3f}".format(stx=chr(2), pressure=self.device.pressure) + return "{stx}{pressure:+8.3f}".format(stx=chr(2), pressure=self._device.pressure) except ValueError: # pressure contains string probably OR (over range) or UR (under range) - return "{stx}{pressure:8s}".format(stx=chr(2), pressure=self.device.pressure) + return "{stx}{pressure:8s}".format(stx=chr(2), pressure=self._device.pressure) From 855e4203213b191e7be55ff16fd0047668a4a37b Mon Sep 17 00:00:00 2001 From: David Keymer Date: Fri, 23 Mar 2018 17:23:22 +0000 Subject: [PATCH 28/44] Upgrade Lewis --- lewis_emulators/lewis_versions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index 79a658b..4d572c5 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,2 @@ -LEWIS_1_1_1 = "1.1.1" -LEWIS_LATEST = LEWIS_1_1_1 \ No newline at end of file +LEWIS_1_2_0 = "1.2.0" +LEWIS_LATEST = LEWIS_1_2_0 \ No newline at end of file From d3dd19007a2cfde03f1bba6c0b1b9744302602e4 Mon Sep 17 00:00:00 2001 From: esouthren Date: Tue, 3 Apr 2018 16:34:00 +0100 Subject: [PATCH 29/44] Update lewis_versions.py Added new line --- lewis_emulators/lewis_versions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index 4d572c5..beae6ab 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,2 @@ LEWIS_1_2_0 = "1.2.0" -LEWIS_LATEST = LEWIS_1_2_0 \ No newline at end of file +LEWIS_LATEST = LEWIS_1_2_0 From a8c2282a1a05be4ce1c6ead5c31b4a28f3663c14 Mon Sep 17 00:00:00 2001 From: Rory-Potter-Tessella Date: Fri, 1 Jun 2018 11:11:57 +0100 Subject: [PATCH 30/44] Changed module name and updated emulator to pass temp test. --- lewis_emulators/__init__.py | 1 - 1 file changed, 1 deletion(-) delete mode 100644 lewis_emulators/__init__.py diff --git a/lewis_emulators/__init__.py b/lewis_emulators/__init__.py deleted file mode 100644 index c396168..0000000 --- a/lewis_emulators/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import absolute_import From 3b9b68dc767b9e60fef4597795d519586437ec6b Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Fri, 15 Jun 2018 13:42:05 +0100 Subject: [PATCH 31/44] Re-add lost init file, with comment saying do not delete. --- lewis_emulators/__init__.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 lewis_emulators/__init__.py diff --git a/lewis_emulators/__init__.py b/lewis_emulators/__init__.py new file mode 100644 index 0000000..ad92558 --- /dev/null +++ b/lewis_emulators/__init__.py @@ -0,0 +1,2 @@ +# DO NOT DELETE THIS FILE - LEWIS FRAMEWORK REQUIRES THE DIRECTORY TO BE IMPORTABLE +from __future__ import absolute_import From d32176210f2b817dac8d51047c33c6a0e116c36e Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Wed, 20 Jun 2018 14:25:37 +0100 Subject: [PATCH 32/44] Convert docs to new style. Make assertion names consistent. --- tests/amint2l.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index 4ffda9e..c690635 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -48,7 +48,7 @@ def test_GIVEN_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): self._set_pressure(expected_pressure) self.ca.assert_that_pv_is("PRESSURE", expected_pressure) - self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_NONE) + self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_NONE) self.ca.assert_that_pv_is("RANGE:ERROR", "No Error") def test_GIVEN_negative_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): @@ -68,7 +68,7 @@ def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): expected_pressure = "OR" self._set_pressure(expected_pressure) - self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) self.ca.assert_that_pv_is("RANGE:ERROR", "Over Range") @skip_if_recsim("In rec sim this test fails") @@ -76,7 +76,7 @@ def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): expected_pressure = "UR" self._set_pressure(expected_pressure) - self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) self.ca.assert_that_pv_is("RANGE:ERROR", "Under Range") @skip_if_recsim("In rec sim this test fails") @@ -85,4 +85,4 @@ def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): # Setting none simulates no response from device which is like pulling the serial cable. Disconnecting the # emulator using the backdoor makes the record go udf not timeout which is what the actual device does. - self.ca.assert_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) From 626c21818046ae480bead693fcbf1b55dd7c31c4 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Wed, 20 Jun 2018 15:18:33 +0100 Subject: [PATCH 33/44] Catch some more old-style alarms --- tests/amint2l.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/amint2l.py b/tests/amint2l.py index c690635..5786876 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -48,7 +48,7 @@ def test_GIVEN_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): self._set_pressure(expected_pressure) self.ca.assert_that_pv_is("PRESSURE", expected_pressure) - self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_NONE) + self.ca.assert_that_pv_alarm_is("PRESSURE", self.ca.Alarms.NONE) self.ca.assert_that_pv_is("RANGE:ERROR", "No Error") def test_GIVEN_negative_pressure_set_WHEN_read_THEN_pressure_is_as_expected(self): @@ -68,7 +68,7 @@ def test_GIVEN_pressure_over_range_set_WHEN_read_THEN_error(self): expected_pressure = "OR" self._set_pressure(expected_pressure) - self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_alarm_is("PRESSURE", self.ca.Alarms.INVALID) self.ca.assert_that_pv_is("RANGE:ERROR", "Over Range") @skip_if_recsim("In rec sim this test fails") @@ -76,7 +76,7 @@ def test_GIVEN_pressure_under_range_set_WHEN_read_THEN_error(self): expected_pressure = "UR" self._set_pressure(expected_pressure) - self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_alarm_is("PRESSURE", self.ca.Alarms.INVALID) self.ca.assert_that_pv_is("RANGE:ERROR", "Under Range") @skip_if_recsim("In rec sim this test fails") @@ -85,4 +85,4 @@ def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): # Setting none simulates no response from device which is like pulling the serial cable. Disconnecting the # emulator using the backdoor makes the record go udf not timeout which is what the actual device does. - self.ca.assert_that_pv_alarm_is("PRESSURE", ChannelAccess.ALARM_INVALID) + self.ca.assert_that_pv_alarm_is("PRESSURE", self.ca.Alarms.INVALID) From dadc612e7f0dc3fbc9aa4ded4d0ddf4857da517d Mon Sep 17 00:00:00 2001 From: Liam <02liamp@gmail.com> Date: Tue, 11 Dec 2018 15:02:07 +0000 Subject: [PATCH 34/44] Added connection emulation --- lewis_emulators/amint2l/device.py | 1 + lewis_emulators/amint2l/interfaces/stream_interface.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lewis_emulators/amint2l/device.py b/lewis_emulators/amint2l/device.py index 79e4ff2..a4936d2 100644 --- a/lewis_emulators/amint2l/device.py +++ b/lewis_emulators/amint2l/device.py @@ -13,6 +13,7 @@ def _initialize_data(self): """ Sets the initial state of the device. """ + self.connected = True self.pressure = 2.0 self.address = "AB" diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 71092d6..55f914f 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -6,7 +6,9 @@ from lewis.core.logging import has_log from lewis_emulators.utils.command_builder import CmdBuilder +from lewis_emulators.utils.replies import conditional_reply +if_connected = conditional_reply("connected") @has_log class Amint2lStreamInterface(StreamInterface): @@ -24,6 +26,7 @@ def __init__(self): CmdBuilder(self.get_pressure).stx().arg("[A-Fa-f0-9]+").escape("r").build() } + @if_connected def handle_error(self, request, error): """ If command is not recognised print and error @@ -35,6 +38,7 @@ def handle_error(self, request, error): """ self.log.error("An error occurred at request " + repr(request) + ": " + repr(error)) + @if_connected def get_pressure(self, address): """ From af1cfb910946feb43cf29fbd5bbe68d54cf7ad40 Mon Sep 17 00:00:00 2001 From: Liam <02liamp@gmail.com> Date: Tue, 11 Dec 2018 15:23:09 +0000 Subject: [PATCH 35/44] added amint2l connection test --- tests/amint2l.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/amint2l.py b/tests/amint2l.py index 5786876..83f4f93 100644 --- a/tests/amint2l.py +++ b/tests/amint2l.py @@ -37,6 +37,7 @@ def setUp(self): self.assertIsNotNone(self._ioc) self.ca = ChannelAccess(device_prefix=DEVICE_PREFIX) + self._lewis.backdoor_set_on_device('connected', True) self._lewis.backdoor_set_on_device("address", ADDRESS) def _set_pressure(self, expected_pressure): @@ -86,3 +87,8 @@ def test_GIVEN_device_disconnected_WHEN_read_THEN_pv_shows_disconnect(self): # emulator using the backdoor makes the record go udf not timeout which is what the actual device does. self.ca.assert_that_pv_alarm_is("PRESSURE", self.ca.Alarms.INVALID) + + @skip_if_recsim("Can not test disconnection in recsim") + def test_GIVEN_device_not_connected_WHEN_get_pressure_THEN_alarm(self): + self._lewis.backdoor_set_on_device('connected', False) + self.ca.assert_that_pv_alarm_is('PRESSURE', ChannelAccess.Alarms.INVALID) From 6ab28056d7f3e277c534c835752f931ddfb0c92a Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Wed, 25 Sep 2019 16:58:41 +0100 Subject: [PATCH 36/44] Updated lewis version --- lewis_emulators/lewis_versions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index beae6ab..a805cfb 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,2 @@ -LEWIS_1_2_0 = "1.2.0" -LEWIS_LATEST = LEWIS_1_2_0 +LEWIS_1_2_1 = "1.2.1" +LEWIS_LATEST = LEWIS_1_2_1 From 85ea0e18cbac1264ae30497071f7d81d831b81ed Mon Sep 17 00:00:00 2001 From: ChrisColeExpControl Date: Tue, 15 Oct 2019 09:43:23 +0100 Subject: [PATCH 37/44] renamed to cryogenic_sms/CRYOSMS --- lewis_emulators/lewis_versions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index beae6ab..fc253d0 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,3 @@ LEWIS_1_2_0 = "1.2.0" -LEWIS_LATEST = LEWIS_1_2_0 +LEWIS_1_2_1 = "1.2.1" +LEWIS_LATEST = LEWIS_1_2_1 From 45d081a121cc03844b81992a91f495dd108a099b Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 1 Jun 2020 18:29:20 +0100 Subject: [PATCH 38/44] Updated lewis version to 1.2.2 --- lewis_emulators/lewis_versions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index a805cfb..5849f8b 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,2 @@ -LEWIS_1_2_1 = "1.2.1" +LEWIS_1_2_1 = "1.2.2" LEWIS_LATEST = LEWIS_1_2_1 From f92bedfe0edf2b134c41ff059a96f6b6ec7952f0 Mon Sep 17 00:00:00 2001 From: aaronlong Date: Fri, 11 Sep 2020 15:38:25 +0100 Subject: [PATCH 39/44] amint2l - PEP8 fix --- lewis_emulators/amint2l/interfaces/stream_interface.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index 55f914f..c2f630e 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -10,6 +10,7 @@ if_connected = conditional_reply("connected") + @has_log class Amint2lStreamInterface(StreamInterface): """ From 135cf34ce968a64a081b17bd2979662ee359ecf2 Mon Sep 17 00:00:00 2001 From: aaronlong Date: Wed, 16 Sep 2020 14:48:32 +0100 Subject: [PATCH 40/44] Fixed variable name for lewis version number --- lewis_emulators/lewis_versions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index 5849f8b..5ae639f 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,2 @@ -LEWIS_1_2_1 = "1.2.2" -LEWIS_LATEST = LEWIS_1_2_1 +LEWIS_1_2_2 = "1.2.2" +LEWIS_LATEST = LEWIS_1_2_2 From 8051ce446b879a23651d464c09689dd9d74bb06c Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Tue, 10 Nov 2020 20:29:26 +0000 Subject: [PATCH 41/44] Updated to use latest lewis version and convert strings correctly --- lewis_emulators/lewis_versions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index 5ae639f..99831a8 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,2 @@ -LEWIS_1_2_2 = "1.2.2" -LEWIS_LATEST = LEWIS_1_2_2 +LEWIS_2_0_0 = "2.0.0" +LEWIS_LATEST = LEWIS_2_0_0 From d0971b6f8347785565211106ce92e9c8ab4519a5 Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Mon, 30 Nov 2020 14:18:57 +0000 Subject: [PATCH 42/44] Update lewis version --- lewis_emulators/lewis_versions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lewis_emulators/lewis_versions.py b/lewis_emulators/lewis_versions.py index 99831a8..0f6c45a 100644 --- a/lewis_emulators/lewis_versions.py +++ b/lewis_emulators/lewis_versions.py @@ -1,2 +1,2 @@ -LEWIS_2_0_0 = "2.0.0" -LEWIS_LATEST = LEWIS_2_0_0 +LEWIS_1_3_0 = "1.3.0" +LEWIS_LATEST = LEWIS_1_3_0 From 95298bd1af30dbb2d24af5386b7c7c29b83e143f Mon Sep 17 00:00:00 2001 From: Dominic Oram Date: Thu, 10 Jun 2021 11:38:28 +0100 Subject: [PATCH 43/44] Moved utils into lewis itself --- lewis_emulators/amint2l/interfaces/stream_interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/lewis_emulators/amint2l/interfaces/stream_interface.py index c2f630e..b0486ac 100644 --- a/lewis_emulators/amint2l/interfaces/stream_interface.py +++ b/lewis_emulators/amint2l/interfaces/stream_interface.py @@ -5,8 +5,8 @@ from lewis.adapters.stream import StreamInterface from lewis.core.logging import has_log -from lewis_emulators.utils.command_builder import CmdBuilder -from lewis_emulators.utils.replies import conditional_reply +from lewis.utils.command_builder import CmdBuilder +from lewis.utils.replies import conditional_reply if_connected = conditional_reply("connected") From d32f0451be08d52f4decf40e4c7b028dd22d0b29 Mon Sep 17 00:00:00 2001 From: aaronlong Date: Thu, 28 Oct 2021 15:31:26 +0100 Subject: [PATCH 44/44] Added system tests to support module --- .gitignore | 4 ++++ Makefile | 3 +++ system_tests/__init__.py | 0 .../lewis_emulators}/__init__.py | 0 .../lewis_emulators}/amint2l/__init__.py | 0 .../lewis_emulators}/amint2l/device.py | 0 .../lewis_emulators}/amint2l/interfaces/__init__.py | 0 .../amint2l/interfaces/stream_interface.py | 0 .../lewis_emulators}/amint2l/states.py | 0 .../lewis_emulators}/lewis_versions.py | 0 system_tests/run_tests.bat | 13 +++++++++++++ system_tests/tests/__init__.py | 0 {tests => system_tests/tests}/amint2l.py | 0 13 files changed, 20 insertions(+) create mode 100644 system_tests/__init__.py rename {lewis_emulators => system_tests/lewis_emulators}/__init__.py (100%) rename {lewis_emulators => system_tests/lewis_emulators}/amint2l/__init__.py (100%) rename {lewis_emulators => system_tests/lewis_emulators}/amint2l/device.py (100%) rename {lewis_emulators => system_tests/lewis_emulators}/amint2l/interfaces/__init__.py (100%) rename {lewis_emulators => system_tests/lewis_emulators}/amint2l/interfaces/stream_interface.py (100%) rename {lewis_emulators => system_tests/lewis_emulators}/amint2l/states.py (100%) rename {lewis_emulators => system_tests/lewis_emulators}/lewis_versions.py (100%) create mode 100644 system_tests/run_tests.bat create mode 100644 system_tests/tests/__init__.py rename {tests => system_tests/tests}/amint2l.py (100%) diff --git a/.gitignore b/.gitignore index bd3bcc4..0e708f8 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,7 @@ dllPath.bat runIOC.bat runIOC.sh relPaths.sh +__pycache__/ +*.py[cod] +*$py.class +/test-reports/ \ No newline at end of file diff --git a/Makefile b/Makefile index 0ce416e..d96db48 100644 --- a/Makefile +++ b/Makefile @@ -27,3 +27,6 @@ iocBoot_DEPEND_DIRS += $(filter %App,$(DIRS)) # Add any additional dependency rules here: include $(TOP)/configure/RULES_TOP + +ioctests: + .\system_tests\run_tests.bat diff --git a/system_tests/__init__.py b/system_tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lewis_emulators/__init__.py b/system_tests/lewis_emulators/__init__.py similarity index 100% rename from lewis_emulators/__init__.py rename to system_tests/lewis_emulators/__init__.py diff --git a/lewis_emulators/amint2l/__init__.py b/system_tests/lewis_emulators/amint2l/__init__.py similarity index 100% rename from lewis_emulators/amint2l/__init__.py rename to system_tests/lewis_emulators/amint2l/__init__.py diff --git a/lewis_emulators/amint2l/device.py b/system_tests/lewis_emulators/amint2l/device.py similarity index 100% rename from lewis_emulators/amint2l/device.py rename to system_tests/lewis_emulators/amint2l/device.py diff --git a/lewis_emulators/amint2l/interfaces/__init__.py b/system_tests/lewis_emulators/amint2l/interfaces/__init__.py similarity index 100% rename from lewis_emulators/amint2l/interfaces/__init__.py rename to system_tests/lewis_emulators/amint2l/interfaces/__init__.py diff --git a/lewis_emulators/amint2l/interfaces/stream_interface.py b/system_tests/lewis_emulators/amint2l/interfaces/stream_interface.py similarity index 100% rename from lewis_emulators/amint2l/interfaces/stream_interface.py rename to system_tests/lewis_emulators/amint2l/interfaces/stream_interface.py diff --git a/lewis_emulators/amint2l/states.py b/system_tests/lewis_emulators/amint2l/states.py similarity index 100% rename from lewis_emulators/amint2l/states.py rename to system_tests/lewis_emulators/amint2l/states.py diff --git a/lewis_emulators/lewis_versions.py b/system_tests/lewis_emulators/lewis_versions.py similarity index 100% rename from lewis_emulators/lewis_versions.py rename to system_tests/lewis_emulators/lewis_versions.py diff --git a/system_tests/run_tests.bat b/system_tests/run_tests.bat new file mode 100644 index 0000000..56f9c25 --- /dev/null +++ b/system_tests/run_tests.bat @@ -0,0 +1,13 @@ +@echo off +REM Run this directory's tests using the IOC Testing Framework + +SET CurrentDir=%~dp0 + +call "%~dp0..\..\..\..\config_env.bat" + +set "PYTHONUNBUFFERED=1" + +REM Command line arguments always passed to the test script +SET ARGS=--test_and_emulator %~dp0 +call %PYTHON3% "%EPICS_KIT_ROOT%\support\IocTestFramework\master\run_tests.py" %ARGS% %* +IF %ERRORLEVEL% NEQ 0 EXIT /b %errorlevel% diff --git a/system_tests/tests/__init__.py b/system_tests/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/amint2l.py b/system_tests/tests/amint2l.py similarity index 100% rename from tests/amint2l.py rename to system_tests/tests/amint2l.py