From b1a0334648f21a184bab27d73bbf0a2476b91046 Mon Sep 17 00:00:00 2001 From: Bernhard Arnold Date: Wed, 3 Dec 2025 16:41:54 +0100 Subject: [PATCH 1/5] added driver initialize mixin --- src/comet/driver/generic/__init__.py | 2 ++ src/comet/driver/generic/instrument.py | 16 ++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/comet/driver/generic/__init__.py b/src/comet/driver/generic/__init__.py index b8b8ff0..e102df0 100644 --- a/src/comet/driver/generic/__init__.py +++ b/src/comet/driver/generic/__init__.py @@ -1,4 +1,5 @@ from .instrument import ( + InitializeMixin, BeeperMixin, ErrorQueueMixin, RouteTerminalMixin, @@ -18,6 +19,7 @@ from .oscilloscope import Oscilloscope, OscilloscopeChannel __all__ = [ + "InitializeMixin", "BeeperMixin", "ErrorQueueMixin", "RouteTerminalMixin", diff --git a/src/comet/driver/generic/instrument.py b/src/comet/driver/generic/instrument.py index b5b4b1e..ade6427 100644 --- a/src/comet/driver/generic/instrument.py +++ b/src/comet/driver/generic/instrument.py @@ -1,14 +1,16 @@ from abc import ABC, abstractmethod -from typing import Optional +from typing import Any, Mapping, Optional from ..driver import Driver __all__ = [ "InstrumentError", + "InitializeMixin", "IdentifyMixin", "ResetMixin", "ClearMixin", "ErrorQueueMixin", + "ConfigureMixin", "BeeperMixin", "RouteTerminalMixin", "Instrument", @@ -16,7 +18,6 @@ class InstrumentError: - def __init__(self, code: int, message: str) -> None: self.code: int = code self.message: str = message @@ -26,32 +27,32 @@ def __repr__(self) -> str: return f"{cls_name}({self.code}, {self.message!r})" -class IdentifyMixin(ABC): +class InitializeMixin(ABC): + @abstractmethod + def initialize(self) -> None: ... + +class IdentifyMixin(ABC): @abstractmethod def identify(self) -> str: ... class ResetMixin(ABC): - @abstractmethod def reset(self) -> None: ... class ClearMixin(ABC): - @abstractmethod def clear(self) -> None: ... class ErrorQueueMixin(ABC): - @abstractmethod def next_error(self) -> Optional[InstrumentError]: ... class BeeperMixin(ABC): - BEEPER_ON: bool = True BEEPER_OFF: bool = False @@ -65,7 +66,6 @@ def beeper(self, value: bool) -> None: ... class RouteTerminalMixin(ABC): - ROUTE_TERMINAL_FRONT: str = "front" ROUTE_TERMINAL_REAR: str = "rear" From 1506353a7db808ae8ce7b3607f17a11857042ce6 Mon Sep 17 00:00:00 2001 From: Bernhard Arnold Date: Wed, 3 Dec 2025 16:47:56 +0100 Subject: [PATCH 2/5] typo --- src/comet/driver/generic/instrument.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/comet/driver/generic/instrument.py b/src/comet/driver/generic/instrument.py index ade6427..db83133 100644 --- a/src/comet/driver/generic/instrument.py +++ b/src/comet/driver/generic/instrument.py @@ -10,7 +10,6 @@ "ResetMixin", "ClearMixin", "ErrorQueueMixin", - "ConfigureMixin", "BeeperMixin", "RouteTerminalMixin", "Instrument", From cefc1e3dfdf6aa682d0d6d57e7457f34f99901e8 Mon Sep 17 00:00:00 2001 From: Bernhard Arnold Date: Wed, 3 Dec 2025 17:06:24 +0100 Subject: [PATCH 3/5] refs #101 implemented initialize for CorvusTT --- src/comet/driver/itk/corvustt.py | 17 ++++++++++++++-- tests/test_driver_itk_corvustt.py | 34 +++++++++++++++++-------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/comet/driver/itk/corvustt.py b/src/comet/driver/itk/corvustt.py index b9e98d8..6838caf 100644 --- a/src/comet/driver/itk/corvustt.py +++ b/src/comet/driver/itk/corvustt.py @@ -65,9 +65,20 @@ def is_moving(self) -> bool: return bool(int(result) & 0x1) -class CorvusTT(MotionController): +class CorvusTT(InitializeMixin, MotionController): + AXES: list[int] = [1, 2, 3] + + def initialize(self) -> None: + # Force host mode + self.resource.write("0 mode") + # Clear clogged control characters from internal buffer. + self.resource.query("version") + def identify(self) -> str: - return self.resource.query("identify").strip() + identity = self.resource.query("identify").strip() + version = self.resource.query("version").strip() + serialno = self.resource.query("getserialno").strip() + return f"{identity} {version} {serialno}" def reset(self) -> None: ... @@ -78,6 +89,8 @@ def next_error(self) -> Optional[InstrumentError]: return parse_error(response) def __getitem__(self, index: int) -> CorvusAxis: + if index not in type(self).AXES: + raise IndexError(index) return CorvusAxis(self.resource, index) def calibrate(self) -> None: diff --git a/tests/test_driver_itk_corvustt.py b/tests/test_driver_itk_corvustt.py index 7829333..aae4b7a 100644 --- a/tests/test_driver_itk_corvustt.py +++ b/tests/test_driver_itk_corvustt.py @@ -11,9 +11,13 @@ def driver(resource): def test_corvus(driver, resource): - resource.buffer = ["Corvus 1 312 1 10F"] - assert driver.identify() == "Corvus 1 312 1 10F" - assert resource.buffer == ["identify"] + resource.buffer = ["\t\0331.0"] # terminal buffer control characters + assert driver.initialize() == "\t\0331.0" + assert resource.buffer == ["0 mode", "version"] + + resource.buffer = ["Corvus 1 312 1 10F", "1.0", "123456789"] + assert driver.identify() == "Corvus 1 312 1 10F 1.0 123456789" + assert resource.buffer == ["identify", "version", "getserialno"] resource.buffer = [] assert driver.calibrate() is None @@ -74,29 +78,29 @@ def test_corvus(driver, resource): def test_corvus_axes(driver, resource): resource.buffer = [] - assert driver[0].calibrate() is None - assert resource.buffer == ["0 ncal"] + assert driver[1].calibrate() is None + assert resource.buffer == ["1 ncal"] resource.buffer = [] - assert driver[1].range_measure() is None - assert resource.buffer == ["1 nrm"] + assert driver[2].range_measure() is None + assert resource.buffer == ["2 nrm"] resource.buffer = [] - assert driver[2].move_absolute(2.4) is None - assert resource.buffer == ["2.400 2 nmove"] + assert driver[3].move_absolute(2.4) is None + assert resource.buffer == ["2.400 3 nmove"] resource.buffer = [] - assert driver[0].move_relative(1.2) is None - assert resource.buffer == ["1.200 0 nrmove"] + assert driver[1].move_relative(1.2) is None + assert resource.buffer == ["1.200 1 nrmove"] resource.buffer = ["4.200"] - assert driver[1].position == 4.2 - assert resource.buffer == ["1 npos"] + assert driver[2].position == 4.2 + assert resource.buffer == ["2 npos"] resource.buffer = ["3"] - assert driver[2].is_moving + assert driver[3].is_moving assert resource.buffer == ["status"] resource.buffer = ["2"] - assert not driver[0].is_moving + assert not driver[1].is_moving assert resource.buffer == ["status"] From 2228db11226c12770e6fc91492b12b860967392f Mon Sep 17 00:00:00 2001 From: Bernhard Arnold Date: Wed, 3 Dec 2025 17:43:48 +0100 Subject: [PATCH 4/5] refs #101 fixed import --- src/comet/driver/itk/corvustt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/comet/driver/itk/corvustt.py b/src/comet/driver/itk/corvustt.py index 6838caf..661c486 100644 --- a/src/comet/driver/itk/corvustt.py +++ b/src/comet/driver/itk/corvustt.py @@ -1,6 +1,6 @@ from typing import Optional -from comet.driver.generic import InstrumentError +from comet.driver.generic import InstrumentError, InitializeMixin from comet.driver.generic.motion_controller import ( Position, MotionControllerAxis, From 0c90da0caecd5249a155212bc220c77ab24fa6d6 Mon Sep 17 00:00:00 2001 From: Bernhard Arnold Date: Wed, 3 Dec 2025 17:48:54 +0100 Subject: [PATCH 5/5] refs #101 fixed test --- tests/test_driver_itk_corvustt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_driver_itk_corvustt.py b/tests/test_driver_itk_corvustt.py index aae4b7a..5b150bc 100644 --- a/tests/test_driver_itk_corvustt.py +++ b/tests/test_driver_itk_corvustt.py @@ -11,8 +11,8 @@ def driver(resource): def test_corvus(driver, resource): - resource.buffer = ["\t\0331.0"] # terminal buffer control characters - assert driver.initialize() == "\t\0331.0" + resource.buffer = ["\t\x1b1.0"] # terminal buffer control characters + assert driver.initialize() is None assert resource.buffer == ["0 mode", "version"] resource.buffer = ["Corvus 1 312 1 10F", "1.0", "123456789"]