forked from analogdevicesinc/pyadi-iio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathad353xr.py
269 lines (217 loc) · 8.67 KB
/
ad353xr.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# Copyright (C) 2025 Analog Devices, Inc.
#
# SPDX short identifier: ADIBSD
from adi.attribute import attribute
from adi.context_manager import context_manager
from adi.rx_tx import tx
class ad353xr(tx, context_manager):
""" AD353xr DAC """
_complex_data = False
channel = [] # type: ignore
_device_name = ""
def __init__(self, uri="", device_name=""):
"""Constructor for AD353xr class."""
context_manager.__init__(self, uri, self._device_name)
compatible_parts = ["ad3530r"]
self._ctrl = None
if not device_name:
device_name = compatible_parts[0]
else:
if device_name not in compatible_parts:
raise Exception(
f"Not a compatible device: {device_name}. Supported device names "
f"are: {','.join(compatible_parts)}"
)
# Select the device matching device_name as working device
for device in self._ctx.devices:
if device.name == device_name:
self._ctrl = device
self._txdac = device
break
if not self._ctrl:
raise Exception("Error in selecting matching device")
if not self._txdac:
raise Exception("Error in selecting matching device")
self._output_bits = []
for ch in self._ctrl.channels:
name = ch.id
self._output_bits.append(ch.data_format.bits)
self._tx_channel_names.append(name)
self.channel.append(self._channel(self._ctrl, name))
setattr(self, name, self._channel(self._ctrl, name))
tx.__init__(self)
@property
def output_bits(self):
"""AD353xr channel-wise number of output bits list"""
return self._output_bits
### Add device attributes here ###
@property
def sampling_frequency(self):
"""AD353xr sampling frequency config"""
return self._get_iio_dev_attr_str("sampling_frequency")
@sampling_frequency.setter
def sampling_frequency(self, value):
self._set_iio_dev_attr_str("sampling_frequency", value)
@property
def all_ch_operating_mode_avail(self):
"""AD353xr all channels operating mode available"""
return self._get_iio_dev_attr_str("all_ch_operating_mode_available")
@property
def all_ch_operating_mode(self):
"""AD353xr all channels operating mode config"""
return self._get_iio_dev_attr_str("all_ch_operating_mode")
@all_ch_operating_mode.setter
def all_ch_operating_mode(self, value):
if value in self.all_ch_operating_mode_avail:
self._set_iio_dev_attr_str("all_ch_operating_mode", value)
else:
raise ValueError(
"Error: Operating mode not supported \nUse one of: "
+ str(self.all_ch_operating_mode_avail)
)
@property
def all_ch_input_registers(self):
"""AD353xr all input registers config"""
return self._get_iio_dev_attr_str("all_ch_input_registers")
@all_ch_input_registers.setter
def all_ch_input_registers(self, value):
self._set_iio_dev_attr_str("all_ch_input_registers", value)
@property
def all_ch_raw(self):
"""AD353xr all dac registers config"""
return self._get_iio_dev_attr_str("all_ch_raw")
@all_ch_raw.setter
def all_ch_raw(self, value):
self._set_iio_dev_attr_str("all_ch_raw", value)
@property
def reference_select_available(self):
"""AD353xr reference voltage available"""
return self._get_iio_dev_attr_str("reference_select_available")
@property
def reference_select(self):
"""AD353xr reference voltage config"""
return self._get_iio_dev_attr_str("reference_select")
@reference_select.setter
def reference_select(self, value):
if value in self.reference_select_available:
self._set_iio_dev_attr_str("reference_select", value)
else:
raise ValueError(
"Error: Reference select not supported \nUse one of: "
+ str(self.reference_select_available)
)
@property
def sw_ldac_trigger_avail(self):
"""AD353xr sw_ldac_trigger available"""
return self._get_iio_dev_attr_str("sw_ldac_trigger_available")
@property
def sw_ldac_trigger(self):
"""AD353xr software ldac trigger config"""
return self._get_iio_dev_attr_str("sw_ldac_trigger")
@sw_ldac_trigger.setter
def sw_ldac_trigger(self, value):
if value in self.sw_ldac_trigger_avail:
self._set_iio_dev_attr_str("sw_ldac_trigger", value)
else:
raise ValueError(
"Error: Trigger value not supported \nUse one of: "
+ str(self.sw_ldac_trigger_avail)
)
@property
def hw_ldac_trigger_avail(self):
"""AD353xr hw_ldac_trigger available"""
return self._get_iio_dev_attr_str("hw_ldac_trigger_available")
@property
def hw_ldac_trigger(self):
"""AD353xr hardware ldac trigger config"""
return self._get_iio_dev_attr_str("hw_ldac_trigger")
@hw_ldac_trigger.setter
def hw_ldac_trigger(self, value):
if value in self.hw_ldac_trigger_avail:
self._set_iio_dev_attr_str("hw_ldac_trigger", value)
else:
raise ValueError(
"Error: Trigger value not supported \nUse one of: "
+ str(self.hw_ldac_trigger_avail)
)
@property
def range_avail(self):
"""AD353xr range available"""
return self._get_iio_dev_attr_str("range_available")
@property
def range(self):
"""AD353xr range config"""
return self._get_iio_dev_attr_str("range")
@range.setter
def range(self, value):
if value in self.range_avail:
self._set_iio_dev_attr_str("range", value)
else:
raise ValueError(
"Error: Range option not supported \nUse one of: "
+ str(self.range_avail)
)
@property
def mux_out_select_avail(self):
"""AD353xr mux_out_select available"""
return self._get_iio_dev_attr_str("mux_out_select_available")
@property
def mux_out_select(self):
"""AD353xr mux out select"""
return self._get_iio_dev_attr_str("mux_out_select")
@mux_out_select.setter
def mux_out_select(self, value):
if value in self.mux_out_select_avail:
self._set_iio_dev_attr_str("mux_out_select", value)
else:
raise ValueError(
"Error: Mux output option not supported \nUse one of: "
+ str(self.mux_out_select_avail)
)
############################################################################
class _channel(attribute):
"""AD353xr channel"""
def __init__(self, ctrl, channel_name):
self.name = channel_name
self._ctrl = ctrl
### Add channel attributes here ###
@property
def input_register(self):
"""AD353xr channel input register value"""
return self._get_iio_attr(self.name, "input_register", True)
@input_register.setter
def input_register(self, value):
self._set_iio_attr(self.name, "input_register", True, str(int(value)))
@property
def raw(self):
"""AD353xr channel raw value"""
return self._get_iio_attr(self.name, "raw", True)
@raw.setter
def raw(self, value):
self._set_iio_attr(self.name, "raw", True, str(int(value)))
@property
def offset(self):
"""AD353xr channel offset"""
return self._get_iio_attr(self.name, "offset", True)
@property
def scale(self):
"""AD353xr channel scale"""
return self._get_iio_attr(self.name, "scale", True)
@property
def operating_mode_avail(self):
"""AD353xr channel operating mode settings"""
return self._get_iio_attr_str(self.name, "operating_mode_available", True)
@property
def operating_mode(self):
"""AD353xr channel operating mode"""
return self._get_iio_attr_str(self.name, "operating_mode", True)
@operating_mode.setter
def operating_mode(self, value):
if value in self.operating_mode_avail:
self._set_iio_attr(self.name, "operating_mode", True, value)
else:
raise ValueError(
"Error: Operating mode not supported \nUse one of: "
+ str(self.operating_mode_avail)
)
#####################################################################