##// END OF EJS Templates
fixed mistake on duration, more complicated expected.
Alexis Jeandet -
r6:cb654cd99d73 default
parent child
Show More
@@ -1,373 +1,374
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 #-*- coding: utf-8 -*-
2 #-*- coding: utf-8 -*-
3 """Simple python library to drive the analog discovery module from www.digilentinc.com
3 """Simple python library to drive the analog discovery module from www.digilentinc.com
4 """
4 """
5
5
6 from ctypes import *
6 from ctypes import *
7 import time
7 import time
8 import sys
8 import sys
9 import os
9 import os
10 import matplotlib.pyplot as plt
10 import matplotlib.pyplot as plt
11 import numpy as np
11 import numpy as np
12
12
13 __author__ = "Alexis Jeandet"
13 __author__ = "Alexis Jeandet"
14 __copyright__ = "Copyright 2015, Laboratory of Plasma Physics"
14 __copyright__ = "Copyright 2015, Laboratory of Plasma Physics"
15 __credits__ = []
15 __credits__ = []
16 __license__ = "GPLv2"
16 __license__ = "GPLv2"
17 __version__ = "1.0.0"
17 __version__ = "1.0.0"
18 __maintainer__ = "Alexis Jeandet"
18 __maintainer__ = "Alexis Jeandet"
19 __email__ = "alexis.jeandet@member.fsf.org"
19 __email__ = "alexis.jeandet@member.fsf.org"
20 __status__ = "Production"
20 __status__ = "Production"
21
21
22
22
23 nodev = c_int(0)
23 nodev = c_int(0)
24 DwfStateDone = c_int(2)
24 DwfStateDone = c_int(2)
25
25
26 DECIAnalogInChannelCount = c_int(1)
26 DECIAnalogInChannelCount = c_int(1)
27 DECIAnalogOutChannelCount = c_int(2)
27 DECIAnalogOutChannelCount = c_int(2)
28 DECIAnalogIOChannelCount = c_int(3)
28 DECIAnalogIOChannelCount = c_int(3)
29 DECIDigitalInChannelCount = c_int(4)
29 DECIDigitalInChannelCount = c_int(4)
30 DECIDigitalOutChannelCount = c_int(5)
30 DECIDigitalOutChannelCount = c_int(5)
31 DECIDigitalIOChannelCount = c_int(6)
31 DECIDigitalIOChannelCount = c_int(6)
32 DECIAnalogInBufferSize = c_int(7)
32 DECIAnalogInBufferSize = c_int(7)
33 DECIAnalogOutBufferSize = c_int(8)
33 DECIAnalogOutBufferSize = c_int(8)
34 DECIDigitalInBufferSize = c_int(9)
34 DECIDigitalInBufferSize = c_int(9)
35 DECIDigitalOutBufferSize = c_int(10)
35 DECIDigitalOutBufferSize = c_int(10)
36
36
37 trigsrcNone = c_byte(0)
37 trigsrcNone = c_byte(0)
38 trigsrcPC = c_byte(1)
38 trigsrcPC = c_byte(1)
39 trigsrcDetectorAnalogIn = c_byte(2)
39 trigsrcDetectorAnalogIn = c_byte(2)
40 trigsrcDetectorDigitalIn = c_byte(3)
40 trigsrcDetectorDigitalIn = c_byte(3)
41 trigsrcAnalogIn = c_byte(4)
41 trigsrcAnalogIn = c_byte(4)
42 trigsrcDigitalIn = c_byte(5)
42 trigsrcDigitalIn = c_byte(5)
43 trigsrcDigitalOut = c_byte(6)
43 trigsrcDigitalOut = c_byte(6)
44 trigsrcAnalogOut1 = c_byte(7)
44 trigsrcAnalogOut1 = c_byte(7)
45 trigsrcAnalogOut2 = c_byte(8)
45 trigsrcAnalogOut2 = c_byte(8)
46 trigsrcAnalogOut3 = c_byte(9)
46 trigsrcAnalogOut3 = c_byte(9)
47 trigsrcAnalogOut4 = c_byte(10)
47 trigsrcAnalogOut4 = c_byte(10)
48 trigsrcExternal1 = c_byte(11)
48 trigsrcExternal1 = c_byte(11)
49 trigsrcExternal2 = c_byte(12)
49 trigsrcExternal2 = c_byte(12)
50 trigsrcExternal3 = c_byte(13)
50 trigsrcExternal3 = c_byte(13)
51 trigsrcExternal4 = c_byte(14)
51 trigsrcExternal4 = c_byte(14)
52 trigAuto = c_byte(254)
52 trigAuto = c_byte(254)
53 trigNormal = c_byte(255)
53 trigNormal = c_byte(255)
54
54
55 AnalogOutNodeCarrier = c_int(0)
55 AnalogOutNodeCarrier = c_int(0)
56 AnalogOutNodeFM = c_int(1)
56 AnalogOutNodeFM = c_int(1)
57 AnalogOutNodeAM = c_int(2)
57 AnalogOutNodeAM = c_int(2)
58
58
59
59
60 shapes = {'DC' : 0,
60 shapes = {'DC' : 0,
61 'Sine' : 1,
61 'Sine' : 1,
62 'Square' : 2,
62 'Square' : 2,
63 'Triangle' : 3,
63 'Triangle' : 3,
64 'RampUp' : 4,
64 'RampUp' : 4,
65 'RampDown' : 5,
65 'RampDown' : 5,
66 'Noise' : 6,
66 'Noise' : 6,
67 'Custom' : 30,
67 'Custom' : 30,
68 'Play' :31, }
68 'Play' :31, }
69
69
70 closed=False
70 closed=False
71 opened=True
71 opened=True
72
72
73
73
74 class DiscoveryLimits(object):
74 class DiscoveryLimits(object):
75 class limitRange(object):
75 class limitRange(object):
76 def __init__(self,Min,Max,name="Unknow",unit=""):
76 def __init__(self,Min,Max,name="Unknow",unit=""):
77 self.Min = Min
77 self.Min = Min
78 self.Max = Max
78 self.Max = Max
79 self.name = name
79 self.name = name
80 self.unit = unit
80 self.unit = unit
81
81
82 def conform(self,value):
82 def conform(self,value):
83 if value<self.Min:
83 if value<self.Min:
84 raise UserWarning("Parameter "+self.name+" out of bound\nValue="+str(value)+"\nForce to "+str(self.Min))
84 raise UserWarning("Parameter "+self.name+" out of bound\nValue="+str(value)+"\nForce to "+str(self.Min))
85 return self.Min
85 return self.Min
86 if value>self.Max:
86 if value>self.Max:
87 raise UserWarning("Parameter "+self.name+" out of bound\nValue="+str(value)+"\nForce to "+str(self.Max))
87 raise UserWarning("Parameter "+self.name+" out of bound\nValue="+str(value)+"\nForce to "+str(self.Max))
88 return self.Max
88 return self.Max
89 return value
89 return value
90
90
91 def __str__(self):
91 def __str__(self):
92 return self.name + ":\n Min="+str(self.Min)+" "+self.unit+",Max="+str(self.Max)+" "+self.unit
92 return self.name + ":\n Min="+str(self.Min)+" "+self.unit+",Max="+str(self.Max)+" "+self.unit
93
93
94 errors = {0: RuntimeError("No card opened"),
94 errors = {0: RuntimeError("No card opened"),
95 1: UserWarning("Parameter out of bound"),
95 1: UserWarning("Parameter out of bound"),
96 }
96 }
97 def __init__(self,libdwf,hdwf):
97 def __init__(self,libdwf,hdwf):
98 self.limits=[]
98 self.limits=[]
99 self.ACQ_IN_RANGES=[0.0]
99 self.ACQ_IN_RANGES=[0.0]
100 if hdwf.value == nodev.value:
100 if hdwf.value == nodev.value:
101 return
101 return
102 self.__hdwf=hdwf
102 self.__hdwf=hdwf
103 self.__libdwf=libdwf
103 self.__libdwf=libdwf
104 Mind=c_double()
104 Mind=c_double()
105 Maxd=c_double()
105 Maxd=c_double()
106 Mini=c_int()
106 Mini=c_int()
107 Maxi=c_int()
107 Maxi=c_int()
108 StepsCount=c_int()
108 StepsCount=c_int()
109 Steps=(c_double*32)()
109 Steps=(c_double*32)()
110 self.__libdwf.FDwfAnalogInBufferSizeInfo(self.__hdwf, byref(Mini), byref(Maxi))
110 self.__libdwf.FDwfAnalogInBufferSizeInfo(self.__hdwf, byref(Mini), byref(Maxi))
111 self.ACQ_BUF=self.limitRange(Mini.value,Maxi.value,"ACQ Buffer Size","Sps")
111 self.ACQ_BUF=self.limitRange(Mini.value,Maxi.value,"ACQ Buffer Size","Sps")
112 self.limits.append(self.ACQ_BUF)
112 self.limits.append(self.ACQ_BUF)
113 self.__libdwf.FDwfAnalogInFrequencyInfo(self.__hdwf, byref(Mind), byref(Maxd))
113 self.__libdwf.FDwfAnalogInFrequencyInfo(self.__hdwf, byref(Mind), byref(Maxd))
114 self.ACQ_FREQ=self.limitRange(Mind.value,Maxd.value,"ACQ Frequency","Hz")
114 self.ACQ_FREQ=self.limitRange(Mind.value,Maxd.value,"ACQ Frequency","Hz")
115 self.limits.append(self.ACQ_FREQ)
115 self.limits.append(self.ACQ_FREQ)
116 self.__libdwf.FDwfAnalogInChannelRangeSteps(self.__hdwf, byref(Steps), byref(StepsCount))
116 self.__libdwf.FDwfAnalogInChannelRangeSteps(self.__hdwf, byref(Steps), byref(StepsCount))
117 self.ACQ_IN_RANGES=Steps[0:StepsCount.value]
117 self.ACQ_IN_RANGES=Steps[0:StepsCount.value]
118 self.__libdwf.FDwfAnalogOutNodeAmplitudeInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
118 self.__libdwf.FDwfAnalogOutNodeAmplitudeInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
119 byref(Mind), byref(Maxd))
119 byref(Mind), byref(Maxd))
120 self.GEN_AMPL=self.limitRange(Mind.value,Maxd.value,"GEN Amplitude","V")
120 self.GEN_AMPL=self.limitRange(Mind.value,Maxd.value,"GEN Amplitude","V")
121 self.limits.append(self.GEN_AMPL)
121 self.limits.append(self.GEN_AMPL)
122 self.__libdwf.FDwfAnalogOutNodeFrequencyInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
122 self.__libdwf.FDwfAnalogOutNodeFrequencyInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
123 byref(Mind), byref(Maxd))
123 byref(Mind), byref(Maxd))
124 self.GEN_FREQ=self.limitRange(Mind.value,Maxd.value,"GEN Frequency","Hz")
124 self.GEN_FREQ=self.limitRange(Mind.value,Maxd.value,"GEN Frequency","Hz")
125 self.limits.append(self.GEN_FREQ)
125 self.limits.append(self.GEN_FREQ)
126 self.__libdwf.FDwfAnalogOutNodeOffsetInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
126 self.__libdwf.FDwfAnalogOutNodeOffsetInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
127 byref(Mind), byref(Maxd))
127 byref(Mind), byref(Maxd))
128 self.GEN_OFFSET=self.limitRange(Mind.value,Maxd.value,"GEN Offset","V")
128 self.GEN_OFFSET=self.limitRange(Mind.value,Maxd.value,"GEN Offset","V")
129 self.limits.append(self.GEN_OFFSET)
129 self.limits.append(self.GEN_OFFSET)
130 self.__libdwf.FDwfAnalogOutNodeDataInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
130 self.__libdwf.FDwfAnalogOutNodeDataInfo(self.__hdwf,c_int(0), AnalogOutNodeCarrier,
131 byref(Mini), byref(Maxi))
131 byref(Mini), byref(Maxi))
132 self.GEN_BUFF=self.limitRange(Mini.value,Maxi.value,"GEN Buffer size","Sps")
132 self.GEN_BUFF=self.limitRange(Mini.value,Maxi.value,"GEN Buffer size","Sps")
133 self.limits.append(self.GEN_BUFF)
133 self.limits.append(self.GEN_BUFF)
134
134
135
135
136 def __conformParam(self,minVal,maxVal,val):
136 def __conformParam(self,minVal,maxVal,val):
137 if val<minVal:
137 if val<minVal:
138 raise self.errors.get(1)
138 raise self.errors.get(1)
139 print("Force to "+str(minVal))
139 print("Force to "+str(minVal))
140 return minVal
140 return minVal
141 if val>maxVal:
141 if val>maxVal:
142 raise self.errors.get(1)
142 raise self.errors.get(1)
143 print("Force to "+str(maxVal))
143 print("Force to "+str(maxVal))
144 return maxVal
144 return maxVal
145 return val
145 return val
146
146
147 def acqFreq(self, value):
147 def acqFreq(self, value):
148 return self.ACQ_FREQ.conform(value)
148 return self.ACQ_FREQ.conform(value)
149
149
150 def acqBufSize(self, value):
150 def acqBufSize(self, value):
151 return self.ACQ_BUF.conform(value)
151 return self.ACQ_BUF.conform(value)
152
152
153 def genFreq(self, value):
153 def genFreq(self, value):
154 return self.GEN_FREQ.conform(value)
154 return self.GEN_FREQ.conform(value)
155
155
156 def genAmplitude(self, value):
156 def genAmplitude(self, value):
157 return self.GEN_AMPL.conform(value)
157 return self.GEN_AMPL.conform(value)
158
158
159 def genOffset(self, value):
159 def genOffset(self, value):
160 return self.GEN_OFFSET.conform(value)
160 return self.GEN_OFFSET.conform(value)
161
161
162 def genBuffSize(self, value):
162 def genBuffSize(self, value):
163 return self.GEN_BUFF.conform(value)
163 return self.GEN_BUFF.conform(value)
164
164
165 def __str__(self):
165 def __str__(self):
166 res=str()
166 res=str()
167 for i in self.limits:
167 for i in self.limits:
168 res+=i.__str__()+"\n"
168 res+=i.__str__()+"\n"
169 res+="ACQ Input ranes: "+str(self.ACQ_IN_RANGES)
169 res+="ACQ Input ranes: "+str(self.ACQ_IN_RANGES)
170 return res
170 return res
171
171
172
172
173 class Discovery(object):
173 class Discovery(object):
174
174
175 errors = {0: RuntimeError("No card opened"),
175 errors = {0: RuntimeError("No card opened"),
176 1: UserWarning("Parameter out of bound"),
176 1: UserWarning("Parameter out of bound"),
177 }
177 }
178 def findDevice(self,device):
178 def findDevice(self,device):
179 if not self.__opened:
179 if not self.__opened:
180 raise self.errors.get(0)
180 raise self.errors.get(0)
181 nbDevices = c_int()
181 nbDevices = c_int()
182 self.__libdwf.FDwfEnum(c_int(0), byref(nbDevices))
182 self.__libdwf.FDwfEnum(c_int(0), byref(nbDevices))
183 SN = create_string_buffer(32)
183 SN = create_string_buffer(32)
184 for i in range(nbDevices.value):
184 for i in range(nbDevices.value):
185 self.__libdwf.FDwfEnumSN(c_int(i), SN)
185 self.__libdwf.FDwfEnumSN(c_int(i), SN)
186 if SN.value.decode("UTF-8") == device:
186 if SN.value.decode("UTF-8") == device:
187 return i
187 return i
188 return -1
188 return -1
189
189
190
190
191 def __init__(self,card=-1):
191 def __init__(self,card=-1):
192 if sys.platform.startswith("win"):
192 if sys.platform.startswith("win"):
193 self.__libdwf = cdll.dwf
193 self.__libdwf = cdll.dwf
194 elif sys.platform.startswith("darwin"):
194 elif sys.platform.startswith("darwin"):
195 self.__libdwf = cdll.LoadLibrary("libdwf.dylib")
195 self.__libdwf = cdll.LoadLibrary("libdwf.dylib")
196 else:
196 else:
197 self.__libdwf = cdll.LoadLibrary("libdwf.so")
197 self.__libdwf = cdll.LoadLibrary("libdwf.so")
198 self.__opened = True
198 self.__opened = True
199 self.__hdwf = c_int()
199 self.__hdwf = c_int()
200 if card != -1:
200 if card != -1:
201 SN=card
201 SN=card
202 card = self.findDevice(card)
202 card = self.findDevice(card)
203 if card == -1:
203 if card == -1:
204 raise RuntimeError( "Card not found "+ SN)
204 raise RuntimeError( "Card not found "+ SN)
205 self.__libdwf.FDwfDeviceOpen(c_int(card), byref(self.__hdwf))
205 self.__libdwf.FDwfDeviceOpen(c_int(card), byref(self.__hdwf))
206 if self.__hdwf.value == nodev.value:
206 if self.__hdwf.value == nodev.value:
207 szerr = create_string_buffer(512)
207 szerr = create_string_buffer(512)
208 self.__libdwf.FDwfGetLastErrorMsg(szerr)
208 self.__libdwf.FDwfGetLastErrorMsg(szerr)
209 print(szerr.value)
209 print(szerr.value)
210 print("failed to open device")
210 print("failed to open device")
211 self.__opened=False
211 self.__opened=False
212 self.__limits=DiscoveryLimits(self.__libdwf,self.__hdwf)
212 self.__limits=DiscoveryLimits(self.__libdwf,self.__hdwf)
213 print(self.__limits)
213 print(self.__limits)
214
214
215 @property
215 @property
216 def opened(self):
216 def opened(self):
217 return self.__opened
217 return self.__opened
218
218
219 @property
219 @property
220 def max_sampling_freq(self):
220 def max_sampling_freq(self):
221 return self.__limits.ACQ_FREQ.Max
221 return self.__limits.ACQ_FREQ.Max
222
222
223 @property
223 @property
224 def min_sampling_freq(self):
224 def min_sampling_freq(self):
225 return self.__limits.ACQ_FREQ.Min
225 return self.__limits.ACQ_FREQ.Min
226
226
227 @property
227 @property
228 def max_sampling_buffer(self):
228 def max_sampling_buffer(self):
229 return self.__limits.ACQ_BUF.Max
229 return self.__limits.ACQ_BUF.Max
230
230
231 #############################################################
231 #############################################################
232 # Power Supply
232 # Power Supply
233 #############################################################
233 #############################################################
234 def set_power(self,fiveVolt=1,minusFiveVolt=1,master=True):
234 def set_power(self,fiveVolt=1,minusFiveVolt=1,master=True):
235 if not self.__opened:
235 if not self.__opened:
236 raise self.errors.get(0)
236 raise self.errors.get(0)
237 # enable positive supply
237 # enable positive supply
238 self.__libdwf.FDwfAnalogIOChannelNodeSet(self.__hdwf, 0, 0, c_double(fiveVolt))
238 self.__libdwf.FDwfAnalogIOChannelNodeSet(self.__hdwf, 0, 0, c_double(fiveVolt))
239 # enable negative supply
239 # enable negative supply
240 self.__libdwf.FDwfAnalogIOChannelNodeSet(self.__hdwf, 1, 0, c_double(minusFiveVolt))
240 self.__libdwf.FDwfAnalogIOChannelNodeSet(self.__hdwf, 1, 0, c_double(minusFiveVolt))
241 # master enable
241 # master enable
242 return self.__libdwf.FDwfAnalogIOEnableSet(self.__hdwf, master)
242 return self.__libdwf.FDwfAnalogIOEnableSet(self.__hdwf, master)
243
243
244 def get_power(self):
244 def get_power(self):
245 if not self.__opened:
245 if not self.__opened:
246 raise self.errors.get(0)
246 raise self.errors.get(0)
247 supplyVoltage = c_double()
247 supplyVoltage = c_double()
248 supplyCurrent = c_double()
248 supplyCurrent = c_double()
249 IsEnabled = c_bool()
249 IsEnabled = c_bool()
250 self.__libdwf.FDwfAnalogIOStatus(self.__hdwf)
250 self.__libdwf.FDwfAnalogIOStatus(self.__hdwf)
251 self.__libdwf.FDwfAnalogIOChannelNodeStatus(self.__hdwf, c_int(3), c_int(0), byref(supplyVoltage))
251 self.__libdwf.FDwfAnalogIOChannelNodeStatus(self.__hdwf, c_int(3), c_int(0), byref(supplyVoltage))
252 self.__libdwf.FDwfAnalogIOChannelNodeStatus(self.__hdwf, c_int(3), c_int(1), byref(supplyCurrent))
252 self.__libdwf.FDwfAnalogIOChannelNodeStatus(self.__hdwf, c_int(3), c_int(1), byref(supplyCurrent))
253 self.__libdwf.FDwfAnalogIOEnableStatus(self.__hdwf, byref(IsEnabled))
253 self.__libdwf.FDwfAnalogIOEnableStatus(self.__hdwf, byref(IsEnabled))
254 return [IsEnabled.value,supplyVoltage.value,supplyCurrent.value]
254 return [IsEnabled.value,supplyVoltage.value,supplyCurrent.value]
255
255
256 #############################################################
256 #############################################################
257 # AnalogIn
257 # AnalogIn
258 #############################################################
258 #############################################################
259 def analog_in_read(self,ch1=True,ch2=True,frequency=100000000,samplesCount=100,ch1range=5.0,ch2range=5.0,trigger=trigsrcNone):
259 def analog_in_read(self,ch1=True,ch2=True,frequency=100000000,samplesCount=100,ch1range=5.0,ch2range=5.0,trigger=trigsrcNone):
260 if not self.__opened:
260 if not self.__opened:
261 raise self.errors.get(0)
261 raise self.errors.get(0)
262 cnt=self.__limits.acqBufSize(samplesCount)
262 cnt=self.__limits.acqBufSize(samplesCount)
263 self.__libdwf.FDwfAnalogInFrequencySet(self.__hdwf, c_double(self.__limits.acqFreq(frequency)))
263 self.__libdwf.FDwfAnalogInFrequencySet(self.__hdwf, c_double(self.__limits.acqFreq(frequency)))
264 f=c_double()
264 f=c_double()
265 self.__libdwf.FDwfAnalogInFrequencyGet(self.__hdwf, byref(f))
265 self.__libdwf.FDwfAnalogInFrequencyGet(self.__hdwf, byref(f))
266 frequency=f.value
266 frequency=f.value
267 self.__libdwf.FDwfAnalogInBufferSizeSet(self.__hdwf, c_int(cnt))
267 self.__libdwf.FDwfAnalogInBufferSizeSet(self.__hdwf, c_int(cnt))
268 self.__libdwf.FDwfAnalogInChannelEnableSet(self.__hdwf, c_int(0), c_bool(ch1))
268 self.__libdwf.FDwfAnalogInChannelEnableSet(self.__hdwf, c_int(0), c_bool(ch1))
269 self.__libdwf.FDwfAnalogInChannelRangeSet(self.__hdwf, c_int(0), c_double(ch1range))
269 self.__libdwf.FDwfAnalogInChannelRangeSet(self.__hdwf, c_int(0), c_double(ch1range))
270 self.__libdwf.FDwfAnalogInChannelEnableSet(self.__hdwf, c_int(1), c_bool(ch2))
270 self.__libdwf.FDwfAnalogInChannelEnableSet(self.__hdwf, c_int(1), c_bool(ch2))
271 self.__libdwf.FDwfAnalogInChannelRangeSet(self.__hdwf, c_int(1), c_double(ch2range))
271 self.__libdwf.FDwfAnalogInChannelRangeSet(self.__hdwf, c_int(1), c_double(ch2range))
272 self.set_analog_in_trigger(trigger)
272 self.set_analog_in_trigger(trigger)
273 self.__libdwf.FDwfAnalogInConfigure(self.__hdwf, c_bool(False), c_bool(True))
273 self.__libdwf.FDwfAnalogInConfigure(self.__hdwf, c_bool(False), c_bool(True))
274 status = c_byte()
274 status = c_byte()
275 while True:
275 while True:
276 self.__libdwf.FDwfAnalogInStatus(self.__hdwf, c_int(1), byref(status))
276 self.__libdwf.FDwfAnalogInStatus(self.__hdwf, c_int(1), byref(status))
277 if status.value == DwfStateDone.value :
277 if status.value == DwfStateDone.value :
278 break
278 break
279 time.sleep(0.1)
279 time.sleep(0.1)
280 if ch1:
280 if ch1:
281 ch1data = (c_double*cnt)()
281 ch1data = (c_double*cnt)()
282 self.__libdwf.FDwfAnalogInStatusData(self.__hdwf, 0, ch1data, cnt)
282 self.__libdwf.FDwfAnalogInStatusData(self.__hdwf, 0, ch1data, cnt)
283 if ch2:
283 if ch2:
284 ch2data = (c_double*cnt)()
284 ch2data = (c_double*cnt)()
285 self.__libdwf.FDwfAnalogInStatusData(self.__hdwf, 1, ch2data, cnt)
285 self.__libdwf.FDwfAnalogInStatusData(self.__hdwf, 1, ch2data, cnt)
286 return [np.array([ch1data,ch2data]),frequency]
286 return [np.array([ch1data,ch2data]),frequency]
287 else:
287 else:
288 return [np.array([ch1data]),frequency]
288 return [np.array([ch1data]),frequency]
289 if ch2:
289 if ch2:
290 ch2data = (c_double*cnt)()
290 ch2data = (c_double*cnt)()
291 self.__libdwf.FDwfAnalogInStatusData(self.__hdwf, 1, ch2data, cnt)
291 self.__libdwf.FDwfAnalogInStatusData(self.__hdwf, 1, ch2data, cnt)
292 return [np.array([ch2data]),frequency]
292 return [np.array([ch2data]),frequency]
293
293
294
294
295 def set_analog_in_trigger(self,trigger=trigAuto,autoTimeout=0.0):
295 def set_analog_in_trigger(self,trigger=trigAuto,autoTimeout=0.0):
296 if not self.__opened:
296 if not self.__opened:
297 raise self.errors.get(0)
297 raise self.errors.get(0)
298 if trigger == trigAuto:
298 if trigger == trigAuto:
299 self.__libdwf.FDwfAnalogInTriggerSourceSet(self.__hdwf,trigsrcDetectorAnalogIn)
299 self.__libdwf.FDwfAnalogInTriggerSourceSet(self.__hdwf,trigsrcDetectorAnalogIn)
300 self.__libdwf.FDwfAnalogInTriggerAutoTimeoutSet(self.__hdwf,c_double(autoTimeout))
300 self.__libdwf.FDwfAnalogInTriggerAutoTimeoutSet(self.__hdwf,c_double(autoTimeout))
301 return
301 return
302 if trigger == trigNormal:
302 if trigger == trigNormal:
303 self.__libdwf.FDwfAnalogInTriggerSourceSet(self.__hdwf,trigsrcDetectorAnalogIn)
303 self.__libdwf.FDwfAnalogInTriggerSourceSet(self.__hdwf,trigsrcDetectorAnalogIn)
304 self.__libdwf.FDwfAnalogInTriggerAutoTimeoutSet(self.__hdwf,c_double(0.0))
304 self.__libdwf.FDwfAnalogInTriggerAutoTimeoutSet(self.__hdwf,c_double(0.0))
305 return
305 return
306 self.__libdwf.FDwfAnalogInTriggerSourceSet(self.__hdwf,trigger)
306 self.__libdwf.FDwfAnalogInTriggerSourceSet(self.__hdwf,trigger)
307
307
308 #############################################################
308 #############################################################
309 # AnalogOut
309 # AnalogOut
310 #############################################################
310 #############################################################
311 def analog_out_gen(self,frequency=1000, shape='Sine', channel=0, amplitude=1.0, offset=0.0,phase=0.0, syncOnTrigger=False, triggerFrq=1.0):
311 def analog_out_gen(self,frequency=1000, shape='Sine', channel=0, amplitude=1.0, offset=0.0,phase=0.0, syncOnTrigger=False, triggerFrq=1.0):
312 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(False))
312 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(False))
313 self.__libdwf.FDwfAnalogOutNodeEnableSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_bool(True))
313 self.__libdwf.FDwfAnalogOutNodeEnableSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_bool(True))
314 self.__libdwf.FDwfAnalogOutNodeFunctionSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_int(shapes.get(shape)))
314 self.__libdwf.FDwfAnalogOutNodeFunctionSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_int(shapes.get(shape)))
315 if shape!="DC":
315 if shape!="DC":
316 self.__libdwf.FDwfAnalogOutNodeFrequencySet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genFreq(frequency)))
316 self.__libdwf.FDwfAnalogOutNodeFrequencySet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genFreq(frequency)))
317 self.__libdwf.FDwfAnalogOutNodeAmplitudeSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genAmplitude(amplitude)))
317 self.__libdwf.FDwfAnalogOutNodeAmplitudeSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genAmplitude(amplitude)))
318 self.__libdwf.FDwfAnalogOutNodeOffsetSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genOffset(offset)))
318 self.__libdwf.FDwfAnalogOutNodeOffsetSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genOffset(offset)))
319 self.__libdwf.FDwfAnalogOutNodePhaseSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(phase))
319 self.__libdwf.FDwfAnalogOutNodePhaseSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(phase))
320 if syncOnTrigger:
320 if syncOnTrigger:
321 self.analog_out_set_trigger(channel)
321 self.analog_out_set_trigger(channel)
322 self.__libdwf.FDwfAnalogOutRepeatSet(self.__hdwf, c_int(channel),c_int(0))
322 self.__libdwf.FDwfAnalogOutRepeatSet(self.__hdwf, c_int(channel),c_int(0))
323 if frequency >= triggerFrq:
323 # if frequency >= triggerFrq:
324 runDuration = triggerFrq
324 runDuration = triggerFrq
325 else:
325 # Doesn't work! try with triggerFrq=1 and frequency=0.8
326 runDuration = triggerFrq/frequency
326 # else:
327 # runDuration = triggerFrq/frequency
327 self.__libdwf.FDwfAnalogOutRunSet(self.__hdwf, c_int(channel),c_double(runDuration))
328 self.__libdwf.FDwfAnalogOutRunSet(self.__hdwf, c_int(channel),c_double(runDuration))
328 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(True))
329 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(True))
329
330
330 def analog_out_gen_arbit(self,samplesBuffer ,repeatingFrequency=100, channel=0, amplitude=1.0, offset=0.0):
331 def analog_out_gen_arbit(self,samplesBuffer ,repeatingFrequency=100, channel=0, amplitude=1.0, offset=0.0):
331 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(False))
332 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(False))
332 cnt=self.__limits.genBuffSize(len(samplesBuffer))
333 cnt=self.__limits.genBuffSize(len(samplesBuffer))
333 buf=(c_double*cnt)()
334 buf=(c_double*cnt)()
334 buf[:]=samplesBuffer[0:cnt]
335 buf[:]=samplesBuffer[0:cnt]
335 #repeatingFrequency = self.__limits.genFreq(repeatingFrequency*cnt)/cnt
336 #repeatingFrequency = self.__limits.genFreq(repeatingFrequency*cnt)/cnt
336 self.__libdwf.FDwfAnalogOutNodeEnableSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_bool(True))
337 self.__libdwf.FDwfAnalogOutNodeEnableSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_bool(True))
337 self.__libdwf.FDwfAnalogOutNodeFunctionSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_int(shapes.get("Custom")))
338 self.__libdwf.FDwfAnalogOutNodeFunctionSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_int(shapes.get("Custom")))
338 self.__libdwf.FDwfAnalogOutNodeFrequencySet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(repeatingFrequency))
339 self.__libdwf.FDwfAnalogOutNodeFrequencySet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(repeatingFrequency))
339 self.__libdwf.FDwfAnalogOutNodeAmplitudeSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genAmplitude(amplitude)))
340 self.__libdwf.FDwfAnalogOutNodeAmplitudeSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genAmplitude(amplitude)))
340 self.__libdwf.FDwfAnalogOutNodeOffsetSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genOffset(offset)))
341 self.__libdwf.FDwfAnalogOutNodeOffsetSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, c_double(self.__limits.genOffset(offset)))
341 self.__libdwf.FDwfAnalogOutNodeDataSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, buf, c_int(cnt))
342 self.__libdwf.FDwfAnalogOutNodeDataSet(self.__hdwf, c_int(channel), AnalogOutNodeCarrier, buf, c_int(cnt))
342 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(True))
343 self.__libdwf.FDwfAnalogOutConfigure(self.__hdwf, c_int(channel), c_bool(True))
343
344
344 def analog_out_set_trigger(self, channel=0, trigSrc=trigsrcExternal1, trigRepeat=True):
345 def analog_out_set_trigger(self, channel=0, trigSrc=trigsrcExternal1, trigRepeat=True):
345 self.__libdwf.FDwfAnalogOutTriggerSourceSet(self.__hdwf, c_int(channel), trigSrc)
346 self.__libdwf.FDwfAnalogOutTriggerSourceSet(self.__hdwf, c_int(channel), trigSrc)
346 self.__libdwf.FDwfAnalogOutRepeatTriggerSet(self.__hdwf, c_int(channel), c_bool(trigRepeat))
347 self.__libdwf.FDwfAnalogOutRepeatTriggerSet(self.__hdwf, c_int(channel), c_bool(trigRepeat))
347
348
348 def __del__(self):
349 def __del__(self):
349 if self.__opened:
350 if self.__opened:
350 self.__libdwf.FDwfDeviceClose(self.__hdwf)
351 self.__libdwf.FDwfDeviceClose(self.__hdwf)
351
352
352
353
353 if __name__ == '__main__':
354 if __name__ == '__main__':
354 print("open first dev")
355 print("open first dev")
355 test = Discovery()
356 test = Discovery()
356 test.set_power()
357 test.set_power()
357 for i in range(2):
358 for i in range(2):
358 time.sleep(0.2)
359 time.sleep(0.2)
359 print(test.get_power())
360 print(test.get_power())
360 test.analog_out_gen()
361 test.analog_out_gen()
361 res=test.analog_in_read(frequency=1000000,samplesCount=1000)
362 res=test.analog_in_read(frequency=1000000,samplesCount=1000)
362 print(res)
363 print(res)
363 plt.plot(range(len(res[0][0])),res[0][0])
364 plt.plot(range(len(res[0][0])),res[0][0])
364 plt.plot(range(len(res[0][0])),res[0][1])
365 plt.plot(range(len(res[0][0])),res[0][1])
365 plt.show()
366 plt.show()
366 test.temp()
367 test.temp()
367 # del test
368 # del test
368 quit()
369 quit()
369
370
370
371
371
372
372
373
373
374
General Comments 0
You need to be logged in to leave comments. Login now