Source code for malcolm.modules.scanning.parts.simultaneousaxespart

from typing import Sequence, Union

from annotypes import Anno, Array, add_call_types

from malcolm.core import (
    APartName,
    Part,
    PartRegistrar,
    StringArrayMeta,
    Widget,
    config_tag,
)

from ..hooks import AAxesToMove, ValidateHook

with Anno("Initial value for set of axes that can be moved at the same time"):
    ASimultaneousAxes = Union[Array[str]]
USimultaneousAxes = Union[ASimultaneousAxes, Sequence[str], str]


[docs]class SimultaneousAxesPart(Part): def __init__( self, name: APartName = "simultaneousAxes", value: USimultaneousAxes = None ) -> None: super().__init__(name) self.attr = StringArrayMeta( "Set of axes that can be specified in axesToMove at configure", tags=[Widget.TEXTINPUT.tag(), config_tag()], ).create_attribute_model(value) # This will be serialized, so maintain camelCase for axesToMove # noinspection PyPep8Naming
[docs] @add_call_types def on_validate(self, axesToMove: AAxesToMove) -> None: assert not set(axesToMove) - set( self.attr.value ), "Can only move %s simultaneously, requested %s" % ( list(self.attr.value), axesToMove, )
def setup(self, registrar: PartRegistrar) -> None: registrar.add_attribute_model( "simultaneousAxes", self.attr, self.attr.set_value ) # Hooks registrar.hook(ValidateHook, self.on_validate)