Skip to content

Commit 3f8c043

Browse files
has-transformed-position (#17)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 4a54b72 commit 3f8c043

1 file changed

Lines changed: 93 additions & 0 deletions

File tree

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
__all__ = ["HasTransformedPosition"]
2+
3+
4+
import pathlib
5+
from typing import Dict, Any, Optional, List
6+
7+
from yaqd_core import HasLimits, HasPosition, IsDaemon
8+
9+
10+
class HasTransformedPosition(HasLimits, HasPosition, IsDaemon):
11+
def __init__(
12+
self, name: str, config: Dict[str, Any], config_filepath: pathlib.Path
13+
):
14+
super().__init__(name, config, config_filepath)
15+
self._native_units = None
16+
17+
# --- conversion of coordinates ---------------------------------------------------------------
18+
19+
def to_native(self, transformed_position):
20+
relative = self._transformed_to_relative(transformed_position)
21+
return relative + self._state["native_reference_position"]
22+
23+
def to_transformed(self, native_position):
24+
relative = native_position - self._state["native_reference_position"]
25+
return self._relative_to_transformed(self, relative)
26+
27+
def _relative_to_transformed(self, relative_position):
28+
"""convert a relative coordinate to a transformed coordinate.
29+
Relative coordinates differ from natural coordinates in that the null position has been subtracted.
30+
(i.e. in relative coordinates reference position is zero).
31+
32+
This placeholder function has trivial behavior, f(x) = x.
33+
Daemons that need more than a reference_position should overload this method.
34+
Note that overloads should still obey inversion:
35+
```
36+
_relative_to_transformed(_transformed_to_relative(x)) == x
37+
```.
38+
"""
39+
return relative_position
40+
41+
def _transformed_to_relative(self, transformed_position):
42+
"""convert a transformed coordinate to a relative coordinate
43+
Relative coordinates differ from natural coordinates in that the null position has been subtracted.
44+
(i.e. in relative coordinates reference position is zero).
45+
46+
This placeholder function has trivial behavior, f(x) = x.
47+
Daemons that need more than a reference_position should overload this method.
48+
Note that overloads should still obey inversion:
49+
```
50+
_relative_to_transformed(_transformed_to_relative(x)) == x
51+
```.
52+
"""
53+
return transformed_position
54+
55+
# --- methods for transformed positions -------------------------------------------------------
56+
57+
def set_position(self, position: float) -> None:
58+
super().set_position(self.to_native(position))
59+
60+
def get_position(self) -> float:
61+
return self.to_transformed(self._state["position"])
62+
63+
def get_destination(self) -> float:
64+
return self.to_transformed(self._state["destination"])
65+
66+
def in_limits(self, position: float) -> bool:
67+
return super().in_limits(self.to_native(position))
68+
69+
def get_limits(self) -> List[float]:
70+
return [self.to_transformed(lim) for lim in super().get_limits()]
71+
72+
# --- native properties -----------------------------------------------------------------------
73+
74+
def get_native_reference(self) -> float:
75+
return self._state["native_reference_position"]
76+
77+
def set_native_reference(self, native_position):
78+
self._state["native_reference_position"] = native_position
79+
80+
def set_native_position(self, native_position):
81+
super().set_position(native_position)
82+
83+
def get_native_position(self) -> float:
84+
return self._state["position"]
85+
86+
def get_native_destination(self) -> float:
87+
return self._state["destination"]
88+
89+
def get_native_limits(self) -> List[float]:
90+
return super().get_limits()
91+
92+
def get_native_units(self) -> Optional[str]:
93+
return self._native_units

0 commit comments

Comments
 (0)