From 2ea27b925493da70428941fd1c52beee9834bb70 Mon Sep 17 00:00:00 2001 From: Antoniu Miclaus Date: Tue, 8 Nov 2022 11:54:07 +0200 Subject: [PATCH] ad4080: add pyadi-iio support Add support for ad4080. Signed-off-by: Antoniu Miclaus --- adi/__init__.py | 1 + adi/ad4080.py | 85 +++++++++++++++++++++++++++++++ doc/source/devices/adi.ad4080.rst | 7 +++ doc/source/devices/index.rst | 1 + examples/ad4080_example.py | 66 ++++++++++++++++++++++++ supported_parts.md | 1 + test/test_ad4080.py | 42 +++++++++++++++ 7 files changed, 203 insertions(+) create mode 100644 adi/ad4080.py create mode 100644 doc/source/devices/adi.ad4080.rst create mode 100644 examples/ad4080_example.py create mode 100644 test/test_ad4080.py diff --git a/adi/__init__.py b/adi/__init__.py index f521b1292..5519f03ff 100644 --- a/adi/__init__.py +++ b/adi/__init__.py @@ -12,6 +12,7 @@ from adi.ad936x import Pluto, ad9361, ad9363, ad9364 from adi.ad937x import ad9371, ad9375 from adi.ad4020 import ad4000, ad4001, ad4002, ad4003, ad4020 +from adi.ad4080 import ad4080 from adi.ad4110 import ad4110 from adi.ad4130 import ad4130 from adi.ad4170 import ad4170 diff --git a/adi/ad4080.py b/adi/ad4080.py new file mode 100644 index 000000000..90bb6e841 --- /dev/null +++ b/adi/ad4080.py @@ -0,0 +1,85 @@ +# Copyright (C) 2022 Analog Devices, Inc. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# - Neither the name of Analog Devices, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# - The use of this software may or may not infringe the patent rights +# of one or more patent holders. This license does not release you +# from the requirement that you obtain separate licenses from these +# patent holders to use this software. +# - Use of the software either in source or binary form, must be run +# on or directly connected to an Analog Devices Inc. component. +# +# THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. +# +# IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +# RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from adi.context_manager import context_manager +from adi.rx_tx import rx + + +class ad4080(rx, context_manager): + + """ AD4080 ADC """ + + _complex_data = False + _rx_channel_names = ["voltage0"] + _device_name = "ad4080" + + def __init__(self, uri=""): + + """Initialize.""" + context_manager.__init__(self, uri, self._device_name) + + self._rxadc = self._ctx.find_device("ad4080") + self._ctrl = self._ctx.find_device("ad4080") + + rx.__init__(self) + + @property + def test_mode(self): + """test_mode: Select Test Mode. Options are: + off midscale_short pos_fullscale neg_fullscale checkerboard pn_long pn_short one_zero_toggle user ramp""" + return self._get_iio_attr_str("voltage0", "test_mode", False) + + @test_mode.setter + def test_mode(self, value): + self._set_iio_attr_str("voltage0", "test_mode", False, value, self._rxadc) + + @property + def test_mode_available(self): + """test_mode_available: Options are: + off midscale_short pos_fullscale neg_fullscale checkerboard pn_long pn_short one_zero_toggle user ramp""" + return self._get_iio_attr_str("voltage0", "test_mode_available", False) + + @property + def scale(self): + """scale: Scale value""" + return self._get_iio_attr("voltage0", "scale", False) + + @property + def scale_available(self): + """scale_avaliable: Available scale value""" + return self._get_iio_attr("voltage0", "scale_available", False) + + @property + def sampling_frequency(self): + """sampling_frequency: Sampling frequency value""" + return self._get_iio_attr("voltage0", "sampling_frequency", False) diff --git a/doc/source/devices/adi.ad4080.rst b/doc/source/devices/adi.ad4080.rst new file mode 100644 index 000000000..56210f696 --- /dev/null +++ b/doc/source/devices/adi.ad4080.rst @@ -0,0 +1,7 @@ +ad4080 +================= + +.. automodule:: adi.ad4080 + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/devices/index.rst b/doc/source/devices/index.rst index 0401722cf..7d7e02e68 100644 --- a/doc/source/devices/index.rst +++ b/doc/source/devices/index.rst @@ -11,6 +11,7 @@ Supported Devices adi.ad2s1210 adi.ad4020 adi.ad405x + adi.ad4080 adi.ad4110 adi.ad4130 adi.ad4170 diff --git a/examples/ad4080_example.py b/examples/ad4080_example.py new file mode 100644 index 000000000..55bf90fb2 --- /dev/null +++ b/examples/ad4080_example.py @@ -0,0 +1,66 @@ +# Copyright (C) 2022 Analog Devices, Inc. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# - Neither the name of Analog Devices, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# - The use of this software may or may not infringe the patent rights +# of one or more patent holders. This license does not release you +# from the requirement that you obtain separate licenses from these +# patent holders to use this software. +# - Use of the software either in source or binary form, must be run +# on or directly connected to an Analog Devices Inc. component. +# +# THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. +# +# IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +# RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import sys + +import matplotlib.pyplot as plt +import numpy as np +from adi import ad4080 + +# Optionally passs URI as command line argument, +# else use default ip:analog.local +my_uri = sys.argv[1] if len(sys.argv) >= 2 else "ip:analog.local" +print("uri: " + str(my_uri)) + +my_adc = ad4080(uri=my_uri) + +print("Sampling frequency: ", my_adc.sampling_frequency) +print("Test mode: ", my_adc.test_mode) +print("Scale: ", my_adc.scale) + +plt.clf() +# Collect data +data = my_adc.rx() + +plt.plot(range(0, len(data)), data, label="channel0") +plt.xlabel("Data Point") +plt.ylabel("ADC counts") +plt.legend( + bbox_to_anchor=(0.0, 1.02, 1.0, 0.102), + loc="lower left", + ncol=4, + mode="expand", + borderaxespad=0.0, +) + +plt.show() diff --git a/supported_parts.md b/supported_parts.md index e20cb0d5e..8e45cceae 100644 --- a/supported_parts.md +++ b/supported_parts.md @@ -17,6 +17,7 @@ - AD4003 (AD4007, AD4011) - AD4020 - AD405x +- AD4080 - AD4130 - AD4110 - AD4111 diff --git a/test/test_ad4080.py b/test/test_ad4080.py new file mode 100644 index 000000000..a840428e4 --- /dev/null +++ b/test/test_ad4080.py @@ -0,0 +1,42 @@ +import pytest + +hardware = ["ad4080"] +classname = ["adi.ad4080"] + + +######################################### +@pytest.mark.iio_hardware(hardware, True) +@pytest.mark.parametrize("classname", [(classname)]) +@pytest.mark.parametrize("channel", [0]) +def test_ad4080_rx_data(test_dma_rx, iio_uri, classname, channel): + test_dma_rx(iio_uri, classname, channel) + + +# ######################################### +# @pytest.mark.iio_hardware(hardware) +# @pytest.mark.parametrize("classname", [(classname)]) +# @pytest.mark.parametrize( +# "attr, val", +# [ +# ( +# "test_mode", +# [ +# "off", +# "midscale_short", +# "pos_fullscale", +# "neg_fullscale", +# "checkerboard", +# "pn_long", +# "pn_short", +# "one_zero_toggle", +# "user", +# "bit_toggle", +# "sync", +# "one_bit_high", +# "mixed_bit_frequency", +# ], +# ), +# ], +# ) +# def test_ad4080_attr(test_attribute_multipe_values, iio_uri, classname, attr, val): +# test_attribute_multipe_values(iio_uri, classname, attr, val, 0)