Skip to content

Commit

Permalink
Merge pull request #610 from analogdevicesinc/adis16550_add_support
Browse files Browse the repository at this point in the history
Add support for adis16550 and adis16550w
tfcollins authored Oct 28, 2024
2 parents be6d695 + ac2e3da commit dde58ee
Showing 9 changed files with 782 additions and 0 deletions.
1 change: 1 addition & 0 deletions adi/__init__.py
Original file line number Diff line number Diff line change
@@ -73,6 +73,7 @@
adis16547,
)
from adi.adis16507 import adis16507
from adi.adis16550 import adis16550
from adi.adl5240 import adl5240
from adi.adl5960 import adl5960
from adi.admv8818 import admv8818
473 changes: 473 additions & 0 deletions adi/adis16550.py

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions doc/source/devices/adi.adis16550.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
adis16550
====================

.. autoclass:: adi.adis16550
:members:
:undoc-members:
:show-inheritance:
:inherited-members:
1 change: 1 addition & 0 deletions doc/source/devices/index.rst
Original file line number Diff line number Diff line change
@@ -79,6 +79,7 @@ Supported Devices
adi.adis16507
adi.adis16545
adi.adis16547
adi.adis16550
adi.adl5240
adi.adl5960
adi.admv8818
59 changes: 59 additions & 0 deletions examples/adis16550_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Copyright (C) 2024 Analog Devices, Inc.
#
# SPDX short identifier: ADIBSD
import sys

import adi
import matplotlib.pyplot as plt

# Set up ADIS16550
my_dev_name = sys.argv[1]
my_uri = sys.argv[2]

dev = adi.adis16550(device_name=my_dev_name, uri=my_uri)

dev.rx_output_type = "raw"
dev.rx_enabled_channels = [0, 1, 2, 3, 4, 5]
# dev.rx_enabled_delta_channels = [7, 8, 9, 10, 11, 12]
dev.sample_rate = 10
dev.rx_buffer_size = 10

print("\nX acceleration: " + str(dev.accel_x_conv) + " m/s^2")
print("Y acceleration: " + str(dev.accel_y_conv) + " m/s^2")
print("Z acceleration: " + str(dev.accel_z_conv) + " m/s^2")

print("\nX angular velocity: " + str(dev.anglvel_x_conv) + " rad/s")
print("Y angular velocity: " + str(dev.anglvel_y_conv) + " rad/s")
print("Z angular velocity: " + str(dev.anglvel_z_conv) + " rad/s")

print("\nX delta velocity: " + str(dev.deltavelocity_x_conv) + " m/s")
print("Y delta velocity: " + str(dev.deltavelocity_y_conv) + " m/s")
print("Z delta velocity: " + str(dev.deltavelocity_z_conv) + " m/s")

print("\nX delta angle: " + str(dev.deltaangl_x_conv) + " rad")
print("Y delta angle: " + str(dev.deltaangl_y_conv) + " rad")
print("Z delta angle: " + str(dev.deltaangl_z_conv) + " rad")

dev.sample_rate = 2000
dev.magn_x_filter_low_pass_3db_frequency = 100
dev.anglvel_y_calibscale = 30
dev.anglvel_x_calibbias = 100

print("\nSampling frequency: " + str(dev.sample_rate))

print("Temperature raw value: " + str(dev.temp.raw))
print("Temperature scale value: " + str(dev.temp.scale))
print("Temperature offset value: " + str(dev.temp.offset))

print("X-axis gyro channel calibbias value: " + str(dev.anglvel_x_calibbias))
print("X-axis gyro channel calibscale value: " + str(dev.anglvel_y_calibscale))
print("X-axis magnetometer bandwidth: " + str(dev.magn_x_filter_low_pass_3db_frequency))

for _ in range(100):
data = dev.rx()
plt.clf()
for i, d in enumerate(data):
plt.plot(d, label=dev._rx_channel_names[dev.rx_enabled_channels[i]])
plt.legend()
plt.show(block=False)
plt.pause(0.1)
2 changes: 2 additions & 0 deletions supported_parts.md
Original file line number Diff line number Diff line change
@@ -143,6 +143,8 @@
- ADIS16507
- ADIS16545
- ADIS16547
- ADIS16550
- ADIS16550W
- ADL5240
- ADL5960
- ADMV8818
149 changes: 149 additions & 0 deletions test/emu/devices/adis16550.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE context [
<!ELEMENT context (device|context-attribute)*>
<!ELEMENT context-attribute EMPTY>
<!ELEMENT device (channel|attribute|debug-attribute|buffer-attribute)*>
<!ELEMENT channel (scan-element?,attribute*)>
<!ELEMENT attribute EMPTY>
<!ELEMENT scan-element EMPTY>
<!ELEMENT debug-attribute EMPTY>
<!ELEMENT buffer-attribute EMPTY>
<!ATTLIST context name CDATA #REQUIRED>
<!ATTLIST context description CDATA #IMPLIED>
<!ATTLIST context-attribute name CDATA #REQUIRED>
<!ATTLIST context-attribute value CDATA #REQUIRED>
<!ATTLIST device id CDATA #REQUIRED>
<!ATTLIST device name CDATA #IMPLIED>
<!ATTLIST channel id CDATA #REQUIRED>
<!ATTLIST channel type (input|output) #REQUIRED>
<!ATTLIST channel name CDATA #IMPLIED>
<!ATTLIST scan-element index CDATA #REQUIRED>
<!ATTLIST scan-element format CDATA #REQUIRED>
<!ATTLIST scan-element scale CDATA #IMPLIED>
<!ATTLIST attribute name CDATA #REQUIRED>
<!ATTLIST attribute filename CDATA #IMPLIED>
<!ATTLIST attribute value CDATA #IMPLIED>
<!ATTLIST debug-attribute name CDATA #REQUIRED>
<!ATTLIST debug-attribute value CDATA #IMPLIED>
<!ATTLIST buffer-attribute name CDATA #REQUIRED>
<!ATTLIST buffer-attribute value CDATA #IMPLIED>
]>
<context name="network" description="10.42.0.83 Linux analog 6.1.54-v7l+ #8 SMP Mon Sep 30 11:56:09 BST 2024 armv7l">
<context-attribute name="hw_carrier" value="Raspberry Pi 4 Model B Rev 1.2" />
<context-attribute name="dtoverlay" value="vc4-kms-v3d,adis16550" />
<context-attribute name="local,kernel" value="6.1.54-v7l+" />
<context-attribute name="uri" value="ip:10.42.0.83" />
<context-attribute name="ip,ip-addr" value="10.42.0.83" />
<device id="hwmon0" name="cpu_thermal">
<channel id="temp1" type="input">
<attribute name="crit" filename="temp1_crit" value="110000" />
<attribute name="input" filename="temp1_input" value="65731" />
</channel>
</device>
<device id="hwmon1" name="rpi_volt">
<channel id="in0" type="input">
<attribute name="lcrit_alarm" filename="in0_lcrit_alarm" value="0" />
</channel>
</device>
<device id="iio:device0" name="adis16550">
<channel id="anglvel_x" type="input">
<scan-element index="0" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="calibbias" filename="in_anglvel_x_calibbias" value="100" />
<attribute name="calibscale" filename="in_anglvel_x_calibscale" value="0" />
<attribute name="filter_low_pass_3db_frequency" filename="in_anglvel_filter_low_pass_3db_frequency" value="0" />
<attribute name="raw" filename="in_anglvel_x_raw" value="294318" />
<attribute name="scale" filename="in_anglvel_scale" value="0.000000003" />
</channel>
<channel id="anglvel_y" type="input">
<scan-element index="1" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="calibbias" filename="in_anglvel_y_calibbias" value="0" />
<attribute name="calibscale" filename="in_anglvel_y_calibscale" value="30" />
<attribute name="filter_low_pass_3db_frequency" filename="in_anglvel_filter_low_pass_3db_frequency" value="0" />
<attribute name="raw" filename="in_anglvel_y_raw" value="-656865" />
<attribute name="scale" filename="in_anglvel_scale" value="0.000000003" />
</channel>
<channel id="anglvel_z" type="input">
<scan-element index="2" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="calibbias" filename="in_anglvel_z_calibbias" value="0" />
<attribute name="calibscale" filename="in_anglvel_z_calibscale" value="0" />
<attribute name="filter_low_pass_3db_frequency" filename="in_anglvel_filter_low_pass_3db_frequency" value="0" />
<attribute name="raw" filename="in_anglvel_z_raw" value="431669" />
<attribute name="scale" filename="in_anglvel_scale" value="0.000000003" />
</channel>
<channel id="accel_x" type="input">
<scan-element index="3" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="calibbias" filename="in_accel_x_calibbias" value="0" />
<attribute name="calibscale" filename="in_accel_x_calibscale" value="0" />
<attribute name="filter_low_pass_3db_frequency" filename="in_accel_filter_low_pass_3db_frequency" value="0" />
<attribute name="raw" filename="in_accel_x_raw" value="-210881" />
<attribute name="scale" filename="in_accel_scale" value="0.000000095" />
</channel>
<channel id="accel_y" type="input">
<scan-element index="4" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="calibbias" filename="in_accel_y_calibbias" value="0" />
<attribute name="calibscale" filename="in_accel_y_calibscale" value="0" />
<attribute name="filter_low_pass_3db_frequency" filename="in_accel_filter_low_pass_3db_frequency" value="0" />
<attribute name="raw" filename="in_accel_y_raw" value="1598455" />
<attribute name="scale" filename="in_accel_scale" value="0.000000095" />
</channel>
<channel id="accel_z" type="input">
<scan-element index="5" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="calibbias" filename="in_accel_z_calibbias" value="0" />
<attribute name="calibscale" filename="in_accel_z_calibscale" value="0" />
<attribute name="filter_low_pass_3db_frequency" filename="in_accel_filter_low_pass_3db_frequency" value="0" />
<attribute name="raw" filename="in_accel_z_raw" value="103145573" />
<attribute name="scale" filename="in_accel_scale" value="0.000000095" />
</channel>
<channel id="temp0" type="input">
<scan-element index="6" format="be:s16/32&gt;&gt;0" scale="4.000000" />
<attribute name="offset" filename="in_temp0_offset" value="6250" />
<attribute name="raw" filename="in_temp0_raw" value="4369" />
<attribute name="scale" filename="in_temp0_scale" value="4" />
</channel>
<channel id="deltaangl_x" type="input">
<scan-element index="7" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="raw" filename="in_deltaangl_x_raw" value="-86" />
<attribute name="scale" filename="in_deltaangl_scale" value="0.000000006" />
</channel>
<channel id="deltaangl_y" type="input">
<scan-element index="8" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="raw" filename="in_deltaangl_y_raw" value="-162" />
<attribute name="scale" filename="in_deltaangl_scale" value="0.000000006" />
</channel>
<channel id="deltaangl_z" type="input">
<scan-element index="9" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="raw" filename="in_deltaangl_z_raw" value="169" />
<attribute name="scale" filename="in_deltaangl_scale" value="0.000000006" />
</channel>
<channel id="deltavelocity_x" type="input">
<scan-element index="10" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="raw" filename="in_deltavelocity_x_raw" value="246" />
<attribute name="scale" filename="in_deltavelocity_scale" value="0.000000058" />
</channel>
<channel id="deltavelocity_y" type="input">
<scan-element index="11" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="raw" filename="in_deltavelocity_y_raw" value="-75" />
<attribute name="scale" filename="in_deltavelocity_scale" value="0.000000058" />
</channel>
<channel id="deltavelocity_z" type="input">
<scan-element index="12" format="be:S32/32&gt;&gt;0" scale="0.000000" />
<attribute name="raw" filename="in_deltavelocity_z_raw" value="84684" />
<attribute name="scale" filename="in_deltavelocity_scale" value="0.000000058" />
</channel>
<channel id="timestamp" type="input">
<scan-element index="13" format="le:S64/64&gt;&gt;0" />
</channel>
<attribute name="current_timestamp_clock" value="realtime " />
<attribute name="sampling_frequency" value="2000.000000" />
<attribute name="waiting_for_supplier" value="0" />
<buffer-attribute name="data_available" value="64" />
<buffer-attribute name="direction" value="in" />
<debug-attribute name="flash_count" value="13" />
<debug-attribute name="firmware_date" value="28-04-2021" />
<debug-attribute name="firmware_revision" value="1.5" />
<debug-attribute name="product_id" value="16550" />
<debug-attribute name="serial_number" value="0x000000b6" />
<debug-attribute name="direct_reg_access" value="0x0" />
</device>
<device id="trigger0" name="adis16550-dev0" />
</context>
9 changes: 9 additions & 0 deletions test/emu/hardware_map.yml
Original file line number Diff line number Diff line change
@@ -584,6 +584,15 @@ adis16480:
- pyadi_iio_class_support:
- adis16480

adis16550:
- adis16550
- emulate:
- filename: adis16550.xml
- data_devices:
- iio:device0
- pyadi_iio_class_support:
- adis16550

ad7124-8:
- ad7124
- pyadi_iio_class_support:
80 changes: 80 additions & 0 deletions test/test_adis16550.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import iio

import adi
import pytest

hardware = "adis16550"
classname = "adi.adis16550"
device_name = "adis16550"


def do_mock():
def mock_set_trigger(self, value):
pass

# Mock the _set_trigger method in iio.Device
iio.Device._set_trigger = mock_set_trigger


#########################################
@pytest.mark.iio_hardware(hardware, False)
def test_adis16550_conv_data(iio_uri):
do_mock()
adis16550 = adi.adis16550(uri=iio_uri)

assert adis16550.accel_x_conv != 0.0
assert adis16550.accel_y_conv != 0.0
assert adis16550.accel_z_conv != 0.0
assert adis16550.anglvel_x_conv != 0.0
assert adis16550.anglvel_y_conv != 0.0
assert adis16550.anglvel_z_conv != 0.0
assert adis16550.temp_conv != 0.0


#########################################
@pytest.mark.iio_hardware(hardware, True)
@pytest.mark.parametrize("classname", [(classname)])
@pytest.mark.parametrize(
"attr, start, stop, step, tol",
[
("anglvel_x_calibbias", -2147483648, 2147483647, 1, 0),
("anglvel_y_calibbias", -2147483648, 2147483647, 1, 0),
("anglvel_z_calibbias", -2147483648, 2147483647, 1, 0),
("accel_x_calibbias", -2147483648, 2147483647, 1, 0),
("accel_y_calibbias", -2147483648, 2147483647, 1, 0),
("accel_z_calibbias", -2147483648, 2147483647, 1, 0),
("anglvel_x_calibscale", 0, 65535, 1, 0),
("anglvel_y_calibscale", 0, 65535, 1, 0),
("anglvel_z_calibscale", 0, 65535, 1, 0),
("accel_x_calibscale", 0, 65535, 1, 0),
("accel_y_calibscale", 0, 65535, 1, 0),
("accel_z_calibscale", 0, 65535, 1, 0),
],
)
def test_adis16550_attr(
test_attribute_single_value, iio_uri, classname, attr, start, stop, step, tol
):
do_mock()
test_attribute_single_value(iio_uri, classname, attr, start, stop, step, tol)


#########################################
@pytest.mark.iio_hardware(hardware, True)
@pytest.mark.parametrize("classname", [(classname)])
@pytest.mark.parametrize(
"attr, values, tol, repeats",
[
("sample_rate", [5, 10, 246, 1230, 2460], 0.5, 2),
("anglvel_x_filter_low_pass_3db_frequency", [0, 55, 275, 310], 0.5, 2),
("anglvel_y_filter_low_pass_3db_frequency", [0, 55, 275, 310], 0.5, 2),
("anglvel_z_filter_low_pass_3db_frequency", [0, 55, 275, 310], 0.5, 2),
("accel_x_filter_low_pass_3db_frequency", [0, 55, 275, 310], 0.5, 2),
("accel_y_filter_low_pass_3db_frequency", [0, 55, 275, 310], 0.5, 2),
("accel_z_filter_low_pass_3db_frequency", [0, 55, 275, 310], 0.5, 2),
],
)
def test_adis16550_attr_multiple_val(
test_attribute_multiple_values, iio_uri, classname, attr, values, tol, repeats,
):
do_mock()
test_attribute_multiple_values(iio_uri, classname, attr, values, tol, repeats)

0 comments on commit dde58ee

Please sign in to comment.