示例#1
0
class TestBasicController(unittest.TestCase):
    def setUp(self):
        self.process = Process("proc")
        self.o = BasicController("MyMRI")
        self.process.add_controller(self.o)
        self.process.start()
        self.b = self.process.block_view("MyMRI")

    def tearDown(self):
        self.process.stop(timeout=2)

    def update_health(self, num, alarm=Alarm.ok):
        self.o.update_health(num, HealthInfo(alarm))

    def test_set_health(self):
        self.update_health(1, Alarm(severity=AlarmSeverity.MINOR_ALARM))
        self.update_health(2, Alarm(severity=AlarmSeverity.MAJOR_ALARM))
        assert self.b.health.alarm.severity == AlarmSeverity.MAJOR_ALARM

        self.update_health(1, Alarm(severity=AlarmSeverity.UNDEFINED_ALARM))
        self.update_health(2, Alarm(severity=AlarmSeverity.INVALID_ALARM))
        assert self.b.health.alarm.severity == AlarmSeverity.UNDEFINED_ALARM

        self.update_health(1)
        self.update_health(2)
        assert self.o.health.value == "OK"
示例#2
0
 def setUp(self):
     self.p = Process("proc")
     c = BasicController("mri")
     c.add_part(CounterPart(name='counting'))
     self.p.add_controller(c)
     self.p.start()
     self.b = self.p.block_view("mri")
示例#3
0
 def setUp(self):
     self.o = LabelPart(value="My label")
     self.p = Process("proc")
     self.c = BasicController("mri")
     self.c.add_part(self.o)
     self.p.add_controller(self.c)
     self.p.start()
     self.b = self.p.block_view(self.c.mri)
示例#4
0
 def makeChildBlock(self, block_mri):
     controller = BasicController(block_mri)
     controller.add_part(PortsPart(name='Connector%s' % block_mri[-1]))
     part = ChildPart(mri=block_mri,
                      name='part%s' % block_mri,
                      stateful=False,
                      initial_visibility=True)
     self.p.add_controller(controller)
     return part, controller
示例#5
0
 def makeChildBlock(self, block_mri):
     controller = BasicController(block_mri)
     controller.add_part(PortsPart(name=f"Connector{block_mri[-1]}"))
     part = ChildPart(
         mri=block_mri,
         name=f"part{block_mri}",
         stateful=False,
     )
     self.p.add_controller(controller)
     return part, controller
 def _make_child_controller(self, parts, mri):
     controller = BasicController(mri=mri)
     if mri.endswith("PCAP"):
         parts.append(PandABlocksActionPart(
             self.client, "*PCAP", "ARM", "Arm position capture", []))
         parts.append(PandABlocksActionPart(
             self.client, "*PCAP", "DISARM", "Disarm position capture", []))
     for part in parts:
         controller.add_part(part)
     return controller
示例#7
0
    def setUp(self):
        self.process = Process("Process")
        self.context = Context(self.process)

        # Create a fake PandA with a pulse block
        self.panda = ManagerController("PANDA", "/tmp")
        controller = BasicController("PANDA:PULSE3")
        self.pulse_part = PulsePart("part")
        controller.add_part(self.pulse_part)
        self.process.add_controller(controller)
        self.panda.add_part(
            ChildPart("PULSE3",
                      "PANDA:PULSE3",
                      initial_visibility=True,
                      stateful=False))
        self.process.add_controller(self.panda)

        # And the detector
        self.config_dir = tmp_dir("config_dir")
        for c in detector_block("DET", config_dir=self.config_dir.value):
            self.process.add_controller(c)

        # Make the child block holding panda and pmac mri
        self.child = self.create_child_block(
            panda_pulse_trigger_block,
            self.process,
            mri="SCAN:PULSE",
            panda="PANDA",
            detector="DET",
        )

        # And our part under test
        self.o = PandAPulseTriggerPart("detTrigger", "SCAN:PULSE")

        # Add in a scan block
        self.scan = RunnableController("SCAN", "/tmp")
        self.scan.add_part(DetectorChildPart("det", "DET", True))
        self.scan.add_part(self.o)
        self.process.add_controller(self.scan)

        # Now start the process off and tell the panda which sequencer tables
        # to use
        self.process.start()
        exports = ExportTable.from_rows([
            ("PULSE3.width", "detTriggerWidth"),
            ("PULSE3.step", "detTriggerStep"),
            ("PULSE3.delay", "detTriggerDelay"),
            ("PULSE3.pulses", "detTriggerPulses"),
        ])
        self.panda.set_exports(exports)
        self.tmpdir = tempfile.mkdtemp()
    def setUp(self):
        self.process = Process("Process")
        self.context = Context(self.process)

        # Make 2 sequencers we can prod
        self.seq_parts = {}
        for i in (1, 2):
            controller = BasicController("TEST:SEQ%d" % i)
            self.seq_parts[i] = SequencerPart("part")
            controller.add_part(self.seq_parts[i])
            self.process.add_controller(controller)

        # Now start the process off
        self.process.start()

        self.seq1_block = self.context.block_view("TEST:SEQ1")
        self.seq2_block = self.context.block_view("TEST:SEQ2")
        self.db = DoubleBuffer(self.context, self.seq1_block, self.seq2_block)
示例#9
0
 def test_init(self):
     params = Mock()
     params.mri = "MyMRI"
     params.description = "My description"
     process = Mock()
     o = BasicController(process, [], params)
     assert o.mri == params.mri
     assert o.params is params
     assert o.process is process
示例#10
0
 def setUp(self):
     self.process = Process("proc")
     self.o = BasicController("MyMRI")
     self.process.add_controller(self.o)
     self.process.start()
     self.b = self.process.block_view("MyMRI")
示例#11
0
class TestLabelPart(unittest.TestCase):
    def setUp(self):
        self.o = LabelPart(value="My label")
        self.p = Process("proc")
        self.c = BasicController("mri")
        self.c.add_part(self.o)
        self.p.add_controller(self.c)
        self.p.start()
        self.b = self.p.block_view(self.c.mri)

    def tearDown(self):
        self.p.stop(1)

    def test_init(self):
        assert self.o.name == "label"
        assert self.o.attr.value == "My label"
        assert self.o.attr.meta.tags == ["widget:textinput", "config:1"]
        assert self.b.meta.label == "My label"

    def test_setter(self):
        self.b.label.put_value("My label2")
        assert self.b.label.value == "My label2"
        assert self.b.meta.label == "My label2"

    def test_concurrency(self):
        q = Queue()
        # Subscribe to the whole block
        sub = Subscribe(id=0, path=["mri"], delta=True)
        sub.set_callback(q.put)
        self.c.handle_request(sub)
        # We should get first Delta through with initial value
        r = q.get().to_dict()
        assert r["id"] == 0
        assert len(r["changes"]) == 1
        assert len(r["changes"][0]) == 2
        assert r["changes"][0][0] == []
        assert r["changes"][0][1]["meta"]["label"] == "My label"
        assert r["changes"][0][1]["label"]["value"] == "My label"
        # Do a Put on the label
        put = Put(id=2, path=["mri", "label", "value"], value="New", get=True)
        put.set_callback(q.put)
        self.c.handle_request(put)
        # Check we got two updates before the return
        r = q.get().to_dict()
        assert r["id"] == 0
        assert len(r["changes"]) == 2
        assert len(r["changes"][0]) == 2
        assert r["changes"][0][0] == ["label", "value"]
        assert r["changes"][0][1] == "New"
        assert len(r["changes"][0]) == 2
        assert r["changes"][1][0] == ["label", "timeStamp"]
        r = q.get().to_dict()
        assert r["id"] == 0
        assert len(r["changes"]) == 1
        assert len(r["changes"][0]) == 2
        assert r["changes"][0][0] == ["meta", "label"]
        assert r["changes"][0][1] == "New"
        # Then the return
        r3 = q.get().to_dict()
        assert r3["id"] == 2
        assert r3["value"] == "New"
    def setUp(self):
        self.process = Process("Process")
        self.context = Context(self.process)

        # Create a fake PandA
        self.panda = ManagerController("PANDA", "/tmp", use_git=False)
        self.busses = PositionsPart("busses")
        self.panda.add_part(self.busses)

        # Make 2 sequencers we can prod
        self.seq_parts = {}
        for i in (1, 2):
            controller = BasicController("PANDA:SEQ%d" % i)
            self.seq_parts[i] = SequencerPart("part")
            controller.add_part(self.seq_parts[i])
            self.process.add_controller(controller)
            self.panda.add_part(
                ChildPart(
                    "SEQ%d" % i,
                    "PANDA:SEQ%d" % i,
                    initial_visibility=True,
                    stateful=False,
                ))
        self.child_seq1 = self.process.get_controller("PANDA:SEQ1")
        self.child_seq2 = self.process.get_controller("PANDA:SEQ2")

        # And an srgate
        controller = BasicController("PANDA:SRGATE1")
        self.gate_part = GatePart("part")
        controller.add_part(self.gate_part)
        self.process.add_controller(controller)
        self.panda.add_part(
            ChildPart("SRGATE1",
                      "PANDA:SRGATE1",
                      initial_visibility=True,
                      stateful=False))
        self.process.add_controller(self.panda)

        # And the PMAC
        pmac_block = make_block_creator(
            os.path.join(os.path.dirname(__file__), "..", "test_pmac", "blah"),
            "test_pmac_manager_block.yaml",
        )
        self.config_dir = tmp_dir("config_dir")
        self.pmac = self.create_child_block(
            pmac_block,
            self.process,
            mri_prefix="PMAC",
            config_dir=self.config_dir.value,
        )
        # These are the motors we are interested in
        self.child_x = self.process.get_controller("BL45P-ML-STAGE-01:X")
        self.child_y = self.process.get_controller("BL45P-ML-STAGE-01:Y")
        self.child_cs1 = self.process.get_controller("PMAC:CS1")
        # CS1 needs to have the right port otherwise we will error
        self.set_attributes(self.child_cs1, port="CS1")

        # Make the child block holding panda and pmac mri
        self.child = self.create_child_block(
            panda_seq_trigger_block,
            self.process,
            mri="SCAN:PCOMP",
            panda="PANDA",
            pmac="PMAC",
        )

        # And our part under test
        self.o = PandASeqTriggerPart("pcomp", "SCAN:PCOMP")

        # Now start the process off and tell the panda which sequencer tables
        # to use
        self.process.start()
        exports = ExportTable.from_rows([
            ("SEQ1.table", "seqTableA"),
            ("SEQ2.table", "seqTableB"),
            ("SRGATE1.forceSet", "seqSetEnable"),
            ("SRGATE1.forceReset", "seqReset"),
        ])
        self.panda.set_exports(exports)
示例#13
0
 def setUp(self):
     self.p = Process("proc")
     c = BasicController("mri")
     c.add_part(HelloPart(name='block'))
     self.p.add_controller(c)
     self.p.start()