MTMountCsc#

class lsst.ts.mtmount.MTMountCsc(config_dir=None, initial_state=State.STANDBY, simulation_mode=0, run_mock_controller=True, mock_command_port=None, mock_telemetry_port=None)#

Bases: ConfigurableCsc

MTMount CSC

Parameters:
  • initial_state (salobj.State or int, optional) – The initial state of the CSC. This is provided for unit testing, as real CSCs should start up in lsst.ts.salobj.StateSTANDBY, the maxMove.

  • simulation_mode (int, optional) – Simulation mode.

  • run_mock_controller (bool, optional) – Run the mock controller (using random ports)? Ignored unless simulation_mode == 1. False with simulation_mode == 1 is for unit tests which run their own mock controller; many tests do this in order to monitor what is going on in the controller.

  • mock_command_port (int or None, optional) – Port for mock controller TCP/IP interface. If None then use the standard value. Ignored unless running in simulation mode and run_mock_controller false. This supports unit tests which run their own mock controller with randomly chosen ports.

  • mock_telemetry_port (int or None, optional) – Port for mock controller telemetry server. If None then use the standard value. Ignored unless running in simulation mode and run_mock_controller false. This supports unit tests which run their own mock controller with randomly chosen ports.

Raises:

salobj.ExpectedError – If initial_state or simulation_mode is invalid.

Notes

Simulation Modes

Supported simulation modes:

  • 0: regular operation

  • 1: simulation mode: start a mock TCP/IP controller and talk to it

Error Codes

See CscErrorCode

Attributes Summary

ccw_only_mode_enabled

Is CSC running in CCW-Only mode?

has_command

Does the CSC have command of the low-level controller?

limits_margin

park_acceleration

park_velocity

unpark_elevation_offset

valid_simulation_modes

version

Methods Summary

assert_enabled_and_not_disabling()

assert_not_opening_or_closing_mirror_cover()

axis_might_fault()

Context manager to handle operations that might cause an axis to fault.

begin_disable(data)

Begin do_disable; called before state changes.

begin_enable(data)

Take command of the low-level controller and initialize devices.

begin_start(data)

Begin do_start; configure the CSC before changing state.

clear_target()

Clear the target event.

close_tasks()

Shut down pending tasks.

compute_camera_cable_wrap_demand(rot_data)

Compute camera cable wrap tracking command data from rotation data.

configure(config)

Configure the CSC.

connect()

Connect to the low-level controller and start the telemetry client.

connect_callback(client)

disable_devices()

Stop and turn off azimuth, elevation, and camera cable wrap, then give up command of the low-level controller.

disconnect()

Disconnect from the low-level controller.

do_applySettingsSet(data)

Handle the applySettingsSet command.

do_clearError(data)

Handle the clearError command.

do_closeMirrorCovers(data)

Handle the closeMirrorCovers command.

do_disableCameraCableWrapFollowing(data)

Handle the disableCameraCableWrapFollowing command.

do_enableCameraCableWrapFollowing(data)

Handle the enableCameraCableWrapFollowing command.

do_homeBothAxes(data)

do_lockMotion(data)

do_moveToTarget(data)

Handle the moveToTarget command.

do_openMirrorCovers(data)

Handle the openMirrorCovers command.

do_park(data)

Handle the park command.

do_restoreDefaultSettings(data)

Handle the RestoreDefaultSettings command.

do_setThermal(data)

Handle the setThermal command.

do_startTracking(data)

Handle the startTracking command.

do_stop(data)

Handle the stop command.

do_stopTracking(data)

Handle the stopTracking command.

do_trackTarget(data)

Handle the trackTarget command.

do_unlockMotion(data)

do_unpark(data)

Handle the unpark command.

enable_devices()

Enable all devices.

end_standby(data)

End do_standby; called after state changes but before command acknowledged.

fault(code, report[, traceback])

Enter the fault state and output the errorCode event.

get_config_pkg()

Get the name of the configuration package, e.g. "ts_config_ocs".

handle_apply_settings_set(restore_defaults, ...)

Method to handle applying settings.

handle_available_settings(reply)

Handle a ReplyId.AVAILABLE_SETTINGS reply.

handle_axis_motion_state(reply)

Handle a ReplyId.AXIS_MOTION_STATE reply.

handle_azimuth_topple_block(reply)

Handle a ReplyId.AZIMUTH_TOPPLE_BLOCK reply.

handle_chiller_state(reply)

Andle a ReplyId.CHILLER_STATE reply.

handle_command_reply(reply)

Handle a ReplyId.CMD_x reply.

handle_commander(reply)

Handle a ReplyId.COMMANDER reply.

handle_deployable_motion_state(reply, topic)

Handle a generic position event.

handle_detailed_settings_applied(reply)

Handle a ReplyId.DETAILED_SETTINGS_APPLIED reply.

handle_elevation_locking_pin_motion_state(reply)

Handle a ReplyId.ELEVATION_LOCKING_PIN_MOTION_STATE reply.

handle_error(reply)

Handle a ReplyId.ERROR reply.

handle_homed(reply)

Handle a ReplyId.HOMED reply.

handle_in_position(reply)

Handle a ReplyId.IN_POSITION reply.

handle_limits(reply)

Handle a ReplyId.LIMITS reply.

handle_motion_controller_state(reply)

Handle a ReplyId.MOTION_CONTROLLER_STATE reply.

handle_oil_supply_system_state(reply)

handle_power_state(reply)

Handle a ReplyId.POWER_STATE reply.

handle_safety_interlocks(reply)

Handle a ReplyId.SAFETY_INTERLOCKS reply.

handle_summary_state()

Called when the summary state has changed.

handle_warning(reply)

Handle a ReplyId.WARNING reply.

in_progress_loop(ack_in_progress, data)

A context manager to handle continuously acknowledging in progress for the enabled command.

is_tracking()

Return True if tracking according to the elevation and azimuth motion state events.

llv_heartbeat_loop()

Send a regular heartbeat "command" to the low-level controller.

log_command_history()

Log the command history.

log_missed_track_target_commands(msg)

Log missed track target commands then sleep for a heartbeat.

monitor_telemetry_client()

Go to FAULT state if the telemetry client exits prematurely.

read_loop()

Read and process replies from the low-level controller.

retry_command(command, *[, max_tries, timeout])

Send a low-level command, retrying up to max_tries times.

send_command(command, *, do_lock[, timeout])

Send a command to the operation manager and wait for it to finish.

send_commands(*commands, do_lock)

Run a set of operation manager commands.

set_thermal_off(system_id)

Turn off a thermal controller.

set_thermal_on(system_id, setpoint)

Turn on a thermal controller with a specified setpoint.

signal_handler()

Handle signals such as SIGTERM.

start()

Finish constructing the CSC.

start_camera_cable_wrap_following()

Make the camera cable wrap start following the camera rotator.

stop_camera_cable_wrap_following()

Stop the camera cable wrap from following the rotator.

terminate_background_processes()

Terminate the background processes with SIGTERM.

Attributes Documentation

ccw_only_mode_enabled#

Is CSC running in CCW-Only mode?

has_command#

Does the CSC have command of the low-level controller?

limits_margin = 0.01#
park_acceleration = 0.1#
park_velocity = 0.5#
unpark_elevation_offset = 20.0#
valid_simulation_modes: Sequence[int] = (0, 1)#
version = '?'#

Methods Documentation

assert_enabled_and_not_disabling()#
assert_not_opening_or_closing_mirror_cover()#
axis_might_fault()#

Context manager to handle operations that might cause an axis to fault.

async begin_disable(data)#

Begin do_disable; called before state changes.

Parameters:

data (DataType) – Command data

async begin_enable(data)#

Take command of the low-level controller and initialize devices.

If taking command fails, raise an exception in order to leave the state as DISABLED.

If initializing fails, first try to disable the axis controllers, then raise an exception in order to leave the state as DISABLED.

async begin_start(data)#

Begin do_start; configure the CSC before changing state.

Parameters:

data (cmd_start.DataType) – Command data

Notes

The override field must be one of:

  • The name of a config label or config file

  • The name and version of a config file, formatted as <file_name>:<version>, where the version is a git reference, such as a git tag or commit hash. This form does not support labels.

async clear_target()#

Clear the target event.

async close_tasks()#

Shut down pending tasks. Called by close.

compute_camera_cable_wrap_demand(rot_data)#

Compute camera cable wrap tracking command data from rotation data.

Parameters:

rot_data (salobj.BaseMsgType) – Current MTRotator rotation telemetry data.

Returns:

  • position (float) – Desired camera cable wrap position (in degrees).

  • velocity (float) – Desired camera cable wrap velocity (in degrees).

  • tai (float) – Desired camera cable wrap time (TAI unix seconds). This will be config.camera_cable_wrap_advance_time seconds in the future.

async configure(config)#

Configure the CSC.

Parameters:

config (object) – The configuration, as described by the config schema, as a struct-like object.

Notes

Called when running the start command, just before changing summary state from State.STANDBY to State.DISABLED.

async connect()#

Connect to the low-level controller and start the telemetry client.

async connect_callback(client)#
async disable_devices()#

Stop and turn off azimuth, elevation, and camera cable wrap, then give up command of the low-level controller.

Leave the top end chiller and oil supply system running and the main axis power supply on.

Notes

This is a “best effort” attempt that should not raise an exception.

Try to disable all subsystems, even if one or more commands fails.

The TMA manages the azimuth cable wrap automatically, so this code does not explicitly stop it or turn it off.

async disconnect()#

Disconnect from the low-level controller.

Close the connection to the low-level controller, if connected. Clear the target event. Stop the telemetry process, if running. Do not stop the mock controller (even if the CSC started it), because that should remain running until the CSC quits.

async do_applySettingsSet(data)#

Handle the applySettingsSet command.

async do_clearError(data)#

Handle the clearError command.

async do_closeMirrorCovers(data)#

Handle the closeMirrorCovers command.

async do_disableCameraCableWrapFollowing(data)#

Handle the disableCameraCableWrapFollowing command.

async do_enableCameraCableWrapFollowing(data)#

Handle the enableCameraCableWrapFollowing command.

do_homeBothAxes(data)#
async do_lockMotion(data)#
do_moveToTarget(data)#

Handle the moveToTarget command.

async do_openMirrorCovers(data)#

Handle the openMirrorCovers command.

do_park(data)#

Handle the park command.

async do_restoreDefaultSettings(data)#

Handle the RestoreDefaultSettings command.

async do_setThermal(data)#

Handle the setThermal command.

do_startTracking(data)#

Handle the startTracking command.

async do_stop(data)#

Handle the stop command.

async do_stopTracking(data)#

Handle the stopTracking command.

async do_trackTarget(data)#

Handle the trackTarget command.

Notes

Note that, although this command is not disabled in CCW-Only mode, the startTracking command is disabled, which essentially preents this command from working when in CCW-Only mode.

async do_unlockMotion(data)#
do_unpark(data)#

Handle the unpark command.

async enable_devices()#

Enable all devices.

Call this when going to ENABLED state.

async end_standby(data)#

End do_standby; called after state changes but before command acknowledged.

Parameters:

data (DataType) – Command data

async fault(code, report, traceback='')#

Enter the fault state and output the errorCode event.

Parameters:
  • code (int) – Error code for the errorCode event. If None then errorCode is not output and you should output it yourself. Specifying None is deprecated; please always specify an integer error code.

  • report (str) – Description of the error.

  • traceback (str, optional) – Description of the traceback, if any.

static get_config_pkg()#

Get the name of the configuration package, e.g. “ts_config_ocs”.

async handle_apply_settings_set(restore_defaults, settings_to_apply)#

Method to handle applying settings.

Parameters:
  • restore_defaults (bool) – Restore defaults before loading settings?

  • settings_to_apply (list`[`str]) – Names of the settings to apply.

Return type:

None

async handle_available_settings(reply)#

Handle a ReplyId.AVAILABLE_SETTINGS reply.

async handle_axis_motion_state(reply)#

Handle a ReplyId.AXIS_MOTION_STATE reply.

async handle_azimuth_topple_block(reply)#

Handle a ReplyId.AZIMUTH_TOPPLE_BLOCK reply.

async handle_chiller_state(reply)#

Andle a ReplyId.CHILLER_STATE reply.

async handle_command_reply(reply)#

Handle a ReplyId.CMD_x reply.

async handle_commander(reply)#

Handle a ReplyId.COMMANDER reply.

async handle_deployable_motion_state(reply, topic)#

Handle a generic position event.

Including:

async handle_detailed_settings_applied(reply)#

Handle a ReplyId.DETAILED_SETTINGS_APPLIED reply.

async handle_elevation_locking_pin_motion_state(reply)#

Handle a ReplyId.ELEVATION_LOCKING_PIN_MOTION_STATE reply.

async handle_error(reply)#

Handle a ReplyId.ERROR reply.

async handle_homed(reply)#

Handle a ReplyId.HOMED reply.

async handle_in_position(reply)#

Handle a ReplyId.IN_POSITION reply.

async handle_limits(reply)#

Handle a ReplyId.LIMITS reply.

async handle_motion_controller_state(reply)#

Handle a ReplyId.MOTION_CONTROLLER_STATE reply.

async handle_oil_supply_system_state(reply)#
async handle_power_state(reply)#

Handle a ReplyId.POWER_STATE reply.

async handle_safety_interlocks(reply)#

Handle a ReplyId.SAFETY_INTERLOCKS reply.

async handle_summary_state()#

Called when the summary state has changed.

Override to perform tasks such as starting and stopping telemetry (example).

Notes

The versions in BaseCsc and ConfigurableCsc do nothing, so if you subclass one of those you do not need to call await super().handle_summary_state().

async handle_warning(reply)#

Handle a ReplyId.WARNING reply.

in_progress_loop(ack_in_progress, data)#

A context manager to handle continuously acknowledging in progress for the enabled command.

is_tracking()#

Return True if tracking according to the elevation and azimuth motion state events.

async llv_heartbeat_loop()#

Send a regular heartbeat “command” to the low-level controller.

The command is not acknowledged in any way.

async log_command_history()#

Log the command history.

async log_missed_track_target_commands(msg)#

Log missed track target commands then sleep for a heartbeat.

This allows the track target command to throttle these messages.

Parameters:

msg (str) – Message to log.

Return type:

None

async monitor_telemetry_client()#

Go to FAULT state if the telemetry client exits prematurely.

async read_loop()#

Read and process replies from the low-level controller.

async retry_command(command, *, max_tries=3, timeout=0.75)#

Send a low-level command, retrying up to max_tries times.

Parameters:
  • command (commands.Command) – Class of command to send

  • max_tries (int, optional) – Maximum number of times to issue the command.

  • timeout (float, optional) – Timeout (sec) for the command (applied to each retry). Keep it short to avoid blocking the command lock for a long time.

async send_command(command, *, do_lock, timeout=None)#

Send a command to the operation manager and wait for it to finish.

Parameters:
  • command (Command) – Command to send.

  • do_lock (bool) – Lock the port while this method runs? The low-level controller has ill-defined limits on which commands commands can run simultaneously, so specify True when practical. Specify False for stop commands and the camera cable wrap tracking command (so rotator following is not blocked).

  • timeout (float | None) – Timeout for initial ack. If None then use self.config.ack_timeout.

Returns:

command_futures – Futures that monitor the command.

Return type:

CommandFutures

Raises:
  • asyncio.TimeoutError – If the timeout is exceeded.

  • salobj.ExpectedError – If not connected to the low-level controller.

  • RuntimeError – If the sequence_id is already in use. This indicates an internal error.

async send_commands(*commands, do_lock)#

Run a set of operation manager commands.

Wait for each command to finish before issuing the next. Wait for all commands to finish before returning.

Parameters:
  • commands (List [Command]) – Commands to send. The sequence_id attribute is set.

  • do_lock (bool) – Lock the port while this method runs? The low-level controller has ill-defined limits on which commands commands can run simultaneously, so specify True when practical. Specify False for stop commands and the camera cable wrap tracking command (so rotator following is not blocked).

Raises:
  • asyncio.TimeoutError – If the timeout is exceeded.

  • salobj.ExpectedError – If not connected to the low-level controller.

  • RuntimeError – If the sequence_id is already in use. This indicates an internal error.

async set_thermal_off(system_id)#

Turn off a thermal controller.

Parameters:

system_id (System) – ID of the thermal control system.

Raises:

ValueError – If system_id is not supported.

async set_thermal_on(system_id, setpoint)#

Turn on a thermal controller with a specified setpoint.

Parameters:
  • system_id (System) – ID of the thermal control system.

  • setpoint (float) – Desired temperature (C).

Raises:

ValueError – If system_id is not supported.

signal_handler()#

Handle signals such as SIGTERM.

async start()#

Finish constructing the CSC.

  • Call set_simulation_mode. If this fails, set self.start_task to the exception, call stop, making the CSC unusable, and return.

  • Call handle_summary_state

  • Set self.start_task done.

async start_camera_cable_wrap_following()#

Make the camera cable wrap start following the camera rotator.

Camera cable wrap following is divided into two tasks so that the enableCameraCableWrapFollowing command can succeed or fail if following is likely or unlikely to work.

This method enables camera cable wrap tracking, waits for that command to succeed or fail, and if it succeeds, starts the camera cable wrap following loop.

async stop_camera_cable_wrap_following()#

Stop the camera cable wrap from following the rotator.

This will only issue the CameraCableWrapStop command if connected to and commanding the low-level controller.

terminate_background_processes()#

Terminate the background processes with SIGTERM.

Return the processes that were terminated so you can await them.