SalInfo¶
- class lsst.ts.salobj.SalInfo(domain: Domain, name: str, index: int | None = 0, write_only: bool = False)¶
Bases:
object
DDS information for one SAL component and its DDS partition
- Parameters:
- Raises:
- RuntimeError
If environment variable
LSST_DDS_PARTITION_PREFIX
is not defined.- RuntimeError
If the IDL file cannot be found for the specified
name
.- TypeError
If
domain
is not an instance ofDomain
or ifindex
is not anint
,enum.IntEnum
, orNone
.- ValueError
If
index
is nonzero and the component is not indexed.
- Attributes:
- domain
Domain
The
domain
constructor argument.- name
str
The
name
constructor argument.- index
int
The
index
constructor argument.- indexed
bool
True
if this SAL component is indexed (meaning a non-zero index is allowed),False
if not.- identity
str
Value used for the private_identity field of DDS messages. Defaults to username@host, but CSCs should use the CSC name: * SAL_component_name for a non-indexed SAL component * SAL_component_name:index for an indexed SAL component.
- log
logging.Logger
A logger.
- partition_prefix
str
The DDS partition name prefix, from environment variable
LSST_DDS_PARTITION_PREFIX
.- publisher
dds.Publisher
A DDS publisher, used to create DDS writers.
- subscriber
dds.Subscriber
A DDS subscriber, used to create DDS readers.
- isopen
bool
Is this instance open?
True
untilclose
orbasic_close
is called. This instance is fully closed when done_task is done.- start_called
bool
Has the start method been called? This 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.- command_names
List
[str
] A tuple of command names without the
"command_"
prefix.- event_names
List
[str
] A tuple of event names, without the
"logevent_"
prefix- telemetry_names
List
[str
] A tuple of telemetry topic names.
- sal_topic_names
List
[str
] A tuple of SAL topic names, e.g. “logevent_summaryState”, in alphabetical order.
- revnames
dict
[str
,str
] A dict of topic name: name_revision.
- topic_info
dict
[str
,TopicMetadata
] A dict of SAL topic name: topic metadata.
- Notes
- —–
- Reads the following `Environment Variables
- <https://ts-salobj.lsst.io/configuration.html#environment_variables>`_;
- follow the link for details:
- * ``LSST_DDS_PARTITION_PREFIX`` (required): the DDS partition name.
- * ``LSST_DDS_HISTORYSYNC`` (optional): time limit (sec)
for waiting for historical (late-joiner) data.
- **Usage**
- * Construct a `SalInfo` object for a particular SAL component and index.
- * Use the object to construct all topics (subclasses of `topics.BaseTopic`)
that you want to use with this SAL component and index.
- * Call `start`.
- * When you are finished, call `close`, or at least be sure to close
the
domain
when you are finished with all classes that use it (see Cleanup below).- You cannot read topics constructed with a `SalInfo` object
- until you call `start`, and once you call `start`, you cannot
- use the `SalInfo` object to construct any more topics.
- You may use `SalInfo` as an async context manager, but this is primarily
- useful for cleanup. After you enter the context (create the object)
- you will still have to create topics and call start.
- This is different from `Domain`, `Controller`, and `Remote`,
- which are ready to use when you enter the context.
- **Cleanup**
- Each `SalInfo` automatically registers itself with the specified ``domain``
- for cleanup, using a weak reference to avoid circular dependencies.
- You may safely close a `SalInfo` before closing its domain,
- and this is recommended if you create and destroy many remotes.
- In any case, be sure to close the ``domain`` when you are done.
- **DDS Partition Names**
- The DDS partition name for each topic is {prefix}.{name}.{suffix}, where:
- * ``prefix`` = $LSST_DDS_PARTITION_PREFIX.
- * ``name`` = the ``name`` constructor argument.
- * ``suffix`` = “cmd” for command topics, and “data” for all other topics,
including
ackcmd
.- The idea is that each `Controller` and `Remote` should have just one
- subscriber and one publisher, and that the durability service
- will only read topics that the object reads, not topics that it writes.
- Thus the durability service for `Controller` will only read commands,
- and the durability service for `Remote` will read everything but commands
- (events, telemetry and the ``ackcmd`` topic).
- domain
Attributes Summary
The class of command acknowledgement.
Partition name for command topics.
Publisher for command topics, but not ackcmd.
Subscriber for command topics, but not ackcmd.
Partition name for non-command topics.
Publisher for ackcmd, events and telemetry topics.
Subscriber for ackcmd, events and telemetry topics.
Get name[:index].
Return True if started and not closed.
Return True if successfully started, False otherwise.
Methods Summary
add_reader
(topic)Add a ReadTopic, so it can be read by the read loop and closed by
close
.add_writer
(topic)Add a WriteTopic, so it can be closed by
close
.Raise RuntimeError if not successfully started.
A synchronous and less thorough version of
close
.close
()Shut down and clean up resources.
make_ackcmd
(private_seqNum, ack[, error, ...])Make an AckCmdType object from keyword arguments.
Parse the IDL metadata to generate some attributes.
start
()Start the read loop.
Attributes Documentation
- AckCmdType¶
The class of command acknowledgement.
It includes these fields, as well as the usual other private fields.
- private_seqNum
int
Sequence number of command.
- ack
int
Acknowledgement code; one of the
SalRetCode
CMD_
constants, such asSalRetCode.CMD_COMPLETE
.- error
int
Error code; 0 for no error.
- result
str
Explanatory message, or “” for no message.
- Raises:
- RuntimeError
If the SAL component has no commands (because if there are no commands then there is no ackcmd topic).
- private_seqNum
- cmd_partition_name¶
Partition name for command topics.
- cmd_publisher¶
Publisher for command topics, but not ackcmd.
This has a different partition name than a data_publisher.
- cmd_subscriber¶
Subscriber for command topics, but not ackcmd.
This has a different partition name than a data_subscriber.
- data_partition_name¶
Partition name for non-command topics.
- data_publisher¶
Publisher for ackcmd, events and telemetry topics.
This has a different partition name than a cmd_publisher.
- data_subscriber¶
Subscriber for ackcmd, events and telemetry topics.
This has a different partition name than a cmd_subscriber.
- name_index¶
Get name[:index].
The suffix is only present if the component is indexed.
- running¶
Return True if started and not closed.
- started¶
Return True if successfully started, False otherwise.
Methods Documentation
- add_reader(topic: ReadTopic) None ¶
Add a ReadTopic, so it can be read by the read loop and closed by
close
.- Parameters:
- topic
topics.ReadTopic
Topic to read and (eventually) close.
- topic
- Raises:
- RuntimeError
If called after
start
has been called.
- add_writer(topic: WriteTopic) None ¶
Add a WriteTopic, so it can be closed by
close
.- Parameters:
- topic
topics.WriteTopic
Write topic to (eventually) close.
- topic
- assert_started() None ¶
Raise RuntimeError if not successfully started.
Notes
Does not raise after this is closed. That avoids race conditions at shutdown.
- basic_close() None ¶
A synchronous and less thorough version of
close
.Intended for exit handlers and constructor error handlers.
- async close() None ¶
Shut down and clean up resources.
May be called multiple times. The first call closes the SalInfo; subsequent calls wait until the SalInfo is closed.
- make_ackcmd(private_seqNum: int, ack: SalRetCode, error: int = 0, result: str = '', timeout: float = 0) AckCmdDataType ¶
Make an AckCmdType object from keyword arguments.
- Parameters:
- private_seqNum
int
Sequence number of command.
- ack
int
Acknowledgement code; one of the
salobj.SalRetCode.CMD_
constants, such assalobj.SalRetCode.CMD_COMPLETE
.- error
int
Error code. Should be 0 unless
ack
issalobj.SalRetCode.CMD_FAILED
- result
str
More information.
- timeout
float
Esimated command duration. This should be specified if
ack
issalobj.SalRetCode.CMD_INPROGRESS
.
- private_seqNum
- Raises:
- RuntimeError
If the SAL component has no commands (because if there are no commands then there is no ackcmd topic).