Skip to content

Commit

Permalink
devices/thorlabs_tcube: fix more style issues
Browse files Browse the repository at this point in the history
sbourdeauducq committed Nov 24, 2015
1 parent 76eadc0 commit bda1114
Showing 1 changed file with 17 additions and 84 deletions.
101 changes: 17 additions & 84 deletions artiq/devices/thorlabs_tcube/driver.py
Original file line number Diff line number Diff line change
@@ -186,7 +186,7 @@ def data_size(self):
raise ValueError


class Tcube:
class _Tcube:
def __init__(self, serial_dev):
self.port = serial.serial_for_url(serial_dev, baudrate=115200,
rtscts=True)
@@ -202,16 +202,15 @@ def send(self, msg):
msg.send(self.port)

def handle_message(self, msg):
pass
# derived classes must implement this
raise NotImplementedError

def send_request(self, msgreq_id, wait_for_msgs, param1=0, param2=0, data=None):
Message(msgreq_id, param1, param2, data=data).send(self.port)
msg = msg_id = None
while msg is None or msg_id not in wait_for_msgs:
msg = None
while msg is None or msg.id not in wait_for_msgs:
msg = Message.recv(self.port)
self.handle_message(msg)
msg_id = msg.id

return msg

def set_channel_enable_state(self, activated):
@@ -238,7 +237,7 @@ def get_channel_enable_state(self):
self.chan_enabled = False
else:
raise MsgError("Channel state response is invalid: neither "
+ "1 nor 2: {}".format(self.chan_enabled))
"1 nor 2: {}".format(self.chan_enabled))
return self.chan_enabled

def module_identify(self):
@@ -247,7 +246,6 @@ def module_identify(self):
Instruct hardware unit to identify itself by flashing its front panel
led.
"""

self.send(Message(MGMSG.MOD_IDENTIFY))

def hardware_start_update_messages(self, update_rate):
@@ -258,13 +256,10 @@ def hardware_start_update_messages(self, update_rate):
:param update_rate: Rate at which you will receive status updates
"""

self.send(Message(MGMSG.HW_START_UPDATEMSGS, param1=update_rate))

def hardware_stop_update_messages(self):
"""Stop status updates from the controller.
"""

"""Stop status updates from the controller."""
self.send(Message(MGMSG.HW_STOP_UPDATEMSGS))

def hardware_request_information(self):
@@ -282,9 +277,9 @@ def ping(self):
return True


class Tpz(Tcube):
class Tpz(_Tcube):
def __init__(self, serial_dev):
Tcube.__init__(self, serial_dev)
_Tcube.__init__(self, serial_dev)
self.voltage_limit = self.get_tpz_io_settings()[0]

def handle_message(self, msg):
@@ -294,8 +289,8 @@ def handle_message(self, msg):
if msg_id == MGMSG.HW_DISCONNECT:
raise MsgError("Error: Please disconnect the TPZ001")
elif msg_id == MGMSG.HW_RESPONSE:
raise MsgError("Hardware error, please disconnect"
+ "and reconnect the TPZ001")
raise MsgError("Hardware error, please disconnect "
"and reconnect the TPZ001")
elif msg_id == MGMSG.HW_RICHRESPONSE:
(code, ) = st.unpack("<H", data[2:4])
raise MsgError("Hardware error {}: {}"
@@ -317,7 +312,6 @@ def set_position_control_mode(self, control_mode):
0x04 for Closed Loop Smooth.
"""

self.send(Message(MGMSG.PZ_SET_POSCONTROLMODE, param1=1,
param2=control_mode))

@@ -336,7 +330,6 @@ def get_position_control_mode(self):
:rtype: int
"""

get_msg = self.send_request(MGMSG.PZ_REQ_POSCONTROLMODE,
[MGMSG.PZ_GET_POSCONTROLMODE], 1)
return get_msg.param2
@@ -354,7 +347,6 @@ def set_output_volts(self, voltage):
<artiq.devices.thorlabs.driver.Tpz.set_tpz_io_settings>` method
between the three values 75 V, 100 V and 150 V.
"""

if voltage < 0 or voltage > self.voltage_limit:
raise ValueError("Voltage must be in range [0;{}]"
.format(self.voltage_limit))
@@ -368,7 +360,6 @@ def get_output_volts(self):
:return: The output voltage.
:rtype: float
"""

get_msg = self.send_request(MGMSG.PZ_REQ_OUTPUTVOLTS,
[MGMSG.PZ_GET_OUTPUTVOLTS], 1)
return st.unpack("<H", get_msg.data[2:])[0]*self.voltage_limit/32767
@@ -385,7 +376,6 @@ def set_output_position(self, position_sw):
[0; 65535] depending on the unit. This corresponds to 0 to 100% of
the maximum piezo extension.
"""

payload = st.pack("<HH", 1, position_sw)
self.send(Message(MGMSG.PZ_SET_OUTPUTPOS, data=payload))

@@ -396,7 +386,6 @@ def get_output_position(self):
position.
:rtype: int
"""

get_msg = self.send_request(MGMSG.PZ_REQ_OUTPUTPOS,
[MGMSG.PZ_GET_OUTPUTPOS], 1)
return st.unpack("<H", get_msg.data[2:])[0]
@@ -424,7 +413,6 @@ def set_input_volts_source(self, volt_src):
The values can be bitwise or'ed to sum the software source with
either or both of the other source options.
"""

payload = st.pack("<HH", 1, volt_src)
self.send(Message(MGMSG.PZ_SET_INPUTVOLTSSRC, data=payload))

@@ -438,7 +426,6 @@ def get_input_volts_source(self):
docstring for meaning of bits.
:rtype: int
"""

get_msg = self.send_request(MGMSG.PZ_REQ_INPUTVOLTSSRC,
[MGMSG.PZ_GET_INPUTVOLTSSRC], 1)
return st.unpack("<H", get_msg.data[2:])[0]
@@ -456,7 +443,6 @@ def set_pi_constants(self, prop_const, int_const):
:param prop_const: Value of the proportional term in range [0; 255].
:param int_const: Value of the integral term in range [0; 255].
"""

payload = st.pack("<HHH", 1, prop_const, int_const)
self.send(Message(MGMSG.PZ_SET_PICONSTS, data=payload))

@@ -467,7 +453,6 @@ def get_pi_constants(self):
term and the second element is the integral term.
:rtype: a 2 int elements tuple : (int, int)
"""

get_msg = self.send_request(MGMSG.PZ_REQ_PICONSTS,
[MGMSG.PZ_GET_PICONSTS], 1)
return st.unpack("<HH", get_msg.data[2:])
@@ -512,7 +497,6 @@ def set_output_lut(self, lut_index, output):
:py:meth:`set_tpz_io_settings
<artiq.devices.thorlabs.driver.Tpz.set_tpz_io_settings>` method.
"""

volt = round(output*32767/self.voltage_limit)
payload = st.pack("<HHH", 1, lut_index, volt)
self.send(Message(MGMSG.PZ_SET_OUTPUTLUT, data=payload))
@@ -524,10 +508,9 @@ def get_output_lut(self):
the voltage output value.
:rtype: a 2 elements tuple (int, float)
"""

get_msg = self.send_request(MGMSG.PZ_REQ_OUTPUTLUT,
[MGMSG.PZ_GET_OUTPUTLUT], 1)
(index, output) = st.unpack("<Hh", get_msg.data[2:])
index, output = st.unpack("<Hh", get_msg.data[2:])
return index, output*self.voltage_limit/32767

def set_output_lut_parameters(self, mode, cycle_length, num_cycles,
@@ -590,7 +573,6 @@ def set_output_lut_parameters(self, mode, cycle_length, num_cycles,
and 2147483648 sample intervals. The system then outputs the last
value in the cycle until the postcycle_rest time has expired.
"""

# triggering is not supported by the TPZ device
payload = st.pack("<HHHLLLLHLH", 1, mode, cycle_length, num_cycles,
delay_time, precycle_rest, postcycle_rest,
@@ -604,21 +586,16 @@ def get_output_lut_parameters(self):
num_cycles, delay_time, precycle_rest, postcycle_rest).
:rtype: 6 int elements tuple
"""

get_msg = self.send_request(MGMSG.PZ_REQ_OUTPUTLUTPARAMS,
[MGMSG.PZ_GET_OUTPUTLUTPARAMS], 1)
return st.unpack("<HHLLLL", get_msg.data[2:22])

def start_lut_output(self):
"""Start the voltage waveform (LUT) outputs.
"""

"""Start the voltage waveform (LUT) outputs."""
self.send(Message(MGMSG.PZ_START_LUTOUTPUT, param1=1))

def stop_lut_output(self):
"""Stop the voltage waveform (LUT) outputs.
"""

"""Stop the voltage waveform (LUT) outputs."""
self.send(Message(MGMSG.PZ_STOP_LUTOUTPUT, param1=1))

def set_eeprom_parameters(self, msg_id):
@@ -627,7 +604,6 @@ def set_eeprom_parameters(self, msg_id):
:param msg_id: The message ID of the message containing the parameters
to be saved.
"""

payload = st.pack("<HH", 1, msg_id)
self.send(Message(MGMSG.PZ_SET_EEPROMPARAMS, data=payload))

@@ -637,7 +613,6 @@ def set_tpz_display_settings(self, intensity):
:param intensity: The intensity is set as a value from 0 (Off) to 255
(brightest).
"""

payload = st.pack("<H", intensity)
self.send(Message(MGMSG.PZ_SET_TPZ_DISPSETTINGS, data=payload))

@@ -647,7 +622,6 @@ def get_tpz_display_settings(self):
:return: The intensity as a value from 0 (Off) to 255 (brightest).
:rtype: int
"""

get_msg = self.send_request(MGMSG.PZ_REQ_TPZ_DISPSETTINGS,
[MGMSG.PZ_GET_TPZ_DISPSETTINGS], 1)
return st.unpack("<H", get_msg.data)[0]
@@ -682,7 +656,6 @@ def set_tpz_io_settings(self, voltage_limit, hub_analog_input):
0x03: the feedback signals run through the read panel SMA
connectors.
"""

self.voltage_limit = voltage_limit

if self.voltage_limit == 75:
@@ -706,7 +679,6 @@ def get_tpz_io_settings(self):
meaning of those parameters.
:rtype: a 2 elements tuple (int, int)
"""

get_msg = self.send_request(MGMSG.PZ_REQ_TPZ_IOSETTINGS,
[MGMSG.PZ_GET_TPZ_IOSETTINGS], 1)
voltage_limit, hub_analog_input = st.unpack("<HH", get_msg.data[2:6])
@@ -722,7 +694,7 @@ def get_tpz_io_settings(self):
return voltage_limit, hub_analog_input


class Tdc(Tcube):
class Tdc(_Tcube):
def send_status_ack(self):
self.send(Message(MGMSG.MOT_ACK_DCSTATUSUPDATE))

@@ -749,7 +721,7 @@ def handle_message(self, msg):
else:
self.status_report_counter += 1
# 'r' is a currently unused and reserved field
(self.position, self.velocity, r, self.status) = st.unpack(
self.position, self.velocity, r, self.status = st.unpack(
"<LHHL", data[2:])

def is_moving(self):
@@ -773,7 +745,6 @@ def set_pot_parameters(self, zero_wnd, vel1, wnd1, vel2, wnd2, vel3,
wnd2 to 127) to apply vel3.
:param vel4: The velocity to move when beyond wnd3.
"""

payload = st.pack("<HHLHLHLHL", 1, zero_wnd, vel1, wnd1, vel2, wnd2,
vel3, wnd3, vel4)
self.send(Message(MGMSG.MOT_SET_POTPARAMS, data=payload))
@@ -788,7 +759,6 @@ def get_pot_parameters(self):
description of each tuple element meaning.
:rtype: An 8 int tuple
"""

get_msg = self.send_request(MGMSG.MOT_REQ_POTPARAMS,
[MGMSG.MOT_GET_POTPARAMS], 1)
return st.unpack("<HLHLHLHL", get_msg.data[2:])
@@ -808,7 +778,6 @@ def set_position_counter(self, position):
:param position: The new value of the position counter.
"""

payload = st.pack("<Hl", 1, position)
self.send(Message(MGMSG.MOT_SET_POSCOUNTER, data=payload))

@@ -818,7 +787,6 @@ def get_position_counter(self):
:return: The value of the position counter.
:rtype: int
"""

get_msg = self.send_request(MGMSG.MOT_REQ_POSCOUNTER,
[MGMSG.MOT_GET_POSCOUNTER], 1)
return st.unpack("<l", get_msg.data[2:])[0]
@@ -832,7 +800,6 @@ def set_encoder_counter(self, encoder_count):
:param encoder_count: The new value of the encoder counter.
"""

payload = st.pack("<Hl", 1, encoder_count)
self.send(Message(MGMSG.MOT_SET_ENCCOUNTER, data=payload))

@@ -842,7 +809,6 @@ def get_encoder_counter(self):
:return: The value of the encoder counter.
:rtype: int
"""

get_msg = self.send_request(MGMSG.MOT_REQ_ENCCOUNTER,
[MGMSG.MOT_GET_ENCCOUNTER], 1)
return st.unpack("<l", get_msg.data[2:])[0]
@@ -853,7 +819,6 @@ def set_velocity_parameters(self, acceleration, max_velocity):
:param acceleration: The acceleration in encoder counts/sec/sec.
:param max_velocity: The maximum (final) velocity in counts/sec.
"""

payload = st.pack("<HLLL", 1, 0, acceleration, max_velocity)
self.send(Message(MGMSG.MOT_SET_VELPARAMS, data=payload))

@@ -863,7 +828,6 @@ def get_velocity_parameters(self):
:return: A 2 int tuple: (acceleration, max_velocity).
:rtype: A 2 int tuple (int, int)
"""

get_msg = self.send_request(MGMSG.MOT_REQ_VELPARAMS,
[MGMSG.MOT_GET_VELPARAMS], 1)
return st.unpack("<LL", get_msg.data[6:])
@@ -880,7 +844,6 @@ def set_jog_parameters(self, mode, step_size, acceleration,
:param stop_mode: 1 for immediate (abrupt) stop, 2 for profiled stop
(with controlled deceleration).
"""

payload = st.pack("<HHLLLLH", 1, mode, step_size, 0, acceleration,
max_velocity, stop_mode)
self.send(Message(MGMSG.MOT_SET_JOGPARAMS, data=payload))
@@ -892,7 +855,6 @@ def get_jog_parameters(self):
step_size, acceleration, max_velocity, stop_mode
:rtype: A 5 int tuple.
"""

get_msg = self.send_request(MGMSG.MOT_REQ_JOGPARAMS,
[MGMSG.MOT_GET_JOGPARAMS], 1)
(jog_mode, step_size, _, acceleration, max_velocity,
@@ -905,7 +867,6 @@ def set_gen_move_parameters(self, backlash_distance):
:param backlash_distance: The value of the backlash distance,
which specifies the relative distance in position counts.
"""

payload = st.pack("<Hl", 1, backlash_distance)
self.send(Message(MGMSG.MOT_SET_GENMOVEPARAMS, data=payload))

@@ -915,7 +876,6 @@ def get_gen_move_parameters(self):
:return: The value of the backlash distance.
:rtype: int
"""

get_msg = self.send_request(MGMSG.MOT_REQ_GENMOVEPARAMS,
[MGMSG.MOT_GET_GENMOVEPARAMS], 1)
return st.unpack("<l", get_msg.data[2:])[0]
@@ -927,7 +887,6 @@ def set_move_relative_parameters(self, relative_distance):
integer that specifies the relative distance in position encoder
counts.
"""

payload = st.pack("<Hl", 1, relative_distance)
self.send(Message(MGMSG.MOT_SET_MOVERELPARAMS, data=payload))

@@ -937,7 +896,6 @@ def get_move_relative_parameters(self):
:return: The relative distance move parameter.
:rtype: int
"""

get_msg = self.send_request(MGMSG.MOT_REQ_MOVERELPARAMS,
[MGMSG.MOT_GET_MOVERELPARAMS], 1)
return st.unpack("<l", get_msg.data[2:])[0]
@@ -949,7 +907,6 @@ def set_move_absolute_parameters(self, absolute_position):
signed integer that specifies the absolute move position in encoder
counts.
"""

payload = st.pack("<Hl", 1, absolute_position)
self.send(Message(MGMSG.MOT_SET_MOVEABSPARAMS, data=payload))

@@ -959,7 +916,6 @@ def get_move_absolute_parameters(self):
:return: The absolute position to move.
:rtype: int
"""

get_msg = self.send_request(MGMSG.MOT_REQ_MOVEABSPARAMS,
[MGMSG.MOT_GET_MOVEABSPARAMS], 1)
return st.unpack("<l", get_msg.data[2:])[0]
@@ -969,7 +925,6 @@ def set_home_parameters(self, home_velocity):
:param home_velocity: Homing velocity.
"""

payload = st.pack("<HHHLL", 1, 0, 0, home_velocity, 0)
self.send(Message(MGMSG.MOT_SET_HOMEPARAMS, data=payload))

@@ -979,7 +934,6 @@ def get_home_parameters(self):
:return: The homing velocity.
:rtype: int
"""

get_msg = self.send_request(MGMSG.MOT_REQ_HOMEPARAMS,
[MGMSG.MOT_GET_HOMEPARAMS], 1)
return st.unpack("<L", get_msg.data[6:10])[0]
@@ -989,7 +943,6 @@ def move_home(self):
This call is blocking until device is homed or move is stopped.
"""

self.send_request(MGMSG.MOT_MOVE_HOME,
[MGMSG.MOT_MOVE_HOMED, MGMSG.MOT_MOVE_STOPPED], 1)

@@ -1020,7 +973,6 @@ def set_limit_switch_parameters(self, cw_hw_limit, ccw_hw_limit):
:param ccw_hw_limit: The operation of counter clockwise hardware limit
switch when contact is made.
"""

payload = st.pack("<HHHLLH", 1, cw_hw_limit, ccw_hw_limit, 0, 0, 0)
self.send(Message(MGMSG.MOT_SET_LIMSWITCHPARAMS, data=payload))

@@ -1034,7 +986,6 @@ def get_limit_switch_parameters(self):
method.
:rtype: A 2 int tuple.
"""

get_msg = self.send_request(MGMSG.MOT_REQ_LIMSWITCHPARAMS,
[MGMSG.MOT_GET_LIMSWITCHPARAMS], 1)
return st.unpack("<HH", get_msg.data[2:6])
@@ -1047,7 +998,6 @@ def move_relative_memory(self):
<artiq.devices.thorlabs.driver.Tdc.set_move_relative_parameters>`
command.
"""

self.send_request(MGMSG.MOT_MOVE_RELATIVE,
[MGMSG.MOT_MOVE_COMPLETED, MGMSG.MOT_MOVE_STOPPED], 1)

@@ -1057,7 +1007,6 @@ def move_relative(self, relative_distance):
:param relative_distance: The distance to move in position encoder
counts.
"""

payload = st.pack("<Hl", 1, relative_distance)
self.send_request(MGMSG.MOT_MOVE_RELATIVE,
[MGMSG.MOT_MOVE_COMPLETED, MGMSG.MOT_MOVE_STOPPED],
@@ -1071,7 +1020,6 @@ def move_absolute_memory(self):
<artiq.devices.thorlabs.driver.Tdc.set_move_absolute_parameters>`
command.
"""

self.send_request(MGMSG.MOT_MOVE_ABSOLUTE,
[MGMSG.MOT_MOVE_COMPLETED, MGMSG.MOT_MOVE_STOPPED],
param1=1)
@@ -1083,18 +1031,16 @@ def move_absolute(self, absolute_distance):
integer that specifies the absolute distance in position encoder
counts.
"""

payload = st.pack("<Hl", 1, absolute_distance)
self.send_request(MGMSG.MOT_MOVE_ABSOLUTE,
[MGMSG.MOT_MOVE_COMPLETED, MGMSG.MOT_MOVE_STOPPED],
data=payload)

def move_jog(self, direction):
"""Start a job move.
"""Start a jog move.
:param direction: The direction to jog. 1 is forward, 2 is backward.
"""

self.send_request(MGMSG.MOT_MOVE_JOG,
[MGMSG.MOT_MOVE_COMPLETED, MGMSG.MOT_MOVE_STOPPED],
param1=1, param2=direction)
@@ -1113,7 +1059,6 @@ def move_velocity(self, direction):
:param direction: The direction to jog: 1 to move forward, 2 to move
backward.
"""

self.send(Message(MGMSG.MOT_MOVE_VELOCITY, param1=1, param2=direction))

def move_stop(self, stop_mode):
@@ -1126,7 +1071,6 @@ def move_stop(self, stop_mode):
or profiled stop. Set this byte to 1 to stop immediately, or to 2
to stop in a controlled (profiled) manner.
"""

if self.is_moving():
self.send_request(MGMSG.MOT_MOVE_STOP,
[MGMSG.MOT_MOVE_STOPPED,
@@ -1148,7 +1092,6 @@ def set_dc_pid_parameters(self, proportional, integral, differential,
setting the corresponding bit to 1. By default, all parameters are
applied, and this parameter is set to 0x0F (1111).
"""

payload = st.pack("<HLLLLH", 1, proportional, integral,
differential, integral_limit, filter_control)
self.send(Message(MGMSG.MOT_SET_DCPIDPARAMS, data=payload))
@@ -1163,7 +1106,6 @@ def get_dc_pid_parameters(self):
precise description.
:rtype: A 5 int tuple.
"""

get_msg = self.send_request(MGMSG.MOT_REQ_DCPIDPARAMS,
[MGMSG.MOT_GET_DCPIDPARAMS], 1)
return st.unpack("<LLLLH", get_msg.data[2:])
@@ -1180,7 +1122,6 @@ def set_av_modes(self, mode_bits):
forward or reverse limit switch.
Set the bit 3 (value 8) will make the LED lit when motor is moving.
"""

payload = st.pack("<HH", 1, mode_bits)
self.send(Message(MGMSG.MOT_SET_AVMODES, data=payload))

@@ -1190,7 +1131,6 @@ def get_av_modes(self):
:return: The LED indicator mode bits.
:rtype: int
"""

get_msg = self.send_request(MGMSG.MOT_REQ_AVMODES,
[MGMSG.MOT_GET_AVMODES], 1)
return st.unpack("<H", get_msg.data[2:])[0]
@@ -1214,7 +1154,6 @@ def set_button_parameters(self, mode, position1, position2):
:param position2: The position (in encoder counts) to which the motor
will move when the bottom button is pressed.
"""

payload = st.pack("<HHllHH", 1, mode, position1, position2,
0, 0)
self.send(Message(MGMSG.MOT_SET_BUTTONPARAMS, data=payload))
@@ -1228,7 +1167,6 @@ def get_button_parameters(self):
description.
:rtype: A 3 int tuple
"""

get_msg = self.send_request(MGMSG.MOT_REQ_BUTTONPARAMS,
[MGMSG.MOT_GET_BUTTONPARAMS], 1)
return st.unpack("<Hll", get_msg.data[2:12])
@@ -1239,7 +1177,6 @@ def set_eeprom_parameters(self, msg_id):
:param msg_id: The message ID of the message containing the parameters
to be saved.
"""

payload = st.pack("<HH", 1, msg_id)
self.send(Message(MGMSG.MOT_SET_EEPROMPARAMS, data=payload))

@@ -1252,7 +1189,6 @@ def get_dc_status_update(self):
velocity, status bits.
:rtype: A 3 int tuple
"""

get_msg = self.send_request(MGMSG.MOT_REQ_DCSTATUSUPDATE,
[MGMSG.MOT_GET_DCSTATUSUPDATE], 1)
pos, vel, _, stat = st.unpack("<LHHL", get_msg.data[2:])
@@ -1264,7 +1200,6 @@ def get_status_bits(self):
:return: The motor status.
:rtype:
"""

get_msg = self.send_request(MGMSG.MOT_REQ_STATUSBITS,
[MGMSG.MOT_GET_STATUSBITS], 1)
return st.unpack("<L", get_msg.data[2:])[0]
@@ -1276,7 +1211,6 @@ def suspend_end_of_move_messages(self):
i.e., MGMSG.MOT_MOVE_STOPPED, MGMSG.MOT_MOVE_COMPLETED,
MGMSGS_MOT_MOVE_HOMED
"""

self.send(Message(MGMSG.MOT_SUSPEND_ENDOFMOVEMSGS))

def resume_end_of_move_messages(self):
@@ -1291,7 +1225,6 @@ def resume_end_of_move_messages(self):
MGMSG.HW_RESPONSE,
MGMSG.HW_RICHRESPONSE
"""

self.send(Message(MGMSG.MOT_RESUME_ENDOFMOVEMSGS))


0 comments on commit bda1114

Please sign in to comment.