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:
ConfigurableCscMTMount CSC
- Parameters:
initial_state (
salobj.Stateorint, optional) – The initial state of the CSC. This is provided for unit testing, as real CSCs should start up inlsst.ts.salobj.StateSTANDBY, the maxMove.simulation_mode (
int, optional) – Simulation mode.run_mock_controller (
bool, optional) – Run the mock controller (using random ports)? Ignored unlesssimulation_mode == 1. False withsimulation_mode == 1is 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 (
intorNone, optional) – Port for mock controller TCP/IP interface. IfNonethen use the standard value. Ignored unless running in simulation mode andrun_mock_controllerfalse. This supports unit tests which run their own mock controller with randomly chosen ports.mock_telemetry_port (
intorNone, optional) – Port for mock controller telemetry server. IfNonethen use the standard value. Ignored unless running in simulation mode andrun_mock_controllerfalse. 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
CscErrorCodeAttributes Summary
Is CSC running in CCW-Only mode?
Does the CSC have command of the low-level controller?
Methods Summary
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 the target event.
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)Stop and turn off azimuth, elevation, and camera cable wrap, then give up command of the low-level controller.
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.
Handle the disableCameraCableWrapFollowing command.
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.
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 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
errorCodeevent.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_SETTINGSreply.handle_axis_motion_state(reply)Handle a
ReplyId.AXIS_MOTION_STATEreply.handle_azimuth_topple_block(reply)Handle a
ReplyId.AZIMUTH_TOPPLE_BLOCKreply.handle_chiller_state(reply)Andle a
ReplyId.CHILLER_STATEreply.handle_command_reply(reply)Handle a ReplyId.CMD_x reply.
handle_commander(reply)Handle a
ReplyId.COMMANDERreply.handle_deployable_motion_state(reply, topic)Handle a generic position event.
Handle a
ReplyId.DETAILED_SETTINGS_APPLIEDreply.Handle a
ReplyId.ELEVATION_LOCKING_PIN_MOTION_STATEreply.handle_error(reply)Handle a
ReplyId.ERRORreply.handle_homed(reply)Handle a
ReplyId.HOMEDreply.handle_in_position(reply)Handle a
ReplyId.IN_POSITIONreply.handle_limits(reply)Handle a
ReplyId.LIMITSreply.Handle a
ReplyId.MOTION_CONTROLLER_STATEreply.handle_power_state(reply)Handle a
ReplyId.POWER_STATEreply.handle_safety_interlocks(reply)Handle a
ReplyId.SAFETY_INTERLOCKSreply.Called when the summary state has changed.
handle_warning(reply)Handle a
ReplyId.WARNINGreply.in_progress_loop(ack_in_progress, data)A context manager to handle continuously acknowledging in progress for the enabled command.
Return True if tracking according to the elevation and azimuth motion state events.
Send a regular heartbeat "command" to the low-level controller.
Log the command history.
Log missed track target commands then sleep for a heartbeat.
Go to FAULT state if the telemetry client exits prematurely.
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.
Handle signals such as SIGTERM.
start()Finish constructing the CSC.
Make the camera cable wrap start following the camera rotator.
Stop the camera cable wrap from following the rotator.
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
overridefield 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:
- 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
startcommand, just before changing summary state fromState.STANDBYtoState.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
errorCodeevent.- Parameters:
code (
int) – Error code for theerrorCodeevent. IfNonethenerrorCodeis not output and you should output it yourself. SpecifyingNoneis 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.
- async handle_available_settings(reply)#
Handle a
ReplyId.AVAILABLE_SETTINGSreply.
- async handle_axis_motion_state(reply)#
Handle a
ReplyId.AXIS_MOTION_STATEreply.
- async handle_azimuth_topple_block(reply)#
Handle a
ReplyId.AZIMUTH_TOPPLE_BLOCKreply.
- async handle_chiller_state(reply)#
Andle a
ReplyId.CHILLER_STATEreply.
- async handle_command_reply(reply)#
Handle a ReplyId.CMD_x reply.
- async handle_commander(reply)#
Handle a
ReplyId.COMMANDERreply.
- async handle_deployable_motion_state(reply, topic)#
Handle a generic position event.
Including:
- async handle_detailed_settings_applied(reply)#
Handle a
ReplyId.DETAILED_SETTINGS_APPLIEDreply.
- async handle_elevation_locking_pin_motion_state(reply)#
Handle a
ReplyId.ELEVATION_LOCKING_PIN_MOTION_STATEreply.
- async handle_error(reply)#
Handle a
ReplyId.ERRORreply.
- async handle_homed(reply)#
Handle a
ReplyId.HOMEDreply.
- async handle_in_position(reply)#
Handle a
ReplyId.IN_POSITIONreply.
- async handle_limits(reply)#
Handle a
ReplyId.LIMITSreply.
- async handle_motion_controller_state(reply)#
Handle a
ReplyId.MOTION_CONTROLLER_STATEreply.
- async handle_oil_supply_system_state(reply)#
- async handle_power_state(reply)#
Handle a
ReplyId.POWER_STATEreply.
- async handle_safety_interlocks(reply)#
Handle a
ReplyId.SAFETY_INTERLOCKSreply.
- 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
BaseCscandConfigurableCscdo nothing, so if you subclass one of those you do not need to callawait super().handle_summary_state().
- async handle_warning(reply)#
Handle a
ReplyId.WARNINGreply.
- 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.
- 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.
- 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:
- 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, setself.start_taskto the exception, callstop, making the CSC unusable, and return.Call
handle_summary_stateSet
self.start_taskdone.
- 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.