6. Reading Data (Input)¶
6.1. Getting the input¶
To read/take samples, first get a reference to the Input
:
input = connector.get_input("MySubscriber::MySquareReader")
Connector.get_input()
returns a Input
object. This example
obtains the input defined by the <data_reader>
named MySquareReader within
the <subscriber>
named MySubscriber:
<subscriber name="MySubscriber">
<data_reader name="MySquareReader" topic_ref="Square" />
</subscriber>
This <subscriber>
is defined inside the <domain_participant>
selected
to create this connector
(see Creating a new Connector).
6.2. Reading or taking the data¶
Call Input.take()
to access and remove the samples:
input.take()
or Input.read()
to access the samples but leave them available for
a future read()
or take()
:
input.read()
The method Input.wait()
can be used to identify when there is new data
available on a specific Input
. It will block until either the supplied
timeout expires (in which case it will raise a TimeoutError
) or until new
data is available:
input.wait()
The method Connector.wait()
has the same behavior as Input.wait()
,
but will block until data is available on any of the Input
objects within
the Connector
:
connector.wait()
6.3. Accessing the data samples¶
After calling Input.read()
or Input.take()
, Input.samples
contains the data samples:
for sample in input.samples:
if sample.valid_data:
print(sample.get_dictionary())
SampleIterator.get_dictionary()
retrieves all the fields of a sample.
Unless the Samples.valid_data_iter
is used, it is necessary to check if the
sample contains valid data before accessing the fields. The only exception to this
rule is if the instance_state
of the sample is "NOT_ALIVE_DISPOSED"
.
See Accessing key values of disposed samples for more information on this use
case.
If you don’t need to access the meta-data (see Accessing sample meta-data),
the simplest way to access the data is to use Samples.valid_data_iter
to skip
samples with invalid data:
for sample in input.samples.valid_data_iter:
print(sample.get_dictionary())
It is also possible to access an individual sample:
if input.samples.length > 0:
if input.samples[0].valid_data:
print(input.samples[0].get_dictionary())
Warning
All the methods described in this section return iterators to samples. Calling read/take again invalidates all iterators currently in use. For that reason, it is not recommended to store any iterator.
get_dictionary()
can receive a field_name
to only return the fields of a
complex member. In addition to get_dictionary()
, you can get the values of
specific primitive fields using SampleIterator.get_number()
,
SampleIterator.get_boolean()
and SampleIterator.get_string()
.
For example:
for sample in input.samples.valid_data_iter:
x = sample.get_number("x") # or just sample["x"]
y = sample.get_number("y")
size = sample.get_number("shapesize")
color = sample.get_string("color") # or just sample["color"]
See more information and examples in Accessing the data.
6.4. Accessing sample meta-data¶
Every sample contains an associated SampleInfo with meta-information about the sample:
for sample in input.samples:
source_timestamp = sample.info["source_timestamp"]
See SampleIterator.info()
for the list of available meta-data fields.
Connext DDS can produce samples with invalid data, which contain meta-data only. For more information about this, see Valid Data Flag in the RTI Connext DDS Core Libraries User’s Manual. These samples indicate a change in the instance state. Samples with invalid data still provide the following information:
- The
SampleInfo
- When an instance is disposed (
sample.info.get('instance_state')
is'NOT_ALIVE_DISPOSED'
), the sample data contains the value of the key that has been disposed. You can access the key fields only. See Accessing key values of disposed samples.
6.5. Matching with a publication¶
Use the method Input.wait_for_publications()
to detect when a compatible
DDS publication is matched or stops matching. It returns the change in the number of
matched publications since the last time it was called:
change_in_matches = input.wait_for_publications()
For example, if a new compatible publication is discovered within the specified
timeout
, the function returns 1; if a previously matching publication
no longer matches, it returns -1.
You can obtain information about the existing matched publications with
Input.matched_publication
:
matched_pubs = input.matched_publications
for pub_info in matched_pubs:
pub_name = pub_info['name']
6.6. Class reference: Input, Samples, SampleIterator¶
6.6.1. Input class¶
-
class
rticonnextdds_connector.
Input
(connector, name)¶ Allows reading data for a Topic
To get an input object, use
Connector.get_input()
.- Attributes:
connector
(Connector
): TheConnector
that created thisInput
name
(str): The name of thisOutput
(the name used inConnector.getOutput()
)native
: A native handle that allows accessing additional Connext DDS APIs in C.
-
matched_publications
¶ Returns information about the matched publications
This property returns a list where each element is a dictionary with information about a publication matched with this Input.
Currently, the only key in the dictionaries is
"name"
, containing the publication name. If a publication doesn’t have name, the value for the keyname
isNone
.Note that Connector Outputs are automatically assigned a name from the data_writer name in the XML configuration.
-
read
()¶ Access the samples received by this Input
This operation performs the same operation as
take()
except that the samples remain accessible.
-
samples
¶ Allows iterating over the samples read by this input
This container provides iterators to access the data samples retrieved by the most-recent call to
read()
ortake()
.Return type: Samples
-
take
()¶ Accesses the sample received by this Input
After calling this method, the samples are accessible from
samples
-
wait
(timeout=None)¶ Wait for this input to receive data.
This method waits for the specified timeout for data to be received by this input. If the operation times out, it raises
TimeoutError
.Parameters: timeout (number) – The maximum time to wait in milliseconds. By default, infinite.
-
wait_for_publications
(timeout=None)¶ Waits until this input matches or unmatches a compatible DDS subscription.
If the operation times out, it will raise
TimeoutError
.Parameters: timeout (number) – The maximum time to wait in milliseconds. By default, infinite. Returns: The change in the current number of matched outputs. If a positive number is returned, the input has matched with new publishers. If a negative number is returned the input has unmatched from an output. It is possible for multiple matches and/or unmatches to be returned (e.g., 0 could be returned, indicating that the input matched the same number of writers as it unmatched).
6.6.2. Samples class¶
-
class
rticonnextdds_connector.
Samples
(input)¶ Provides access to the data samples read by an Input (
Input.samples
)This class provides the special method
__iter__
to iterate over the data samples and__getitem__
to access a specific sample by index. Both return the typeSampleIterator
.The default iterator provides access to all the data samples retrieved by the most-recent call to
read()
ortake()
. Usevalid_data_iter()
to access only samples with valid data.Samples
is the type of the propertyInput.samples
.For more information and examples see Accessing the data samples.
- Special methods:
__getitem__
gets a sample by index:input.samples[i]
__iter__
enables iteration:for s in input.samples: ...
-
length
¶ Returns the number of samples available
Returns: The number of samples available since the last time read/take was called
-
valid_data_iter
¶ Returns an iterator to the data samples with valid data
The iterator provides access to the data samples retrieved by the most-recent call to
Input.read()
orInput.take()
, and skips samples with invalid data (meta-data only).To access all samples, including those with meta-data only, iterate over
Input.samples
directly.By using this iterator, it is not necessary to check if each sample contains valid data.
Returns: An iterator to the data samples with valid Return type: ValidSampleIterator
6.6.3. SampleIterator class¶
-
class
rticonnextdds_connector.
SampleIterator
(input, index=-1)¶ Iterates and provides access to a data sample
A SampleIterator provides access to the data received by an input. SampleIterator is the iterator type of
Input.samples
.See Reading Data (Input).
- Special methods:
__getitem__
retrieves a field, see Accessing the data__iter__
enables iteration__next__
moves to the next sample
-
get_boolean
(field_name)¶ Gets the value of a boolean field in this sample
Parameters: field_name (str) – The name of the field. See Accessing the data. Returns: The boolean value for the field field_name
.
-
get_dictionary
(member_name=None)¶ Gets a dictionary with the values of all the fields of this sample
The dictionary keys are the field names and the dictionary values correspond to each field value. To see how nested types, sequences, and arrays are represented, see Accessing the data.
Parameters: member_name (str) – (Optional) The name of the complex member or field. The type of the member with name member_name must be an array, sequence, struct, value or union. Returns: A dictionary containing all the fields of the sample, or if a member_name is supplied, all the fields or elements of that member.
-
get_number
(field_name)¶ Gets the value of a numeric field in this sample
Note that this operation should not be used to retrieve values larger than
2^53
. See Accessing 64-bit integers for more information.Parameters: field_name (str) – The name of the field. See Accessing the data. Returns: The numeric value for the field field_name
.
-
get_string
(field_name)¶ Gets the value of a string field in this sample
Parameters: field_name (str) – The name of the field. See Accessing the data. Returns: The string value for the field field_name
.
-
info
¶ Provides access to this sample’s meta-data
The info object expects one of the SampleInfo field names:
value = sample_it.info[field]
Supported fields:
"source_timestamp"
, returns an integer representing nanoseconds"reception_timestamp"
, returns an integer representing nanoseconds"sample_identity"
, or"identity"
returns a dictionary (seeOutput.write()
)"related_sample_identity"
returns a dictionary (seeOutput.write()
)"valid_data"
, returns a boolean (equivalent tosample_it.valid_data
)"view_state"
, returns a string (either “NEW” or “NOT_NEW”)"instance_state"
, returns a string (one of “ALIVE”, “NOT_ALIVE_DISPOSED” or “NOT_ALIVE_NO_WRITERS”)"sample_state"
, returns a string (either “READ” or “NOT_READ”)
These fields are documented in The SampleInfo Structure section in the Connext DDS Core Libraries User’s Manual.
-
native
¶ Returns the native pointer to this sample
-
next
()¶ Moves to the next sample
-
valid_data
¶ Returns whether this sample contains valid data
If this returns
False
, this object’s getters cannot be called.
6.6.4. ValidSampleIterator class¶
-
class
rticonnextdds_connector.
ValidSampleIterator
(input, index=-1)¶ Iterates and provides access to data samples with valid data
This iterator provides the same methods as
SampleIterator
.See
Samples.valid_data_iter()
.-
next
()¶ Moves to the next sample
-