Source code for ophyd_async.epics.advimba._vimba_controller

import asyncio

from ophyd_async.core import (
    DetectorTrigger,
    TriggerInfo,
)
from ophyd_async.epics import adcore

from ._vimba_io import VimbaDriverIO, VimbaExposeOutMode, VimbaOnOff, VimbaTriggerSource

TRIGGER_MODE = {
    DetectorTrigger.INTERNAL: VimbaOnOff.OFF,
    DetectorTrigger.CONSTANT_GATE: VimbaOnOff.ON,
    DetectorTrigger.VARIABLE_GATE: VimbaOnOff.ON,
    DetectorTrigger.EDGE_TRIGGER: VimbaOnOff.ON,
}

EXPOSE_OUT_MODE = {
    DetectorTrigger.INTERNAL: VimbaExposeOutMode.TIMED,
    DetectorTrigger.CONSTANT_GATE: VimbaExposeOutMode.TRIGGER_WIDTH,
    DetectorTrigger.VARIABLE_GATE: VimbaExposeOutMode.TRIGGER_WIDTH,
    DetectorTrigger.EDGE_TRIGGER: VimbaExposeOutMode.TIMED,
}


[docs] class VimbaController(adcore.ADBaseController[VimbaDriverIO]): """Controller for the Vimba detector.""" def __init__( self, driver: VimbaDriverIO, good_states: frozenset[adcore.ADState] = adcore.DEFAULT_GOOD_STATES, ) -> None: super().__init__(driver, good_states=good_states)
[docs] def get_deadtime(self, exposure: float | None) -> float: return 0.001
[docs] async def prepare(self, trigger_info: TriggerInfo): await asyncio.gather( self.driver.trigger_mode.set(TRIGGER_MODE[trigger_info.trigger]), self.driver.exposure_mode.set(EXPOSE_OUT_MODE[trigger_info.trigger]), self.driver.num_images.set(trigger_info.total_number_of_triggers), self.driver.image_mode.set(adcore.ADImageMode.MULTIPLE), ) if trigger_info.livetime is not None and trigger_info.trigger not in [ DetectorTrigger.VARIABLE_GATE, DetectorTrigger.CONSTANT_GATE, ]: await self.driver.acquire_time.set(trigger_info.livetime) if trigger_info.trigger != DetectorTrigger.INTERNAL: self.driver.trigger_source.set(VimbaTriggerSource.LINE1) else: self.driver.trigger_source.set(VimbaTriggerSource.FREERUN)