This commit updates the branch to use Thing._class_settings instead of FEATURE_FLAGS for a safer way to implement new features.
61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
"""A module to handle the illumination in LabThings."""
|
|
|
|
import time
|
|
from typing import Literal
|
|
|
|
import labthings_fastapi as lt
|
|
|
|
from .camera.simulation import SimulatedCamera
|
|
from .stage.sangaboard import SangaboardThing
|
|
|
|
|
|
class Illumination(lt.Thing):
|
|
"""Base class for an illumination controller."""
|
|
|
|
_class_settings = {"validate_properties_on_set": True}
|
|
|
|
@lt.action
|
|
def set_led(self, led_on: bool = True) -> None:
|
|
"""Set the LED to on or off."""
|
|
raise NotImplementedError(
|
|
"Turning the LED on and off should be implemented by child classes."
|
|
)
|
|
|
|
@lt.action
|
|
def flash(self, number_of_flashes: int = 10, dt: float = 0.5) -> None:
|
|
"""Flash the illumination source.
|
|
|
|
:param number_of_flashes: Number of times to flash the LED.
|
|
:param dt: Flash duration in seconds.
|
|
"""
|
|
for _ in range(number_of_flashes):
|
|
self.set_led(False)
|
|
time.sleep(dt)
|
|
self.set_led(True)
|
|
time.sleep(dt)
|
|
|
|
|
|
class SangaIllumination(Illumination):
|
|
"""Illumination driven by a Sangaboard."""
|
|
|
|
_stage: SangaboardThing = lt.thing_slot()
|
|
|
|
@lt.action
|
|
def set_led(
|
|
self,
|
|
led_on: bool = True,
|
|
led_channel: Literal["cc"] = "cc",
|
|
) -> None:
|
|
"""Set the LED to on or off."""
|
|
self._stage.set_led(led_on, led_channel)
|
|
|
|
|
|
class SimulatorIllumination(Illumination):
|
|
"""Illumination control in the simulator."""
|
|
|
|
_cam: SimulatedCamera = lt.thing_slot()
|
|
|
|
@lt.action
|
|
def set_led(self, led_on: bool = True) -> None:
|
|
"""Set the LED to on or off."""
|
|
self._cam.set_led(led_on)
|