adi_iio_node
: service call reference
Prerequisites:
The command below launches the adi_iio_node executable from the adi_iio package.
The uri
parameter is used to describe the context location of the IIO device.
URI=ip:192.168.2.1
ros2 run adi_iio adi_iio_node \
--ros-args \
-p uri:=$URI \
--log-level debug
From a new terminal you can view the names of all the running nodes:
ros2 node list
The terminal should return the node name, which indicates it is running.
/adi_iio_node
Warning
The adi_iio_node
executable must be running in order to use the services
described below.
Overview:
Inspect node information:
ros2 node info /adi_iio_node
You should see a list like this:
/adi_iio_node Subscribers: /parameter_events: rcl_interfaces/msg/ParameterEvent Publishers: /parameter_events: rcl_interfaces/msg/ParameterEvent /rosout: rcl_interfaces/msg/Log Service Servers: /adi_iio_node/AttrDisableTopic: adi_iio/srv/AttrDisableTopic /adi_iio_node/AttrEnableTopic: adi_iio/srv/AttrEnableTopic /adi_iio_node/AttrReadString: adi_iio/srv/AttrReadString /adi_iio_node/AttrWriteString: adi_iio/srv/AttrWriteString /adi_iio_node/BufferCreate: adi_iio/srv/BufferCreate /adi_iio_node/BufferDestroy: adi_iio/srv/BufferDestroy /adi_iio_node/BufferDisableTopic: adi_iio/srv/BufferDisableTopic /adi_iio_node/BufferEnableTopic: adi_iio/srv/BufferEnableTopic /adi_iio_node/BufferRead: adi_iio/srv/BufferRead /adi_iio_node/BufferRefill: adi_iio/srv/BufferRefill /adi_iio_node/BufferWrite: adi_iio/srv/BufferWrite /adi_iio_node/ListAttributes: adi_iio/srv/ListAttributes /adi_iio_node/ListChannels: adi_iio/srv/ListChannels /adi_iio_node/ListDevices: adi_iio/srv/ListDevices /adi_iio_node/ScanContext: adi_iio/srv/ScanContext /adi_iio_node/describe_parameters: rcl_interfaces/srv/DescribeParameters /adi_iio_node/get_parameter_types: rcl_interfaces/srv/GetParameterTypes /adi_iio_node/get_parameters: rcl_interfaces/srv/GetParameters /adi_iio_node/list_parameters: rcl_interfaces/srv/ListParameters /adi_iio_node/set_parameters: rcl_interfaces/srv/SetParameters /adi_iio_node/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically Service Clients: Action Servers: Action Clients:
Inspect exposed services:
Running the command
ros2 service list --show-types
should return a list containing only the services currently available in the system along with their associated types:/adi_iio_node/AttrDisableTopic [adi_iio/srv/AttrDisableTopic] /adi_iio_node/AttrEnableTopic [adi_iio/srv/AttrEnableTopic] /adi_iio_node/AttrReadString [adi_iio/srv/AttrReadString] /adi_iio_node/AttrWriteString [adi_iio/srv/AttrWriteString] /adi_iio_node/BufferCreate [adi_iio/srv/BufferCreate] /adi_iio_node/BufferDestroy [adi_iio/srv/BufferDestroy] /adi_iio_node/BufferDisableTopic [adi_iio/srv/BufferDisableTopic] /adi_iio_node/BufferEnableTopic [adi_iio/srv/BufferEnableTopic] /adi_iio_node/BufferRead [adi_iio/srv/BufferRead] /adi_iio_node/BufferRefill [adi_iio/srv/BufferRefill] /adi_iio_node/BufferWrite [adi_iio/srv/BufferWrite] /adi_iio_node/ListAttributes [adi_iio/srv/ListAttributes] ...
You can inspect the interface of each service in order to find the request (above) and response (below) parameters. For example:
ros2 interface show adi_iio/srv/AttrWriteString
Which will return the interface of the service:
string attr_path string value --- bool success string message
Service Call Reference:
ScanContext
For complete details about the request and response format of this service, please refer to the ScanContext service documentation.
Usage:
ros2 service call /adi_iio_node/ScanContext adi_iio/srv/ScanContext
The output should look like this:
requester: making request: adi_iio.srv.ScanContext_Request()
response:
adi_iio.srv.ScanContext_Response(success=True, message='Found: Context attributes: 16; Devices: 14; Channels: 98; Device attributes: 54; Channel attributes: 372; ', devices=['xadc', 'ad5625', 'm2k-fabric', 'm2k-adc-trigger', 'ad9963', 'm2k-adc', 'ad5627', 'pll', 'm2k-dds', 'm2k-dac-a', 'm2k-dac-b', 'm2k-logic-analyzer', 'm2k-logic-analyzer-tx', 'm2k-logic-analyzer-rx'], channels=['xadc/input_voltage5', 'xadc/input_voltage0', 'xadc/input_voltage4', 'xadc/input_temp0', ....)
The response fields contain lists of IIO Path values.
ListDevices
For complete details about the request and response format of this service, please refer to the ListDevices service documentation.
Usage:
ros2 service call /adi_iio_node/ListDevices adi_iio/srv/ListDevices
The output should look like this:
requester: making request: adi_iio.srv.ListDevices_Request()
response:
adi_iio.srv.ListDevices_Response(success=True, message='Found 14 devices', data=['xadc', 'ad5625', 'm2k-fabric', 'm2k-adc-trigger', 'ad9963', 'm2k-adc', 'ad5627', 'pll', 'm2k-dds', 'm2k-dac-a', 'm2k-dac-b', 'm2k-logic-analyzer', 'm2k-logic-analyzer-tx', 'm2k-logic-analyzer-rx'])
The data
field from the response contains a list of device_paths
as
described in the Device Path (device_path) section.
ListChannels
For complete details about the request and response format of this service, please refer to the ListChannels service documentation.
Usage:
The request interface for this service requires the user to specify the
iio_path
using a valid Device Path (device_path) value.
ros2 service call /adi_iio_node/ListChannels adi_iio/srv/ListChannels "{
iio_path: 'm2k-adc'
}"
The output should look like this:
requester: making request: adi_iio.srv.ListChannels_Request(iio_path='m2k-adc')
response:
adi_iio.srv.ListChannels_Response(success=True, message='Found 2 channels in device: m2k-adc', data=['m2k-adc/input_voltage0', 'm2k-adc/input_voltage1'])
The data
field from the response contains a list of channel_paths
as
described in the Channel Path (channel_path) section.
ListAttributes
For complete details about the request and response format of this service, please refer to the ListAttributes service documentation.
Usage:
The request interface for this service requires the user to specify the
iio_path
using a valid Context Path, Device Path (device_path), or
:ref:Channel Path
value.
Context Path attributes:
ros2 service call /adi_iio_node/ListAttributes adi_iio/srv/ListAttributes "{
iio_path: ''
}"
The output should look like this:
requester: making request: adi_iio.srv.ListAttributes_Request(iio_path='')
response:
adi_iio.srv.ListAttributes_Response(success=True, message='Found 16 attributes', data=['hw_model', 'hw_model_variant', 'hw_serial', 'fw_version', 'cal,offset_pos_dac', 'cal,gain_pos_dac', 'cal,offset_pos_adc', 'cal,gain_pos_adc', 'cal,offset_neg_dac', 'cal,gain_neg_dac', 'cal,offset_neg_adc', 'cal,gain_neg_adc', 'cal,temp_lut', 'local,kernel', 'uri', 'ip,ip-addr'])
The data
field from the response contains a list of attr_path
to
context attributes as described in the Context Attribute Path (attr_path) section.
Device Path attributes:
ros2 service call /adi_iio_node/ListAttributes adi_iio/srv/ListAttributes "{
iio_path: 'm2k-dac-a'
}"
The output should look like this:
requester: making request: adi_iio.srv.ListAttributes_Request(iio_path='m2k-dac-a')
response:
adi_iio.srv.ListAttributes_Response(success=True, message='Found 11 attributes in device: m2k-dac-a', data=['m2k-dac-a/auto_rearm_trigger', 'm2k-dac-a/calibscale', 'm2k-dac-a/dma_sync', 'm2k-dac-a/dma_sync_start', 'm2k-dac-a/oversampling_ratio', 'm2k-dac-a/sampling_frequency', 'm2k-dac-a/sampling_frequency_available', 'm2k-dac-a/trigger_condition', 'm2k-dac-a/trigger_condition_available', 'm2k-dac-a/trigger_src', 'm2k-dac-a/trigger_src_available'])
The data
field from the response contains a list of attr_path
to
device attributes as described in the Device Attribute Path (attr_path) section.
Channel Path attributes:
ros2 service call /adi_iio_node/ListAttributes adi_iio/srv/ListAttributes "{
iio_path: 'm2k-dac-a/output_voltage0'
}"
The output should look like this:
requester: making request: adi_iio.srv.ListAttributes_Request(iio_path='m2k-dac-a/output_voltage0')
response:
adi_iio.srv.ListAttributes_Response(success=True, message='Found 5 attributes in channel: output_voltage0', data=['m2k-dac-a/output_voltage0/raw', 'm2k-dac-a/output_voltage0/raw_enable', 'm2k-dac-a/output_voltage0/raw_enable_available', 'm2k-dac-a/output_voltage0/trigger_status', 'm2k-dac-a/output_voltage0/trigger_status_available'])
The data
field from the response contains a list of attr_path
to
channel attributes as described in the Channel Attribute Path (attr_path) section.
AttrEnableTopic
For complete details about the request and response format of this service, please refer to the AttrEnableTopic service documentation.
Usage:
ros2 service call /adi_iio_node/AttrEnableTopic adi_iio/srv/AttrEnableTopic "{
attr_path: xadc/input_temp0/raw
}"
The output should look like this:
requester: making request: adi_iio.srv.AttrEnableTopic_Request(attr_path='xadc/input_temp0/raw', topic_name='', loop_rate=1, type=0)
response:
adi_iio.srv.AttrEnableTopic_Response(success=True, message='Success')
Note
Running the command ros2 topic list
should show the new topics created:
/xadc/input_temp0/raw/read
and /xadc/input_temp0/raw/write
. Since
this example uses an input channel, we can monitor the topic using the
command ros2 topic echo /xadc/input_temp0/raw/read
.
Note
Control the data type of the topic:
ros2 service call /adi_iio_node/AttrEnableTopic adi_iio/srv/AttrEnableTopic "{
attr_path: xadc/input_temp0/raw,
type: 1
}"
Control the loop rate of the topic:
ros2 service call /adi_iio_node/AttrEnableTopic adi_iio/srv/AttrEnableTopic "{
attr_path: xadc/input_temp0/raw,
loop_rate: 10
}"
AttrDisableTopic
For complete details about the request and response format of this service, please refer to the AttrDisableTopic service documentation.
Usage:
ros2 service call /adi_iio_node/AttrDisableTopic adi_iio/srv/AttrDisableTopic "{
topic_name: xadc/input_temp0/raw
}"
The output should look like this:
requester: making request: adi_iio.srv.AttrDisableTopic_Request(topic_name='xadc/input_temp0/raw', type=0)
response:
adi_iio.srv.AttrDisableTopic_Response(success=True, message='Success')
AttrReadString
For complete details about the request and response format of this service, please refer to the AttrReadString service documentation.
Usage:
ros2 service call /adi_iio_node/AttrReadString adi_iio/srv/AttrReadString "{
attr_path: xadc/input_temp0/raw
}"
The output should look like this:
requester: making request: adi_iio.srv.AttrReadString_Request(attr_path='xadc/input_temp0/raw')
response:
adi_iio.srv.AttrReadString_Response(success=True, message='2690')
AttrWriteString
For complete details about the request and response format of this service, please refer to the AttrWriteString service documentation.
Usage:
ros2 service call /adi_iio_node/AttrWriteString adi_iio/srv/AttrWriteString "{
attr_path: m2k-dac-a/voltage0/raw,
value: 123
}"
The output should look like this:
requester: making request: adi_iio.srv.AttrWriteString_Request(attr_path='m2k-dac-a/voltage0/raw', value='123')
response:
adi_iio.srv.AttrWriteString_Response(success=True, message='123')
BufferCreate
For complete details about the request and response format of this service, please refer to the BufferCreate service documentation.
Usage:
# Device has 2 inpus channels
ros2 service call /adi_iio_node/BufferCreate adi_iio/srv/BufferCreate "{
device_path: 'm2k-adc',
channels: ['voltage0', 'voltage1'],
samples_count: 8,
}"
# Alternatively, you can explicitly specify the channel direction
ros2 service call /adi_iio_node/BufferCreate adi_iio/srv/BufferCreate "{
device_path: 'm2k-adc',
channels: ['input_voltage0', 'input_voltage1'],
samples_count: 8,
}"
The output should look like this:
requester: making request: adi_iio.srv.BufferCreate_Request(device_path='m2k-adc', channels=['voltage0', 'voltage1'], samples_count=8)
response:
adi_iio.srv.BufferCreate_Response(success=True, message='Success', layout=std_msgs.msg.MultiArrayLayout(dim=[std_msgs.msg.MultiArrayDimension(label='samples', size=8, stride=16), std_msgs.msg.MultiArrayDimension(label='channels', size=2, stride=2)], data_offset=0))
BufferDestroy
For complete details about the request and response format of this service, please refer to the BufferDestroy service documentation.
Usage:
ros2 service call /adi_iio_node/BufferDestroy adi_iio/srv/BufferDestroy "{
device_path: 'm2k-adc'
}"
The output should look like this:
requester: making request: adi_iio.srv.BufferDestroy_Request(device_path='m2k-adc')
response:
adi_iio.srv.BufferDestroy_Response(success=True, message='Success')
BufferDisableTopic
For complete details about the request and response format of this service, please refer to the BufferDisableTopic service documentation.
Usage:
ros2 service call /adi_iio_node/BufferDisableTopic adi_iio/srv/BufferDisableTopic "{
device_path: 'm2k-adc',
}"
The output should look like this:
requester: making request: adi_iio.srv.BufferDisableTopic_Request(device_path='m2k-adc')
response:
adi_iio.srv.BufferDisableTopic_Response(success=True, message='Success')
BufferEnableTopic
For complete details about the request and response format of this service, please refer to the BufferEnableTopic service documentation.
Usage:
ros2 service call /adi_iio_node/BufferEnableTopic adi_iio/srv/BufferEnableTopic "{
device_path: 'm2k-adc',
topic_name: 'm2k-adc'
}"
The output should look like this:
requester: making request: adi_iio.srv.BufferEnableTopic_Request(device_path='m2k-adc', topic_name='m2k-adc')
response:
adi_iio.srv.BufferEnableTopic_Response(success=True, message='Success')
Note
The BufferEnableTopic
service is used to stream the buffer data to a topic.
For this, you need to create a buffer using the BufferCreate
service first.
BufferRead
For complete details about the request and response format of this service, please refer to the BufferRead service documentation.
Usage:
ros2 service call /adi_iio_node/BufferRead adi_iio/srv/BufferRead "{
device_path: 'm2k-adc',
channels: ['voltage0', 'voltage1'],
samples_count: 8
}"
The output should look like this:
requester: making request: adi_iio.srv.BufferRead_Request(device_path='m2k-adc', channels=['voltage0', 'voltage1'], samples_count=8)
response:
adi_iio.srv.BufferRead_Response(success=True, message='Success', buffer=std_msgs.msg.Int32MultiArray(layout=std_msgs.msg.MultiArrayLayout(dim=[std_msgs.msg.MultiArrayDimension(label='samples', size=8, stride=16), std_msgs.msg.MultiArrayDimension(label='channels', size=2, stride=2)], data_offset=0), data=[61, -65, 60, -65, 61, -65, 60, -65, 61, -64, 62, -64, 61, -66, 60, -66]))
BufferRefill
For complete details about the request and response format of this service, please refer to the BufferRefill service documentation.
Usage:
ros2 service call /adi_iio_node/BufferRefill adi_iio/srv/BufferRefill "{
device_path: 'm2k-adc'
}"
The output should look like this:
requester: making request: adi_iio.srv.BufferRefill_Request(device_path='m2k-adc')
response:
adi_iio.srv.BufferRefill_Response(success=True, message='Success', buffer=std_msgs.msg.Int32MultiArray(layout=std_msgs.msg.MultiArrayLayout(dim=[std_msgs.msg.MultiArrayDimension(label='samples', size=8, stride=16), std_msgs.msg.MultiArrayDimension(label='channels', size=2, stride=2)], data_offset=0), data=[61, -65, 61, -64, 62, -66, 62, -66, 62, -65, 60, -65, 60, -65, 61, -63]))
Note
The BufferRefill
service is used to refill the buffer with new data.
For this, you need to create a buffer using the BufferCreate
service first.
BufferWrite
For complete details about the request and response format of this service, please refer to the BufferWrite service documentation.
Usage:
ros2 service call /adi_iio_node/BufferWrite adi_iio/srv/BufferWrite "{
device_path: m2k-dac-a,
channels: ['voltage0'],
cyclic: 0,
buffer: {
layout: {
dim: [
{
label: "samples",
size: 4,
stride: 4
},
{
label: "channels",
size: 1,
stride: 1
}
],
data_offset: 0
},
data: [ 12345, 12345, 12345, 12345 ]
}
}"
The output should look like this:
requester: making request: adi_iio.srv.BufferWrite_Request(device_path='m2k-dac-a', channels=['voltage0'], buffer=std_msgs.msg.Int32MultiArray(layout=std_msgs.msg.MultiArrayLayout(dim=[std_msgs.msg.MultiArrayDimension(label='samples', size=4, stride=4), std_msgs.msg.MultiArrayDimension(label='channels', size=1, stride=1)], data_offset=0), data=[12345, 12345, 12345, 12345]), cyclic=False)
response:
adi_iio.srv.BufferWrite_Response(success=True, message='Success')