Skip to content

Commit

Permalink
Merge pull request #75 from prakhub/patch-1
Browse files Browse the repository at this point in the history
Add driver for Photonic F3000 LED light source.
  • Loading branch information
arnobaer authored Jul 26, 2024
2 parents 82b7a92 + 78a8414 commit bf0fa70
Show file tree
Hide file tree
Showing 8 changed files with 237 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/comet/driver/generic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@
MotionController,
MotionControllerAxis,
)
from .light_source import LightSource
27 changes: 27 additions & 0 deletions src/comet/driver/generic/light_source.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from abc import abstractmethod

from ..driver import Driver

__all__ = ["LightSource"]


class LightSource(Driver):

@property
@abstractmethod
def brightness(self) -> int: ...

@brightness.setter
@abstractmethod
def brightness(self, brightness: int) -> None: ...

@property
@abstractmethod
def light_enabled(self) -> bool: ...

@light_enabled.setter
@abstractmethod
def light_enabled(self, light_enabled: bool) -> None: ...

@abstractmethod
def identify(self) -> str: ...
1 change: 1 addition & 0 deletions src/comet/driver/photonic/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .f3000 import F3000
65 changes: 65 additions & 0 deletions src/comet/driver/photonic/f3000.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from comet.driver.generic.light_source import LightSource

__all__ = ["F3000"]


class F3000(LightSource):
"""Class for controlling Photonics F3000 LED light sources"""

@property
def brightness(self) -> int:
"""Returns current brightness of light source
(0-100 percent)
Returns:
int . Brightness of light source in percent
"""

self.resource.write("B?")
response = self.resource.read()

return int(response.replace("B", ""))

@brightness.setter
def brightness(self, brightness: int):
"""Set brightness of light source in percent
Args:
brightness (int): Brightness to set in percent
"""
brightness = max(0, min(100, brightness))

self.resource.write(f"B{brightness}")
self.resource.read()

@property
def light_enabled(self) -> bool:
"""Get current state of shutter (light source)
Returns:
str: State of light source (1 on, 0 off)
"""

self.resource.write("S?")
response = self.resource.read().replace("S", "")

return int(response) == 0

@light_enabled.setter
def light_enabled(self, light_enabled: bool):
"""Turn on / off shutter (light source)
Args:
light_enabled (bool): Enable / Disable light source
"""
if light_enabled:
self.resource.write("S0")
else:
self.resource.write("S1")

self.resource.read()

def identify(self):
"""Acquire identification string"""
self.resource.write("V?")
return self.resource.read()
Empty file.
41 changes: 41 additions & 0 deletions src/comet/emulator/photonic/f3000.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""Photonic F3000 LED light source emulator"""

from comet.emulator import Emulator
from comet.emulator import message, run

__all__ = ["F3000Emulator"]


class F3000Emulator(Emulator):
IDENTITY: str = "F3000 v2.09, Emulator"

def __init__(self) -> None:
super().__init__()

self.current_brightness: int = 50
self.light_enabled: bool = False

@message(r"^V\?$")
def get_version(self) -> str:
return self.IDENTITY

@message(r"^B(\d{1,3})$")
def set_brightness(self, brightness: int) -> None:
brightness = max(0, min(int(brightness), 100))
self.current_brightness = int(brightness)

@message(r"^B\?$")
def get_brightness(self) -> str:
return "B" + str(self.current_brightness)

@message(r"^S\?$")
def get_light_enabled(self) -> str:
return "S0" if self.light_enabled else "S1"

@message(r"^S(0|1)$")
def set_light_enabled(self, light_enabled: str) -> None:
self.light_enabled = not bool(int(light_enabled))


if __name__ == "__main__":
run(F3000Emulator())
60 changes: 60 additions & 0 deletions tests/test_driver_photonic_f3000.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import pytest

from comet.driver.photonic import F3000

from .test_driver import resource


@pytest.fixture
def driver(resource):
return F3000(resource)


def test_identify(driver, resource):
resource.buffer = ["F3000 v2.09, Emulator"]
assert driver.identify() == "F3000 v2.09, Emulator"
assert resource.buffer == ["V?"]


def test_read_brightness(driver, resource):
resource.buffer = ["B50"]
assert driver.brightness == 50
assert resource.buffer == ["B?"]


def test_set_brightness(driver, resource):
resource.buffer = [""]
driver.brightness = 0
assert resource.buffer == ["B0"]

resource.buffer = [""]
driver.brightness = 50
assert resource.buffer == ["B50"]

resource.buffer = [""]
driver.brightness = 100
assert resource.buffer == ["B100"]

resource.buffer = [""]
driver.brightness = 101
assert resource.buffer == ["B100"]


def test_read_light_enabled(driver, resource):
resource.buffer = ["S1"]
assert driver.light_enabled == 0
assert resource.buffer == ["S?"]

resource.buffer = ["S0"]
assert driver.light_enabled == 1
assert resource.buffer == ["S?"]


def test_set_light_enabled(driver, resource):
resource.buffer = [""]
driver.light_enabled = True
assert resource.buffer == ["S0"]

resource.buffer = [""]
driver.light_enabled = False
assert resource.buffer == ["S1"]
42 changes: 42 additions & 0 deletions tests/test_emulator_photonic_f3000.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import pytest

from comet.emulator.photonic.f3000 import F3000Emulator


@pytest.fixture
def emulator():
return F3000Emulator()


def test_identify(emulator):
assert emulator("V?") == "F3000 v2.09, Emulator"


def test_read_brightness(emulator):
assert emulator("B?") == "B50"


def test_set_brightness(emulator):
assert emulator("B0") == None
assert emulator("B?") == "B0"

assert emulator("B50") == None
assert emulator("B?") == "B50"

assert emulator("B100") == None
assert emulator("B?") == "B100"

assert emulator("B101") == None
assert emulator("B?") == "B100"


def test_read_light_enabled(emulator):
assert emulator("S?") == "S1"


def test_set_light_enabled(emulator):
assert emulator("S1") == None
assert emulator("S?") == "S1"

assert emulator("S0") == None
assert emulator("S?") == "S0"

0 comments on commit bf0fa70

Please sign in to comment.