-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #75 from prakhub/patch-1
Add driver for Photonic F3000 LED light source.
- Loading branch information
Showing
8 changed files
with
237 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,3 +13,4 @@ | |
MotionController, | ||
MotionControllerAxis, | ||
) | ||
from .light_source import LightSource |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: ... |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from .f3000 import F3000 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |