Source code for device.interfer_motors
from . import base
[docs]
class InterferometryMotors(base.ArduinoMotorsBase):
def __init__(self, calibfile, buses=None, limits_enabled=True, **kwargs):
super().__init__(calibfile, buses, limits_enabled, **kwargs)
self._relay_on = {"1": False, "2": False}
# ==== Inherited abstract methods ====
def _defaultstate(self):
speed = 450
accel = 200
for a in self._ardu.values():
a.write("s{:d}".format(speed).encode("ascii"))
a.readline()
a.write("a{:d}".format(accel).encode("ascii"))
a.readline()
self._relay_on = {"1": False, "2": False}
# self._update_relay_states() # Unnecessary: both are off after reset
# self._homed = True # TODO Just temporary, homing does not work well
def _disconnect(self):
self.relay1_off()
self.relay2_off()
super()._disconnect()
# ==== Private commands ====
@base.idle_command
def _update_relay_states(self):
self._ardu["R"].write(b"q")
# Wait for correct response (skip through old responses)
while True:
resp = self._read_serial("R")
if resp == "":
raise base.TransmissionError("Expected a response (action 'q')")
elif resp.startswith("Rele 1 :"):
resp = [resp, self._read_serial("R")]
break
for i in range(2):
self._relay_on[str(i+1)] = resp[i][len("Rele 1 :"):] == "0"
@base.base_command
def _toggle_relay(self, which):
self._ardu["R"].write({"1": b"r", "2": b"t"}[which]) # Toggle relay 1/2 state
if self._read_serial("R") == "":
raise base.TransmissionError("Expected a response (action 'r'/'t')")
self._relay_on[which] = not self._relay_on[which]
# ==== Commands ====
[docs]
def is_relay1_on(self):
"""Return the state of the relay."""
self._update_relay_states()
return self._relay_on["1"]
[docs]
def is_relay2_on(self):
"""Return the state of the relay."""
self._update_relay_states()
return self._relay_on["2"]
[docs]
@base.base_command
def relay1_on(self):
"""Activate relay 1."""
if not self.is_relay1_on():
self._toggle_relay("1")
[docs]
@base.base_command
def relay2_on(self):
"""Activate relay 2."""
if not self.is_relay2_on():
self._toggle_relay("2")
[docs]
@base.base_command
def relay1_off(self):
"""Deactivate relay 1."""
if self.is_relay1_on():
self._toggle_relay("1")
[docs]
@base.base_command
def relay2_off(self):
"""Deactivate relay 2."""
if self.is_relay2_on():
self._toggle_relay("2")
[docs]
@base.compound_command
def anetenna_moveto(self, position):
"""Move ANTENNA to position [mm]."""
self.moveto("R", position)
[docs]
@base.compound_command
def object_moveto(self, position):
"""Move OBJECT (e.g. glass) to position [mm]."""
self.moveto("L", position)
# ==== Related to DeviceClient ====
[docs]
def update_frontend(self, device_client):
for key, name in [("L", "Object"), ("R", "Antenna")]:
self._idleupdate_position(key)
value = self._position[key]
device_client.emit("value", {
"value": value,
"formatted": "{:.2f} mm".format(value),
"label": name,
"min": min(self.limits(key)),
"max": max(self.limits(key)),
"id": "position_" + key
})