diff --git a/adi/__init__.py b/adi/__init__.py index d2d4ff84f..86f43b091 100644 --- a/adi/__init__.py +++ b/adi/__init__.py @@ -14,6 +14,7 @@ from adi.ad4020 import ad4000, ad4001, ad4002, ad4003, ad4020 from adi.ad4110 import ad4110 from adi.ad4130 import ad4130 +from adi.ad4170 import ad4170 from adi.ad4630 import ad4630, adaq42xx from adi.ad4858 import ad4858 from adi.ad5592r import ad5592r diff --git a/adi/ad4170.py b/adi/ad4170.py new file mode 100644 index 000000000..f7c87d67a --- /dev/null +++ b/adi/ad4170.py @@ -0,0 +1,94 @@ +# Copyright (C) 2024 Analog Devices, Inc. +# +# SPDX short identifier: ADIBSD + + +from decimal import Decimal + +import numpy as np +from adi.attribute import attribute +from adi.context_manager import context_manager +from adi.rx_tx import rx + + +class ad4170(rx, context_manager): + """ AD4170 ADC """ + + _complex_data = False + channels = [] # type: ignore + _device_name = "" + + def __init__(self, uri="", device_name=""): + + context_manager.__init__(self, uri, self._device_name) + + compatible_parts = ["ad4170"] + + self._ctrl = None + + if not device_name: + device_name = compatible_parts[0] + else: + if device_name not in compatible_parts: + raise Exception("Not a compatible device: " + device_name) + + # Select the device matching device_name as working device + for device in self._ctx.devices: + if device.name == device_name: + self._ctrl = device + self._rxadc = device + break + + self.channels = [] + for ch in self._ctrl.channels: + name = ch._id + self._rx_channel_names.append(name) + self.channels.append(self._channel(self._ctrl, name)) + + rx.__init__(self) + + class _channel(attribute): + """AD4170 channel""" + + def __init__(self, ctrl, channel_name): + self.name = channel_name + self._ctrl = ctrl + + @property + def raw(self): + """AD4170 channel raw value""" + return self._get_iio_attr(self.name, "raw", False) + + @property + def offset(self): + """AD4170 channel offset""" + return float(self._get_iio_attr_str(self.name, "offset", False)) + + @offset.setter + def offset(self, value): + self._set_iio_attr(self.name, "offset", False, str(Decimal(value).real)) + + @property + def scale(self): + """AD4170 channel scale""" + return float(self._get_iio_attr_str(self.name, "scale", False)) + + @scale.setter + def scale(self, value): + self._set_iio_attr(self.name, "scale", False, str(Decimal(value).real)) + + def to_volts(self, index, val): + """Converts raw value to SI + index - Channel index + val- Raw value """ + _scale = self.channel[index].scale + + ret = None + + if isinstance(val, np.int16): + ret = val * _scale + + if isinstance(val, np.ndarray): + ret = [x * _scale for x in val] + + return ret diff --git a/doc/source/devices/adi.ad4170.rst b/doc/source/devices/adi.ad4170.rst new file mode 100644 index 000000000..b5b3ed3fd --- /dev/null +++ b/doc/source/devices/adi.ad4170.rst @@ -0,0 +1,7 @@ +ad4170 +================= + +.. automodule:: adi.ad4170 + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/devices/index.rst b/doc/source/devices/index.rst index b9451ab08..2b41e444f 100644 --- a/doc/source/devices/index.rst +++ b/doc/source/devices/index.rst @@ -13,6 +13,7 @@ Supported Devices adi.ad405x adi.ad4110 adi.ad4130 + adi.ad4170 adi.ad4630 adi.ad469x adi.ad5592r diff --git a/examples/ad4170_example.py b/examples/ad4170_example.py new file mode 100644 index 000000000..3c192ae28 --- /dev/null +++ b/examples/ad4170_example.py @@ -0,0 +1,17 @@ +# Copyright (C) 2024 Analog Devices, Inc. +# +# SPDX short identifier: ADIBSD + +import adi +import numpy as np + +ad4170_dev = adi.ad4170("ip:analog") + +chn = 0 +ad4170_dev.rx_output_type = "SI" +ad4170_dev.rx_enabled_channels = [chn] +ad4170_dev.rx_buffer_size = 100 + +data = ad4170_dev.rx() + +print(data) diff --git a/supported_parts.md b/supported_parts.md index 0ddfdb1c2..060665fd1 100644 --- a/supported_parts.md +++ b/supported_parts.md @@ -25,6 +25,7 @@ - AD4115 - AD4116 - AD4134 +- AD4170 - AD4630 - AD4696 - AD4697 diff --git a/test/emu/devices/ad4170.xml b/test/emu/devices/ad4170.xml new file mode 100644 index 000000000..03bef190e --- /dev/null +++ b/test/emu/devices/ad4170.xml @@ -0,0 +1 @@ +]> \ No newline at end of file diff --git a/test/emu/hardware_map.yml b/test/emu/hardware_map.yml index a2b0ba1c4..ce4f03655 100644 --- a/test/emu/hardware_map.yml +++ b/test/emu/hardware_map.yml @@ -600,4 +600,13 @@ ad7134: - data_devices: - iio:device0 - pyadi_iio_class_support: - - ad7134 \ No newline at end of file + - ad7134 + +ad4170: + - ad4170 + - pyadi_iio_class_support: + - ad4170 + - emulate: + - filename: ad4170.xml + - data_devices: + - iio:device0 diff --git a/test/test_ad4170.py b/test/test_ad4170.py new file mode 100644 index 000000000..0257525e8 --- /dev/null +++ b/test/test_ad4170.py @@ -0,0 +1,12 @@ +import pytest + +hardware = "ad4170" +classname = "adi.ad4170" + + +######################################### +@pytest.mark.iio_hardware(hardware, True) +@pytest.mark.parametrize("classname", [(classname)]) +@pytest.mark.parametrize("channel", [0]) +def test_ad4170_rx_data(test_dma_rx, iio_uri, classname, channel): + test_dma_rx(iio_uri, classname, channel)