Controller¶
- class lsst.ts.salobj.Controller(name: str, index: int | None = None, *, do_callbacks: bool = False, write_only: bool = False, allow_missing_callbacks: bool = False, extra_commands: set[str] = {})¶
Bases:
object
A class that receives commands for a SAL component and sends telemetry and events from that component.
This class provides much of the behavior for
BaseCsc
, basically everything except the standard summary states and associated transition commands.- Parameters:
- name
str
Name of SAL component.
- index
int
orNone
, optional SAL component index, or 0 or None if the component is not indexed. A value is required if the component is indexed.
- do_callbacks
bool
, optional Set
do_{command}
methods as callbacks for commands? If true then there must be exactly onedo_{command}
method for each command. Cannot be true ifwrite_only
is true.- write_only
bool
, optional If true then the Controller will have no command topics and will not read any SAL data. Cannot be true if
do_callbacks
is true.- allow_missing_callbacks
bool
, optional Allow missing
do_{command}
callback methods? Missing method will be replaced with one that raises salobj.ExpectedError. This is intended for mock controllers, which may only support a subset of commands. Cannot be true unlessdo_callbacks
is true.- extra_commands
set`[`str
] List of valid commands that can be defined in the CSC without being in the interface.
- name
- Raises:
- ValueError
If
do_callbacks
andwrite_only
are both true, or ifallow_missing_callbacks
is true anddo_callbacks
is not.- TypeError
If
do_callbacks
true and one or moredo_{command}
methods is present that has no corresponding command, or ifdo_callbacks
true,allow_missing_callbacks
false, and one or moredo_{command}
methods is missing.
Notes
Writing a Controller
(To write a CSC see Writing a CSC, instead)
To write a controller that is not a CSC (one that does not provide the standard summary states and associated state transition commands):
Inherit from this class.
Provide all Required Logging Attributes; these are automatically provided to CSCs, but not other controllers.
Implement
close_tasks
.
Here is an example that makes a Test controller and displays the topic-related attributes, but has no code to do anything useful with those topics (see
TestCsc
for that):include salobj # the index is arbitrary, but a remote must use the same index # to talk to this controller test_controller = salobj.Controller("Test", index=5) print(dir(test_controller))
You should see the following topic-related attributes:
Commands, each an instance of
topics.ControllerCommand
:cmd_standby
cmd_start
… and so on for all other standard CSC commands
cmd_setArrays
cmd_setScalars
Events, each an instance of
topics.ControllerEvent
:evt_configurationApplied
… and so on for all other standard CSC events
evt_arrays
evt_scalars
Telemetry, each an instance of
topics.ControllerTelemetry
(note that there are no standard CSC telemetry topics):tel_arrays
tel_scalars
Required Logging Attributes
Each
Controller
must support the following topics, as specified in ts_xml inSALGenerics.xml
:setLogLevel command
logLevel event
logMessage event
Adding Commands
When adding new commands to the CSC interface, there might be a time when one needs to support both the old interface (without the new commands) and the new interface. In this situations one can define the list of new commands using the
extra_commands
parameters. Callback to those commands can be defined in the CSC and they will work with both old and new interfaces.- Attributes:
- log
logging.Logger
A logger.
- salinfo
SalInfo
SAL info.
- isopen
bool
Is this instance open?
True
untilclose
is called. The instance is fully closed when done_task is done.- start_called
bool
Has the start method been called? The instance is fully started when start_task is done.
- done_task
asyncio.Task
A task which is finished when
close
orbasic_close
is done.- start_task
asyncio.Task
A task which is finished when
start
is done, or to an exception ifstart
fails.- cmd_<command_name>
topics.ControllerCommand
Controller command topic. There is one for each command supported by the SAL component.
- evt_<event_name>
topics.ControllerEvent
Controller event topic. There is one for each event topic supported by the SAL component.
- tel_<telemetry_name>
topics.ControllerTelemetry
Controller telemetry topic. There is one for each telemetry topic supported by the SAL component.
- log
Attributes Summary
Methods Summary
close
([exception, cancel_start])Shut down, clean up resources and set done_task done.
Shut down pending tasks.
do_setLogLevel
(data)Set logging level.
Output the logLevel event.
start
()Finish construction.
Additional work after
start
before fully started.Attributes Documentation
- domain¶
Methods Documentation
- async close(exception: Exception | None = None, cancel_start: bool = True) None ¶
Shut down, clean up resources and set done_task done.
May be called multiple times. The first call closes the Controller; subsequent calls wait until the Controller is closed.
Subclasses should override
close_tasks
instead ofclose
, unless you have a good reason to do otherwise.- Parameters:
- exception
Exception
, optional The exception that caused stopping, if any, in which case the
self.done_task
exception is set to this value. SpecifyNone
for a normal exit, in which case theself.done_task
result is set toNone
.- cancel_start
bool
, optional Cancel the start task? Leave this true unless calling this from the start task.
- exception
Notes
Removes the SAL log handler, calls
close_tasks
to stop all background tasks, pauses briefly to allow final SAL messages to be sent, then closes the dds domain.
- async close_tasks() None ¶
Shut down pending tasks. Called by
close
.Perform all cleanup other than disabling logging to SAL and closing the dds domain.
- async do_setLogLevel(data: BaseMsgType) None ¶
Set logging level.
- Parameters:
- data
cmd_setLogLevel.DataType
Logging level.
- data