from annotypes import Anno
from malcolm.modules import ADCore, ADPandABlocks, builtin, pandablocks, scanning
from ..parts.pandadatasetbussespart import PandADatasetBussesPart
with Anno("Prefix for areaDetector records"):
APrefix = str
# Re-export the things we are reusing from pandablocks
AMri = pandablocks.controllers.AMri
AConfigDir = pandablocks.controllers.AConfigDir
AHostname = pandablocks.controllers.AHostname
APort = pandablocks.controllers.APort
APollPeriod = pandablocks.controllers.APollPeriod
ATemplateDesigns = pandablocks.controllers.ATemplateDesigns
AInitialDesign = pandablocks.controllers.AInitialDesign
ADescription = pandablocks.controllers.ADescription
class PandAStatefulBlockController(
pandablocks.controllers.pandablockcontroller.PandABlockController,
builtin.controllers.StatefulController,
):
pass
[docs]class PandARunnableController(
pandablocks.controllers.PandAManagerController,
scanning.controllers.RunnableController,
):
def __init__(
self,
mri: AMri,
config_dir: AConfigDir,
prefix: APrefix,
hostname: AHostname = "localhost",
port: APort = 8888,
poll_period: APollPeriod = 0.1,
template_designs: ATemplateDesigns = "",
initial_design: AInitialDesign = "",
description: ADescription = "",
) -> None:
super().__init__(
mri=mri,
config_dir=config_dir,
hostname=hostname,
port=port,
poll_period=poll_period,
template_designs=template_designs,
initial_design=initial_design,
description=description,
)
self.prefix = prefix
def _make_busses(self) -> PandADatasetBussesPart:
return PandADatasetBussesPart("busses", self._client)
def _make_child_block(self, block_name, block_data):
if block_name == "PCAP":
controller = PandAStatefulBlockController(
self._client, self.mri, block_name, block_data, self._doc_url_base
)
# Add the areaDetector control parts
_, ps = ADPandABlocks.includes.panda_adbase_parts(prefix=self.prefix)
for p in ps:
controller.add_part(p)
child_part = ADCore.parts.DetectorDriverPart(
name=block_name, mri=controller.mri, main_dataset_useful=False
)
return controller, child_part
else:
return super()._make_child_block(block_name, block_data)