ALICE 1.3  1.0
Develpoer documentation
alice-desktop-1.3.pyw
Go to the documentation of this file.
1 #!/usr/bin/python
2 # -*- coding: cp1252 -*-
3 
12 import __future__
13 import math
14 import time
15 try:
16  import numpy
17  numpy_found = True
18 except:
19  numpy_found = False
20 import csv
21 import wave
22 import os
23 #import requests
24 import sys
25 import struct
26 import subprocess
27 from time import gmtime, strftime
28 if sys.version_info[0] == 2:
29  print ("Python 2.x")
30  import urllib2
31  import tkFont
32  from Tkinter import *
33  from ttk import *
34  from tkFileDialog import askopenfilename
35  from tkFileDialog import asksaveasfilename
36  from tkSimpleDialog import askstring
37  from tkMessageBox import *
38 if sys.version_info[0] == 3:
39  print ("Python 3.x")
40  import urllib.request, urllib.error, urllib.parse
41  from tkinter.font import *
42  from tkinter import *
43  from tkinter.ttk import *
44  from tkinter.filedialog import askopenfilename
45  from tkinter.filedialog import asksaveasfilename
46  from tkinter.simpledialog import askstring
47  from tkinter.messagebox import *
48 #
49 import webbrowser
50 try:
51  from pysmu import *
52  pysmu_found = True
53 except:
54  pysmu_found = False
55 #
56 # check which operating system
57 import platform
58 #
59 RevDate = "(5 Dec 2020)"
60 SWRev = "1.3 "
61 Version_url = 'https://github.com/analogdevicesinc/alice/releases/download/1.3.9/alice-desktop-1.3-setup.exe'
62 # small bit map of ADI logo for window icon
63 TBicon = """
64 R0lGODlhIAAgAHAAACH5BAEAAAIALAAAAAAgACAAgQAAAP///wAAAAAAAAJJhI+py+0PYwtBWkDp
65 hTnv2XlfEobjUZZnmn4se72vJMtcbYN4ruz44uORgiodsfI4Im++2M5VW81OmBbVULxiRVrUsgsO
66 i8fUAgA7
67 """
68 
69 root=Tk()
70 root.title("ALICE DeskTop " + SWRev + RevDate + ": ALM1000 Oscilloscope")
71 img = PhotoImage(data=TBicon)
72 root.call('wm', 'iconphoto', root._w, '-default', img)
73 print("Windowing System is " + str(root.tk.call('tk', 'windowingsystem')))
74 
75 GRW = 720 # Width of the time grid 720 default
76 GRH = 390 # Height of the time grid 390 default
77 X0L = 55 # Left top X value of time grid
78 Y0T = 25 # Left top Y value of time grid
79 #
80 GRWF = 720 # Width of the spectrum grid 720 default
81 GRHF = 390 # Height of the spectrum grid 390 default
82 X0LF = 37 # Left top X value of spectrum grid
83 Y0TF = 25 # Left top Y value of spectrum grid
84 #
85 GRWBP = 720 # Width of the Bode Plot grid 720 default
86 GRHBP = 390 # Height of the Bode Plot grid 390 default
87 X0LBP = 37 # Left top X value of Bode Plot grid
88 Y0TBP = 25 # Left top Y value of Bode Plot grid
89 #
90 GRWXY = 420 # Width of the XY grid 420 default
91 GRHXY = 390 # Height of the XY grid 390 default
92 X0LXY = 37 # Left top X value of XY grid
93 Y0TXY = 25 # Left top Y value of XY grid
94 #
95 GRWIA = 400 # Width of the grid 400 default
96 GRHIA = 400 # Height of the grid 400 default
97 X0LIA = 37 # Left top X value of grid
98 Y0TIA = 25 # Left top Y value of grid
99 #
100 GRWNqP = 400 # Width of the Nyquist plot grid 400 default
101 GRHNqP = 400 # Height of the grid 400 default
102 X0LNqP = 25 # Left top X value of grid
103 Y0TNqP = 25 # Left top Y value of grid
104 #
105 GRWNiC = 400 # Width of the Nichols plot grid 400 default
106 GRHNiC = 400 # Height of the grid 400 default
107 X0LNiC = 25 # Left top X value of grid
108 Y0TNiC = 25 # Left top Y value of grid
109 #
110 GRWPhA = 400 # Width of the grid 400 default
111 GRHPhA = 400 # Height of the grid 400 default
112 X0LPhA = 37 # Left top X value of grid
113 Y0TPhA = 25 # Left top Y value of grid
114 #
115 FontSize = 8
116 BorderSize = 1
117 MouseX = MouseY = -10
118 MouseCAV = MouseCAI = MouseCBV = MouseCBI = MouseMuxA = MouseMuxB = MouseMuxC = MouseMuxD = -10
119 
120 COLORframes = "#000080" # Color = "#rrggbb" rr=red gg=green bb=blue, Hexadecimal values 00 - ff
121 COLORcanvas = "#000000" # 100% black
122 COLORgrid = "#808080" # 50% Gray
123 COLORzeroline = "#0000ff" # 100% blue
124 COLORtrace1 = "#00ff00" # 100% green
125 COLORtrace2 = "#ff8000" # 100% orange
126 COLORtrace3 = "#00ffff" # 100% cyan
127 COLORtrace4 = "#ffff00" # 100% yellow
128 COLORtrace5 = "#ff00ff" # 100% magenta
129 COLORtrace6 = "#C80000" # 90% red
130 COLORtrace7 = "#8080ff" # 100% purple
131 COLORtraceR1 = "#008000" # 50% green
132 COLORtraceR2 = "#905000" # 50% orange
133 COLORtraceR3 = "#008080" # 50% cyan
134 COLORtraceR4 = "#808000" # 50% yellow
135 COLORtraceR5 = "#800080" # 50% magenta
136 COLORtraceR6 = "#800000" # 80% red
137 COLORtraceR7 = "#4040a0" # 80% purple
138 COLORtext = "#ffffff" # 100% white
139 COLORtrigger = "#ff0000" # 100% red
140 COLORsignalband = "#ff0000" # 100% red
141 ButtonGreen = "#00ff00" # 100% green
142 ButtonRed = "#ff0000" # 100% red
143 GUITheme = "Light"
144 ButtonOrder = 0
145 ColorMode = IntVar(0)
146 # # Can be Light or Dark or Blue or LtBlue or Custom where:
147 FrameBG = "#d7d7d7" # Background color for frame
148 ButtonText = "#000000" # Button Text color
149 # Widget relief can be RAISED, GROOVE, RIDGE, and FLAT
150 ButRelief = RAISED
151 LabRelief = FLAT
152 FrameRefief = RIDGE
153 LocalLanguage = "English"
154 
155 OnBoardRes = 50.83
156 AD584act = 2.5
157 # Set sample buffer size
158 HoldOff = 0.0
159 LShift = 0
160 BaseSampleRate = 100000
161 AWGSAMPLErate = BaseSampleRate # Sample rate of the AWG channels
162 SAMPLErate = BaseSampleRate # Scope sample rate can be decimated
163 MinSamples = 2000
164 MaxSamples = 200000
165 ETSrecord = 2000
166 DISsamples = GRW
167 # set initial trigger conditions
168 TRIGGERlevel = 2.5 # Triggerlevel in volts
169 
170 MathString = "VBuffA[t] + VBuffB[t]"
171 MathUnits = " V"
172 MathXString = "VBuffA[t]"
173 MathXUnits = " V"
174 MathYString = "VBuffB[t]"
175 MathYUnits = " V"
176 UserAString = "MaxV1-VATop"
177 UserALabel = "OverShoot"
178 UserBString = "MinV2-VBBase"
179 UserBLabel = "UnderShoot"
180 MathAxis = "V-A"
181 MathXAxis = "V-A"
182 MathYAxis = "V-B"
183 AWGAMathString = "(VBuffA + VBuffB)/2"
184 AWGBMathString = "(VBuffA + VBuffB)/2"
185 AWGAcsvFile = "examplea.csv"
186 AWGBcsvFile = "exampleb.csv"
187 AWGAwavFile = "examplea.wav"
188 AWGBwavFile = "exampleb.wav"
189 FFTUserWindowString = "numpy.kaiser(SMPfft, 14) * 3"
190 DigFilterAString = "numpy.sinc(numpy.linspace(-1, 1, 91))"
191 DigFilterBString = "numpy.sinc(numpy.linspace(-1, 1, 91))"
192 ChaMeasString1 = "DCV1"
193 ChaMeasString2 = "DCI1"
194 ChaMeasString3 = "SV1"
195 ChaMeasString4 = "MaxV1-MinV1"
196 ChaMeasString5 = "MaxI1-MinI1"
197 ChaMeasString6 = "math.sqrt(SV1**2 - DCV1**2)"
198 ChbMeasString1 = "DCV2"
199 ChbMeasString2 = "DCI2"
200 ChbMeasString3 = "SV2"
201 ChbMeasString4 = "MaxV2-MinV2"
202 ChbMeasString5 = "MaxI2-MinI2"
203 ChbMeasString6 = "math.sqrt(SV2**2 - DCV2**2)"
204 ChaLableSrring1 = "CHA-DCV "
205 ChaLableSrring2 = "CHA-DCI "
206 ChaLableSrring3 = "CHA-TRMS "
207 ChaLableSrring4 = "CHA-VP-P "
208 ChaLableSrring5 = "CHA-IP-P "
209 ChaLableSrring6 = "CHA-ACRMS "
210 ChbLableSrring1 = "CHB-DCV "
211 ChbLableSrring2 = "CHB-DCI "
212 ChbLableSrring3 = "CHB-TRMS "
213 ChbLableSrring4 = "CHB-VP-P "
214 ChbLableSrring5 = "CHB-IP-P "
215 ChbLableSrring6 = "CHB-ACRMS "
216 LabelPlotText = IntVar(0)
217 PlotLabelText = "Custom Plot Label"
218 
219 GridWidth = IntVar(0)
220 GridWidth.set(1)
221 TRACEwidth = IntVar(0)
222 TRACEwidth.set(1)
223 TRACEaverage = IntVar(0) # Number of average sweeps for average mode
224 TRACEaverage.set(8)
225 Vdiv = IntVar(0)
226 Vdiv.set(10) # Number of vertical divisions for spectrum / Bode
227 LPFTrigger = IntVar(0) # trigger lpf on/off
228 Trigger_LPF_length = IntVar(0)
229 Trigger_LPF_length.set(10) # Length of Trigger box car LPF in samples
230 HarmonicMarkers = IntVar(0)
231 HarmonicMarkers.set(3)
232 AWGShowAdvanced = IntVar(0)
233 AWGShowAdvanced.set(0)
234 AWG_Amp_Mode = IntVar(0)
235 AWG_Amp_Mode.set(0) # 0 = Min/Max mode, 1 = Amp/Offset
236 AWGA_Ext_Gain = DoubleVar(0)
237 AWGA_Ext_Gain.set(1.0)
238 AWGA_Ext_Offset = DoubleVar(0)
239 AWGA_Ext_Offset.set(0.0)
240 AWGB_Ext_Gain = DoubleVar(0)
241 AWGB_Ext_Gain.set(1.0)
242 AWGB_Ext_Offset = DoubleVar(0)
243 AWGB_Ext_Offset.set(0.0)
244 AWG_2X = IntVar(0) # selection variable to set AWG DAC channes for 2X samplerate modes
245 Two_X_Sample = IntVar(0) # selection variable to set ADC channes for 2X samplerate mode
246 Two_X_Sample.set(0)
247 ADC_Mux_Mode = IntVar(0) # selection variable to set ADC CHA for voltagr or current 2X samplerate mode
248 ADC_Mux_Mode.set(0)
249 Last_ADC_Mux_Mode = 0
250 Alternate_Sweep_Mode = IntVar(0) # alternate sweeps when in 2X samplerate mode
251 Alternate_Sweep_Mode.set(0)
252 #
253 ZEROstuffing = IntVar(0) # The zero stuffing value is 2 ** ZERO stuffing, calculated on initialize
254 ZEROstuffing.set(1)
255 FFTwindow = IntVar(0) # FFT window function variable
256 FFTwindow.set(5) # FFTwindow 0=None (rectangular B=1), 1=Cosine (B=1.24), 2=Triangular non-zero endpoints (B=1.33),
257  # 3=Hann (B=1.5), 4=Blackman (B=1.73), 5=Nuttall (B=2.02), 6=Flat top (B=3.77)
258 RelPhaseCorrection = 15 # Relative Phase error seems to be a random number each time board is powered up
259 RelPhaseCenter = IntVar(0)
260 RelPhaseCenter.set(0) # Center line value for phase plots
261 ImpedanceCenter = IntVar(0)
262 ImpedanceCenter.set(0) # Center line value for impedance plots
263 MultipleBoards = IntVar(0)
264 MultipleBoards.set(0) # Turn on access for multiple m1k boards
265 IgnoreFirmwareCheck = 0
266 EnableScopeOnly = 0
267 EnableXYPlotter = 1
268 EnablePhaseAnalizer = 1
269 EnableSpectrumAnalizer = 1
270 EnableBodePlotter = 1
271 EnableImpedanceAnalizer = 1
272 EnableOhmMeter = 1
273 EnableDigIO = 1
274 EnableCommandInterface = 0
275 EnableMuxMode = 0
276 EnablePIODACMode = 0
277 EnableMinigenMode = 0
278 EnablePmodDA1Mode = 0
279 EnableDigPotMode = 0
280 EnableGenericSerialMode = 0
281 EnableAD5626SerialMode = 0
282 EnableDigitalFilter = 0
283 EnableMeasureScreen = 0
284 EnableETSScreen = 0
285 EnableHSsampling = 0
286 AllowFlashFirmware = 0
287 DeBugMode = 0
288 ShowTraceControls = 0
289 # ADC Mux defaults
290 v1_adc_conf = 0x20F1
291 i1_adc_conf = 0x20F7
292 v2_adc_conf = 0x20F7
293 i2_adc_conf = 0x20F1
294 #
295 MouseFocus = 1
296 HistAsPercent = 0
297 ShowBallonHelp = 0
298 contloop = 0
299 discontloop = 0
300 AwgLayout = "Horz"
301 MarkerLoc = 'UL' # can be UL, UR, LL or LR
302 CHA_TC1 = DoubleVar(0)
303 CHA_TC1.set(1)
304 CHA_TC2 = DoubleVar(0)
305 CHA_TC2.set(1)
306 CHB_TC1 = DoubleVar(0)
307 CHB_TC1.set(1)
308 CHB_TC2 = DoubleVar(0)
309 CHB_TC2.set(1)
310 CHA_A1 = DoubleVar(0)
311 CHA_A1.set(1)
312 CHA_A2 = DoubleVar(0)
313 CHA_A2.set(1)
314 CHB_A1 = DoubleVar(0)
315 CHB_A1.set(1)
316 CHB_A2 = DoubleVar(0)
317 CHB_A2.set(1)
318 Auto_ETS_Comp = IntVar(0)
319 ETS_TC1 = DoubleVar(0)
320 ETS_TC1.set(0.18333)
321 ETS_A1 = DoubleVar(0)
322 ETS_A1.set(5.0)
323 ETS_TC2 = DoubleVar(0)
324 ETS_TC2.set(0.03)
325 ETS_A2 = DoubleVar(0)
326 ETS_A2.set(5.0)
327 PhaseOffset1x = 37
328 PhaseOffset2x = 37
329 #('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
330 # 'aqua' built-in native Mac OS X only; Native Mac OS X
331 windowingsystem = root.tk.call('tk', 'windowingsystem')
332 if (root.tk.call('tk', 'windowingsystem')=='aqua'):
333  Style_String = 'aqua'
334  # On Macs, allow the dock icon to deiconify.
335  root.createcommand('::tk::mac::ReopenApplication', root.deiconify)
336  root.createcommand('::tk::mac::Quit', root.destroy)# Bcloseexit)
337  # On Macs, set up menu bar to be minimal.
338  root.option_add('*tearOff', False)
339  if sys.version_info[0] == 2:
340  menubar = tKinter.Menu(root)
341  appmenu = tKinter.Menu(menubar, name='apple')
342  else:
343  menubar = tkinter.Menu(root)
344  appmenu = tkinter.Menu(menubar, name='apple')
345  # menubar = tk.Menu(root)
346  # appmenu = tk.Menu(menubar, name='apple')
347  menubar.add_cascade(menu=appmenu)
348  # appmenu.add_command(label='Exit', command=Bcloseexit)
349  root['menu'] = menubar
350 else:
351  Style_String = 'alt'
352 # Check if there is an alice_init.ini file to read in
353 try:
354  InitFile = open("alice_init.ini")
355  for line in InitFile:
356  try:
357  exec( line.rstrip() )
358  except:
359  print("Skiping " + line.rstrip())
360  InitFile.close()
361 except:
362  print( "No Init File Read")
363 #
364 X0L = FontSize * 7
365 XOLF = XOLBP = XOLXY = XOLIA = int(FontSize * 4.625)
366 XOLNqP = XOLNiC = int(FontSize * 3.125)
367 root.style = Style()
368 try:
369  root.style.theme_use(Style_String)
370 except:
371  root.style.theme_use('default')
372 if MouseFocus == 1:
373  root.tk_focusFollowsMouse()
374 #
375 DevID = "m1k"
376 #
377 if sys.version_info[0] == 2:
378  default_font = tkFont.nametofont("TkDefaultFont")
379 if sys.version_info[0] == 3:
380  default_font = tkinter.font.nametofont("TkDefaultFont")
381 default_font.configure(size=FontSize)
382 
383 CHvpdiv = (0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 5.0)
384 
385 CHipdiv = (0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 100.0, 200.0)
386 
387 TMpdiv = (0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0, 100.0, 200.0)
388 ResScalediv = (1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000)
389 SampRateList = (1024, 2048, 4096, 8192, 16384, 32765, 64000, 93023, 93385, 93750, 94118,
390  96385, 96774, 97166, 97561, 97959, 98361, 98765, 99174, 99585, 100000)
391 TIMEdiv = 0.5
392 RefPhase = ("CA-V", "CB-V", "CA-I", "CB-I")
393 
394 
395 AWGAAmplvalue = 0.0
396 AWGAOffsetvalue = 0.0
397 AWGAFreqvalue = 0.0
398 AWGAPhasevalue = 0
399 AWGAdelayvalue = 0
400 AWGADutyCyclevalue = 50
401 AWGAWave = 'dc'
402 AWGBAmplvalue = 0.0
403 AWGBOffsetvalue = 0.0
404 AWGBFreqvalue = 0.0
405 AWGBPhasevalue = 0
406 AWGBdelayvalue = 0
407 AWGBDutyCyclevalue = 50
408 AWGBWave = 'dc'
409 AWGACycles = 1
410 AWGBCycles = 1
411 AWGABurstDelay = 0
412 AWGBBurstDelay = 0
413 Reset_Freq = 300
414 MeasGateLeft = 0.0
415 MeasGateRight = 0.0 # in mSec
416 MeasGateNum = 0
417 MeasGateStatus = IntVar(0)
418 MeasGateStatus.set(0)
419 #
420 DCV1 = DCV2 = MinV1 = MaxV1 = MinV2 = MaxV2 = MidV1 = PPV1 = MidV2 = PPV2 = SV1 = SI1 = 0
421 
422 DCVMuxA = MinVMuxA = MaxVMuxA = MidVMuxA = PPVMuxA = SVMuxA = 0
423 DCVMuxB = MinVMuxB = MaxVMuxB = MidVMuxB = PPVMuxB = SVMuxB = 0
424 DCVMuxC = MinVMuxC = MaxVMuxC = MidVMuxC = PPVMuxC = SVMuxC = 0
425 DCVMuxD = MinVMuxD = MaxVMuxD = MidVMuxD = PPVMuxD = SVMuxD = 0
426 PeakVA = PeakVB = PeakIA = PeakIB = 0.0
427 PeakVMA = PeakVMB = PeakVMC = PeakVMD = 0.0
428 PeakphaseVMA = PeakphaseVMB = PeakphaseVMC = PeakphaseVMD = 0.0
429 PeakfreqVA = PeakfreqVB = PeakfreqIA = PeakfreqIB = 0.0
430 PeakphaseVA = PeakphaseVB = PeakphaseIA = PeakphaseIB = PeakphaseVAB = 0.0
431 CHADCy = CHBDCy = 0
432 DCI1 = DCI2 = MinI1 = MaxI1 = MinI2 = MaxI2 = MidI1 = PPI1 = MidI2 = PPI2 = SV2 = SI2 = 0
433 CHAperiod = CHAfreq = CHBperiod = CHBfreq = 0
434 # Calibration coefficients
435 CHAVGain = CHBVGain = 1.0
436 CHAVOffset = CHBVOffset = 0.0
437 # Initialisation of general variables
438 CHAOffset = CHBOffset = CHBAOffset = CHBBOffset = CHBCOffset = CHBDOffset = 2.5
439 CHAIOffset = CHBIOffset = InOffA = InGainA = InOffB = InGainB = 0.0
440 # Other global variables required in various routines
441 CANVASwidth = GRW + 2 * X0L # The canvas width
442 CANVASheight = GRH + Y0T + (FontSize * 7) # The canvas height
443 
444 ADsignal1 = [] # Ain signal array channel A and B
445 VBuffA = []
446 VBuffB = []
447 IBuffA = []
448 IBuffB = []
449 VBuffMA = []
450 VBuffMB = []
451 VBuffMC = []
452 VBuffMD = []
453 VmemoryMuxA = []
454 VmemoryMuxB = []
455 VmemoryMuxC = []
456 VmemoryMuxD = []
457 #
458 VAresult = []
459 VBresult = []
460 IAresult = []
461 IBresult = []
462 PhaseIA = []
463 PhaseIB = []
464 PhaseVA = []
465 PhaseVB = []
466 DFiltACoef = [1]
467 DFiltBCoef = [1]
468 DigFiltA = IntVar(0)
469 DigFiltA.set(0)
470 DigFiltABoxCar = IntVar(0)
471 DigFiltBBoxCar = IntVar(0)
472 DigFiltB = IntVar(0)
473 DigFiltB.set(0)
474 DigBuffA = IntVar(0)
475 DigBuffB = IntVar(0)
476 DigBuffA.set(0)
477 DigBuffB.set(0)
478 VFilterA = {}
479 VFilterB = {}
480 SampleRateStatus = IntVar(0)
481 ETSStatus = IntVar(0)
482 ETSDisp = IntVar(0)
483 ETSDir = IntVar(0)
484 #
485 AWGAwaveform = []
486 AWGA2X = [] # array for odd numbers samples when in 2x sample rate
487 AWGBwaveform = []
488 AWGB2X = [] # array for odd numbers samples when in 2x sample rate
489 VmemoryA = numpy.ones(1) # The memory for averaging
490 VmemoryB = numpy.ones(1)
491 ImemoryA = numpy.ones(1) # The memory for averaging
492 ImemoryB = numpy.ones(1)
493 TRACEresetTime = True # True for first new trace, false for averageing
494 TRACEresetFreq = True # True for first new trace, false for averageing
495 AWGScreenStatus = IntVar(0)
496 
497 T1Vline = [] # Voltage Trace line channel A
498 T2Vline = [] # Voltage Trace line channel B
499 T1Iline = [] # Current Trace line channel A
500 T2Iline = [] # Current Trace line channel B
501 TMAVline = [] # Voltage Trace line MUX channel A
502 TMBVline = [] # Voltage Trace line MUX channel B
503 TMCVline = [] # Voltage Trace line MUX channel C
504 TMDVline = [] # Voltage Trace line MUX channel D
505 TMBRline = [] # V reference Trace line MUX channel B
506 TMCRline = [] # V reference line MUX channel C
507 TXYline = [] # XY Trace line
508 TXYRline = [] # XY reference trace line
509 Tmathline = [] # Math trace line
510 TMXline = [] # X math Trace line
511 TMYline = [] # Y math Trace line
512 T1VRline = [] # V reference Trace line channel A
513 T2VRline = [] # V reference Trace line channel B
514 T1IRline = [] # I reference Trace line channel A
515 T2IRline = [] # I reference Trace line channel B
516 TMRline = [] # Math reference Trace line
517 Triggerline = [] # Triggerline
518 Triggersymbol = [] # Trigger symbol
519 #
520 SHOWsamples = 4000 # Number of samples on the screen
521 SCstart = 0 # Start sample of the trace
522 HozPoss = 0.0
523 Is_Triggered = 0
524 #
525 TRACES = 1 # Number of traces 1 or 2
526 TRACESread = 0 # Number of traces that have been read from ALM
527 ScreenTrefresh = IntVar(0)
528 ScreenXYrefresh = IntVar(0)
529 #
530 NSteps = IntVar(0) # number of frequency sweep steps
531 NSteps.set(128)
532 LoopNum = IntVar(0)
533 LoopNum.set(1)
534 LastWindow = -1
535 LastSMPfft = 0
536 CurrentFreqX = X0LBP + 14
537 FBins = numpy.linspace(0, 50000, num=16384)
538 FStep = numpy.linspace(0, 16384, num=NSteps.get())
539 FSweepMode = IntVar(0)
540 FSweepCont = IntVar(0)
541 FStepSync = IntVar(0)
542 FSweepSync = IntVar(0)
543 ShowCA_VdB = IntVar(0) # curves to display variables
544 ShowCA_P = IntVar(0)
545 ShowCB_VdB = IntVar(0)
546 ShowCB_P = IntVar(0)
547 ShowMarkerBP = IntVar(0)
548 ShowCA_RdB = IntVar(0)
549 ShowCA_RP = IntVar(0)
550 ShowCB_RdB = IntVar(0)
551 ShowCB_RP = IntVar(0)
552 ShowMathBP = IntVar(0)
553 ShowRMathBP = IntVar(0)
554 SingleShotSA = IntVar(0) # variable for Single Shot sweeps
555 FSweepAdB = []
556 FSweepBdB = []
557 FSweepAPh = []
558 FSweepBPh = []
559 NSweepSeriesR = []
560 NSweepSeriesX = []
561 NSweepSeriesMag = [] # in ohms
562 NSweepSeriesAng = [] # in degrees
563 NetworkScreenStatus = IntVar(0)
564 BDSweepFile = IntVar(0)
565 FileSweepFreq = []
566 FileSweepAmpl = []
567 #
568 MarkerNum = MarkerFreqNum = 0
569 ShowTCur = IntVar(0)
570 ShowVCur = IntVar(0)
571 TCursor = VCursor = 0
572 ShowXCur = IntVar(0)
573 ShowYCur = IntVar(0)
574 XCursor = YCursor = 0
575 ShowFCur = IntVar(0)
576 ShowdBCur = IntVar(0)
577 FCursor = dBCursor = 0
578 ShowBPCur = IntVar(0)
579 ShowBdBCur = IntVar(0)
580 BPCursor = BdBCursor = 0
581 RUNstatus = IntVar(0) # 0 stopped, 1 start, 2 running, 3 stop and restart, 4 stop
582 PowerStatus = 1
583 TRIGGERsample = 0 # AD sample trigger point
584 DX = 0 # interpolated trigger point
585 
586 DBdivlist = [1, 2, 3, 5, 10, 15, 20] # dB per division
587 DBdivindex = IntVar(0) # 10 dB/div as initial value
588 DBdivindex.set(4)
589 DBlevel = IntVar(0) # Reference level
590 DBlevel.set(0)
591 DBdivindexBP = IntVar(0) # 10 dB/div as initial value
592 DBdivindexBP.set(4)
593 DBlevelBP = IntVar(0) # Reference level
594 DBlevelBP.set(0)
595 hldn = 0
596 SpectrumScreenStatus = IntVar(0)
597 SmoothCurvesSA = IntVar(0)
598 SmoothCurvesBP = IntVar(0)
599 CutDC = IntVar(0)
600 IAScreenStatus = IntVar(0)
601 NqPScreenStatus = IntVar(0)
602 NqPDisp = IntVar(0)
603 NiCScreenStatus = IntVar(0)
604 NiCDisp = IntVar(0)
605 ImpedanceMagnitude = 0.0 # in ohms
606 ImpedanceAngle = 0.0 # in degrees
607 ImpedanceRseries = 0.0 # in ohms
608 ImpedanceXseries = 0.0 # in ohms
609 Show_Rseries = IntVar(0)
610 Show_Xseries = IntVar(0)
611 Show_Magnitude = IntVar(0)
612 Show_Angle = IntVar(0)
613 Show_RseriesRef = IntVar(0)
614 Show_XseriesRef = IntVar(0)
615 Show_MagnitudeRef = IntVar(0)
616 Show_AngleRef = IntVar(0)
617 
618 TIARline = []
619 TIAXline = []
620 TIAMagline = []
621 TIAAngline = []
622 TIAMline = []
623 TIAMRline = []
624 RefIARline = []
625 RefIAXline = []
626 RefIAMagline = []
627 RefIAAngline = []
628 IASource = IntVar(0)
629 
630 DisplaySeries = IntVar(0)
631 IA_Ext_Conf = IntVar(0)
632 IASweepSaved = IntVar(0)
633 OverRangeFlagA = 0
634 OverRangeFlagB = 0
635 PeakdbA = 10
636 PeakdbB = 10
637 PeakRelPhase = 0.0
638 PeakfreqA = 100
639 PeakfreqB = 1000
640 OhmStatus = IntVar(0)
641 OhmRunStatus = IntVar(0)
642 FFTbandwidth = 0 # The FFT bandwidth
643 FFTBuffA = [] # Clear the FFTBuff array for trace A
644 FFTBuffB = [] # Clear the FFTBuff array for trace B
645 FFTresultA = [] # FFT result CHA
646 PhaseA = []
647 FFTresultB = [] # FFT result CHB
648 PhaseB = []
649 FFTresultAB = []
650 FFTwindowname = "--" # The FFT window name
651 FFTmemoryA = numpy.ones(1) # The memory for averaging
652 PhaseMemoryA = numpy.ones(1)
653 FFTmemoryB = numpy.ones(1) # The memory for averaging
654 PhaseMemoryB = numpy.ones(1)
655 SMPfftpwrTwo = IntVar(0) # The power of two of SMPfft
656 SMPfftpwrTwo.set(11)
657 SMPfft = 2 ** SMPfftpwrTwo.get() # Initialize
658 Two28 = 268435456
659 FFTwindowshape = numpy.ones(SMPfft) # The FFT window curve
660 
661 T1Fline = [] # Frequency Trace line channel A
662 T2Fline = [] # Frequency Trace line channel B
663 T1Pline = [] # Phase angle Trace line channel A - B
664 T2Pline = [] # Phase angle Trace line channel B - A
665 T1FRline = [] # F reference Trace line channel A
666 T2FRline = [] # F reference Trace line channel B
667 T1PRline = [] # Phase reference Trace line channel A - B
668 T2PRline = [] # Phase reference Trace line channel B - A
669 TFMline = [] # Frequency Math Trace
670 TFRMline = [] # Frequency reference Math Trace
671 FreqTraceMode = IntVar(0) # 1 normal mode, 2 max hold mode, 3 average mode
672 FreqTraceMode.set(1)
673 
674 TAFline = [] # Bode Freq Trace line channel A
675 TBFline = [] # Bode Freq Trace line channel B
676 TAPline = [] # Bode Phase angle Trace line channel A - B
677 TBPline = [] # Bode Phase angle Trace line channel B - A
678 TAFRline = [] # Bode F reference Trace line channel A
679 TBFRline = [] # Bode F reference Trace line channel B
680 TAPRline = [] # Bode Phase reference Trace line channel A - B
681 TBPRline = [] # Bode Phase reference Trace line channel B - A
682 TBPMline = [] # Bode Frequency Math Trace
683 TBPRMline = [] # Bode Frequency reference Math Trace
684 #
685 MinSamplesSA = 64
686 MaxSamplesSA = 65536
687 #
688 MathScreenStatus = IntVar(0)
689 #
690 XYScreenStatus = IntVar(0)
691 Xsignal = IntVar(0) # Signal for X axis variable
692 Xsignal.set(1)
693 Ysignal = IntVar(0) # Signal for X axis variable
694 Ysignal.set(3)
695 ShowRXY = IntVar(0) # show reference XY trace
696 # show Analog Input Mux Variables
697 Show_CBA = IntVar(0)
698 Show_CBB = IntVar(0)
699 Show_CBC = IntVar(0)
700 Show_CBD = IntVar(0)
701 D0 = IntVar(0)
702 D1 = IntVar(0)
703 D2 = IntVar(0)
704 D3 = IntVar(0)
705 D4 = IntVar(0)
706 D5 = IntVar(0)
707 D6 = IntVar(0)
708 D7 = IntVar(0)
709 PIO_0 = 28
710 PIO_1 = 29
711 PIO_2 = 47
712 PIO_3 = 3
713 PIO_4 = 4
714 PIO_5 = 5
715 PIO_6 = 6
716 PIO_7 = 7
717 #
718 SCLKPort = IntVar(0)
719 SDATAPort = IntVar(0)
720 SLATCHPort = IntVar(0)
721 
722 
723 hipulse = """
724 R0lGODlhGQAYAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/
725 /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
726 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm
727 AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/
728 MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm
729 ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/
730 mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm
731 zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/
732 /5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ
733 AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA
734 M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ
735 ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A
736 mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z
737 zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///ywAAAAAGQAYAAAIZwAfCBxI
738 sKDBgw8AKFzIsKFChA4jMoQoUSJFAAgHLryYUeDGgx8zhiw4EuRDkxg7ltR4UmRLki9RclQZk2VK
739 lzdh5pTJE+dMnz1/6uyYsKZHowRXHt1pcGREohUbQo2qNKlDolgFBgQAOw==
740 """
741 hipulseimg = PhotoImage(data=hipulse)
742 
743 lowpulse = """
744 R0lGODlhGQAYAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/
745 /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
746 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm
747 AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/
748 MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm
749 ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/
750 mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm
751 zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/
752 /5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ
753 AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA
754 M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ
755 ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A
756 mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z
757 zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///ywAAAAAGQAYAAAIZwAfCBxI
758 sKBBggASKgRwEOHChwsbDoRIkaHEBxQdWpSosGHHix8NhvSYkORGkyhBljw4kuVKkS9TwjzpkubE
759 mDVl6tR4ESPOmzYLtgTac6hAozxzqgzqkynRmhUhmoz6cCpVpD0vBgQAOw==
760 """
761 lowpulseimg = PhotoImage(data=lowpulse)
762 
763 class CreateToolTip(object):
764 
765  def __init__(self, widget, text='widget info'):
766  self.waittime = 500 #miliseconds
767  self.wraplength = 100 #pixels
768  self.widget = widget
769  self.text = text
770  self.widget.bind("<Enter>", self.enter)
771  self.widget.bind("<Leave>", self.leave)
772  self.widget.bind("<ButtonPress>", self.leave)
773  self.id = None
774  self.tw = None
775 
776  def enter(self, event=None):
777  self.schedule()
778 
779  def leave(self, event=None):
780  self.unschedule()
781  self.hidetip()
782 
783  def schedule(self):
784  self.unschedule()
785  self.id = self.widget.after(self.waittime, self.showtip)
786 
787  def unschedule(self):
788  id = self.id
789  self.id = None
790  if id:
791  self.widget.after_cancel(id)
792 
793  def showtip(self, event=None):
794  x = y = 0
795  x, y, cx, cy = self.widget.bbox("insert")
796  x += self.widget.winfo_rootx() + 25
797  y += self.widget.winfo_rooty() + 20
798  # creates a toplevel window
799  self.tw = Toplevel(self.widget)
800  # Leaves only the label and removes the app window
801  self.tw.wm_overrideredirect(True)
802  self.tw.wm_geometry("+%d+%d" % (x, y))
803  label = Label(self.tw, text=self.text, justify='left',
804  background="#ffffe0", foreground="#000000",
805  relief='solid', borderwidth=1,
806  wraplength = self.wraplength)
807  label.pack(ipadx=1)
808 
809  def hidetip(self):
810  tw = self.tw
811  self.tw= None
812  if tw:
813  tw.destroy()
814 
815  def configure(self, text):
816  self.text = text
817 #
818 # =========== Start widgets routines =============================
819 
821 def BSaveConfig(filename):
822  global TgInput, TgEdge, ManualTrigger, SingleShot, AutoLevel, SingleShotSA
823  global root, freqwindow, awgwindow, iawindow, xywindow, win1, win2
824  global TRIGGERentry, TMsb, Xsignal, Ysignal, AutoCenterA, AutoCenterB
825  global CHAsb, CHAIsb, CHBsb, CHBIsb, HScale, FreqTraceMode
826  global CHAsbxy, CHAIsbxy, CHBsbxy, CHBIsbxy, HoldOffentry
827  global CHAVPosEntryxy, CHBVPosEntryxy, CHAIPosEntryxy, CHBIPosEntryxy
828  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I, MathTrace, MathXUnits, MathYUnits
829  global CHAVPosEntry, CHAIPosEntry, CHBVPosEntry, CHBIPosEntry
830  global AWGAAmplEntry, AWGAOffsetEntry, AWGAFreqEntry, AWGADutyCycleEntry
831  global AWGAPhaseEntry, AWGAShape, AWGATerm, AWGAMode, AWGARepeatFlag, AWGBRepeatFlag
832  global AWGBAmplEntry, AWGBOffsetEntry, AWGBFreqEntry, AWGBDutyCycleEntry
833  global AWGBPhaseEntry, AWGBShape, AWGBTerm, AWGBMode, AWGSync, AWGAIOMode, AWGBIOMode
834  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
835  global MeasDCV1, MeasMinV1, MeasMaxV1, MeasMidV1, MeasPPV1, MeasDCI1, MeasMinI1
836  global MeasMaxI1, MeasMidI1, MeasPPI1, MeasDCV2, MeasMinV2, MeasMaxV2, MeasMidV2
837  global MeasPPV2, MeasDCI2, MeasMinI2, MeasMaxI2, MeasMidI2, MeasPPI2, MeasDiffAB, MeasDiffBA
838  global MeasRMSV1, MeasRMSV2, MeasRMSI1, MeasRMSI2, MeasPhase
839  global MeasAHW, MeasALW, MeasADCy, MeasAPER, MeasAFREQ, IASource, DisplaySeries
840  global MeasBHW, MeasBLW, MeasBDCy, MeasBPER, MeasBFREQ
841  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
842  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P, CutDC, DacScreenStatus, DigScreenStatus
843  global FFTwindow, DBdivindex, DBlevel, TRACEmodeTime, TRACEaverage, Vdiv
844  global SMPfftpwrTwo, SMPfft, StartFreqEntry, StopFreqEntry, ZEROstuffing
845  global TimeDisp, XYDisp, FreqDisp, IADisp, XYScreenStatus, IAScreenStatus, SpectrumScreenStatus
846  global RsystemEntry, ResScale, GainCorEntry, PhaseCorEntry, AWGAPhaseDelay, AWGBPhaseDelay
847  global MeasTopV1, MeasBaseV1, MeasTopV2, MeasBaseV2, MeasDelay
848  global Show_CBA, Show_CBB, Show_CBC, Show_CBD, MuxScreenStatus, MuxEnb
849  global CHB_Asb, CHB_APosEntry, CHB_Bsb, CHB_BPosEntry, muxwindow
850  global CHB_Csb, CHB_CPosEntry, CHB_Dsb, CHB_DPosEntry, HozPossentry
851  global SmoothCurvesBP, bodewindow, AWG_Amp_Mode, ColorMode
852  global ShowCA_VdB, ShowCA_P, ShowCB_VdB, ShowCB_P, ShowMarkerBP, BodeDisp
853  global ShowCA_RdB, ShowCA_RP, ShowCB_RdB, ShowCB_RP, ShowMathBP, ShowRMathBP
854  global BPSweepMode, BPSweepCont, BodeScreenStatus, RevDate, SweepStepBodeEntry
855  global HScaleBP, StopBodeEntry, StartBodeEntry, ShowBPCur, ShowBdBCur, BPCursor, BdBCursor
856  global MathString, MathXString, MathYString, UserAString, UserALabel, UserBString, UserBLabel
857  global MathAxis, MathXAxis, MathYAxis, Show_MathX, Show_MathY, MathScreenStatus, MathWindow
858  global AWGAMathString, AWGBMathString, FFTUserWindowString, DigFilterAString, DigFilterBString
859  global GRWF, GRHF, GRWBP, GRHBP, GRWXY, GRHXY, GRWIA, GRHIA, MeasureStatus
860  global ChaLableSrring1, ChaLableSrring2, ChaLableSrring3, ChaLableSrring4, ChaLableSrring5, ChaLableSrring6
861  global ChbLableSrring1, ChbLableSrring2, ChbLableSrring3, ChbLableSrring4, ChbLableSrring5, ChbLableSrring6
862  global ChaMeasString1, ChaMeasString2, ChaMeasString3, ChaMeasString4, ChaMeasString5, ChaMeasString6
863  global ChbMeasString1, ChbMeasString2, ChbMeasString3, ChbMeasString4, ChbMeasString5, ChbMeasString6
864  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2, CHAI_RC_HP, CHBI_RC_HP
865  global CHA_A1, CHA_A2, CHB_A1, CHB_A2, RelPhaseCenter, ImpedanceCenter, NetworkScreenStatus
866  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
867  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
868  global Show_Rseries, Show_Xseries, Show_Magnitude, Show_Angle
869  global AWGABurstFlag, AWGACycles, AWGABurstDelay, AWGAcsvFile, AWGBcsvFile
870  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay, AWGAwavFile, AWGBwavFile
871  global SCLKPort, SDATAPort, SLATCHPort, EnableHSsampling, FminEntry, HtMulEntry
872  global Auto_ETS_Comp, ETS_TC1, ETS_A1, ETS_TC2, ETS_A2
873  global ets_TC1Entry, ets_A1Entry, ets_TC2Entry, ets_A2Entry
874  global DigFiltStatus, DigFiltABoxCar, DigFiltBBoxCar, BCALenEntry, BCBLenEntry
875  global phawindow, PhAca, PhAScreenStatus, PhADisp
876  global GRWPhA, X0LPhA, GRHPhA, Y0TPhA
877  global VScale, IScale, RefphEntry, EnableScopeOnly
878  global vat_btn, vbt_btn, iat_btn, ibt_btn, vabt_btn
879  global ShowPB_A, ShowPB_B, ShowPB_C, ShowPB_D
880 
881  # open Config file for Write?
882  try:
883  ConfgFile = open(filename, "w")
884  except: # didn't work? then just return
885  return
886  # Save Window placements
887  ConfgFile.write("root.geometry('+" + str(root.winfo_x()) + '+' + str(root.winfo_y()) + "')\n")
888  if EnableScopeOnly == 0:
889  ConfgFile.write("awgwindow.geometry('+" + str(awgwindow.winfo_x()) + '+' + str(awgwindow.winfo_y()) + "')\n")
890  ConfgFile.write('global GRW; GRW = ' + str(GRW) + '\n')
891  ConfgFile.write('global GRH; GRH = ' + str(GRH) + '\n')
892  ConfgFile.write('ColorMode.set(' + str(ColorMode.get()) + ')\n')
893  # Windows configuration
894  ConfgFile.write('global MathString; MathString = "' + MathString + '"\n')
895  ConfgFile.write('global MathUnits; MathUnits = "' + MathUnits + '"\n')
896  ConfgFile.write('global MathAxis; MathAxis = "' + MathAxis + '"\n')
897  ConfgFile.write('global MathXString; MathXString = "' + MathXString + '"\n')
898  ConfgFile.write('global MathXUnits; MathXUnits = "' + MathXUnits + '"\n')
899  ConfgFile.write('global MathXAxis; MathXAxis = "' + MathXAxis + '"\n')
900  ConfgFile.write('global MathYString; MathYString = "' + MathYString + '"\n')
901  ConfgFile.write('global MathYUnits; MathYUnits = "' + MathYUnits + '"\n')
902  ConfgFile.write('global MathYAxis; MathYAxis = "' + MathYAxis + '"\n')
903  if MathScreenStatus.get() > 0:
904  ConfgFile.write('NewEnterMathControls()\n')
905  ConfgFile.write("MathWindow.geometry('+" + str(MathWindow.winfo_x()) + '+' + str(MathWindow.winfo_y()) + "')\n")
906  else:
907  ConfgFile.write('DestroyMathScreen()\n')
908  if XYScreenStatus.get() > 0:
909  ConfgFile.write('global GRWXY; GRWXY = ' + str(GRWXY) + '\n')
910  ConfgFile.write('global GRHXY; GRHXY = ' + str(GRHXY) + '\n')
911  ConfgFile.write('MakeXYWindow()\n')
912  ConfgFile.write("xywindow.geometry('+" + str(xywindow.winfo_x()) + '+' + str(xywindow.winfo_y()) + "')\n")
913  ConfgFile.write('CHAsbxy.delete(0,END)\n')
914  ConfgFile.write('CHAsbxy.insert(0, ' + CHAsbxy.get() + ')\n')
915  ConfgFile.write('CHAIsbxy.delete(0,END)\n')
916  ConfgFile.write('CHAIsbxy.insert(0, ' + CHAIsbxy.get() + ')\n')
917  ConfgFile.write('CHAVPosEntryxy.delete(0,END)\n')
918  ConfgFile.write('CHAVPosEntryxy.insert(4, ' + CHAVPosEntryxy.get() + ')\n')
919  ConfgFile.write('CHAIPosEntryxy.delete(0,END)\n')
920  ConfgFile.write('CHAIPosEntryxy.insert(4, ' + CHAIPosEntryxy.get() + ')\n')
921  ConfgFile.write('CHBsbxy.delete(0,END)\n')
922  ConfgFile.write('CHBsbxy.insert(0, ' + CHBsbxy.get() + ')\n')
923  ConfgFile.write('CHBIsbxy.delete(0,END)\n')
924  ConfgFile.write('CHBIsbxy.insert(0, ' + CHBIsbxy.get() + ')\n')
925  ConfgFile.write('CHBVPosEntryxy.delete(0,END)\n')
926  ConfgFile.write('CHBVPosEntryxy.insert(4, ' + CHBVPosEntryxy.get() + ')\n')
927  ConfgFile.write('CHBIPosEntryxy.delete(0,END)\n')
928  ConfgFile.write('CHBIPosEntryxy.insert(4, ' + CHBIPosEntryxy.get() + ')\n')
929  else:
930  ConfgFile.write('DestroyXYScreen()\n')
931  if IAScreenStatus.get() > 0:
932  ConfgFile.write('global GRWIA; GRWIA = ' + str(GRWIA) + '\n')
933  ConfgFile.write('global GRHIA; GRHIA = ' + str(GRHIA) + '\n')
934  ConfgFile.write('MakeIAWindow()\n')
935  ConfgFile.write("iawindow.geometry('+" + str(iawindow.winfo_x()) + '+' + str(iawindow.winfo_y()) + "')\n")
936  ConfgFile.write('IASource.set(' + str(IASource.get()) + ')\n')
937  ConfgFile.write('DisplaySeries.set(' + str(DisplaySeries.get()) + ')\n')
938  ConfgFile.write('RsystemEntry.delete(0,END)\n')
939  ConfgFile.write('RsystemEntry.insert(5, ' + RsystemEntry.get() + ')\n')
940  ConfgFile.write('ResScale.delete(0,END)\n')
941  ConfgFile.write('ResScale.insert(5, ' + ResScale.get() + ')\n')
942  ConfgFile.write('GainCorEntry.delete(0,END)\n')
943  ConfgFile.write('GainCorEntry.insert(5, ' + GainCorEntry.get() + ')\n')
944  ConfgFile.write('PhaseCorEntry.delete(0,END)\n')
945  ConfgFile.write('PhaseCorEntry.insert(5, ' + PhaseCorEntry.get() + ')\n')
946  ConfgFile.write('NetworkScreenStatus.set(' + str(NetworkScreenStatus.get()) + ')\n')
947  else:
948  ConfgFile.write('DestroyIAScreen()\n')
949  if SpectrumScreenStatus.get() > 0:
950  ConfgFile.write('global GRWF; GRWF = ' + str(GRWF) + '\n')
951  ConfgFile.write('global GRHF; GRHF = ' + str(GRHF) + '\n')
952  ConfgFile.write('RelPhaseCenter.set(' + str(RelPhaseCenter.get()) + ')\n')
953  ConfgFile.write('MakeSpectrumWindow()\n')
954  ConfgFile.write("freqwindow.geometry('+" + str(freqwindow.winfo_x()) + '+' + str(freqwindow.winfo_y()) + "')\n")
955  ConfgFile.write('ShowC1_VdB.set(' + str(ShowC1_VdB.get()) + ')\n')
956  ConfgFile.write('ShowC1_P.set(' + str(ShowC1_P.get()) + ')\n')
957  ConfgFile.write('ShowC2_VdB.set(' + str(ShowC2_VdB.get()) + ')\n')
958  ConfgFile.write('ShowC2_P.set(' + str(ShowC2_P.get()) + ')\n')
959  ConfgFile.write('StartFreqEntry.delete(0,END)\n')
960  ConfgFile.write('StartFreqEntry.insert(5, ' + StartFreqEntry.get() + ')\n')
961  ConfgFile.write('StopFreqEntry.delete(0,END)\n')
962  ConfgFile.write('StopFreqEntry.insert(5, ' + StopFreqEntry.get() + ')\n')
963  ConfgFile.write('HScale.set(' + str(HScale.get()) + ')\n')
964  ConfgFile.write('FreqTraceMode.set(' + str(FreqTraceMode.get()) + ')\n')
965  ConfgFile.write('SingleShotSA.set(' + str(SingleShotSA.get()) + ')\n')
966  else:
967  ConfgFile.write('DestroySpectrumScreen()\n')
968  #
969  if DacScreenStatus.get() > 0:
970  ConfgFile.write('MakeDacScreen()\n')
971  ConfgFile.write("win1.geometry('+" + str(win1.winfo_x()) + '+' + str(win1.winfo_y()) + "')\n")
972  else:
973  ConfgFile.write('DestroyDacScreen()\n')
974  if DigScreenStatus.get() > 0:
975  ConfgFile.write('MakeDigScreen()\n')
976  ConfgFile.write("win2.geometry('+" + str(win2.winfo_x()) + '+' + str(win2.winfo_y()) + "')\n")
977  else:
978  ConfgFile.write('DestroyDigScreen()\n')
979  if EnableHSsampling > 0:
980  ConfgFile.write('FminEntry.delete(0,"end")\n')
981  ConfgFile.write('FminEntry.insert(0, ' + FminEntry.get() + ')\n')
982  ConfgFile.write('HtMulEntry.delete(0,"end")\n')
983  ConfgFile.write('HtMulEntry.insert(0, ' + HtMulEntry.get() + ')\n')
984  ConfgFile.write('Auto_ETS_Comp.set(' + str(Auto_ETS_Comp.get()) + ')\n')
985  try:
986  ConfgFile.write('ets_TC1Entry.delete(0,"end")\n')
987  ConfgFile.write('ets_TC1Entry.insert(0, ' + ets_TC1Entry.get() + ')\n')
988  ConfgFile.write('ETS_TC1.set(' + ets_TC1Entry.get() + ')\n')
989  ConfgFile.write('ets_A1Entry.delete(0,"end")\n')
990  ConfgFile.write('ets_A1Entry.insert(0, ' + ets_A1Entry.get() + ')\n')
991  ConfgFile.write('ETS_A1.set(' + ets_A1Entry.get() + ')\n')
992  ConfgFile.write('ets_TC2Entry.delete(0,"end")\n')
993  ConfgFile.write('ets_TC2Entry.insert(0, ' + ets_TC2Entry.get() + ')\n')
994  ConfgFile.write('ETS_TC2.set(' + ets_TC2Entry.get() + ')\n')
995  ConfgFile.write('ets_A2Entry.delete(0,"end")\n')
996  ConfgFile.write('ets_A2Entry.insert(0, ' + ets_A2Entry.get() + ')\n')
997  ConfgFile.write('ETS_A2.set(' + ets_A2Entry.get() + ')\n')
998  except:
999  ConfgFile.write('ETS_TC1.set(' + str(ETS_TC1.get()) + ')\n')
1000  ConfgFile.write('ETS_A1.set(' + str(ETS_A1.get()) + ')\n')
1001  ConfgFile.write('ETS_TC2.set(' + str(ETS_TC2.get()) + ')\n')
1002  ConfgFile.write('ETS_A2.set(' + str(ETS_A2.get()) + ')\n')
1003  if DigFiltStatus.get() == 1:
1004  ConfgFile.write('MakeDigFiltWindow()\n')
1005  ConfgFile.write('DigFiltABoxCar.set(' + str(DigFiltABoxCar.get()) + ')\n')
1006  ConfgFile.write('DigFiltBBoxCar.set(' + str(DigFiltBBoxCar.get()) + ')\n')
1007  ConfgFile.write('BCALenEntry.delete(0,"end")\n')
1008  ConfgFile.write('BCALenEntry.insert(0, ' + BCALenEntry.get() + ')\n')
1009  ConfgFile.write('BCBLenEntry.delete(0,"end")\n')
1010  ConfgFile.write('BCBLenEntry.insert(0, ' + BCBLenEntry.get() + ')\n')
1011  ConfgFile.write('BuildBoxCarA()\n')
1012  ConfgFile.write('BuildBoxCarB()\n')
1013  else:
1014  ConfgFile.write('DestroyDigFiltScreen()\n')
1015  if MinigenScreenStatus.get() == 1:
1016  ConfgFile.write('MakeMinigenWindow()\n')
1017  ConfgFile.write("minigenwindow.geometry('+" + str(minigenwindow.winfo_x()) + '+' + str(minigenwindow.winfo_y()) + "')\n")
1018  ConfgFile.write('MinigenMode.set(' + str(MinigenMode.get()) + ')\n')
1019  ConfgFile.write('MinigenFout.delete(0,END)\n')
1020  ConfgFile.write('MinigenFout.insert(4, ' + MinigenFout.get() + ')\n')
1021  ConfgFile.write('MinigenFclk.delete(0,END)\n')
1022  ConfgFile.write('MinigenFclk.insert(4, ' + MinigenFclk.get() + ')\n')
1023  ConfgFile.write('SCLKPort.set(' + str(SCLKPort.get()) + ')\n')
1024  ConfgFile.write('SDATAPort.set(' + str(SDATAPort.get()) + ')\n')
1025  ConfgFile.write('SLATCHPort.set(' + str(SLATCHPort.get()) + ')\n')
1026  else:
1027  ConfgFile.write('DestroyMinigenScreen()\n')
1028  if MuxScreenStatus.get() == 1:
1029  ConfgFile.write('MakeMuxModeWindow()\n')
1030  ConfgFile.write("muxwindow.geometry('+" + str(muxwindow.winfo_x()) + '+' + str(muxwindow.winfo_y()) + "')\n")
1031  ConfgFile.write('Show_CBA.set(' + str(Show_CBA.get()) + ')\n')
1032  ConfgFile.write('Show_CBB.set(' + str(Show_CBB.get()) + ')\n')
1033  ConfgFile.write('Show_CBC.set(' + str(Show_CBC.get()) + ')\n')
1034  ConfgFile.write('Show_CBD.set(' + str(Show_CBD.get()) + ')\n')
1035  ConfgFile.write('MuxEnb.set(' + str(MuxEnb.get()) + ')\n')
1036  ConfgFile.write('CHB_Asb.delete(0,END)\n')
1037  ConfgFile.write('CHB_Asb.insert(0, ' + CHB_Asb.get() + ')\n')
1038  ConfgFile.write('CHB_Bsb.delete(0,END)\n')
1039  ConfgFile.write('CHB_Bsb.insert(0, ' + CHB_Bsb.get() + ')\n')
1040  ConfgFile.write('CHB_Csb.delete(0,END)\n')
1041  ConfgFile.write('CHB_Csb.insert(0, ' + CHB_Csb.get() + ')\n')
1042  ConfgFile.write('CHB_Dsb.delete(0,END)\n')
1043  ConfgFile.write('CHB_Dsb.insert(0, ' + CHB_Dsb.get() + ')\n')
1044  ConfgFile.write('CHB_APosEntry.delete(0,END)\n')
1045  ConfgFile.write('CHB_APosEntry.insert(4, ' + CHB_APosEntry.get() + ')\n')
1046  ConfgFile.write('CHB_BPosEntry.delete(0,END)\n')
1047  ConfgFile.write('CHB_BPosEntry.insert(4, ' + CHB_BPosEntry.get() + ')\n')
1048  ConfgFile.write('CHB_CPosEntry.delete(0,END)\n')
1049  ConfgFile.write('CHB_CPosEntry.insert(4, ' + CHB_CPosEntry.get() + ')\n')
1050  ConfgFile.write('CHB_DPosEntry.delete(0,END)\n')
1051  ConfgFile.write('CHB_DPosEntry.insert(4, ' + CHB_DPosEntry.get() + ')\n')
1052  else:
1053  ConfgFile.write('DestroyMuxScreen()\n')
1054  # Save Phase Anayzer stuff after Analog Mux in case they are both open
1055  if PhAScreenStatus.get() > 0:
1056  ConfgFile.write('global GRWPhA; GRWPhA = ' + str(GRWPhA) + '\n')
1057  ConfgFile.write('global GRHPhA; GRHPhA = ' + str(GRHPhA) + '\n')
1058  ConfgFile.write('MakePhAWindow()\n')
1059  ConfgFile.write("phawindow.geometry('+" + str(phawindow.winfo_x()) + '+' + str(phawindow.winfo_y()) + "')\n")
1060  ConfgFile.write('VScale.delete(0,END)\n')
1061  ConfgFile.write('VScale.insert(0, ' + str(VScale.get()) + ')\n')
1062  ConfgFile.write('IScale.delete(0,END)\n')
1063  ConfgFile.write('IScale.insert(0, ' + str(IScale.get()) + ')\n')
1064  ConfgFile.write('RefphEntry.delete(0,END)\n')
1065  ConfgFile.write('RefphEntry.insert(0, "' + str(RefphEntry.get()) + '")\n')
1066  if vat_btn.config('text')[-1] == 'OFF':
1067  ConfgFile.write('vat_btn.config(text="OFF", style="Stop.TButton")\n')
1068  else:
1069  ConfgFile.write('vat_btn.config(text="ON", style="Run.TButton")\n')
1070  if MuxScreenStatus.get() == 0: # these buttons do not exist if Mux screen open
1071  if vbt_btn.config('text')[-1] == 'OFF':
1072  ConfgFile.write('vbt_btn.config(text="OFF", style="Stop.TButton")\n')
1073  else:
1074  ConfgFile.write('vbt_btn.config(text="ON", style="Run.TButton")\n')
1075  if vabt_btn.config('text')[-1] == 'OFF':
1076  ConfgFile.write('vabt_btn.config(text="OFF", style="Stop.TButton")\n')
1077  else:
1078  ConfgFile.write('vabt_btn.config(text="ON", style="Run.TButton")\n')
1079  else: # But these do
1080  ConfgFile.write('ShowPB_A.set(' + str(ShowPB_A.get()) + ')\n')
1081  ConfgFile.write('ShowPB_B.set(' + str(ShowPB_B.get()) + ')\n')
1082  ConfgFile.write('ShowPB_C.set(' + str(ShowPB_C.get()) + ')\n')
1083  ConfgFile.write('ShowPB_D.set(' + str(ShowPB_D.get()) + ')\n')
1084  if iat_btn.config('text')[-1] == 'OFF':
1085  ConfgFile.write('iat_btn.config(text="OFF", style="Stop.TButton")\n')
1086  else:
1087  ConfgFile.write('iat_btn.config(text="ON", style="Run.TButton")\n')
1088  if ibt_btn.config('text')[-1] == 'OFF':
1089  ConfgFile.write('ibt_btn.config(text="OFF", style="Stop.TButton")\n')
1090  else:
1091  ConfgFile.write('ibt_btn.config(text="ON", style="Run.TButton")\n')
1092  #
1093  else:
1094  ConfgFile.write('DestroyPhAScreen()\n')
1095  if BodeScreenStatus.get() == 1:
1096  ConfgFile.write('global GRWBP; GRWBP = ' + str(GRWBP) + '\n')
1097  ConfgFile.write('global GRHBP; GRHBP = ' + str(GRHBP) + '\n')
1098  ConfgFile.write('RelPhaseCenter.set(' + str(RelPhaseCenter.get()) + ')\n')
1099  ConfgFile.write('ImpedanceCenter.set(' + str(ImpedanceCenter.get()) + ')\n')
1100  ConfgFile.write('MakeBodeWindow()\n')
1101  ConfgFile.write("bodewindow.geometry('+" + str(bodewindow.winfo_x()) + '+' + str(bodewindow.winfo_y()) + "')\n")
1102  ConfgFile.write('ShowCA_VdB.set(' + str(ShowCA_VdB.get()) + ')\n')
1103  ConfgFile.write('ShowCB_VdB.set(' + str(ShowCB_VdB.get()) + ')\n')
1104  ConfgFile.write('ShowCA_P.set(' + str(ShowCA_P.get()) + ')\n')
1105  ConfgFile.write('ShowCB_P.set(' + str(ShowCB_P.get()) + ')\n')
1106  ConfgFile.write('ShowCA_RdB.set(' + str(ShowCA_RdB.get()) + ')\n')
1107  ConfgFile.write('ShowCA_RP.set(' + str(ShowCA_RP.get()) + ')\n')
1108  ConfgFile.write('ShowCB_RdB.set(' + str(ShowCB_RdB.get()) + ')\n')
1109  ConfgFile.write('ShowCB_RP.set(' + str(ShowCB_RP.get()) + ')\n')
1110  ConfgFile.write('BodeDisp.set(' + str(BodeDisp.get()) + ')\n')
1111  ConfgFile.write('ShowMarkerBP.set(' + str(ShowMarkerBP.get()) + ')\n')
1112  ConfgFile.write('ShowMathBP.set(' + str(ShowMathBP.get()) + ')\n')
1113  ConfgFile.write('ShowRMathBP.set(' + str(ShowRMathBP.get()) + ')\n')
1114  ConfgFile.write('HScaleBP.set(' + str(HScaleBP.get()) + ')\n')
1115  ConfgFile.write('NSteps.set(' + str(NSteps.get()) + ')\n')
1116  ConfgFile.write('DBdivindexBP.set(' + str(DBdivindexBP.get()) + ')\n')
1117  ConfgFile.write('DBlevelBP.set(' + str(DBlevelBP.get()) + ')\n')
1118  ConfgFile.write('FSweepMode.set(' + str(FSweepMode.get()) + ')\n')
1119  ConfgFile.write('SweepStepBodeEntry.delete(0,END)\n')
1120  ConfgFile.write('SweepStepBodeEntry.insert(4, ' + SweepStepBodeEntry.get() + ')\n')
1121  ConfgFile.write('StopBodeEntry.delete(0,END)\n')
1122  ConfgFile.write('StopBodeEntry.insert(4, ' + StopBodeEntry.get() + ')\n')
1123  ConfgFile.write('StartBodeEntry.delete(0,END)\n')
1124  ConfgFile.write('StartBodeEntry.insert(4, ' + StartBodeEntry.get() + ')\n')
1125  ConfgFile.write('Show_Rseries.set(' + str(Show_Rseries.get()) + ')\n')
1126  ConfgFile.write('Show_Xseries.set(' + str(Show_Xseries.get()) + ')\n')
1127  ConfgFile.write('Show_Magnitude.set(' + str(Show_Magnitude.get()) + ')\n')
1128  ConfgFile.write('Show_Angle.set(' + str(Show_Angle.get()) + ')\n')
1129  else:
1130  ConfgFile.write('DestroyBodeScreen()\n')
1131  if MeasureStatus.get() == 1:
1132  # Save strings
1133  ConfgFile.write('global ChaLableSrring1; ChaLableSrring1 = "' + ChaLableSrring1 + '"\n')
1134  ConfgFile.write('global ChaLableSrring2; ChaLableSrring2 = "' + ChaLableSrring2 + '"\n')
1135  ConfgFile.write('global ChaLableSrring3; ChaLableSrring3 = "' + ChaLableSrring3 + '"\n')
1136  ConfgFile.write('global ChaLableSrring4; ChaLableSrring4 = "' + ChaLableSrring4 + '"\n')
1137  ConfgFile.write('global ChaLableSrring5; ChaLableSrring5 = "' + ChaLableSrring5 + '"\n')
1138  ConfgFile.write('global ChaLableSrring6; ChaLableSrring6 = "' + ChaLableSrring6 + '"\n')
1139  ConfgFile.write('global ChbLableSrring1; ChbLableSrring1 = "' + ChbLableSrring1 + '"\n')
1140  ConfgFile.write('global ChbLableSrring2; ChbLableSrring2 = "' + ChbLableSrring2 + '"\n')
1141  ConfgFile.write('global ChbLableSrring3; ChbLableSrring3 = "' + ChbLableSrring3 + '"\n')
1142  ConfgFile.write('global ChbLableSrring4; ChbLableSrring4 = "' + ChbLableSrring4 + '"\n')
1143  ConfgFile.write('global ChbLableSrring5; ChbLableSrring5 = "' + ChbLableSrring5 + '"\n')
1144  ConfgFile.write('global ChbLableSrring6; ChbLableSrring6 = "' + ChbLableSrring6 + '"\n')
1145  ConfgFile.write('global ChaMeasString1; ChaMeasString1 = "' + ChaMeasString1 + '"\n')
1146  ConfgFile.write('global ChaMeasString2; ChaMeasString2 = "' + ChaMeasString2 + '"\n')
1147  ConfgFile.write('global ChaMeasString3; ChaMeasString3 = "' + ChaMeasString3 + '"\n')
1148  ConfgFile.write('global ChaMeasString4; ChaMeasString4 = "' + ChaMeasString4 + '"\n')
1149  ConfgFile.write('global ChaMeasString5; ChaMeasString5 = "' + ChaMeasString5 + '"\n')
1150  ConfgFile.write('global ChaMeasString6; ChaMeasString6 = "' + ChaMeasString6 + '"\n')
1151  ConfgFile.write('global ChbMeasString1; ChbMeasString1 = "' + ChbMeasString1 + '"\n')
1152  ConfgFile.write('global ChbMeasString2; ChbMeasString2 = "' + ChbMeasString2 + '"\n')
1153  ConfgFile.write('global ChbMeasString3; ChbMeasString3 = "' + ChbMeasString3 + '"\n')
1154  ConfgFile.write('global ChbMeasString4; ChbMeasString4 = "' + ChbMeasString4 + '"\n')
1155  ConfgFile.write('global ChbMeasString5; ChbMeasString5 = "' + ChbMeasString5 + '"\n')
1156  ConfgFile.write('global ChbMeasString6; ChbMeasString6 = "' + ChbMeasString6 + '"\n')
1157  ConfgFile.write('MakeMeasureScreen()\n')
1158  ConfgFile.write("measurewindow.geometry('+" + str(measurewindow.winfo_x()) + '+' + str(measurewindow.winfo_y()) + "')\n")
1159  else:
1160  ConfgFile.write('DestroyMeasuewScreen()\n')
1161  if ETSStatus.get() == 1: #
1162  ConfgFile.write('MakeETSWindow()\n')
1163  ConfgFile.write("etswindow.geometry('+" + str(etswindow.winfo_x()) + '+' + str(etswindow.winfo_y()) + "')\n")
1164  ConfgFile.write('ETSDisp.set(' + str(ETSDisp.get()) + ')\n')
1165  ConfgFile.write('ETSDir.set(' + str(ETSDir.get()) + ')\n')
1166  ConfgFile.write('FMulXEntry.delete(0,END)\n')
1167  ConfgFile.write('FMulXEntry.insert(6, ' + FMulXEntry.get() + ')\n')
1168  ConfgFile.write('DivXEntry.delete(0,END)\n')
1169  ConfgFile.write('DivXEntry.insert(4, ' + DivXEntry.get() + ')\n')
1170  ConfgFile.write('ETSts.delete(0,END)\n')
1171  ConfgFile.write('ETSts.insert(4, ' + ETSts.get() + ')\n')
1172  else:
1173  ConfgFile.write('DestroyETSScreen()\n')
1174  #
1175  ConfgFile.write('TRIGGERentry.delete(0,END)\n')
1176  ConfgFile.write('TRIGGERentry.insert(4, ' + TRIGGERentry.get() + ')\n')
1177  ConfgFile.write('HoldOffentry.delete(0,"end")\n')
1178  ConfgFile.write('HoldOffentry.insert(0, ' + HoldOffentry.get() + ')\n')
1179  ConfgFile.write('HozPossentry.delete(0,"end")\n')
1180  ConfgFile.write('HozPossentry.insert(0, ' + HozPossentry.get() + ')\n')
1181  ConfgFile.write('TMsb.delete(0,END)\n')
1182  ConfgFile.write('TMsb.insert(0, ' + TMsb.get() + ')\n')
1183  ConfgFile.write('TgInput.set(' + str(TgInput.get()) + ')\n')
1184  ConfgFile.write('AutoLevel.set(' + str(AutoLevel.get()) + ')\n')
1185  ConfgFile.write('ManualTrigger.set(' + str(ManualTrigger.get()) + ')\n')
1186  ConfgFile.write('SingleShot.set(' + str(SingleShot.get()) + ')\n')
1187  ConfgFile.write('TgEdge.set(' + str(TgEdge.get()) + ')\n')
1188  ConfgFile.write('Xsignal.set(' + str(Xsignal.get()) + ')\n')
1189  ConfgFile.write('Ysignal.set(' + str(Ysignal.get()) + ')\n')
1190  #
1191  ConfgFile.write('TimeDisp.set(' + str(TimeDisp.get()) + ')\n')
1192  ConfgFile.write('XYDisp.set(' + str(XYDisp.get()) + ')\n')
1193  ConfgFile.write('FreqDisp.set(' + str(FreqDisp.get()) + ')\n')
1194  ConfgFile.write('IADisp.set(' + str(IADisp.get()) + ')\n')
1195  ConfgFile.write('ShowC1_V.set(' + str(ShowC1_V.get()) + ')\n')
1196  ConfgFile.write('ShowC1_I.set(' + str(ShowC1_I.get()) + ')\n')
1197  ConfgFile.write('ShowC2_V.set(' + str(ShowC2_V.get()) + ')\n')
1198  ConfgFile.write('ShowC2_I.set(' + str(ShowC2_I.get()) + ')\n')
1199  ConfgFile.write('Show_MathX.set(' + str(Show_MathX.get()) + ')\n')
1200  ConfgFile.write('Show_MathY.set(' + str(Show_MathY.get()) + ')\n')
1201  ConfgFile.write('AutoCenterA.set(' + str(AutoCenterA.get()) + ')\n')
1202  ConfgFile.write('AutoCenterB.set(' + str(AutoCenterB.get()) + ')\n')
1203  ConfgFile.write('TRACEmodeTime.set(' + str(TRACEmodeTime.get()) + ')\n')
1204  #
1205  ConfgFile.write('CHAVPosEntry.delete(0,END)\n')
1206  ConfgFile.write('CHAVPosEntry.insert(4, ' + CHAVPosEntry.get() + ')\n')
1207  ConfgFile.write('CHAIPosEntry.delete(0,END)\n')
1208  ConfgFile.write('CHAIPosEntry.insert(4, ' + CHAIPosEntry.get() + ')\n')
1209  ConfgFile.write('CHAsb.delete(0,END)\n')
1210  ConfgFile.write('CHAsb.insert(0, ' + CHAsb.get() + ')\n')
1211  ConfgFile.write('CHAIsb.delete(0,END)\n')
1212  ConfgFile.write('CHAIsb.insert(0, ' + CHAIsb.get() + ')\n')
1213  #
1214  ConfgFile.write('CHBVPosEntry.delete(0,END)\n')
1215  ConfgFile.write('CHBVPosEntry.insert(4, ' + CHBVPosEntry.get() + ')\n')
1216  ConfgFile.write('CHBIPosEntry.delete(0,END)\n')
1217  ConfgFile.write('CHBIPosEntry.insert(4, ' + CHBIPosEntry.get() + ')\n')
1218  ConfgFile.write('CHBsb.delete(0,END)\n')
1219  ConfgFile.write('CHBsb.insert(0, ' + CHBsb.get() + ')\n')
1220  ConfgFile.write('CHBIsb.delete(0,END)\n')
1221  ConfgFile.write('CHBIsb.insert(0, ' + CHBIsb.get() + ')\n')
1222  # AWG stuff
1223  ConfgFile.write('AWG_Amp_Mode.set('+ str(AWG_Amp_Mode.get()) + ')\n')
1224  ConfgFile.write('AWGAMode.set('+ str(AWGAMode.get()) + ')\n')
1225  ConfgFile.write('AWGAIOMode.set('+ str(AWGAIOMode.get()) + ')\n')
1226  ConfgFile.write('AWGATerm.set('+ str(AWGATerm.get()) + ')\n')
1227  ConfgFile.write('AWGAPhaseDelay.set('+ str(AWGAPhaseDelay.get()) + ')\n')
1228  ConfgFile.write('AWGAAmplEntry.delete(0,END)\n')
1229  ConfgFile.write('AWGAAmplEntry.insert(4, ' + AWGAAmplEntry.get() + ')\n')
1230  ConfgFile.write('AWGAOffsetEntry.delete(0,END)\n')
1231  ConfgFile.write('AWGAOffsetEntry.insert(4, ' + AWGAOffsetEntry.get() + ')\n')
1232  ConfgFile.write('AWGAFreqEntry.delete(0,END)\n')
1233  ConfgFile.write('AWGAFreqEntry.insert(4, ' + AWGAFreqEntry.get() + ')\n')
1234  ConfgFile.write('AWGAPhaseEntry.delete(0,END)\n')
1235  ConfgFile.write('AWGAPhaseEntry.insert(4, ' + AWGAPhaseEntry.get() + ')\n')
1236  ConfgFile.write('AWGADutyCycleEntry.delete(0,END)\n')
1237  ConfgFile.write('AWGADutyCycleEntry.insert(4, ' + AWGADutyCycleEntry.get() + ')\n')
1238  ConfgFile.write('AWGAShape.set(' + str(AWGAShape.get()) + ')\n')
1239  ConfgFile.write('AWGARepeatFlag.set(' + str(AWGARepeatFlag.get()) + ')\n')
1240  ConfgFile.write('AWGABurstFlag.set(' + str(AWGABurstFlag.get()) + ')\n')
1241  ConfgFile.write('global AWGACycles; AWGACycles = ' + str(AWGACycles) + '\n')
1242  ConfgFile.write('global AWGABurstDelay; AWGABurstDelay = ' + str(AWGABurstDelay) + '\n')
1243  #
1244  ConfgFile.write('AWGBMode.set('+ str(AWGBMode.get()) + ')\n')
1245  ConfgFile.write('AWGBIOMode.set('+ str(AWGBIOMode.get()) + ')\n')
1246  ConfgFile.write('AWGBTerm.set('+ str(AWGBTerm.get()) + ')\n')
1247  ConfgFile.write('AWGBPhaseDelay.set('+ str(AWGBPhaseDelay.get()) + ')\n')
1248  ConfgFile.write('AWGBAmplEntry.delete(0,END)\n')
1249  ConfgFile.write('AWGBAmplEntry.insert(4, ' + AWGBAmplEntry.get() + ')\n')
1250  ConfgFile.write('AWGBOffsetEntry.delete(0,END)\n')
1251  ConfgFile.write('AWGBOffsetEntry.insert(4, ' + AWGBOffsetEntry.get() + ')\n')
1252  ConfgFile.write('AWGBFreqEntry.delete(0,END)\n')
1253  ConfgFile.write('AWGBFreqEntry.insert(4, ' + AWGBFreqEntry.get() + ')\n')
1254  ConfgFile.write('AWGBPhaseEntry.delete(0,END)\n')
1255  ConfgFile.write('AWGBPhaseEntry.insert(4, ' + AWGBPhaseEntry.get() + ')\n')
1256  ConfgFile.write('AWGBDutyCycleEntry.delete(0,END)\n')
1257  ConfgFile.write('AWGBDutyCycleEntry.insert(4, ' + AWGBDutyCycleEntry.get() + ')\n')
1258  ConfgFile.write('AWGBShape.set(' + str(AWGBShape.get()) + ')\n')
1259  ConfgFile.write('AWGBRepeatFlag.set(' + str(AWGBRepeatFlag.get()) + ')\n')
1260  ConfgFile.write('AWGBBurstFlag.set(' + str(AWGBBurstFlag.get()) + ')\n')
1261  ConfgFile.write('global AWGBCycles; AWGBCycles = ' + str(AWGBCycles) + '\n')
1262  ConfgFile.write('global AWGBBurstDelay; AWGBBurstDelay = ' + str(AWGBBurstDelay) + '\n')
1263  #
1264  ConfgFile.write('AWGSync.set(' + str(AWGSync.get()) + ')\n')
1265  ConfgFile.write('global AWGAMathString; AWGAMathString = "' + AWGAMathString + '"\n')
1266  ConfgFile.write('global AWGBMathString; AWGBMathString = "' + AWGBMathString + '"\n')
1267  ConfgFile.write('global AWGAcsvFile; AWGAcsvFile = "' + AWGAcsvFile + '"\n')
1268  ConfgFile.write('global AWGBcsvFile; AWGBcsvFile = "' + AWGBcsvFile + '"\n')
1269  ConfgFile.write('global AWGAwavFile; AWGAwavFile = "' + AWGAwavFile + '"\n')
1270  ConfgFile.write('global AWGBwavFile; AWGBwavFile = "' + AWGBwavFile + '"\n')
1271  #
1272  ConfgFile.write('CHAVGainEntry.delete(0,END)\n')
1273  ConfgFile.write('CHAVGainEntry.insert(4, ' + CHAVGainEntry.get() + ')\n')
1274  ConfgFile.write('CHBVGainEntry.delete(0,END)\n')
1275  ConfgFile.write('CHBVGainEntry.insert(4, ' + CHBVGainEntry.get() + ')\n')
1276  ConfgFile.write('CHAVOffsetEntry.delete(0,END)\n')
1277  ConfgFile.write('CHAVOffsetEntry.insert(4, ' + CHAVOffsetEntry.get() + ')\n')
1278  ConfgFile.write('CHBVOffsetEntry.delete(0,END)\n')
1279  ConfgFile.write('CHBVOffsetEntry.insert(4, ' + CHBVOffsetEntry.get() + ')\n')
1280  #
1281  ConfgFile.write('MeasDCV1.set(' + str(MeasDCV1.get()) + ')\n')
1282  ConfgFile.write('MeasMinV1.set(' + str(MeasMinV1.get()) + ')\n')
1283  ConfgFile.write('MeasMaxV1.set(' + str(MeasMaxV1.get()) + ')\n')
1284  ConfgFile.write('MeasBaseV1.set(' + str(MeasBaseV1.get()) + ')\n')
1285  ConfgFile.write('MeasTopV1.set(' + str(MeasTopV1.get()) + ')\n')
1286  ConfgFile.write('MeasMidV1.set(' + str(MeasMidV1.get()) + ')\n')
1287  ConfgFile.write('MeasPPV1.set(' + str(MeasPPV1.get()) + ')\n')
1288  ConfgFile.write('MeasRMSV1.set(' + str(MeasRMSV1.get()) + ')\n')
1289  ConfgFile.write('MeasDCI1.set(' + str(MeasDCI1.get()) + ')\n')
1290  ConfgFile.write('MeasMinI1.set(' + str(MeasMinI1.get()) + ')\n')
1291  ConfgFile.write('MeasMaxI1.set(' + str(MeasMaxI1.get()) + ')\n')
1292  ConfgFile.write('MeasMidI1.set(' + str(MeasMidI1.get()) + ')\n')
1293  ConfgFile.write('MeasPPI1.set(' + str(MeasPPI1.get()) + ')\n')
1294  ConfgFile.write('MeasRMSI1.set(' + str(MeasRMSI1.get()) + ')\n')
1295  ConfgFile.write('MeasDiffAB.set(' + str(MeasDiffAB.get()) + ')\n')
1296  ConfgFile.write('MeasDCV2.set(' + str(MeasDCV2.get()) + ')\n')
1297  ConfgFile.write('MeasMinV2.set(' + str(MeasMinV2.get()) + ')\n')
1298  ConfgFile.write('MeasMaxV2.set(' + str(MeasMaxV2.get()) + ')\n')
1299  ConfgFile.write('MeasBaseV2.set(' + str(MeasBaseV2.get()) + ')\n')
1300  ConfgFile.write('MeasTopV2.set(' + str(MeasTopV2.get()) + ')\n')
1301  ConfgFile.write('MeasMidV2.set(' + str(MeasMidV2.get()) + ')\n')
1302  ConfgFile.write('MeasPPV2.set(' + str(MeasPPV2.get()) + ')\n')
1303  ConfgFile.write('MeasRMSV2.set(' + str(MeasRMSV2.get()) + ')\n')
1304  ConfgFile.write('MeasDCI2.set(' + str(MeasDCI2.get()) + ')\n')
1305  ConfgFile.write('MeasMinI2.set(' + str(MeasMinI2.get()) + ')\n')
1306  ConfgFile.write('MeasMaxI2.set(' + str(MeasMaxI2.get()) + ')\n')
1307  ConfgFile.write('MeasMidI2.set(' + str(MeasMidI2.get()) + ')\n')
1308  ConfgFile.write('MeasPPI2.set(' + str(MeasPPI2.get()) + ')\n')
1309  ConfgFile.write('MeasRMSI2.set(' + str(MeasRMSI2.get()) + ')\n')
1310  ConfgFile.write('MeasDiffBA.set(' + str(MeasDiffBA.get()) + ')\n')
1311  #
1312  ConfgFile.write('MeasAHW.set(' + str(MeasAHW.get()) + ')\n')
1313  ConfgFile.write('MeasALW.set(' + str(MeasALW.get()) + ')\n')
1314  ConfgFile.write('MeasADCy.set(' + str(MeasADCy.get()) + ')\n')
1315  ConfgFile.write('MeasAPER.set(' + str(MeasAPER.get()) + ')\n')
1316  ConfgFile.write('MeasAFREQ.set(' + str(MeasAFREQ.get()) + ')\n')
1317  ConfgFile.write('MeasBHW.set(' + str(MeasBHW.get()) + ')\n')
1318  ConfgFile.write('MeasBLW.set(' + str(MeasBLW.get()) + ')\n')
1319  ConfgFile.write('MeasBDCy.set(' + str(MeasBDCy.get()) + ')\n')
1320  ConfgFile.write('MeasBPER.set(' + str(MeasBPER.get()) + ')\n')
1321  ConfgFile.write('MeasBFREQ.set(' + str(MeasBFREQ.get()) + ')\n')
1322  ConfgFile.write('MeasPhase.set(' + str(MeasPhase.get()) + ')\n')
1323  ConfgFile.write('MeasDelay.set(' + str(MeasDelay.get()) + ')\n')
1324  #
1325  ConfgFile.write('MathTrace.set(' + str(MathTrace.get()) + ')\n')
1326  #
1327  ConfgFile.write('CHAIGainEntry.delete(0,END)\n')
1328  ConfgFile.write('CHAIGainEntry.insert(4, ' + CHAIGainEntry.get() + ')\n')
1329  ConfgFile.write('CHBIGainEntry.delete(0,END)\n')
1330  ConfgFile.write('CHBIGainEntry.insert(4, ' + CHBIGainEntry.get() + ')\n')
1331  ConfgFile.write('CHAIOffsetEntry.delete(0,END)\n')
1332  ConfgFile.write('CHAIOffsetEntry.insert(4, ' + CHAIOffsetEntry.get() + ')\n')
1333  ConfgFile.write('CHBIOffsetEntry.delete(0,END)\n')
1334  ConfgFile.write('CHBIOffsetEntry.insert(4, ' + CHBIOffsetEntry.get() + ')\n')
1335  # Save strings
1336  ConfgFile.write('global UserAString; UserAString = "' + UserAString + '"\n')
1337  ConfgFile.write('global UserALabel; UserALabel = "' + UserALabel + '"\n')
1338  ConfgFile.write('global UserBString; UserBString = "' + UserBString + '"\n')
1339  ConfgFile.write('global UserBLabel; UserBLabel = "' + UserBLabel + '"\n')
1340  ConfgFile.write('global FFTUserWindowString; FFTUserWindowString= "' + FFTUserWindowString + '"\n')
1341  ConfgFile.write('global DigFilterAString; DigFilterAString = "' + DigFilterAString + '"\n')
1342  ConfgFile.write('global DigFilterBString; DigFilterBString = "' + DigFilterBString + '"\n')
1343  # save channel AC frequency compensation settings
1344  try:
1345  CHA_TC1.set(float(cha_TC1Entry.get()))
1346  CHA_TC2.set(float(cha_TC2Entry.get()))
1347  CHB_TC1.set(float(chb_TC1Entry.get()))
1348  CHB_TC2.set(float(chb_TC2Entry.get()))
1349  CHA_A1.set(float(cha_A1Entry.get()))
1350  CHA_A2.set(float(cha_A2Entry.get()))
1351  CHB_A1.set(float(chb_A1Entry.get()))
1352  CHB_A2.set(float(chb_A2Entry.get()))
1353  except:
1354  donothing()
1355  ConfgFile.write('CHA_RC_HP.set(' + str(CHA_RC_HP.get()) + ')\n')
1356  ConfgFile.write('CHB_RC_HP.set(' + str(CHB_RC_HP.get()) + ')\n')
1357  ConfgFile.write('CHAI_RC_HP.set(' + str(CHAI_RC_HP.get()) + ')\n')
1358  ConfgFile.write('CHBI_RC_HP.set(' + str(CHBI_RC_HP.get()) + ')\n')
1359  ConfgFile.write('CHA_TC1.set(' + str(CHA_TC1.get()) + ')\n')
1360  ConfgFile.write('CHA_TC2.set(' + str(CHA_TC2.get()) + ')\n')
1361  ConfgFile.write('CHB_TC1.set(' + str(CHB_TC1.get()) + ')\n')
1362  ConfgFile.write('CHB_TC2.set(' + str(CHB_TC2.get()) + ')\n')
1363  ConfgFile.write('CHA_A1.set(' + str(CHA_A1.get()) + ')\n')
1364  ConfgFile.write('CHA_A2.set(' + str(CHA_A2.get()) + ')\n')
1365  ConfgFile.write('CHB_A1.set(' + str(CHB_A1.get()) + ')\n')
1366  ConfgFile.write('CHB_A2.set(' + str(CHB_A2.get()) + ')\n')
1367  ConfgFile.write('cha_TC1Entry.delete(0,END)\n')
1368  ConfgFile.write('cha_TC1Entry.insert(4, ' + str(CHA_TC1.get()) + ')\n')
1369  ConfgFile.write('cha_TC2Entry.delete(0,END)\n')
1370  ConfgFile.write('cha_TC2Entry.insert(4, ' + str(CHA_TC2.get()) + ')\n')
1371  ConfgFile.write('chb_TC1Entry.delete(0,END)\n')
1372  ConfgFile.write('chb_TC1Entry.insert(4, ' + str(CHB_TC1.get()) + ')\n')
1373  ConfgFile.write('chb_TC2Entry.delete(0,END)\n')
1374  ConfgFile.write('chb_TC2Entry.insert(4, ' + str(CHB_TC2.get()) + ')\n')
1375  ConfgFile.write('cha_A1Entry.delete(0,END)\n')
1376  ConfgFile.write('cha_A1Entry.insert(4, ' + str(CHA_A1.get()) + ')\n')
1377  ConfgFile.write('cha_A2Entry.delete(0,END)\n')
1378  ConfgFile.write('cha_A2Entry.insert(4, ' + str(CHA_A2.get()) + ')\n')
1379  ConfgFile.write('chb_A1Entry.delete(0,END)\n')
1380  ConfgFile.write('chb_A1Entry.insert(4, ' + str(CHB_A1.get()) + ')\n')
1381  ConfgFile.write('chb_A2Entry.delete(0,END)\n')
1382  ConfgFile.write('chb_A2Entry.insert(4, ' + str(CHB_A2.get()) + ')\n')
1383 
1384  # extra Spectrum stuff
1385  if SpectrumScreenStatus.get() > 0 or IAScreenStatus.get() > 0 or BodeScreenStatus.get() > 0:
1386  ConfgFile.write('SMPfftpwrTwo.set(' + str(SMPfftpwrTwo.get()) + ')\n')
1387  ConfgFile.write('FFTwindow.set(' + str(FFTwindow.get()) + ')\n')
1388  ConfgFile.write('ZEROstuffing.set(' + str(ZEROstuffing.get()) + ')\n')
1389  ConfgFile.write('Vdiv.set(' + str(Vdiv.get()) + ')\n')
1390  #
1391  ConfgFile.write('DBdivindex.set(' + str(DBdivindex.get()) + ')\n')
1392  ConfgFile.write('DBlevel.set(' + str(DBlevel.get()) + ')\n')
1393  # ConfgFile.write('TRACEaverage.set(' + str(TRACEaverage.get()) + ')\n')
1394  ConfgFile.write('CutDC.set(' + str(CutDC.get()) + ')\n')
1395  #
1396  ConfgFile.close()
1397 
1399  global iawindow
1400 
1401  filename = asksaveasfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=iawindow)
1402  BSaveConfig(filename)
1403 
1405  global freqwindow
1406 
1407  filename = asksaveasfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=freqwindow)
1408  BSaveConfig(filename)
1409 
1411  global bodewindow
1412 
1413  filename = asksaveasfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=bodewindow)
1414  BSaveConfig(filename)
1415 
1417  global root
1418  filename = asksaveasfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=root)
1419  BSaveConfig(filename)
1420 
1421 def BLoadConfig(filename):
1422  global TgInput, TgEdge, SingleShot, AutoLevel, SingleShotSA, ManualTrigger
1423  global root, freqwindow, awgwindow, iawindow, xywindow, win1, win2
1424  global TRIGGERentry, TMsb, Xsignal, Ysignal, AutoCenterA, AutoCenterB
1425  global CHAsb, CHAIsb, CHBsb, CHBIsb, HScale, FreqTraceMode
1426  global CHAsbxy, CHAIsbxy, CHBsbxy, CHBIsbxy, HoldOffentry
1427  global CHAVPosEntryxy, CHBVPosEntryxy, CHAIPosEntryxy, CHBIPosEntryxy
1428  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I, MathTrace, MathXUnits, MathYUnits
1429  global CHAVPosEntry, CHAIPosEntry, CHBVPosEntry, CHBIPosEntry, HozPossentry
1430  global AWGAAmplEntry, AWGAOffsetEntry, AWGAFreqEntry, AWGADutyCycleEntry
1431  global AWGAPhaseEntry, AWGAShape, AWGATerm, AWGAMode, AWGARepeatFlag, AWGBRepeatFlag
1432  global AWGBAmplEntry, AWGBOffsetEntry, AWGBFreqEntry, AWGBDutyCycleEntry
1433  global AWGBPhaseEntry, AWGBShape, AWGBTerm, AWGBMode, AWGSync, AWGAIOMode, AWGBIOMode
1434  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
1435  global MeasDCV1, MeasMinV1, MeasMaxV1, MeasMidV1, MeasPPV1, MeasDCI1, MeasMinI1
1436  global MeasMaxI1, MeasMidI1, MeasPPI1, MeasDCV2, MeasMinV2, MeasMaxV2, MeasMidV2
1437  global MeasPPV2, MeasDCI2, MeasMinI2, MeasMaxI2, MeasMidI2, MeasPPI2, MeasDiffAB, MeasDiffBA
1438  global MeasRMSV1, MeasRMSV2, MeasRMSI1, MeasRMSI2, MeasPhase, MeasDelay
1439  global MeasAHW, MeasALW, MeasADCy, MeasAPER, MeasAFREQ, IASource, DisplaySeries
1440  global MeasBHW, MeasBLW, MeasBDCy, MeasBPER, MeasBFREQ
1441  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
1442  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P, CutDC, AWG_Amp_Mode
1443  global FFTwindow, DBdivindex, DBlevel, TRACEmodeTime, TRACEaverage, Vdiv
1444  global SMPfftpwrTwo, SMPfft, StartFreqEntry, StopFreqEntry, ZEROstuffing
1445  global TimeDisp, XYDisp, FreqDisp, IADisp, AWGAPhaseDelay, AWGBPhaseDelay
1446  global RsystemEntry, ResScale, GainCorEntry, PhaseCorEntry
1447  global MeasTopV1, MeasBaseV1, MeasTopV2, MeasBaseV2
1448  global Show_CBA, Show_CBB, Show_CBC, Show_CBD, MuxScreenStatus, MuxEnb
1449  global CHB_Asb, CHB_APosEntry, CHB_Bsb, CHB_BPosEntry, muxwindow
1450  global CHB_Csb, CHB_CPosEntry, CHB_Dsb, CHB_DPosEntry
1451  global MathString, MathXString, MathYString, UserAString, UserALabel, UserBString, UserBLabel
1452  global MathAxis, MathXAxis, MathYAxis, Show_MathX, Show_MathY, MathScreenStatus, MathWindow
1453  global AWGAMathString, AWGBMathString, FFTUserWindowString, DigFilterAString, DigFilterBString
1454  global GRWF, GRHF, GRWBP, GRHBP, GRWXY, GRHXY, GRWIA, GRHIA, MeasureStatus
1455  global ChaLableSrring1, ChaLableSrring2, ChaLableSrring3, ChaLableSrring4, ChaLableSrring5, ChaLableSrring6
1456  global ChbLableSrring1, ChbLableSrring2, ChbLableSrring3, ChbLableSrring4, ChbLableSrring5, ChbLableSrring6
1457  global ChaMeasString1, ChaMeasString2, ChaMeasString3, ChaMeasString4, ChaMeasString5, ChaMeasString6
1458  global ChbMeasString1, ChbMeasString2, ChbMeasString3, ChbMeasString4, ChbMeasString5, ChbMeasString6
1459  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2, CHAI_RC_HP, CHBI_RC_HP
1460  global CHA_A1, CHA_A2, CHB_A1, CHB_A2, RelPhaseCenter, ImpedanceCenter
1461  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
1462  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
1463  global Show_Rseries, Show_Xseries, Show_Magnitude, Show_Angle
1464  global AWGABurstFlag, AWGACycles, AWGABurstDelay, AWGAwaveform, AWGAcsvFile, AWGBcsvFile
1465  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay, AWGBwaveform, AWGAwavFile, AWGBwavFile
1466  global SCLKPort, SDATAPort, SLATCHPort, EnableHSsampling, FminEntry, HtMulEntry
1467  global phawindow, PhAca, PhAScreenStatus, PhADisp
1468  global GRWPhA, X0LPhA, GRHPhA, Y0TPhA, EnableScopeOnly
1469  global VScale, IScale, RefphEntry, SMPfft
1470  global vat_btn, vbt_btn, iat_btn, ibt_btn, vabt_btn
1471  global ShowPB_A, ShowPB_B, ShowPB_C, ShowPB_D
1472  global TRACEwidth, ColorMode, ca, COLORcanvas, COLORtrace4, COLORtraceR4, COLORtext
1473 
1474  # Read configuration values from file
1475  try:
1476  ConfgFile = open(filename)
1477  for line in ConfgFile:
1478  try:
1479  exec( line.rstrip() )
1480  except:
1481  print( "Skipping " + line.rstrip())
1482  ConfgFile.close()
1483  if DevID != "No Device":
1484  BAWGAModeLabel()
1485  BAWGBModeLabel()
1486  BAWGAPhaseDelay()
1487  BAWGBPhaseDelay()
1488  if ColorMode.get() > 0: # White background
1489  # print("White background")
1490  if TRACEwidth.get() < 2:
1491  TRACEwidth.set(2)
1492  COLORtext = "#000000" # 100% black
1493  COLORtrace4 = "#a0a000" # 50% yellow
1494  COLORtraceR4 = "#606000" # 25% yellow
1495  COLORcanvas = "#ffffff" # 100% white
1496  else:
1497  # print("Black background")
1498  COLORcanvas = "#000000" # 100% black
1499  COLORtrace4 = "#ffff00" # 100% yellow
1500  COLORtraceR4 = "#808000" # 50% yellow
1501  COLORtext = "#ffffff" # 100% white
1502  ca.config(background=COLORcanvas)
1503  # Needs to reload from waveform files
1504  if AWGAShape.get()==6:
1505  AWGALoadCSV()
1506  if AWGAShape.get()==13:
1507  AWGALoadWAV()
1508  if AWGBShape.get()==6:
1509  AWGBLoadCSV()
1510  if AWGBShape.get()==13:
1511  AWGBLoadWAV()
1512  # Regenerate waveform from formula
1513  if AWGAShape.get()==10:
1514  AWGAConfigMath()
1515  if AWGBShape.get()==10:
1516  AWGBConfigMath()
1517  if EnableScopeOnly == 0:
1518  UpdateAWGWin()
1519  TimeCheckBox()
1520  XYCheckBox()
1521  FreqCheckBox()
1522  BodeCheckBox()
1523  IACheckBox()
1524  OhmCheckBox()
1525  else:
1526  TimeCheckBox()
1527  XYCheckBox()
1528  UpdateAWGWin()
1529 #
1530  time.sleep(0.05)
1531  ReMakeAWGwaves()
1532  session.end() # Add this to turn off outputs after first time loading a config?
1533  BTime()
1534  except:
1535  print( "Config File Not Found.")
1536 
1537 def ReMakeAWGwaves(): # re make awg waveforms ib case something changed
1538  global AWGAShape, AWGBShape, BisCompA, AWGAShapeLabel, AWGBShapeLabel
1539  global AWGALength, AWGBLength, AWGAwaveform, AWGBwaveform, EnableScopeOnly
1540 
1541  if AWGAShape.get()==9:
1542  AWGAMakeImpulse()
1543  AWGAShapeLabel.config(text = "Impulse") # change displayed value
1544  elif AWGAShape.get()==11:
1546  AWGAShapeLabel.config(text = "Trapazoid") # change displayed value
1547  elif AWGAShape.get()==15:
1548  AWGAMakeSSQ()
1549  AWGAShapeLabel.config(text = "SSQ Pulse") # change displayed value
1550  elif AWGAShape.get()==16:
1551  AWGAMakeRamp()
1552  AWGAShapeLabel.config(text = "Ramp") # change displayed value
1553  elif AWGAShape.get()==17:
1554  AWGAMakePWMSine()
1555  AWGAShapeLabel.config(text = "PWN Sine") # change displayed value
1556  elif AWGAShape.get()==18:
1558  AWGAShapeLabel.config(text = "Hi Res Sine") # change displayed value
1559  elif AWGAShape.get()==12:
1561  AWGAShapeLabel.config(text = "Up Down Ramp") # change displayed value
1562  elif AWGAShape.get()==14:
1563  AWGAMakeFourier()
1564  AWGAShapeLabel.config(text = "Fourier Series") # change displayed value
1565  elif AWGAShape.get()==19:
1566  AWGAMakeSinc()
1567  AWGAShapeLabel.config(text = "Sinc Pulse") # change displayed value
1568  elif AWGAShape.get()==20:
1569  AWGAMakePulse()
1570  AWGAShapeLabel.config(text = "Pulse") # change displayed value
1571  elif AWGAShape.get()==21:
1572  AWGAMakeFMSine()
1573  AWGAShapeLabel.config(text = "FM Sine") # change displayed value
1574  elif AWGAShape.get()==22:
1575  AWGAMakeAMSine()
1576  AWGAShapeLabel.config(text = "AM Sine") # change displayed value
1577  elif AWGAShape.get()==7:
1578  AWGAMakeUUNoise()
1579  AWGAShapeLabel.config(text = "UU Noise") # change displayed value
1580  elif AWGAShape.get()==8:
1581  AWGAMakeUGNoise()
1582  AWGAShapeLabel.config(text = "UG Noise") # change displayed value
1583  elif AWGAShape.get()==0:
1584  AWGAShapeLabel.config(text = "DC") # change displayed value
1585  elif AWGAShape.get()==2:
1586  AWGAShapeLabel.config(text = "Triangle") # change displayed value
1587  elif AWGAShape.get()==4:
1588  AWGAShapeLabel.config(text = "Square") # change displayed value
1589  elif AWGAShape.get()==3:
1590  AWGAShapeLabel.config(text = "Saw Tooth") # change displayed value
1591  elif AWGAShape.get()==5:
1592  AWGAShapeLabel.config(text = "Starestep") # change displayed value
1593  elif AWGAShape.get()==6:
1594  AWGAShapeLabel.config(text = "CSV File") # change displayed value
1595  elif AWGAShape.get()==13:
1596  AWGAShapeLabel.config(text = "Wav File") # change displayed value
1597  elif AWGAShape.get()==10:
1598  AWGAShapeLabel.config(text = "Math") # change displayed value
1599  else:
1600  AWGAShapeLabel.config(text = "Other Shape") # change displayed value
1601 #
1602  if BisCompA.get() == 1:
1603  SetBCompA()
1604  if AWGBShape.get()==9:
1605  AWGBMakeImpulse()
1606  AWGBShapeLabel.config(text = "Impulse") # change displayed value
1607  elif AWGBShape.get()==11:
1609  AWGBShapeLabel.config(text = "Trapazoid") # change displayed value
1610  elif AWGBShape.get()==15:
1611  AWGBMakeSSQ()
1612  AWGBShapeLabel.config(text = "SSQ Pulse") # change displayed value
1613  elif AWGBShape.get()==16:
1614  AWGBMakeRamp()
1615  AWGBShapeLabel.config(text = "Ramp") # change displayed value
1616  elif AWGBShape.get()==17:
1617  AWGBMakePWMSine()
1618  AWGBShapeLabel.config(text = "PWN Sine") # change displayed value
1619  elif AWGBShape.get()==18:
1621  AWGBShapeLabel.config(text = "Hi Res Sine") # change displayed value
1622  elif AWGBShape.get()==12:
1624  AWGBShapeLabel.config(text = "Up Doen Ramp") # change displayed value
1625  elif AWGBShape.get()==14:
1626  AWGBMakeFourier()
1627  AWGBShapeLabel.config(text = "Fourier Series") # change displayed value
1628  elif AWGBShape.get()==19:
1629  AWGBMakeSinc()
1630  AWGBShapeLabel.config(text = "Sinc Pulse") # change displayed value
1631  elif AWGBShape.get()==20:
1632  AWGBMakePulse()
1633  AWGBShapeLabel.config(text = "Pulse") # change displayed value
1634  elif AWGBShape.get()==7:
1635  AWGBMakeUUNoise()
1636  AWGBShapeLabel.config(text = "UU Noise") # change displayed value
1637  elif AWGBShape.get()==8:
1638  AWGBMakeUGNoise()
1639  AWGBShapeLabel.config(text = "UG Noise") # change displayed value
1640  elif AWGBShape.get()==0:
1641  AWGBShapeLabel.config(text = "DC") # change displayed value
1642  elif AWGBShape.get()==2:
1643  AWGBShapeLabel.config(text = "Triangle") # change displayed value
1644  elif AWGBShape.get()==4:
1645  AWGBShapeLabel.config(text = "Square") # change displayed value
1646  elif AWGBShape.get()==3:
1647  AWGBShapeLabel.config(text = "Saw Tooth") # change displayed value
1648  elif AWGBShape.get()==5:
1649  AWGBShapeLabel.config(text = "Starestep") # change displayed value
1650  elif AWGBShape.get()==6:
1651  AWGBShapeLabel.config(text = "CSV File") # change displayed value
1652  elif AWGBShape.get()==13:
1653  AWGBShapeLabel.config(text = "Wav File") # change displayed value
1654  elif AWGBShape.get()==10:
1655  AWGBShapeLabel.config(text = "Math") # change displayed value
1656  else:
1657  AWGBShapeLabel.config(text = "Other Shape") # change displayed value
1658  if EnableScopeOnly == 0:
1659  AWGALength.config(text = "L = " + str(int(len(AWGAwaveform)))) # change displayed value
1660  AWGBLength.config(text = "L = " + str(int(len(AWGBwaveform)))) # change displayed value
1661  UpdateAwgCont()
1662  time.sleep(0.05)
1663 
1665  global iawindow
1666 
1667  filename = askopenfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=iawindow)
1668  BLoadConfig(filename)
1669 
1671  global freqwindow
1672 
1673  filename = askopenfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=freqwindow)
1674  BLoadConfig(filename)
1675 
1677  global bodewindow
1678 
1679  filename = askopenfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=bodewindow)
1680  BLoadConfig(filename)
1681 
1683  global root
1684 
1685  filename = askopenfilename(defaultextension = ".cfg", filetypes=[("Config files", "*.cfg")], parent=root)
1686  BLoadConfig(filename)
1687  UpdateTimeTrace()
1688 
1689 def BgColor():
1690  global COLORtext, COLORcanvas, ColorMode, Bodeca, BodeScreenStatus, PhAca, PhAScreenStatus
1691  global ca, Freqca, SpectrumScreenStatus, XYca, XYScreenStatus, IAca, IAScreenStatus
1692  global COLORtrace4, COLORtraceR4, TRACEwidth
1693 
1694  if ColorMode.get() > 0: # White background
1695  if TRACEwidth.get() < 2:
1696  TRACEwidth.set(2)
1697  COLORtext = "#000000" # 100% black
1698  COLORtrace4 = "#a0a000" # 50% yellow
1699  COLORtraceR4 = "#606000" # 25% yellow
1700  COLORcanvas = "#ffffff" # 100% white
1701  else:
1702  COLORcanvas = "#000000" # 100% black
1703  COLORtrace4 = "#ffff00" # 100% yellow
1704  COLORtraceR4 = "#808000" # 50% yellow
1705  COLORtext = "#ffffff" # 100% white
1706  ca.config(background=COLORcanvas)
1708  if SpectrumScreenStatus.get() > 0:
1709  Freqca.config(background=COLORcanvas)
1711  if XYScreenStatus.get() > 0:
1712  XYca.config(background=COLORcanvas)
1713  UpdateXYScreen()
1714  if PhAScreenStatus.get() > 0:
1715  PhAca.config(background=COLORcanvas)
1716  UpdatePhAScreen()
1717  if IAScreenStatus.get() > 0:
1718  IAca.config(background=COLORcanvas)
1719  UpdateIAScreen()
1720  if BodeScreenStatus.get() > 0:
1721  Bodeca.config(background=COLORcanvas)
1723 
1725  global CANVASwidth, CANVASheight
1726  global COLORtext, MarkerNum, ColorMode
1727  # ask for file name
1728  filename = asksaveasfilename(defaultextension = ".eps", filetypes=[("Encapsulated Postscript", "*.eps")])
1729  Orient = askyesno("Rotation","Save in Landscape (Yes) or Portrait (No):\n")
1730  if MarkerNum > 0 or ColorMode.get() > 0:
1731  ca.postscript(file=filename, height=CANVASheight, width=CANVASwidth, colormode='color', rotate=Orient)
1732  else: # temp chnage text corlor to black
1733  COLORtext = "#000000"
1735  # first save postscript file
1736  ca.postscript(file=filename, height=CANVASheight, width=CANVASwidth, colormode='color', rotate=Orient)
1737  # now convert to bit map
1738  # img = Image.open("screen_shot.eps")
1739  # img.save("screen_shot.gif", "gif")
1740  COLORtext = "#ffffff"
1742 
1744  global CANVASwidthXY, CANVASheightXY, xywindow
1745  global COLORtext, MarkerNum, ColorMode, XYca
1746  # ask for file name
1747  filename = asksaveasfilename(defaultextension = ".eps", filetypes=[("Encapsulated Postscript", "*.eps")], parent=xywindow)
1748  Orient = askyesno("Rotation","Save in Landscape (Yes) or Portrait (No):\n", parent=xywindow)
1749  if MarkerNum > 0 or ColorMode.get() > 0:
1750  XYca.postscript(file=filename, height=CANVASheightXY, width=CANVASwidthXY, colormode='color', rotate=Orient)
1751  else: # temp chnage text corlor to black
1752  COLORtext = "#000000"
1753  UpdateXYScreen()
1754  # first save postscript file
1755  XYca.postscript(file=filename, height=CANVASheightXY, width=CANVASwidthXY, colormode='color', rotate=Orient)
1756  # now convert to bit map
1757  # img = Image.open("screen_shot.eps")
1758  # img.save("screen_shot.gif", "gif")
1759  COLORtext = "#ffffff"
1760  UpdateXYScreen()
1761 
1763  global CANVASwidthIA, CANVASheightIA
1764  global COLORtext, IAca, ColorMode, iawindow
1765  # ask for file name
1766  filename = asksaveasfilename(defaultextension = ".eps", filetypes=[("Encapsulated Postscript", "*.eps")], parent=iawindow)
1767  Orient = askyesno("Rotation","Save in Landscape (Yes) or Portrait (No):\n", parent=iawindow)
1768  if ColorMode.get() > 0:
1769  IAca.postscript(file=filename, height=CANVASheightIA, width=CANVASwidthIA, colormode='color', rotate=Orient)
1770  else: # temp change text color to black for Black BG
1771  COLORtext = "#000000"
1772  UpdateIAScreen()
1773  # save postscript file
1774  IAca.postscript(file=filename, height=CANVASheightIA, width=CANVASwidthIA, colormode='color', rotate=Orient)
1775  #
1776  COLORtext = "#ffffff"
1777  UpdateIAScreen()
1778 
1780  global CANVASwidthBP, CANVASheightBP
1781  global COLORtext, Bodeca, bodewindow
1782  # ask for file name
1783  filename = asksaveasfilename(defaultextension = ".eps", filetypes=[("Encapsulated Postscript", "*.eps")], parent = bodewindow)
1784  Orient = askyesno("Rotation","Save in Landscape (Yes) or Portrait (No):\n", parent=bodewindow)
1785  if MarkerNum > 0 or ColorMode.get() > 0:
1786  Bodeca.postscript(file=filename, height=CANVASheightBP, width=CANVASwidthBP, colormode='color', rotate=Orient)
1787  else: # temp change text color to black
1788  COLORtext = "#000000"
1790  # save postscript file
1791  Bodeca.postscript(file=filename, height=CANVASheightBP, width=CANVASwidthBP, colormode='color', rotate=Orient)
1792  #
1793  COLORtext = "#ffffff"
1795 
1797  global VBuffA, VBuffB, IBuffA, IBuffB, SAMPLErate
1798 
1799  # open file to save data
1800  filename = asksaveasfilename(defaultextension = ".csv", filetypes=[("Comma Separated Values", "*.csv")])
1801  DataFile = open(filename, 'w')
1802  DataFile.write( 'Sample-#, CA-V, CA-I, CB-V, CB-I \n' )
1803  for index in range(len(VBuffA)):
1804  TimePnt = float((index+0.0)/SAMPLErate)
1805  DataFile.write( str(TimePnt) + ', ' + str(VBuffA[index]) + ', ' + str(IBuffA[index]) + ', '
1806  + str(VBuffB[index]) + ', ' + str(IBuffB[index]) + '\n')
1807  DataFile.close()
1808 
1810  global SAMPLErate, VBuffA, VBuffB, IBuffA, IBuffB
1811 
1812  # ask user for channel to save
1813  Channel = askstring("Choose Channel", "CA-V, CB-V, CA-I or CB-I\n\nChannel:\n", initialvalue="CA-V")
1814  if (Channel == None): # If Cancel pressed, then None
1815  return
1816  # open file to save data
1817  filename = asksaveasfilename(defaultextension = ".txt", filetypes=[("Text Columns", "*.txt")])
1818  DataFile = open(filename, 'w')
1819  for index in range(len(VBuffA)):
1820  TimePnt = float((index+0.0)/SAMPLErate)
1821  if Channel == "CA-V":
1822  DataFile.write( str(TimePnt) + ', ' + str(VBuffA[index]) + '\n')
1823  elif Channel == "CA-I":
1824  DataFile.write( str(TimePnt) + ', ' + str(IBuffA[index]) + '\n')
1825  elif Channel == "CB-V":
1826  DataFile.write( str(TimePnt) + ', ' + str(VBuffB[index]) + '\n')
1827  elif Channel == "CB-I":
1828  DataFile.write( str(TimePnt) + ', ' + str(IBuffB[index]) + '\n')
1829  DataFile.close()
1830 
1832  global VBuffA, VBuffB, IBuffA, IBuffB, SHOWsamples
1833 
1834  # Read values from CVS file
1835  filename = askopenfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")])
1836  try:
1837  CSVFile = open(filename)
1838  dialect = csv.Sniffer().sniff(CSVFile.read(2048))
1839  CSVFile.seek(0)
1840  csv_f = csv.reader(CSVFile, dialect)
1841  VBuffA = []
1842  VBuffB = []
1843  IBuffA = []
1844  IBuffB = []
1845  SHOWsamples = 0
1846  for row in csv_f:
1847  try:
1848  VBuffA.append(float(row[1]))
1849  IBuffA.append(float(row[2]))
1850  VBuffB.append(float(row[3]))
1851  IBuffB.append(float(row[4]))
1852  SHOWsamples = SHOWsamples + 1
1853  except:
1854  print( 'skipping non-numeric row')
1855  VBuffA = numpy.array(VBuffA)
1856  IBuffA = numpy.array(IBuffA)
1857  VBuffB = numpy.array(VBuffB)
1858  IBuffB = numpy.array(IBuffB)
1859  CSVFile.close()
1860  UpdateTimeTrace()
1861  except:
1862  showwarning("WARNING","No such file found or wrong format!")
1863 
1865 def BHelp():
1866 
1867  url = "https://wiki.analog.com/university/tools/m1k/alice/desk-top-users-guide"
1868  webbrowser.open(url,new=2)
1869 
1870 def BAbout():
1871  global RevDate, SWRev, FWRevOne, HWRevOne, DevID, Version_url
1872 #Version_url = 'https://github.com/analogdevicesinc/alice/releases/download/1.3.8/alice-desktop-1.3-setup.exe'
1873  try:
1874  if sys.version_info[0] == 2:
1875  u = urllib2.urlopen(Version_url)
1876  if sys.version_info[0] == 3:
1877  u = urllib.request.urlopen(Version_url)
1878  meta = u.info()
1879  time_string = str(meta.getheaders("Last-Modified"))
1880  except:
1881  time_string = "Unavailable"
1882  showinfo("About ALICE", "ALICE DeskTop" + SWRev + RevDate + "\n" +
1883  "Last Released Version: " + time_string[7:18] + "\n" +
1884  "ADALM1000 Hardware Rev " + str(HWRevOne) + "\n" +
1885  "Firmware Rev " + str(FWRevOne) + "\n" +
1886  "Board Serial Number " + DevID + "\n" +
1887  "Software is provided as is without any Warranty")
1888 
1890  global T1Vline, T2Vline, T1Iline, T2Iline
1891  global TXYline, Tmathline, TMRline, TXYRline
1892  global T1VRline, T2VRline, T1IRline, T2IRline, TMCVline, TMDVline
1893  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I, ShowMath, MathTrace
1894  global MuxScreenStatus, TMCRline, TMBRline, TMAVline, TMBVline, TMCVline, TMDVline
1895  global Show_CBA, Show_CBB, Show_CBC, Show_CBD, MuxEnb
1896 
1897  if ShowC1_V.get() == 1:
1898  T1VRline = T1Vline # V reference Trace line channel A
1899  if ShowC2_V.get() == 1:
1900  T2VRline = T2Vline # V reference Trace line channel B
1901  if ShowC1_I.get() == 1:
1902  T1IRline = T1Iline # I reference Trace line channel A
1903  if ShowC2_I.get() == 1:
1904  T2IRline = T2Iline # I reference Trace line channel B
1905  if MathTrace.get() > 0:
1906  TMRline = Tmathline # Math reference Trace line
1907  if MuxScreenStatus.get() > 0:
1908  if Show_CBA.get() > 0:
1909  T2VRline = TMAVline # V reference Trace line Mux channel A
1910  if Show_CBB.get() > 0:
1911  TMBRline = TMBVline # V reference Trace line Mux channel B
1912  if Show_CBC.get() > 0:
1913  TMCRline = TMCVline # V reference Trace line Mux channel C
1914  if Show_CBD.get() > 0:
1915  T2IRline = TMDVline # V reference Trace line Mux channel D
1916  if len(TXYline) > 4:
1917  TXYRline = TXYline # XY reference trace line
1918 
1919 def BSaveCal():
1920  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
1921  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
1922  global DevID
1923  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2
1924  global CHA_A1, CHA_A2, CHB_A1, CHB_A2
1925  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
1926  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
1927 
1928  devidstr = DevID[17:31]
1929  filename = devidstr + "_O.cal"
1930  CalFile = open(filename, "w")
1931  #
1932  CalFile.write('CHAVGainEntry.delete(0,END)\n')
1933  CalFile.write('CHAVGainEntry.insert(4, ' + CHAVGainEntry.get() + ')\n')
1934  CalFile.write('CHBVGainEntry.delete(0,END)\n')
1935  CalFile.write('CHBVGainEntry.insert(4, ' + CHBVGainEntry.get() + ')\n')
1936  CalFile.write('CHAVOffsetEntry.delete(0,END)\n')
1937  CalFile.write('CHAVOffsetEntry.insert(4, ' + CHAVOffsetEntry.get() + ')\n')
1938  CalFile.write('CHBVOffsetEntry.delete(0,END)\n')
1939  CalFile.write('CHBVOffsetEntry.insert(4, ' + CHBVOffsetEntry.get() + ')\n')
1940  #
1941  CalFile.write('CHAIGainEntry.delete(0,END)\n')
1942  CalFile.write('CHAIGainEntry.insert(4, ' + CHAIGainEntry.get() + ')\n')
1943  CalFile.write('CHBIGainEntry.delete(0,END)\n')
1944  CalFile.write('CHBIGainEntry.insert(4, ' + CHBIGainEntry.get() + ')\n')
1945  CalFile.write('CHAIOffsetEntry.delete(0,END)\n')
1946  CalFile.write('CHAIOffsetEntry.insert(4, ' + CHAIOffsetEntry.get() + ')\n')
1947  CalFile.write('CHBIOffsetEntry.delete(0,END)\n')
1948  CalFile.write('CHBIOffsetEntry.insert(4, ' + CHBIOffsetEntry.get() + ')\n')
1949  #
1950  # save channel AC frequency compensation settings
1951  try:
1952  CHA_TC1.set(float(cha_TC1Entry.get()))
1953  CHA_TC2.set(float(cha_TC2Entry.get()))
1954  CHB_TC1.set(float(chb_TC1Entry.get()))
1955  CHB_TC2.set(float(chb_TC2Entry.get()))
1956  CHA_A1.set(float(cha_A1Entry.get()))
1957  CHA_A2.set(float(cha_A2Entry.get()))
1958  CHB_A1.set(float(chb_A1Entry.get()))
1959  CHB_A2.set(float(chb_A2Entry.get()))
1960  except:
1961  donothing()
1962  CalFile.write('CHA_RC_HP.set(' + str(CHA_RC_HP.get()) + ')\n')
1963  CalFile.write('CHB_RC_HP.set(' + str(CHB_RC_HP.get()) + ')\n')
1964  CalFile.write('CHA_TC1.set(' + str(CHA_TC1.get()) + ')\n')
1965  CalFile.write('CHA_TC2.set(' + str(CHA_TC2.get()) + ')\n')
1966  CalFile.write('CHB_TC1.set(' + str(CHB_TC1.get()) + ')\n')
1967  CalFile.write('CHB_TC2.set(' + str(CHB_TC2.get()) + ')\n')
1968  CalFile.write('CHA_A1.set(' + str(CHA_A1.get()) + ')\n')
1969  CalFile.write('CHA_A2.set(' + str(CHA_A2.get()) + ')\n')
1970  CalFile.write('CHB_A1.set(' + str(CHB_A1.get()) + ')\n')
1971  CalFile.write('CHB_A2.set(' + str(CHB_A2.get()) + ')\n')
1972  CalFile.write('cha_TC1Entry.delete(0,END)\n')
1973  CalFile.write('cha_TC1Entry.insert(4, ' + str(CHA_TC1.get()) + ')\n')
1974  CalFile.write('cha_TC2Entry.delete(0,END)\n')
1975  CalFile.write('cha_TC2Entry.insert(4, ' + str(CHA_TC2.get()) + ')\n')
1976  CalFile.write('chb_TC1Entry.delete(0,END)\n')
1977  CalFile.write('chb_TC1Entry.insert(4, ' + str(CHB_TC1.get()) + ')\n')
1978  CalFile.write('chb_TC2Entry.delete(0,END)\n')
1979  CalFile.write('chb_TC2Entry.insert(4, ' + str(CHB_TC2.get()) + ')\n')
1980  CalFile.write('cha_A1Entry.delete(0,END)\n')
1981  CalFile.write('cha_A1Entry.insert(4, ' + str(CHA_A1.get()) + ')\n')
1982  CalFile.write('cha_A2Entry.delete(0,END)\n')
1983  CalFile.write('cha_A2Entry.insert(4, ' + str(CHA_A2.get()) + ')\n')
1984  CalFile.write('chb_A1Entry.delete(0,END)\n')
1985  CalFile.write('chb_A1Entry.insert(4, ' + str(CHB_A1.get()) + ')\n')
1986  CalFile.write('chb_A2Entry.delete(0,END)\n')
1987  CalFile.write('chb_A2Entry.insert(4, ' + str(CHB_A2.get()) + ')\n')
1988 
1989  CalFile.close()
1990 
1991 def BLoadCal():
1992  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
1993  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
1994  global DevID
1995  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2
1996  global CHA_A1, CHA_A2, CHB_A1, CHB_A2
1997  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
1998  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
1999 
2000  devidstr = DevID[17:31]
2001  filename = devidstr + "_O.cal"
2002  try:
2003  CalFile = open(filename)
2004  for line in CalFile:
2005  exec( line.rstrip() )
2006  CalFile.close()
2007  except:
2008  print( "Cal file for this device not found")
2009 
2011  global UserAString, UserALabel, MeasUserA
2012 
2013  TempString = UserALabel
2014  UserALabel = askstring("Measurement Label", "Current Label: " + UserALabel + "\n\nNew Label:\n", initialvalue=UserALabel)
2015  if (UserALabel == None): # If Cancel pressed, then None
2016  MeasUserA.set(0)
2017  UserALabel = TempString
2018  return
2019  TempString = UserAString
2020  UserAString = askstring("Measurement Formula", "Current Formula: " + UserAString + "\n\nNew Formula:\n", initialvalue=UserAString)
2021  if (UserAString == None): # If Cancel pressed, then None
2022  MeasUserA.set(0)
2023  UserAString = TempString
2024  return
2025  MeasUserA.set(1)
2026 
2028  global UserBString, UserBLabel, MeasUserB
2029 
2030  TempString = UserBLabel
2031  UserBLabel = askstring("Measurement Label", "Current Label: " + UserBLabel + "\n\nNew Label:\n", initialvalue=UserBLabel)
2032  if (UserBLabel == None): # If Cancel pressed, then None
2033  MeasUserB.set(0)
2034  UserBLabel = TempString
2035  return
2036  TempString = UserBString
2037  UserBString = askstring("Measurement Formula", "Current Formula: " + UserBString + "\n\nNew Formula:\n", initialvalue=UserBString)
2038  if (UserBString == None): # If Cancel pressed, then None
2039  MeasUserB.set(0)
2040  UserBString = TempString
2041  return
2042  MeasUserB.set(1)
2043 #
2044 
2046  global LabelPlotText, PlotLabelText # = "Custom Plot Label"
2047 
2048  TempString = PlotLabelText
2049  PlotLabelText = askstring("Custom Label", "Current Plot Label: " + PlotLabelText + "\n\nNew Label:\n", initialvalue=PlotLabelText)
2050  if (PlotLabelText == None): # If Cancel pressed, then None
2051  LabelPlotText.set(0)
2052  PlotLabelText = TempString
2053  return
2054  LabelPlotText.set(1)
2055 
2057  global RUNstatus, MathScreenStatus, MathWindow, SWRev, RevDate
2058  global MathString, MathUnits, MathXString, MathXUnits, MathYString, MathYUnits
2059  global MathAxis, MathXAxis, MathYAxis, MathTrace
2060  global formentry, unitsentry, axisentry, xformentry, xunitsentry, xaxisentry, yformentry, yunitsentry, yaxisentry
2061  global formlab, xformlab, yformlab, FrameBG
2062  global Mframe1, Mframe2, Mframe3, Mframe4
2063 
2064  if MathScreenStatus.get() == 0:
2065  MathScreenStatus.set(1)
2066  #
2067  MathWindow = Toplevel()
2068  MathWindow.title("Math Formula " + SWRev + RevDate)
2069  MathWindow.resizable(FALSE,FALSE)
2070  MathWindow.protocol("WM_DELETE_WINDOW", DestroyMathScreen)
2071  MathWindow.configure(background=FrameBG)
2072  Mframe1 = LabelFrame(MathWindow, text="Built-in Exp", style="A10R1.TLabelframe")
2073  Mframe2 = LabelFrame(MathWindow, text="Math Trace", style="A10R1.TLabelframe")
2074  Mframe3 = LabelFrame(MathWindow, text="X Math Trace", style="A10R1.TLabelframe")
2075  Mframe4 = LabelFrame(MathWindow, text="Y Math Trace", style="A10R1.TLabelframe")
2076  # frame1.grid(row=0, column=0, sticky=W)
2077  #
2078  Mframe1.grid(row = 0, column=0, rowspan=3, sticky=W)
2079  Mframe2.grid(row = 0, column=1, sticky=W)
2080  Mframe3.grid(row = 1, column=1, sticky=W)
2081  Mframe4.grid(row = 2, column=1, sticky=W)
2082  #
2083  # Built in functions
2084  #
2085  mrb1 = Radiobutton(Mframe1, text='none', variable=MathTrace, value=0, command=UpdateTimeTrace)
2086  mrb1.grid(row=0, column=0, sticky=W)
2087  mrb2 = Radiobutton(Mframe1, text='CAV+CBV', variable=MathTrace, value=1, command=UpdateTimeTrace)
2088  mrb2.grid(row=1, column=0, sticky=W)
2089  mrb3 = Radiobutton(Mframe1, text='CAV-CBV', variable=MathTrace, value=2, command=UpdateTimeTrace)
2090  mrb3.grid(row=2, column=0, sticky=W)
2091  mrb4 = Radiobutton(Mframe1, text='CBV-CAV', variable=MathTrace, value=3, command=UpdateTimeTrace)
2092  mrb4.grid(row=3, column=0, sticky=W)
2093  mrb5 = Radiobutton(Mframe1, text='CAI-CBI', variable=MathTrace, value=8, command=UpdateTimeTrace)
2094  mrb5.grid(row=4, column=0, sticky=W)
2095  mrb6 = Radiobutton(Mframe1, text='CBI-CAI', variable=MathTrace, value=9, command=UpdateTimeTrace)
2096  mrb6.grid(row=5, column=0, sticky=W)
2097  mrb7 = Radiobutton(Mframe1, text='CAV*CAI', variable=MathTrace, value=4, command=UpdateTimeTrace)
2098  mrb7.grid(row=6, column=0, sticky=W)
2099  mrb8 = Radiobutton(Mframe1, text='CBV*CBI', variable=MathTrace, value=5, command=UpdateTimeTrace)
2100  mrb8.grid(row=7, column=0, sticky=W)
2101  mrb9 = Radiobutton(Mframe1, text='CAV/CAI', variable=MathTrace, value=6, command=UpdateTimeTrace)
2102  mrb9.grid(row=8, column=0, sticky=W)
2103  mrb10 = Radiobutton(Mframe1, text='CBV/CBI', variable=MathTrace, value=7, command=UpdateTimeTrace)
2104  mrb10.grid(row=9, column=0, sticky=W)
2105  mrb11 = Radiobutton(Mframe1, text='CBV/CAV', variable=MathTrace, value=10, command=UpdateTimeTrace)
2106  mrb11.grid(row=10, column=0, sticky=W)
2107  mrb12 = Radiobutton(Mframe1, text='CBI/CAI', variable=MathTrace, value=11, command=UpdateTimeTrace)
2108  mrb12.grid(row=11, column=0, sticky=W)
2109  mrb13 = Radiobutton(Mframe1, text='Formula', variable=MathTrace, value=12, command=UpdateTimeTrace)
2110  mrb13.grid(row=12, column=0, sticky=W)
2111  #
2112  # Math trace formula sub Mframe2
2113  #
2114  sframe2a = Frame( Mframe2 )
2115  sframe2a.pack(side=TOP)
2116  formlab = Label(sframe2a, text=" Formula ", style= "A10B.TLabel")
2117  formlab.pack(side=LEFT)
2118  formentry = Entry(sframe2a, width=23)
2119  formentry.pack(side=LEFT)
2120  formentry.delete(0,"end")
2121  formentry.insert(0,MathString)
2122  sframe2b = Frame( Mframe2 )
2123  sframe2b.pack(side=TOP)
2124  unitslab = Label(sframe2b, text="Units ", style= "A10B.TLabel")
2125  unitslab.pack(side=LEFT)
2126  unitsentry = Entry(sframe2b, width=6)
2127  unitsentry.pack(side=LEFT)
2128  unitsentry.delete(0,"end")
2129  unitsentry.insert(0,MathUnits)
2130  checkbt = Button(sframe2b, text="Check", command=CheckMathString )
2131  checkbt.pack(side=LEFT)
2132  sframe2c = Frame( Mframe2 )
2133  sframe2c.pack(side=TOP)
2134  axislab = Label(sframe2c, text="Axis ", style= "A10B.TLabel")
2135  axislab.pack(side=LEFT)
2136  axisentry = Entry(sframe2c, width=4)
2137  axisentry.pack(side=LEFT)
2138  axisentry.delete(0,"end")
2139  axisentry.insert(0,MathAxis)
2140  applybt = Button(sframe2c, text="Apply", command=ApplyMathString )
2141  applybt.pack(side=LEFT)
2142  #
2143  # X Math trace formula sub Mframe3
2144  #
2145  sframe3a = Frame( Mframe3 )
2146  sframe3a.pack(side=TOP)
2147  xformlab = Label(sframe3a, text="X Formula ", style= "A10B.TLabel")
2148  xformlab.pack(side=LEFT)
2149  xformentry = Entry(sframe3a, width=23)
2150  xformentry.pack(side=LEFT)
2151  xformentry.delete(0,"end")
2152  xformentry.insert(0, MathXString)
2153  sframe3b = Frame( Mframe3 )
2154  sframe3b.pack(side=TOP)
2155  xunitslab = Label(sframe3b, text="X Units ", style= "A10B.TLabel")
2156  xunitslab.pack(side=LEFT)
2157  xunitsentry = Entry(sframe3b, width=6)
2158  xunitsentry.pack(side=LEFT)
2159  xunitsentry.delete(0,"end")
2160  xunitsentry.insert(0, MathXUnits)
2161  xcheckbt = Button(sframe3b, text="Check", command=CheckMathXString )
2162  xcheckbt.pack(side=LEFT)
2163  sframe3c = Frame( Mframe3 )
2164  sframe3c.pack(side=TOP)
2165  xaxislab = Label(sframe3c, text="X Axis ", style= "A10B.TLabel")
2166  xaxislab.pack(side=LEFT)
2167  xaxisentry = Entry(sframe3c, width=4)
2168  xaxisentry.pack(side=LEFT)
2169  xaxisentry.delete(0,"end")
2170  xaxisentry.insert(0, MathXAxis)
2171  xapplybt = Button(sframe3c, text="Apply", command=ApplyMathXString )
2172  xapplybt.pack(side=LEFT)
2173  #
2174  # Math trace formula sub Mframe4
2175  #
2176  sframe4a = Frame( Mframe4 )
2177  sframe4a.pack(side=TOP)
2178  yformlab = Label(sframe4a, text="Y Formula ", style= "A10B.TLabel")
2179  yformlab.pack(side=LEFT)
2180  yformentry = Entry(sframe4a, width=23)
2181  yformentry.pack(side=LEFT)
2182  yformentry.delete(0,"end")
2183  yformentry.insert(0,MathYString)
2184  sframe4b = Frame( Mframe4 )
2185  sframe4b.pack(side=TOP)
2186  yunitslab = Label(sframe4b, text="Y Units ", style= "A10B.TLabel")
2187  yunitslab.pack(side=LEFT)
2188  yunitsentry = Entry(sframe4b, width=6)
2189  yunitsentry.pack(side=LEFT)
2190  yunitsentry.delete(0,"end")
2191  yunitsentry.insert(0,MathYUnits)
2192  ycheckbt = Button(sframe4b, text="Check", command=CheckMathYString )
2193  ycheckbt.pack(side=LEFT)
2194  sframe4c = Frame( Mframe4 )
2195  sframe4c.pack(side=TOP)
2196  yaxislab = Label(sframe4c, text="Y Axis ", style= "A10B.TLabel")
2197  yaxislab.pack(side=LEFT)
2198  yaxisentry = Entry(sframe4c, width=4)
2199  yaxisentry.pack(side=LEFT)
2200  yaxisentry.delete(0,"end")
2201  yaxisentry.insert(0,MathYAxis)
2202  yapplybt = Button(sframe4c, text="Apply", command=ApplyMathYString )
2203  yapplybt.pack(side=LEFT)
2204 
2205  dismissbutton = Button(MathWindow, text="Dismiss", command=DestroyMathScreen)
2206  dismissbutton.grid(row=3, column=0, sticky=W)
2207 
2208  if RUNstatus.get() > 0:
2209  UpdateTimeTrace()
2210 
2212  global MathScreenStatus, MathWindow
2213 
2214  if MathScreenStatus.get() == 1:
2215  MathScreenStatus.set(0)
2216  MathWindow.destroy()
2217 
2219  global MathString, formentry, MathUnits, unitsentry, MathAxis, axisentry, formlab
2220  global VBuffA, VBuffB, IBuffA, IBuffB
2221  global VBuffMA, VBuffMB, VBuffMC, VBuffMD
2222  global VmemoryA, VmemoryB, ImemoryA, ImemoryB
2223  global FFTBuffA, FFTBuffB, FFTwindowshape
2224  global AWGAwaveform, AWGBwaveform
2225  global Show_MathX, Show_MathY
2226  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
2227  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
2228 
2229  t = 0
2230  TempString = formentry.get()
2231  try:
2232  MathResult = eval(TempString)
2233  formlab.configure(text="Formula ", style= "A10G.TLabel")
2234  except:
2235  formlab.configure(text="Formula ", style= "A10R.TLabel")
2236 
2238  global MathXString, xformentry, MathXUnits, xunitsentry, MathXAxis, xaxisentry, xformlab
2239  global VBuffA, VBuffB, IBuffA, IBuffB
2240  global VBuffMA, VBuffMB, VBuffMC, VBuffMD
2241  global VmemoryA, VmemoryB, ImemoryA, ImemoryB
2242  global FFTBuffA, FFTBuffB, FFTwindowshape
2243  global AWGAwaveform, AWGBwaveform
2244  global Show_MathX, Show_MathY
2245  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
2246  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
2247 
2248  t = 0
2249  TempString = xformentry.get()
2250  try:
2251  MathResult = eval(TempString)
2252  xformlab.configure(text="X Formula ", style= "A10G.TLabel")
2253  except:
2254  xformlab.configure(text="X Formula ", style= "A10R.TLabel")
2255 
2257  global MathYString, yformentry, MathYUnits, yunitsentry, MathYAxis, yaxisentry, yformlab
2258  global VBuffA, VBuffB, IBuffA, IBuffB
2259  global VBuffMA, VBuffMB, VBuffMC, VBuffMD
2260  global VmemoryA, VmemoryB, ImemoryA, ImemoryB
2261  global FFTBuffA, FFTBuffB, FFTwindowshape
2262  global AWGAwaveform, AWGBwaveform
2263  global Show_MathX, Show_MathY
2264  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
2265  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
2266 
2267  t = 0
2268  TempString = yformentry.get()
2269  try:
2270  MathResult = eval(TempString)
2271  yformlab.configure(text="Y Formula ", style= "A10G.TLabel")
2272  except:
2273  yformlab.configure(text="Y Formula ", style= "A10R.TLabel")
2274 
2276  global MathString, formentry, MathUnits, unitsentry, MathAxis, axisentry
2277 
2278  MathString = formentry.get()
2279  MathUnits = unitsentry.get()
2280  MathAxis = axisentry.get()
2281 
2283  global MathXString, xformentry, MathXUnits, xunitsentry, MathXAxis, xaxisentry
2284 
2285  MathXString = xformentry.get()
2286  MathXUnits = xunitsentry.get()
2287  MathXAxis = xaxisentry.get()
2288 
2290  global MathYString, yformentry, MathYUnits, yunitsentry, MathYAxis, yaxisentry
2291 
2292  MathYString = yformentry.get()
2293  MathYUnits = yunitsentry.get()
2294  MathYAxis = yaxisentry.get()
2295 
2297  global MarkerLoc, RUNstatus
2298 
2299  TempString = MarkerLoc
2300  MarkerLoc = askstring("Marker Text Location", "Current Marker Text Location: " + MarkerLoc + "\n\nNew Location: (UL, UR, LL, LR)\n", initialvalue=MarkerLoc)
2301  if (MarkerLoc == None): # If Cancel pressed, then None
2302  MarkerLoc = TempString
2303  if RUNstatus.get() == 0: # if not running
2304  UpdateTimeTrace() # Update
2305 
2307  global RUNstatus
2308 
2309 def DoNothing(event):
2310  global RUNstatus
2311 
2313  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I, RUNstatus
2314 
2315  ShowC1_V.set(1)
2316  ShowC1_I.set(1)
2317  ShowC2_V.set(1)
2318  ShowC2_I.set(1)
2319  if RUNstatus.get() == 0: # if not running
2320  UpdateTimeTrace() # Update
2321 
2323  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I, RUNstatus
2324 
2325  ShowC1_V.set(0)
2326  ShowC1_I.set(0)
2327  ShowC2_V.set(0)
2328  ShowC2_I.set(0)
2329  if RUNstatus.get() == 0: # if not running
2330  UpdateTimeTrace() # Update
2331 
2333  global TgEdge
2334 
2335 # TRIGCOND trigcondRisingPositive = 0
2336 # TRIGCOND trigcondFallingNegative = 1
2337 
2339  global TgInput, TRIGGERlevel, TRIGGERentry, RUNstatus
2340  global MaxV1, MinV1, MaxV2, MinV2
2341  global MaxI1, MinI1, MaxI2, MinI2
2342  # set new trigger level to mid point of waveform
2343  MidV1 = (MaxV1+MinV1)/2
2344  MidV2 = (MaxV2+MinV2)/2
2345  MidI1 = (MaxI1+MinI1)/2
2346  MidI2 = (MaxI2+MinI2)/2
2347  if (TgInput.get() == 0):
2348  DCString = "0.0"
2349  elif (TgInput.get() == 1 or TgInput.get() == 5):
2350  DCString = ' {0:.2f} '.format(MidV1)
2351  elif (TgInput.get() == 2 ):
2352  DCString = ' {0:.2f} '.format(MidI1)
2353  elif (TgInput.get() == 3 ):
2354  DCString = ' {0:.2f} '.format(MidV2)
2355  elif (TgInput.get() == 4 ):
2356  DCString = ' {0:.2f} '.format(MidI2)
2357 
2358  TRIGGERlevel = eval(DCString)
2359  TRIGGERentry.delete(0,END)
2360  TRIGGERentry.insert(4, DCString)
2361  if RUNstatus.get() == 0: # if not running
2362  UpdateTimeTrace() # Update
2363 
2364 
2366  global TgInput
2367 
2368 # if (TgInput.get() == 0):
2369  # no trigger
2370 # elif (TgInput.get() == 1):
2371  # trigger source set to detector of analog in channels
2372  # auto trigger timeout value
2373 # elif (TgInput.get() == 2):
2374  # trigger source set to detector of analog in channels
2375  # 0 disables auto trigger
2376 
2377 def BTriglevel(event):
2378  global TRIGGERlevel, TRIGGERentry, RUNstatus
2379 
2380  # evalute entry string to a numerical value
2381  try:
2382  TRIGGERlevel = float(eval(TRIGGERentry.get()))
2383  except:
2384  TRIGGERentry.delete(0,END)
2385  TRIGGERentry.insert(0, TRIGGERlevel)
2386  # set new trigger level
2387  if RUNstatus.get() == 0: # if not running
2388  UpdateTimeTrace() # Update
2389 
2390 
2391 def BHoldOff(event):
2392  global HoldOff, HoldOffentry, RUNstatus
2393 
2394  try:
2395  HoldOff = float(eval(HoldOffentry.get()))
2396  except:
2397  HoldOffentry.delete(0,END)
2398  HoldOffentry.insert(0, HoldOff)
2399  if RUNstatus.get() == 0: # if not running
2400  UpdateTimeTrace() # Update
2401 # Set Horx possition from entry widget
2402 def BHozPoss(event):
2403  global HozPoss, HozPossentry, RUNstatus
2404 
2405  try:
2406  HozPoss = float(eval(HozPossentry.get()))
2407  except:
2408  HozPossentry.delete(0,END)
2409  HozPossentry.insert(0, HozPoss)
2410  if RUNstatus.get() == 0: # if not running
2411  UpdateTimeTrace() # Update
2412 #
2414  global HozPossentry, TgInput, TMsb
2415 
2416  # get time scale
2417  try:
2418  TIMEdiv = float(eval(TMsb.get()))
2419  except:
2420  TIMEdiv = 0.5
2421  TMsb.delete(0,"end")
2422  TMsb.insert(0,TIMEdiv)
2423  # prevent divide by zero error
2424  if TIMEdiv < 0.0002:
2425  TIMEdiv = 0.01
2426  if TgInput.get() > 0:
2427  HozPoss = -5 * TIMEdiv
2428  HozPossentry.delete(0,END)
2429  HozPossentry.insert(0, HozPoss)
2430 #
2432  global HoldOffentry, HoldOff, TgInput, TMsb
2433 
2434 # get time scale
2435  try:
2436  TIMEdiv = float(eval(TMsb.get()))
2437  except:
2438  TIMEdiv = 0.5
2439  TMsb.delete(0,"end")
2440  TMsb.insert(0,TIMEdiv)
2441  # prevent divide by zero error
2442  if TIMEdiv < 0.0002:
2443  TIMEdiv = 0.01
2444  if TgInput.get() == 0:
2445  HoldOff = HoldOff + TIMEdiv
2446  HoldOffentry.delete(0,END)
2447  HoldOffentry.insert(0, HoldOff)
2448 
2450  global CHB_APosEntry, DCVMuxA
2451 
2452  CHB_APosEntry.delete(0,"end")
2453  CHB_APosEntry.insert(0, ' {0:.2f} '.format(DCVMuxA))
2454 #
2456  global CHB_BPosEntry, DCVMuxB
2457 
2458  CHB_BPosEntry.delete(0,"end")
2459  CHB_BPosEntry.insert(0, ' {0:.2f} '.format(DCVMuxB))
2460 #
2462  global CHB_CPosEntry, DCVMuxC
2463 
2464  CHB_CPosEntry.delete(0,"end")
2465  CHB_CPosEntry.insert(0, ' {0:.2f} '.format(DCVMuxC))
2466 #
2468  global CHD_BPosEntry, DCVMuxD
2469 
2470  CHB_DPosEntry.delete(0,"end")
2471  CHB_DPosEntry.insert(0, ' {0:.2f} '.format(DCVMuxD))
2472 #
2474  global MarkerScale, CHB_Alab, CHB_Blab, CHB_Clab, CHB_Dlab
2475 
2476  if MarkerScale.get() != 1:
2477  MarkerScale.set(5)
2478  CHB_Alab.config(style="Rtrace2.TButton")
2479  CHB_Blab.config(style="Strace6.TButton")
2480  CHB_Clab.config(style="Strace7.TButton")
2481  CHB_Dlab.config(style="Strace4.TButton")
2482  else:
2483  MarkerScale.set(0)
2484 #
2486  global MarkerScale, CHB_Alab, CHB_Blab, CHB_Clab, CHB_Dlab
2487 
2488  if MarkerScale.get() != 1:
2489  MarkerScale.set(6)
2490  CHB_Alab.config(style="Strace2.TButton")
2491  CHB_Blab.config(style="Rtrace6.TButton")
2492  CHB_Clab.config(style="Strace7.TButton")
2493  CHB_Dlab.config(style="Strace4.TButton")
2494  else:
2495  MarkerScale.set(0)
2496 #
2498  global MarkerScale, CHB_Alab, CHB_Blab, CHB_Clab, CHB_Dlab
2499 
2500  if MarkerScale.get() != 1:
2501  MarkerScale.set(7)
2502  CHB_Alab.config(style="Strace2.TButton")
2503  CHB_Blab.config(style="Strace6.TButton")
2504  CHB_Clab.config(style="Rtrace7.TButton")
2505  CHB_Dlab.config(style="Strace4.TButton")
2506  else:
2507  MarkerScale.set(0)
2508 #
2510  global MarkerScale, CHB_Alab, CHB_Blab, CHB_Clab, CHB_Dlab
2511 
2512  if MarkerScale.get() != 1:
2513  MarkerScale.set(8)
2514  CHB_Alab.config(style="Strace2.TButton")
2515  CHB_Blab.config(style="Strace6.TButton")
2516  CHB_Clab.config(style="Strace7.TButton")
2517  CHB_Dlab.config(style="Rtrace4.TButton")
2518  else:
2519  MarkerScale.set(0)
2520 #
2522  global CHAVPosEntry, DCV1
2523 
2524  CHAVPosEntry.delete(0,"end")
2525  CHAVPosEntry.insert(0, ' {0:.2f} '.format(DCV1))
2526 #
2528  global CHBVPosEntry, DCV2
2529 
2530  CHBVPosEntry.delete(0,"end")
2531  CHBVPosEntry.insert(0, ' {0:.2f} '.format(DCV2))
2532 #
2534  global CHAIPosEntry, DCI1
2535 
2536  CHAIPosEntry.delete(0,"end")
2537  CHAIPosEntry.insert(0, ' {0:.2f} '.format(DCI1))
2538 #
2540  global CHBIPosEntry, DCI2
2541 
2542  CHBIPosEntry.delete(0,"end")
2543  CHBIPosEntry.insert(0, ' {0:.2f} '.format(DCI2))
2544 #
2546  global CHAVPosEntryxy, DCV1
2547 
2548  CHAVPosEntryxy.delete(0,"end")
2549  CHAVPosEntryxy.insert(0, ' {0:.2f} '.format(DCV1))
2550 #
2552  global CHBVPosEntryxy, DCV2
2553 
2554  CHBVPosEntryxy.delete(0,"end")
2555  CHBVPosEntryxy.insert(0, ' {0:.2f} '.format(DCV2))
2556 #
2558  global CHAIPosEntryxy, DCI1
2559 
2560  CHAIPosEntryxy.delete(0,"end")
2561  CHAIPosEntryxy.insert(0, ' {0:.2f} '.format(DCI1))
2562 #
2564  global CHBIPosEntryxy, DCI2
2565 
2566  CHBIPosEntryxy.delete(0,"end")
2567  CHBIPosEntryxy.insert(0, ' {0:.2f} '.format(DCI2))
2568 
2570  global RUNstatus, session, CHA, CHB, devx, AWG_2X
2571 
2572  RUNstatus.set(0)
2573  # BSaveConfig("alice-last-config.cfg")
2574  try:
2575  # try to write last config file, Don't crash if running in Write protected space
2576  BSaveConfig("alice-last-config.cfg")
2577  # Put channels in Hi-Z and exit
2578  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z split mode
2579  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z split mode
2580  devx.set_adc_mux(0) # set ADC mux conf to default
2581  AWG_2X.set(0)
2582  BAWG2X()
2583  CHA.constant(0.0)
2584  CHB.constant(0.0)
2585  devx.set_led(0b001) # Set LED.red on the way out
2586  if session.continuous:
2587  session.end()
2588  except:
2589  donothing()
2590 
2591  root.destroy()
2592  exit()
2593 
2594 def BStart():
2595  global RUNstatus, PowerStatus, devx, PwrBt, DevID, FWRevOne, session, AWGSync
2596  global contloop, discontloop, TIMEdiv, First_Slow_sweep
2597 
2598  if DevID == "No Device":
2599  showwarning("WARNING","No Device Plugged In!")
2600  elif FWRevOne == 0.0:
2601  showwarning("WARNING","Out of data Firmware!")
2602  else:
2603  if PowerStatus == 0:
2604  PowerStatus = 1
2605  PwrBt.config(style="Pwr.TButton",text="PWR-On")
2606  devx.ctrl_transfer( 0x40, 0x51, 49, 0, 0, 0, 100) # turn on analog power
2607  if (RUNstatus.get() == 0):
2608  RUNstatus.set(1)
2609  if AWGSync.get() == 0:
2610  session.flush()
2611  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z mode
2612  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z mode
2613  BAWGEnab()
2614  if not session.continuous:
2615  session.start(0)
2616  time.sleep(0.02) # wait awhile here for some reason
2617  elif session.continuous:
2618  session.end()
2619  session.flush()
2620  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z mode
2621  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z mode
2622 
2634  BAWGEnab()
2635  else:
2636  contloop = 0
2637  discontloop = 1
2638  if session.continuous:
2639  session.end() # end continuous session mode
2640 
2641  # UpdateTimeScreen() # Always Update
2642  if TIMEdiv >= 100:
2643  First_Slow_sweep = 0
2644  else:
2645  First_Slow_sweep = 1
2646 #$ Start running Ohmmeter tool
2648  global session, AWGSync
2649 
2650  AWGSync.set(1)
2651  if AWGSync.get() == 0:
2652  session.flush()
2653  if not session.continuous:
2654  session.start(0)
2655  time.sleep(0.02) # wait awhile here for some reason
2656  elif session.continuous:
2657  session.end()
2658  session.flush()
2659  else:
2660  contloop = 0
2661  discontloop = 1
2662  if session.continuous:
2663  session.end() # end continuous session mode
2664 
2665 def BStartIA():
2666  global AWGAFreqEntry, AWGAFreqvalue, Two_X_Sample, FWRevOne
2667 
2668  try:
2669  AWGAFreqvalue = float(eval(AWGAFreqEntry.get()))
2670  except:
2671  AWGAFreqEntry.delete(0,"end")
2672  AWGAFreqEntry.insert(0, AWGAFreqvalue)
2673  if FWRevOne > 2.16:
2674  if AWGAFreqvalue > 20000.0:
2675  Two_X_Sample.set(1)
2676  else:
2677  Two_X_Sample.set(0)
2678  SetADC_Mux()
2679  IASourceSet()
2680  BStart()
2681 
2683  global IASource, CHA, CHB, AWGAMode, AWGBMode, AWGBIOMode, AWGSync
2684 
2685  if AWGSync.get() == 0: # running in continuous mode
2686  AWGSync.set(1)
2687  if IASource.get() == 1:
2688  CHA.mode = Mode.HI_Z # Put CHA in Hi Z split mode
2689  CHB.mode = Mode.HI_Z # Put CHB in Hi Z split mode
2690  AWGAMode.set(2) # Set AWG A to Hi-Z
2691  else:
2692  CHA.mode = Mode.SVMI # Put CHA in Hi Z split mode
2693  CHB.mode = Mode.HI_Z # Put CHB in Hi Z split mode
2694  AWGAMode.set(0) # Set AWG A to SVMI
2695  if AWGBIOMode.get() == 0: # if not in split I/O mode
2696  AWGBMode.set(2) # Set AWG B to Hi-Z
2697 
2698 def BStop():
2699  global RUNstatus, TimeDisp, XYDisp, FreqDisp, IADisp, session, AWGSync
2700  global CHA, CHB, contloop, discontloop
2701 
2702  if (RUNstatus.get() == 1):
2703  # print("Stoping")
2704  RUNstatus.set(0)
2705  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z split mode
2706  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z split mode
2707  if AWGSync.get() == 0: # running in continuous mode
2708  CHA.constant(0.0)
2709  CHB.constant(0.0)
2710  # print("Stoping continuous mode")
2711  # session.cancel() # cancel continuous session mode while paused
2712  if session.continuous:
2713  #print( "Is Continuous? ", session.continuous)
2714  session.end()
2715  #time.sleep(0.02)
2716  #print( "Is Continuous? ", session.continuous)
2717  else:
2718  contloop = 0
2719  discontloop = 1
2720  session.cancel()
2721 #
2722  if TimeDisp.get() > 0:
2723  UpdateTimeScreen() # Always Update screens as necessary
2724  if XYDisp.get() > 0:
2725  UpdateXYScreen()
2726  if FreqDisp.get() > 0:
2728  if IADisp.get() > 0:
2729  UpdateIAScreen()
2730 
2731 def BPower():
2732  global RUNstatus, PowerStatus, devx, PwrBt
2733 
2734  if (RUNstatus.get() == 1):
2735  BStop()
2736  if PowerStatus == 1:
2737  PowerStatus = 0
2738  PwrBt.config(style="PwrOff.TButton",text="PWR-Off")
2739  devx.ctrl_transfer( 0x40, 0x50, 49, 0, 0, 0, 100) # turn off analog power
2740  else:
2741  PowerStatus = 1
2742  PwrBt.config(style="Pwr.TButton",text="PWR-On")
2743  devx.ctrl_transfer( 0x40, 0x51, 49, 0, 0, 0, 100) # turn on analog power
2744 
2745 def BTime():
2746  global TIMEdiv, TMsb, RUNstatus, Two_X_Sample, ETSDisp, FWRevOne
2747 
2748  try: # get time scale in mSec/div
2749  TIMEdiv = float(eval(TMsb.get()))
2750  if TIMEdiv < 0.0002:
2751  TIMEdiv = 0.01
2752  TMsb.delete(0,"end")
2753  TMsb.insert(0,TIMEdiv)
2754  except:
2755  TIMEdiv = 0.5
2756  TMsb.delete(0,"end")
2757  TMsb.insert(0,TIMEdiv)
2758  # Switch to 2X sampleling if time scale small enough and not runing ETS
2759  if ETSDisp.get() == 0:
2760  Samples_per_div = TIMEdiv * 100.0 # samples per mSec @ base sample rate
2761  if FWRevOne > 2.16:
2762  if Samples_per_div < 20.0:
2763  Two_X_Sample.set(1)
2764  else:
2765  Two_X_Sample.set(0)
2766  SetADC_Mux()
2767  #
2768  if RUNstatus.get() == 0: # if not running
2769  UpdateTimeTrace() # Update
2770 
2772  global CHAsb, RUNstatus, CH1vpdvLevel
2773 
2774  try:
2775  CH1vpdvLevel = float(eval(CHAsb.get()))
2776  except:
2777  CHAsb.delete(0,END)
2778  CHAsb.insert(0, CH1vpdvLevel)
2779  if RUNstatus.get() == 0:
2780  UpdateTimeTrace() # if not running Update
2781 
2783  global CHAIsb, RUNstatus, CH1ipdvLevel
2784 
2785  try:
2786  CH1ipdvLevel = float(eval(CHAIsb.get()))
2787  except:
2788  CHAIsb.delete(0,END)
2789  CHAIsb.insert(0, CH1ipdvLevel)
2790  if RUNstatus.get() == 0:
2791  UpdateTimeTrace() # if not running Update
2792 
2794  global CHBsb, RUNstatus, CH2vpdvLevel
2795 
2796  try:
2797  CH2vpdvLevel = float(eval(CHBsb.get()))
2798  except:
2799  CHBsb.delete(0,END)
2800  CHBsb.insert(0, CH2vpdvLevel)
2801  if RUNstatus.get() == 0:
2802  UpdateTimeTrace() # if not running Update
2803 
2805  global CHBIsb, RUNstatus, CH2ipdvLevel
2806 
2807  try:
2808  CH2ipdvLevel = float(eval(CHBIsb.get()))
2809  except:
2810  CHBIsb.delete(0,END)
2811  CHBIsb.insert(0, CH2ipdvLevel)
2812  if RUNstatus.get() == 0:
2813  UpdateTimeTrace() # if not running Update
2814 
2815 def BOffsetA(event):
2816  global CHAOffset, CHAVPosEntry, RUNstatus
2817 
2818  try:
2819  CHAOffset = float(eval(CHAVPosEntry.get())) # evalute entry string to a numerical value
2820  except:
2821  CHAVPosEntry.delete(0,END)
2822  CHAVPosEntry.insert(0, CHAOffset)
2823  # set new offset level
2824  if RUNstatus.get() == 0:
2825  UpdateTimeTrace() # if not running Update
2826 
2827 def BIOffsetA(event):
2828  global CHAIOffset, CHAIPosEntry, RUNstatus
2829 
2830  try:
2831  CHAIOffset = float(eval(CHAIPosEntry.get())) # evalute entry string to a numerical value
2832  except:
2833  CHAIPosEntry.delete(0,END)
2834  CHAIPosEntry.insert(0, CHAIOffset)
2835  # set new offset level
2836  if RUNstatus.get() == 0:
2837  UpdateTimeTrace() # if not running Update
2838 
2839 def BOffsetB(event):
2840  global CHBOffset, CHBVPosEntry, RUNstatus
2841 
2842  try:
2843  CHBOffset = float(eval(CHBVPosEntry.get())) # evalute entry string to a numerical value
2844  except:
2845  CHBVPosEntry.delete(0,END)
2846  CHBVPosEntry.insert(0, CHBOffset)
2847  # set new offset level
2848  if RUNstatus.get() == 0:
2849  UpdateTimeTrace() # if not running Update
2850 
2851 def BIOffsetB(event):
2852  global CHBIOffset, CHBIPosEntry, RUNstatus
2853 
2854  try:
2855  CHBIOffset = float(eval(CHBIPosEntry.get())) # evalute entry string to a numerical value
2856  except:
2857  CHBIPosEntry.delete(0,END)
2858  CHBIPosEntry.insert(0, CHBIOffset)
2859  # set new offset level
2860  if RUNstatus.get() == 0:
2861  UpdateTimeTrace() # if not running Update
2862 
2864  global TimeDisp, ckb1
2865  if TimeDisp.get() == 1:
2866  ckb1.config(style="Enab.TCheckbutton")
2867  else:
2868  ckb1.config(style="Disab.TCheckbutton")
2869 #
2871  global XYDisp, ckb2
2872  if XYDisp.get() == 1:
2873  ckb2.config(style="Enab.TCheckbutton")
2874  else:
2875  ckb2.config(style="Disab.TCheckbutton")
2876 #
2878  global FreqDisp, ckb3, OOTckb3, OOTScreenStatus
2879  if FreqDisp.get() == 1:
2880  if OOTScreenStatus.get() == 0:
2881  ckb3.config(style="Enab.TCheckbutton")
2882  else:
2883  OOTckb3.config(style="Enab.TCheckbutton")
2884  else:
2885  if OOTScreenStatus.get() == 0:
2886  ckb3.config(style="Disab.TCheckbutton")
2887  else:
2888  OOTckb3.config(style="Disab.TCheckbutton")
2889 #
2891  global BodeDisp, ckb5, AWGSync, OOTckb5, OOTScreenStatus
2892  if BodeDisp.get() == 1:
2893  AWGSync.set(1)
2894  if OOTScreenStatus.get() == 0:
2895  ckb5.config(style="Enab.TCheckbutton")
2896  else:
2897  OOTckb5.config(style="Enab.TCheckbutton")
2898  else:
2899  if OOTScreenStatus.get() == 0:
2900  ckb5.config(style="Disab.TCheckbutton")
2901  else:
2902  OOTckb5.config(style="Disab.TCheckbutton")
2903 #
2905  global IADisp, ckb4, OOTckb4, OOTScreenStatus
2906  if IADisp.get() == 1:
2907  if OOTScreenStatus.get() == 0:
2908  ckb4.config(style="Enab.TCheckbutton")
2909  else:
2910  OOTckb4.config(style="Enab.TCheckbutton")
2911  else:
2912  if OOTScreenStatus.get() == 0:
2913  ckb4.config(style="Disab.TCheckbutton")
2914  else:
2915  OOTckb4.config(style="Disab.TCheckbutton")
2916 #
2918  global PhADisp, Phckb, OOTphckb, OOTScreenStatus
2919  if PhADisp.get() == 1:
2920  if OOTScreenStatus.get() == 0:
2921  phckb.config(style="Enab.TCheckbutton")
2922  else:
2923  OOTphckb.config(style="Enab.TCheckbutton")
2924  else:
2925  if OOTScreenStatus.get() == 0:
2926  phckb.config(style="Disab.TCheckbutton")
2927  else:
2928  OOTphckb.config(style="Disab.TCheckbutton")
2929 #
2931  global OhmDisp, ckb6, OOTckb6, OOTScreenStatus
2932  if OhmDisp.get() == 1:
2933  if OOTScreenStatus.get() == 0:
2934  ckb6.config(style="Enab.TCheckbutton")
2935  else:
2936  OOTckb6.config(style="Enab.TCheckbutton")
2937  else:
2938  if OOTScreenStatus.get() == 0:
2939  ckb6.config(style="Disab.TCheckbutton")
2940  else:
2941  OOTckb6.config(style="Disab.TCheckbutton")
2942 #
2944  global ETSDisp, enb1
2945  if ETSDisp.get() == 1:
2946  enb1.config(style="Enab.TCheckbutton")
2947  else:
2948  try:
2949  enb1.config(style="Disab.TCheckbutton")
2950  except:
2951  donothing()
2952 # ========================= Main routine ====================================
2953 
2955  global RUNstatus, SingleShot, ManualTrigger, TimeDisp, XYDisp, FreqDisp, SpectrumScreenStatus, HWRevOne
2956  global IADisp, IAScreenStatus, CutDC, DevOne, AWGBMode, MuxEnb, BodeScreenStatus, BodeDisp
2957  global MuxScreenStatus, VBuffA, VBuffB, MuxSync, AWGBIOMode
2958  global VmemoryMuxA, VmemoryMuxB, VmemoryMuxC, VmemoryMuxD, MuxChan
2959  global ShowC1_V, ShowC2_V, ShowC2_I, SMPfft
2960  global PIO_0, PIO_1, PIO_2, PIO_3, PIO_4, PIO_5, PIO_6, PIO_7
2961  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
2962  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
2963  global SV1, SI1, SV2, SI2, SVA_B
2964  global FregPoint, FBins, FStep
2965  # Analog Mux channel measurement variables
2966  global TRACEresetTime, TRACEmodeTime, SettingsStatus
2967  global VBuffMA, VBuffMB, VBuffMC, VBuffMD, DualMuxMode
2968  global Show_CBA, Show_CBB, Show_CBC, Show_CBD
2969  global DCVMuxA, MinVMuxA, MaxVMuxA, MidVMuxA, PPVMuxA, SVMuxA
2970  global DCVMuxB, MinVMuxB, MaxVMuxB, MidVMuxB, PPVMuxB, SVMuxB
2971  global DCVMuxC, MinVMuxC, MaxVMuxC, MidVMuxC, PPVMuxC, SVMuxC
2972  global DCVMuxD, MinVMuxD, MaxVMuxD, MidVMuxD, PPVMuxD, SVMuxD
2973 
2974  while (True): # Main loop
2975  # RUNstatus = 1 : Open Acquisition
2976  if (RUNstatus.get() == 1) or (RUNstatus.get() == 2):
2977  if SettingsStatus.get() == 1:
2978  SettingsUpdate() # Make sure current entries in Settings controls are up to date
2979  if TimeDisp.get() > 0 or XYDisp.get() > 0:
2980  if MuxScreenStatus.get() == 0:
2981  MuxChan = -1
2982  Analog_Time_In()
2983  else:
2984  if DualMuxMode.get() == 1: # force split I/O mode if dual mux mode set
2985  AWGAIOMode.set(1)
2986  AWGBIOMode.set(1)
2987  ShowC1_V.set(0) # force A voltage trace off
2988  ShowC2_V.set(0) # force B voltage trace off
2989  if HWRevOne == "D" :
2990  # force channel B to always be in High-Z mode for Rev D hardware or if not in split I/O mode
2991  AWGBMode.set(2)
2992  if AWGBIOMode.get() == 0: # if not in split I/O mode
2993  ShowC2_I.set(0) # no need to show CH-B current
2994  if MuxEnb.get() == 1:
2995  PIO2 = 0x51
2996  else:
2997  PIO2 = 0x50
2998  if MuxSync.get() == 0:
2999  PIO3 = 0x51
3000  PIO3x = 0x50
3001  else:
3002  PIO3 = 0x50
3003  PIO3x = 0x51
3004  if TRACEmodeTime.get() == 0 and TRACEresetTime == False:
3005  TRACEresetTime = True # Clear the memory for averaging
3006  elif TRACEmodeTime.get() == 1:
3007  if TRACEresetTime == True:
3008  TRACEresetTime = False
3009  # Save previous trace in memory for average trace
3010  VmemoryMuxA = VBuffMA
3011  VmemoryMuxB = VBuffMB
3012  VmemoryMuxC = VBuffMC
3013  ImemoryMuxD = VBuffMD
3014  if Show_CBA.get() == 1:
3015  MuxChan = 0
3016  devx.ctrl_transfer(0x40, 0x50, PIO_0, 0, 0, 0, 100) # set PIO 0 to 0
3017  devx.ctrl_transfer(0x40, 0x50, PIO_1, 0, 0, 0, 100) # set PIO 1 to 0
3018  devx.ctrl_transfer(0x40, PIO2, PIO_2, 0, 0, 0, 100) # set PIO enable
3019  devx.ctrl_transfer(0x40, PIO3, PIO_3, 0, 0, 0, 100) # set PIO 3 to 1 sync pulse for sweep start
3020  time.sleep(0.002)
3021  devx.ctrl_transfer(0x40, PIO3x, PIO_3, 0, 0, 0, 100) # set PIO 3 to return value
3022  Analog_Time_In()
3023  if Show_CBB.get() == 1:
3024  MuxChan = 1
3025  devx.ctrl_transfer(0x40, 0x51, PIO_0, 0, 0, 0, 100) # set PIO 0 to 1
3026  devx.ctrl_transfer(0x40, 0x50, PIO_1, 0, 0, 0, 100) # set PIO 1 to 0
3027  devx.ctrl_transfer(0x40, PIO2, PIO_2, 0, 0, 0, 100) # set PIO 2 to 0
3028  devx.ctrl_transfer(0x40, PIO3, PIO_3, 0, 0, 0, 100) # set PIO 3 to sync pulse for sweep start
3029  time.sleep(0.002)
3030  devx.ctrl_transfer(0x40, PIO3x, 3, 0, 0, 0, 100) # set PIO 3 to return value
3031  Analog_Time_In()
3032  if Show_CBC.get() == 1:
3033  MuxChan = 2
3034  if DualMuxMode.get() == 1:
3035  devx.ctrl_transfer(0x40, 0x51, PIO_0, 0, 0, 0, 100) # set PIO 0 to 1
3036  devx.ctrl_transfer(0x40, 0x50, PIO_1, 0, 0, 0, 100) # set PIO 1 to 0
3037  else:
3038  devx.ctrl_transfer(0x40, 0x50, PIO_0, 0, 0, 0, 100) # set PIO 0 to 0
3039  devx.ctrl_transfer(0x40, 0x51, PIO_1, 0, 0, 0, 100) # set PIO 1 to 1
3040  devx.ctrl_transfer(0x40, PIO2, PIO_2, 0, 0, 0, 100) # set PIO 2 to 0
3041  devx.ctrl_transfer(0x40, PIO3, PIO_3, 0, 0, 0, 100) # set PIO 3 to sync pulse for sweep start
3042  time.sleep(0.002)
3043  devx.ctrl_transfer(0x40, PIO3x, PIO_3, 0, 0, 0, 100) # set PIO 3 to return value
3044  Analog_Time_In()
3045  if Show_CBD.get() == 1:
3046  MuxChan = 3
3047  if DualMuxMode.get() == 1:
3048  devx.ctrl_transfer(0x40, 0x50, PIO_0, 0, 0, 0, 100) # set PIO 0 to 0
3049  devx.ctrl_transfer(0x40, 0x50, PIO_1, 0, 0, 0, 100) # set PIO 1 to 0
3050  else:
3051  devx.ctrl_transfer(0x40, 0x51, PIO_0, 0, 0, 0, 100) # set PIO 0 to 1
3052  devx.ctrl_transfer(0x40, 0x51, PIO_1, 0, 0, 0, 100) # set PIO 1 to 1
3053  devx.ctrl_transfer(0x40, PIO2, PIO_2, 0, 0, 0, 100) # set PIO 2 to 0
3054  devx.ctrl_transfer(0x40, PIO3, PIO_3, 0, 0, 0, 100) # set PIO 3 to sync pulse for sweep start
3055  time.sleep(0.002)
3056  devx.ctrl_transfer(0x40, PIO3x, PIO_3, 0, 0, 0, 100) # set PIO 3 to return value
3057  Analog_Time_In()
3058  if Show_CBA.get() == 0 and Show_CBB.get() == 0 and Show_CBC.get() == 0 and Show_CBD.get() == 0 and ShowC1_V.get() == 1:
3059  Analog_Time_In()
3060  if (FreqDisp.get() > 0 and SpectrumScreenStatus.get() == 1) or (IADisp.get() > 0 and IAScreenStatus.get() == 1) or (BodeDisp.get() > 0 and BodeScreenStatus.get() == 1):
3061  if IADisp.get() > 0 or BodeDisp.get() > 0:
3062  CutDC.set(1) # remove DC portion of waveform
3063  AWGSync.set(1) # Impedance analyzer and Bode plotter must be run in discontinuous mode
3064  if BodeDisp.get() > 0:
3065  if LoopNum.get() <= len(FStep):
3066  FregPoint = FBins[int(FStep[LoopNum.get()-1])] # look up next frequency from list of bins
3067  if FregPoint < 100.0:
3068  SMPfft = 16384
3069  elif FregPoint < 500.0:
3070  SMPfft = 8192
3071  elif FregPoint < 2000.0:
3072  SMPfft = 4096
3073  else:
3074  SMPfft = 2048
3075  if Two_X_Sample.get() > 0 and FregPoint < 2000.0:
3076  SMPfft = SMPfft * 2
3077 
3078  Analog_Freq_In()
3079  elif OhmRunStatus.get() == 1 and OhmDisp.get() == 1:
3080  Ohm_Analog_In()
3081  root.update_idletasks()
3082  root.update()
3083 
3085  global RMode, CHATestVEntry, CHATestREntry, CHA, CHB, devx, OhmA0, OhmA1, discontloop
3086  global AWGAMode, AWGBMode, AWGAShape, AWGSync, AWGBTerm, AWGAOffsetEntry
3087  global AWGAIOMode, AWGBIOMode, Two_X_Sample
3088 
3089 # Do input probe Calibration CH1VGain, CH2VGain, CH1VOffset, CH2VOffset
3090  try:
3091  InOffA = float(eval(CHAVOffsetEntry.get()))
3092  except:
3093  CHAVOffsetEntry.delete(0,END)
3094  CHAVOffsetEntry.insert(0, InOffA)
3095  try:
3096  InGainA = float(eval(CHAVGainEntry.get()))
3097  except:
3098  CHAVGainEntry.delete(0,END)
3099  CHAVGainEntry.insert(0, InGainA)
3100  try:
3101  InOffB = float(eval(CHBVOffsetEntry.get()))
3102  except:
3103  CHBVOffsetEntry.delete(0,END)
3104  CHBVOffsetEntry.insert(0, InOffB)
3105  try:
3106  InGainB = float(eval(CHBVGainEntry.get()))
3107  except:
3108  CHBVGainEntry.delete(0,END)
3109  CHBVGainEntry.insert(0, InGainB)
3110  try:
3111  CurOffA = float(CHAIOffsetEntry.get())
3112  except:
3113  CurOffA = 0.0
3114  try:
3115  CurOffB = float(CHBIOffsetEntry.get())
3116  except:
3117  CurOffB = 0.0
3118  try:
3119  CurGainA = float(CHAIGainEntry.get())
3120  except:
3121  CurGainA = 1.0
3122  try:
3123  CurGainB = float(CHBIGainEntry.get())
3124  except:
3125  CurGainB = 1.0
3126  try:
3127  chatestv = float(eval(CHATestVEntry.get()))
3128  if chatestv > 5.0:
3129  chatestv = 5.0
3130  CHATestVEntry.delete(0,END)
3131  CHATestVEntry.insert(0, chatestv)
3132  except:
3133  CHATestVEntry.delete(0,END)
3134  CHATestVEntry.insert(0, chatestv)
3135  try:
3136  chatestr = float(eval(CHATestREntry.get()))
3137  except:
3138  CHATestREntry.delete(0,END)
3139  CHATestREntry.insert(0, chatestr)
3140  #
3141  DCVA0 = DCVB0 = DCIA0 = DCIB0 = 0.0 # initalize measurment variable
3142  RIN = 1000000 # nominal ALM1000 input resistance is 1 Mohm
3143  Two_X_Sample.set(0) # make sure we are in 1V sample rate mode
3144  SetADC_Mux()
3145  # set A and B channels
3146  AWGAMode.set(0) # Set AWG A to SVMI
3147  AWGAShape.set(0) # DC
3148  AWGBMode.set(2) # Set AWG B to Hi-Z
3149  AWGAIOMode.set(0) # turn off Split I/O mode
3150  AWGBIOMode.set(0) # turn off Split I/O mode
3151  AWGAOffsetEntry.delete(0,"end")
3152  AWGAOffsetEntry.insert(0, chatestv)
3153  BAWGAModeLabel()
3154  BAWGBModeLabel() # update AWG labels
3155 
3156  if RMode.get() == 0:
3157  AWGBTerm.set(0)
3158  else:
3159  AWGBTerm.set(1)
3160  #
3161  if AWGSync.get() > 0: # awg syn flag set so run in discontinuous mode
3162  if discontloop > 0:
3163  session.flush()
3164  else:
3165  discontloop = 1
3166  time.sleep(0.01)
3167  BAWGEnab()
3168  ADsignal1 = devx.get_samples(210) # get samples for both channel A and B
3169  # time.sleep(1000.0/SHOWsamples)
3170  else: # running in continuous mode
3171  if session.continuous:
3172  ADsignal1 = devx.read(210, -1, True) # get samples for both channel A and B
3173  #
3174  # get_samples returns a list of values for voltage [0] and current [1]
3175  for index in range(200): # calculate average
3176  DCVA0 += ADsignal1[index+10][0][0] # VAdata # Sum for average CA voltage
3177  DCVB0 += ADsignal1[index+10][1][0] # VBdata # Sum for average CB voltage
3178  DCIA0 += ADsignal1[index+10][0][1] # Sum for average CA current
3179  DCIB0 += ADsignal1[index+10][1][1] # Sum for average CB current
3180 
3181  DCVA0 = DCVA0 / 200.0 # calculate average
3182  DCVB0 = DCVB0 / 200.0 # calculate average
3183  DCIA0 = DCIA0 / 200.0 # calculate average
3184  DCIB0 = DCIB0 / 200.0 # calculate average
3185  DCVA0 = (DCVA0 - InOffA) * InGainA
3186  DCVB0 = (DCVB0 - InOffB) * InGainB
3187  DCIA0 = ((DCIA0*1000) - CurOffA) * CurGainA
3188  DCIB0 = ((DCIB0*1000) - CurOffB) * CurGainB
3189  if RMode.get() == 0: # external resistor
3190  DCM = chatestr * (DCVB0/(DCVA0-DCVB0))
3191  DCR = (DCM * RIN) / (RIN - DCM) # correct for channel B input resistance
3192  else: # use internal 50 ohm resistor
3193  DCR = chatestr * ((DCVA0-DCVB0)/DCVB0)
3194  if DCR < 1000:
3195  OhmString = '{0:.2f} '.format(DCR) + "Ohms "# format with 2 decimal places
3196  else:
3197  OhmString = '{0:.3f} '.format(DCR/1000) + "KOhms " # divide by 1000 and format with 3 decimal places
3198  IAString = "Meas " + ' {0:.2f} '.format(DCIA0) + " mA " + ' {0:.2f} '.format(DCVB0) + " V"
3199  OhmA0.config(text = OhmString) # change displayed value
3200  OhmA1.config(text = IAString) # change displayed value
3201 #
3202  time.sleep(0.1)
3203  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
3204 
3207  global TIMEdiv, TMsb, TRACEmodeTime, TRACEresetTime, TRACEaverage
3208  global VBuffMA, VmemoryMuxA, VBuffMB, VmemoryMuxB, VBuffMC, VmemoryMuxC, VBuffMD, VmemoryMuxD
3209  global CHAVOffsetEntry, CHAVGainEntry, CHBVOffsetEntry, CHBVGainEntry
3210  global CHAIOffsetEntry, CHBIOffsetEntry, CHAIGainEntry, CHBIGainEntry
3211  global InOffA, InGainA, InOffB, InGainB
3212  global CurOffA, CurOffB, CurGainA, CurGainB
3213  global PhADisp, PhAScreenStatus, MuxScreenStatus
3214  global Show_CBA, Show_CBB, Show_CBC, Show_CBD
3215 
3216  # get time scale
3217  try:
3218  TIMEdiv = eval(TMsb.get())
3219  except:
3220  TIMEdiv = 0.5
3221  TMsb.delete(0,"end")
3222  TMsb.insert(0,TIMEdiv)
3223  if TIMEdiv < 0.0002:
3224  TIMEdiv = 0.01
3225  #
3226 # Do input divider Calibration CH1VGain, CH2VGain, CH1VOffset, CH2VOffset
3227  try:
3228  InOffA = float(eval(CHAVOffsetEntry.get()))
3229  except:
3230  CHAVOffsetEntry.delete(0,END)
3231  CHAVOffsetEntry.insert(0, InOffA)
3232  try:
3233  InGainA = float(eval(CHAVGainEntry.get()))
3234  except:
3235  CHAVGainEntry.delete(0,END)
3236  CHAVGainEntry.insert(0, InGainA)
3237  try:
3238  InOffB = float(eval(CHBVOffsetEntry.get()))
3239  except:
3240  CHBVOffsetEntry.delete(0,END)
3241  CHBVOffsetEntry.insert(0, InOffB)
3242  try:
3243  InGainB = float(eval(CHBVGainEntry.get()))
3244  except:
3245  CHBVGainEntry.delete(0,END)
3246  CHBVGainEntry.insert(0, InGainB)
3247  try:
3248  CurOffA = float(CHAIOffsetEntry.get()) #/1000.0 # convert to Amps # leave in mA
3249  except:
3250  CurOffA = 0.0
3251  try:
3252  CurOffB = float(CHBIOffsetEntry.get())#/1000.0 # convert to Amps
3253  except:
3254  CurOffB = 0.0
3255  try:
3256  CurGainA = float(CHAIGainEntry.get())
3257  except:
3258  CurGainA = 1.0
3259  try:
3260  CurGainB = float(CHBIGainEntry.get())
3261  except:
3262  CurGainB = 1.0
3263 # Dedecide which Fast or Slow sweep routine to call
3264  if TIMEdiv > 500:
3265  Analog_Slow_time() # failed attempt as rolling trace
3266  else:
3268  if MuxScreenStatus.get() > 0:
3269  if Show_CBA.get() == 1:
3270  # Average mode 1, add difference / TRACEaverage to arrayif :
3271  if TRACEmodeTime.get() == 1 and TRACEresetTime == False:
3272  try:
3273  VBuffMA = VmemoryMuxA + (VBuffMA - VmemoryMuxA) / TRACEaverage.get()
3274  except:
3275  # buffer size mismatch so reset memory buffers
3276  VmemoryMuxA = VBuffMA
3277  if Show_CBB.get() == 1:
3278  # Average mode 1, add difference / TRACEaverage to arrayif :
3279  if TRACEmodeTime.get() == 1 and TRACEresetTime == False:
3280  try:
3281  VBuffMB = VmemoryMuxB + (VBuffMB - VmemoryMuxB) / TRACEaverage.get()
3282  except:
3283  # buffer size mismatch so reset memory buffers
3284  VmemoryMuxB = VBuffMB
3285  if Show_CBC.get() == 1:
3286  # Average mode 1, add difference / TRACEaverage to arrayif :
3287  if TRACEmodeTime.get() == 1 and TRACEresetTime == False:
3288  try:
3289  VBuffMC = VmemoryMuxC + (VBuffMC - VmemoryMuxC) / TRACEaverage.get()
3290  except:
3291  # buffer size mismatch so reset memory buffers
3292  VmemoryMuxC = VBuffMC
3293  if Show_CBD.get() == 1:
3294  # Average mode 1, add difference / TRACEaverage to arrayif :
3295  if TRACEmodeTime.get() == 1 and TRACEresetTime == False:
3296  try:
3297  VBuffMD = VmemoryMuxD + (VBuffMD - VmemoryMuxD) / TRACEaverage.get()
3298  except:
3299  # buffer size mismatch so reset memory buffers
3300  VmemoryMuxD = VBuffMD
3301  if PhADisp.get() > 0 and PhAScreenStatus.get() == 1:
3302  Analog_Phase_In()
3303 #
3304 # Process captured time dmain signals to extract magnitude and phase data
3306  global ADsignal1, VBuffA, VBuffB, IBuffA, IBuffB
3307  global VBuffMA, VBuffMB, VBuffMC, VBuffMD
3308  global VAresult, VBresult, IAresult, IBresult, VABresult
3309  global PhaseVA, PhaseVB, PhaseIA, PhaseIB, PhaseVAB
3310  global VMAresult, VMBresult,VMCresult, VMDresult
3311  global PhaseVMA, PhaseVMB, PhaseVMC, PhaseVMD
3312  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
3313  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
3314  global DCVMuxA, DCVMuxB, DCVMuxC, DCVMuxD
3315  global SHOWsamples, SMPfft, hldn, MuxScreenStatus, MuxChan
3316  global FFTwindowshape, ZEROstuffing
3317 
3318  if len(VBuffA) < SMPfft: # put up warning to reduce number of FFT Samples or increase Time/Div time base
3320  #showwarning("WARNING","Redude Number of Samples \n Or Increas Time/Div time base.")
3321  #BStop() # Force Stop loop if running
3322  #return
3323  # Do an FFT on captured voltage and current buffer
3324  StartSmp = hldn
3325  StopSmp = hldn + SMPfft
3327  REX = []
3328  PhaseVA = []
3329  PhaseIA = []
3330  PhaseIB = []
3331  # Convert list to numpy array REX for faster Numpy calculations
3332  # Take the first SMPfft samples of VBuffA
3333  REX = numpy.array(VBuffA[StartSmp:StopSmp]-DCV1) # Make a numpy arry of the list
3334 
3335  # Set Analog level display value MAX value is 5 volts for ALM1000
3336  REX = REX / 5.0
3337 
3338  # Do the FFT window function
3339  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3340  # FFT with numpy
3341  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3342  PhaseVA = numpy.angle(ALL, deg=True) # calculate angle
3343  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3344 
3345  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3346  ALL = ALL[0:le] # So take only first half of the array
3347  PhaseVA = PhaseVA[0:le]
3348  Totalcorr = 7.07106 / SMPfft # RMS For VOLTAGE!
3349  VAresult = Totalcorr * ALL
3350  # check to see if analog Mux is being used?
3351  if MuxScreenStatus.get() == 0:
3352  PhaseVB = []
3353  PhaseVAB = []
3354  # Now VB array
3355  REX = numpy.array(VBuffB[StartSmp:StopSmp]-DCV2) # Make a numpy arry of the list
3356 
3357  # Set Analog level display value MAX value is 5 volts for ALM1000
3358  REX = REX / 5.0
3359 
3360  # Do the FFT window function
3361  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3362 
3363  # FFT with numpy
3364  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3365  PhaseVB = numpy.angle(ALL, deg=True) # calculate angle
3366  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3367 
3368  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3369  ALL = ALL[0:le] # So take only first half of the array
3370  PhaseVB = PhaseVB[0:le]
3371  Totalcorr = 7.07106 / SMPfft # For rMS VOLTAGE!
3372  VBresult = Totalcorr * ALL
3373 
3374  # Now VAB array
3375  REX = numpy.array(VBuffA[StartSmp:StopSmp]-VBuffB[StartSmp:StopSmp]) # Make a numpy arry of the list
3376  REX = REX - (DCV1-DCV2) # cut any remaining DC
3377  # Set Analog level display value MAX value is 5 volts for ALM1000
3378  REX = REX / 5.0
3379 
3380  # Do the FFT window function
3381  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3382 
3383  # FFT with numpy
3384  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3385  PhaseVAB = numpy.angle(ALL, deg=True) # calculate angle
3386  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3387 
3388  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3389  ALL = ALL[0:le] # So take only first half of the array
3390  PhaseVAB = PhaseVAB[0:le]
3391  Totalcorr = 7.07106 / SMPfft # For rms VOLTAGE!
3392  VABresult = Totalcorr * ALL
3393  else: # Do FFTs on Mux buffers as needed if MuxScreenStatus.get() == 0:
3394  if MuxChan == 0: #
3395  PhaseVMA = []
3396  # Now VMuxA array
3397  REX = numpy.array(VBuffMA[StartSmp:StopSmp]-DCVMuxA) # Make a numpy arry of the list
3398 
3399  # Set Analog level display value MAX value is 5 volts for ALM1000
3400  REX = REX / 5.0
3401 
3402  # Do the FFT window function
3403  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3404 
3405  # FFT with numpy
3406  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3407  PhaseVMA = numpy.angle(ALL, deg=True) # calculate angle
3408  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3409 
3410  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3411  ALL = ALL[0:le] # So take only first half of the array
3412  PhaseVMA = PhaseVMA[0:le]
3413  Totalcorr = 7.07106 / SMPfft # For rms VOLTAGE!
3414  VMAresult = Totalcorr * ALL
3415  if MuxChan == 1: # MuxChan = 1
3416  PhaseVMB = []
3417  # Now VMuxA array
3418  REX = numpy.array(VBuffMB[StartSmp:StopSmp]-DCVMuxB) # Make a numpy arry of the list
3419 
3420  # Set Analog level display value MAX value is 5 volts for ALM1000
3421  REX = REX / 5.0
3422 
3423  # Do the FFT window function
3424  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3425 
3426  # FFT with numpy
3427  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3428  PhaseVMB = numpy.angle(ALL, deg=True) # calculate angle
3429  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3430 
3431  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3432  ALL = ALL[0:le] # So take only first half of the array
3433  PhaseVMB = PhaseVMB[0:le]
3434  Totalcorr = 7.07106 / SMPfft # For rms VOLTAGE!
3435  VMBresult = Totalcorr * ALL
3436  if MuxChan == 2: # MuxChan = 2
3437  PhaseVMC = []
3438  # Now VMuxA array
3439  REX = numpy.array(VBuffMC[StartSmp:StopSmp]-DCVMuxC) # Make a numpy arry of the list
3440 
3441  # Set Analog level display value MAX value is 5 volts for ALM1000
3442  REX = REX / 5.0
3443 
3444  # Do the FFT window function
3445  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3446 
3447  # FFT with numpy
3448  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3449  PhaseVMC = numpy.angle(ALL, deg=True) # calculate angle
3450  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3451 
3452  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3453  ALL = ALL[0:le] # So take only first half of the array
3454  PhaseVMC = PhaseVMC[0:le]
3455  Totalcorr = 7.07106 / SMPfft # For rms VOLTAGE!
3456  VMCresult = Totalcorr * ALL
3457  if MuxChan == 3: # MuxChan = 3
3458  PhaseVMD = []
3459  # Now VMuxA array
3460  REX = numpy.array(VBuffMD[StartSmp:StopSmp]-DCVMuxD) # Make a numpy arry of the list
3461 
3462  # Set Analog level display value MAX value is 5 volts for ALM1000
3463  REX = REX / 5.0
3464 
3465  # Do the FFT window function
3466  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3467 
3468  # FFT with numpy
3469  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3470  PhaseVMD = numpy.angle(ALL, deg=True) # calculate angle
3471  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3472 
3473  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3474  ALL = ALL[0:le] # So take only first half of the array
3475  PhaseVMD = PhaseVMD[0:le]
3476  Totalcorr = 7.07106 / SMPfft # For rms VOLTAGE!
3477  VMDresult = Totalcorr * ALL
3478  # Now IA array
3479  REX = numpy.array(IBuffA[StartSmp:StopSmp]) # -DCI1 Make a numpy arry of the list
3480 
3481  # Set Analog level display value MAX value is 0.2 amps for ALM1000
3482  REX = REX / 0.5
3483 
3484  # Do the FFT window function
3485  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3486 
3487  # FFT with numpy
3488  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3489  PhaseIA = numpy.angle(ALL, deg=True) # calculate angle
3490  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3491 
3492  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3493  ALL = ALL[0:le] # So take only first half of the array
3494  PhaseIA = PhaseIA[0:le]
3495  Totalcorr = 0.707106 / SMPfft # RMS For current!
3496  IAresult = Totalcorr * ALL
3497 
3498  # Now IB array
3499  REX = numpy.array(IBuffB[StartSmp:StopSmp]) # -DCI2 Make a numpy arry of the list
3500 
3501  # Set Analog level display value MAX value is 0.2 amps for ALM1000
3502  REX = REX / 0.5
3503 
3504  # Do the FFT window function
3505  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
3506 
3507  # FFT with numpy
3508  ALL = numpy.fft.fft(REX, n=SMPfft) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
3509  PhaseIB = numpy.angle(ALL, deg=True) # calculate angle
3510  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
3511 
3512  le = int(len(ALL) / 2) # Only half is used, other half is mirror
3513  ALL = ALL[0:le] # So take only first half of the array
3514  PhaseIB = PhaseIB[0:le]
3515  Totalcorr = 0.707106 / SMPfft # RMS For current!
3516  IBresult = Totalcorr * ALL
3517 #
3518  UpdatePhAAll()
3519 #
3520 
3523  global ADsignal1, VBuffA, VBuffB, IBuffA, IBuffB, VFilterA, VFilterB
3524  global VmemoryA, VmemoryB, ImemoryA, ImemoryB
3525  global AWGSync, AWGAMode, AWGBMode, TMsb, HoldOff, HoldOffentry, HozPoss, HozPossentry
3526  global AWGAIOMode, AWGBIOMode, DecimateOption, DualMuxMode, MuxChan
3527  global TRACEresetTime, TRACEmodeTime, TRACEaverage, TRIGGERsample, TgInput, LShift
3528  global CHA, CHB, session, devx, discontloop, contloop
3529  global TRACES, TRACESread, TRACEsize, First_Slow_sweep, ShiftPointer
3530  global RUNstatus, SingleShot, ManualTrigger, TimeDisp, XYDisp, FreqDisp
3531  global TIMEdiv1x, TIMEdiv, hldn, Is_Triggered
3532  global SAMPLErate, SHOWsamples, MinSamples, MaxSamples, AWGSAMPLErate
3533  global TRACErefresh, AWGScreenStatus, XYScreenStatus, MeasureStatus
3534  global SCREENrefresh, DCrefresh
3535  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
3536  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
3537  global SV1, SI1, SV2, SI2, SVA_B
3538  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
3539  global CHAVPosEntry, CHAIPosEntry, CHBVPosEntry, CHBIPosEntry
3540  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
3541  global InOffA, InGainA, InOffB, InGainB, CurOffA, CurOffB, CurGainA, CurGainB
3542  global DigFiltA, DigFiltB, DFiltACoef, DFiltBCoef, DigBuffA, DigBuffB
3543  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2
3544  global CHA_A1, CHA_A2, CHB_A1, CHB_A2
3545  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
3546  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
3547  global VAets, VBets, Samples_Cycle, MulX, ETSDisp, ETSDir, ETSts, Fmin, FminE, eqivsamplerate
3548  global DivXEntry, FOffEntry, FminDisp, FOff, DivX, FMulXEntry, FBase, MaxETSrecord
3549  global cal, Two_X_Sample, ADC_Mux_Mode, Alternate_Sweep_Mode, Last_ADC_Mux_Mode
3550  global MeasGateLeft, MeasGateRight, MeasGateNum, MeasGateStatus
3551  global VBuffMA, VBuffMB, VBuffMC, VBuffMD, DualMuxMode
3552  global VmemoryMuxA, VmemoryMuxB, VmemoryMuxC, VmemoryMuxD
3553  global Show_CBA, Show_CBB, Show_CBC, Show_CBD
3554  global DCVMuxA, MinVMuxA, MaxVMuxA, MidVMuxA, PPVMuxA, SVMuxA
3555  global DCVMuxB, MinVMuxB, MaxVMuxB, MidVMuxB, PPVMuxB, SVMuxB
3556  global DCVMuxC, MinVMuxC, MaxVMuxC, MidVMuxC, PPVMuxC, SVMuxC
3557  global DCVMuxD, MinVMuxD, MaxVMuxD, MidVMuxD, PPVMuxD, SVMuxD
3558  global PIO_0, PIO_1, PIO_2, PIO_3, PIO_4, PIO_5, PIO_6, PIO_7
3559 
3560  # Starting acquisition
3561  DCVA0 = DCVB0 = DCIA0 = DCIB0= 0.0 # initalize measurment variable
3562  #
3563  NumSamples = 1 # int(SAMPLErate/TIMEdiv)
3564  if First_Slow_sweep == 0:
3565  BufferLen = TIMEdiv*12.0
3566  VBuffA = numpy.ones(BufferLen)
3567  VBuffB = numpy.ones(BufferLen)
3568  IBuffA = numpy.ones(BufferLen)
3569  IBuffB = numpy.ones(BufferLen)
3570  First_Slow_sweep = 1
3571  #
3572  if AWGScreenStatus.get() == 1: # don't try to start AWG is AWG screen is closed
3573  if AWGSync.get() > 0: # awg syn flag set so run in discontinuous mode
3574  if discontloop > 0:
3575  session.flush()
3576  else:
3577  discontloop = 1
3578  BAWGEnab()
3579  ADsignal1 = devx.get_samples(NumSamples) # get samples for both channel A and B
3580  # waite to finish then return to open termination
3581  devx.ctrl_transfer( 0x40, 0x51, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to open
3582  devx.ctrl_transfer( 0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
3583  devx.ctrl_transfer( 0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
3584  devx.ctrl_transfer( 0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
3585 
3586  else: # running in continuous mode
3587  if session.continuous:
3588  if MuxScreenStatus.get() > 0:
3589  devx.flush(-1, True)
3590  DummySamples = NumSamples*2
3591  if DummySamples < 10000:
3592  DummySamples = 10000
3593  ADsignal1 = devx.read(DummySamples, -1, True) # do dummy read if in analog mux mode
3594  ADsignal1 = devx.read(NumSamples, -1, True) # get samples for both channel A and B
3595  #
3596  else:
3597  ADsignal1 = devx.get_samples(NumSamples) # , True) # get samples for both channel A and B
3598 
3599  # get_samples returns a list of values for voltage [0] and current [1]
3600  for index in range(NumSamples): # calculate average
3601  DCVA0 += ADsignal1[index][0][0] # Sum for average CA voltage
3602  DCVB0 += ADsignal1[index][1][0] # Sum for average CB voltage
3603  DCIA0 += ADsignal1[index][0][1] # Sum for average CA current
3604  DCIB0 += ADsignal1[index][1][1] # Sum for average CB current
3605  DCVA0 = DCVA0/(NumSamples) # calculate V average
3606  DCVB0 = DCVB0/(NumSamples) # calculate V average
3607  DCVA0 = (DCVA0 - InOffA) * InGainA
3608  DCVB0 = (DCVB0 - InOffB) * InGainB
3609  DCIA0 = DCIA0/(NumSamples) # calculate I average
3610  DCIB0 = DCIB0/(NumSamples) # calculate I average
3611  DCIA0 = DCIA0 * 1000 # convert to mA
3612  DCIB0 = DCIB0 * 1000 # convert to mA
3613  DCIA0 = (DCIA0 - CurOffA) * CurGainA
3614  DCIB0 = (DCIB0 - CurOffB) * CurGainB
3615 # Shift in next new sample
3616  VBuffA = shift_buffer(VBuffA, -1, DCVA0)
3617  VBuffB = shift_buffer(VBuffB, -1, DCVB0)
3618  IBuffA = shift_buffer(IBuffA, -1, DCIA0)
3619  IBuffB = shift_buffer(IBuffB, -1, DCIB0)
3620 # Calculate measurement values
3621  DCV1 = numpy.mean(VBuffA)
3622  DCV2 = numpy.mean(VBuffB)
3623  DCI1 = numpy.mean(IBuffA)
3624  DCI2 = numpy.mean(IBuffB)
3625 # find min and max values
3626  MinV1 = numpy.amin(VBuffA)
3627  MaxV1 = numpy.amax(VBuffA)
3628  MinV2 = numpy.amin(VBuffB)
3629  MaxV2 = numpy.amax(VBuffB)
3630  MinI1 = numpy.amin(IBuffA)
3631  MaxI1 = numpy.amax(IBuffA)
3632  MinI2 = numpy.amin(IBuffB)
3633  MaxI2 = numpy.amax(IBuffB)
3634 # RMS value = square root of average of the data record squared
3635  SV1 = numpy.sqrt(numpy.mean(numpy.square(VBuffA)))
3636  SI1 = numpy.sqrt(numpy.mean(numpy.square(IBuffA)))
3637  SV2 = numpy.sqrt(numpy.mean(numpy.square(VBuffB)))
3638  SI2 = numpy.sqrt(numpy.mean(numpy.square(IBuffB)))
3639  SVA_B = numpy.sqrt(numpy.mean(numpy.square(VBuffA-VBuffB)))
3640 #
3641  if TimeDisp.get() > 0:
3642  UpdateTimeAll() # Update Data, trace and time screen
3643  if XYDisp.get() > 0 and XYScreenStatus.get() > 0:
3644  UpdateXYAll() # Update Data, trace and XY screen
3645  if MeasureStatus.get() > 0:
3647  if (RUNstatus.get() == 3) or (RUNstatus.get() == 4):
3648  if RUNstatus.get() == 3:
3649  RUNstatus.set(0)
3650  if RUNstatus.get() == 4:
3651  RUNstatus.set(1)
3652  if TimeDisp.get() > 0:
3654  if XYDisp.get() > 0 and XYScreenStatus.get() > 0:
3655  UpdateXYScreen()
3656  # update screens
3657 
3660  global ADsignal1, VBuffA, VBuffB, IBuffA, IBuffB, VFilterA, VFilterB
3661  global VmemoryA, VmemoryB, ImemoryA, ImemoryB
3662  global AWGSync, AWGAMode, AWGBMode, TMsb, HoldOff, HoldOffentry, HozPoss, HozPossentry
3663  global AWGAIOMode, AWGBIOMode, DecimateOption, DualMuxMode, MuxChan
3664  global TRACEresetTime, TRACEmodeTime, TRACEaverage, TRIGGERsample, TgInput, LShift
3665  global CHA, CHB, session, devx, discontloop, contloop, DeBugMode
3666  global TRACES, TRACESread, TRACEsize, TRIGGERsampleAltA, TRIGGERsampleAltB
3667  global RUNstatus, SingleShot, ManualTrigger, TimeDisp, XYDisp, FreqDisp
3668  global TIMEdiv1x, TIMEdiv, hldn, Is_Triggered, Trigger_LPF_length, LPFTrigger
3669  global SAMPLErate, SHOWsamples, SMPfft, MinSamples, MaxSamples, AWGSAMPLErate
3670  global TRACErefresh, AWGScreenStatus, XYScreenStatus, MeasureStatus
3671  global SCREENrefresh, DCrefresh, ETSrecord
3672  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
3673  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
3674  global SV1, SI1, SV2, SI2, SVA_B
3675  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
3676  global CHAVPosEntry, CHAIPosEntry, CHBVPosEntry, CHBIPosEntry
3677  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
3678  global InOffA, InGainA, InOffB, InGainB, CurOffA, CurOffB, CurGainA, CurGainB
3679  global DigFiltA, DigFiltB, DFiltACoef, DFiltBCoef, DigBuffA, DigBuffB
3680  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2, CHAI_RC_HP, CHBI_RC_HP
3681  global CHA_A1, CHA_A2, CHB_A1, CHB_A2
3682  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
3683  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
3684  global VAets, VBets, Samples_Cycle, MulX, ETSDisp, ETSDir, ETSts, Fmin, FminE, eqivsamplerate
3685  global DivXEntry, FOffEntry, FminDisp, FOff, DivX, FMulXEntry, FBase, MaxETSrecord
3686  global cal, Two_X_Sample, ADC_Mux_Mode, Alternate_Sweep_Mode, Last_ADC_Mux_Mode
3687  global MeasGateLeft, MeasGateRight, MeasGateNum, MeasGateStatus
3688  global VBuffMA, VBuffMB, VBuffMC, VBuffMD, DualMuxMode
3689  global VmemoryMuxA, VmemoryMuxB, VmemoryMuxC, VmemoryMuxD
3690  global Show_CBA, Show_CBB, Show_CBC, Show_CBD
3691  global DCVMuxA, MinVMuxA, MaxVMuxA, MidVMuxA, PPVMuxA, SVMuxA
3692  global DCVMuxB, MinVMuxB, MaxVMuxB, MidVMuxB, PPVMuxB, SVMuxB
3693  global DCVMuxC, MinVMuxC, MaxVMuxC, MidVMuxC, PPVMuxC, SVMuxC
3694  global DCVMuxD, MinVMuxD, MaxVMuxD, MidVMuxD, PPVMuxD, SVMuxD
3695  global PIO_0, PIO_1, PIO_2, PIO_3, PIO_4, PIO_5, PIO_6, PIO_7
3696 
3697  if TRACEmodeTime.get() == 0 and TRACEresetTime == False:
3698  TRACEresetTime = True # Clear the memory for averaging
3699  elif TRACEmodeTime.get() == 1:
3700  if TRACEresetTime == True:
3701  TRACEresetTime = False
3702  # Save previous trace in memory for average trace
3703  VmemoryA = VBuffA
3704  VmemoryB = VBuffB
3705  ImemoryA = IBuffA
3706  ImemoryB = IBuffB
3707 
3708  try:
3709  HoldOff = float(eval(HoldOffentry.get()))
3710  if HoldOff < 0:
3711  HoldOff = 0
3712  HoldOffentry.delete(0,END)
3713  HoldOffentry.insert(0, HoldOff)
3714  except:
3715  HoldOffentry.delete(0,END)
3716  HoldOffentry.insert(0, HoldOff)
3717 #
3718  try:
3719  HozPoss = float(eval(HozPossentry.get()))
3720  except:
3721  HozPossentry.delete(0,END)
3722  HozPossentry.insert(0, HozPoss)
3723 
3724  hldn = int(HoldOff * SAMPLErate/1000 )
3725  hozpos = int(HozPoss * SAMPLErate/1000 )
3726  if hozpos < 0:
3727  hozpos = 0
3728  twoscreens = int(SAMPLErate * 20.0 * TIMEdiv / 1000.0) # number of samples to acquire, 2 screen widths
3729  onescreen = int(twoscreens/2)
3730  if hldn+hozpos > MaxSamples-twoscreens:
3731  hldn = MaxSamples-twoscreens-hozpos
3732  HoldOffentry.delete(0,END)
3733  HoldOffentry.insert(0, hldn*1000/SAMPLErate)
3734  if ETSDisp.get() > 0:
3735  if TIMEdiv > 0.2:
3736  MaxETSrecord = int(AWGSAMPLErate * 10 * TIMEdiv / 1000.0)
3737  else:
3738  MaxETSrecord = int(AWGSAMPLErate * 20 * TIMEdiv / 1000.0)
3739  if (MaxETSrecord*100) > MaxSamples:
3740  MaxETSrecord = MaxSamples / 100
3741  try:
3742  DivX = float(eval(DivXEntry.get()))
3743  if DivX < 2:
3744  DivX = 2
3745  if DivX > 75:
3746  DivX = 75
3747  DivXEntry.delete(0,END)
3748  DivXEntry.insert(0, DivX)
3749  except:
3750  DivXEntry.delete(0,END)
3751  DivXEntry.insert(0, DivX)
3752  FOff = 25
3753  MulX = (DivX*SAMPLErate)/(100*FOff)
3754  while MulX > MaxETSrecord:
3755  FOff = FOff + 5
3756  MulX = (DivX*SAMPLErate)/(100*FOff)
3757  FOff = 0 - FOff
3758  if DeBugMode > 0:
3759  SRstring = "Rec Len Mul = " + str(MulX) + " samples"
3760  MulXEntry.config(text = SRstring) # change displayed value
3761  SRstring = "Offset = " + str(FOff) + " samples"
3762  FOffEntry.config(text = SRstring) # change displayed value
3763  SHOWsamples = int(MulX * 100)
3764  else:
3765  SHOWsamples = twoscreens + hldn + hozpos
3766  if SHOWsamples > MaxSamples: # or a Max of 100,000 samples
3767  SHOWsamples = MaxSamples
3768  if SHOWsamples < MinSamples: # or a Min of 1000 samples
3769  SHOWsamples = MinSamples
3770  if PhAScreenStatus.get() > 0:
3771  if SHOWsamples < SMPfft:
3772  SHOWsamples = SMPfft + hldn + hozpos
3773  if hozpos >= 0:
3774  TRIGGERsample = hldn
3775  else:
3776  TRIGGERsample = abs(hozpos)
3777  TRIGGERsample = TRIGGERsample + hozpos #
3778 # Starting acquisition
3779  if AWGScreenStatus.get() == 1: # don't try to start AWG is AWG screen is closed
3780  if AWGSync.get() > 0: # awg syn flag set so run in discontinuous mode
3781  if discontloop > 0:
3782  session.flush()
3783  else:
3784  discontloop = 1
3785  time.sleep(0.01)
3786  BAWGEnab()
3787  ADsignal1 = devx.get_samples(SHOWsamples) # get samples for both channel A and B
3788  # waite to finish then return to open termination
3789  devx.ctrl_transfer( 0x40, 0x51, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to open
3790  devx.ctrl_transfer( 0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
3791  devx.ctrl_transfer( 0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
3792  devx.ctrl_transfer( 0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
3793  else: # running in continuous mode
3794  if session.continuous:
3795  if MuxScreenStatus.get() > 0:
3796  devx.flush(-1, True)
3797  DummySamples = SHOWsamples*2
3798  if DummySamples < 20000:
3799  DummySamples = 20000
3800  ADsignal1 = devx.read(DummySamples, -1, True) # do dummy read if in analog mux mode
3801  ADsignal1 = devx.read(SHOWsamples, -1, True) # get samples for both channel A and B
3802  #
3803  else:
3804  ADsignal1 = devx.get_samples(SHOWsamples) # , True) # get samples for both channel A and B
3805  # waite to finish then return to open termination
3806  devx.ctrl_transfer( 0x40, 0x51, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to open
3807  devx.ctrl_transfer( 0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
3808  devx.ctrl_transfer( 0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
3809  devx.ctrl_transfer( 0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
3810  #
3811  if Alternate_Sweep_Mode.get() == 1 and Two_X_Sample.get() == 1:
3812  if ADC_Mux_Mode.get() == 0: # VA and VB
3813  VBuffA = [] # Clear the V Buff array for trace A
3814  VBuffB = [] # Clear the V Buff array for trace B
3815  elif ADC_Mux_Mode.get() == 1: # IA and IB
3816  IBuffA = [] # Clear the I Buff array for trace A
3817  IBuffB = [] # Clear the I Buff array for trace B
3818  elif ADC_Mux_Mode.get() == 4: # VA and IA
3819  VBuffA = [] # Clear the V Buff array for trace A
3820  IBuffA = [] # Clear the I Buff array for trace A
3821  elif ADC_Mux_Mode.get() == 5: # VB and IB
3822  VBuffB = [] # Clear the V Buff array for trace B
3823  IBuffB = [] # Clear the I Buff array for trace B
3824  else:
3825  VBuffA = [] # Clear the V Buff array for trace A
3826  IBuffA = [] # Clear the I Buff array for trace A
3827  VBuffB = [] # Clear the V Buff array for trace B
3828  IBuffB = [] # Clear the I Buff array for trace B
3829  increment = 1
3830  # SAMPLErate = 200000 #AWGSAMPLErate
3831  if SHOWsamples >= 20000 and DecimateOption.get() > 0:
3832  increment = 2
3833  SAMPLErate = int(AWGSAMPLErate/increment)
3834  if SHOWsamples >= 40000 and DecimateOption.get() > 0:
3835  increment = 4
3836  SAMPLErate = int(AWGSAMPLErate/increment)
3837  index = 0
3838  if SHOWsamples != len(ADsignal1):
3839  SHOWsamples = len(ADsignal1)
3840  while index < SHOWsamples: # build arrays and decimate if needed
3841  if Two_X_Sample.get() == 1 and ADC_Mux_Mode.get() < 6:
3842  if ADC_Mux_Mode.get() == 0: # VA and VB
3843  VBuffA.append(ADsignal1[index][0][0])
3844  VBuffA.append(ADsignal1[index][1][1])
3845  VBuffB.append(ADsignal1[index][0][1])
3846  VBuffB.append(ADsignal1[index][1][0])
3847  if Alternate_Sweep_Mode.get() == 0:
3848  IBuffA.append(0.0) # fill as a place holder
3849  IBuffA.append(0.0) # fill as a place holder
3850  IBuffB.append(0.0) # fill as a place holder
3851  IBuffB.append(0.0) # fill as a place holder
3852  elif ADC_Mux_Mode.get() == 1: # IA and IB
3853  IBuffA.append(ADsignal1[index][0][1])
3854  IBuffA.append(ADsignal1[index][1][0])
3855  IBuffB.append(ADsignal1[index][0][0])
3856  IBuffB.append(ADsignal1[index][1][1])
3857  if Alternate_Sweep_Mode.get() == 0:
3858  VBuffA.append(0.0) # fill as a place holder
3859  VBuffA.append(0.0) # fill as a place holder
3860  VBuffB.append(0.0) # fill as a place holder
3861  VBuffB.append(0.0) # fill as a place holder
3862  elif ADC_Mux_Mode.get() == 2: # VA and IB
3863  VBuffA.append((ADsignal1[index][0][1])/1024.0)
3864  VBuffA.append((ADsignal1[index][1][0])/1024.0)
3865  #
3866  IBuffB.append( ((ADsignal1[index][0][0])/4096.0)-0.5 )
3867  IBuffB.append( ((ADsignal1[index][1][1])/4096.0)-0.5 )
3868  #
3869  if Alternate_Sweep_Mode.get() == 0:
3870  VBuffB.append(0.0) # fill as a place holder
3871  VBuffB.append(0.0) # fill as a place holder
3872  IBuffA.append(0.0) # fill as a place holder
3873  IBuffA.append(0.0) # fill as a place holder
3874  elif ADC_Mux_Mode.get() == 3: # VB and IA
3875  VBuffB.append((ADsignal1[index][0][0])/1024.0)
3876  VBuffB.append((ADsignal1[index][1][1])/1024.0)
3877  #
3878  IBuffA.append( ((ADsignal1[index][0][1])/4096.0)-0.5 )
3879  IBuffA.append( ((ADsignal1[index][1][0])/4096.0)-0.5 )
3880  #
3881  if Alternate_Sweep_Mode.get() == 0:
3882  VBuffA.append(0.0) # fill as a place holder
3883  VBuffA.append(0.0) # fill as a place holder
3884  IBuffB.append(0.0) # fill as a place holder
3885  IBuffB.append(0.0) # fill as a place holder
3886  elif ADC_Mux_Mode.get() == 4: # VA and IA
3887  VBuffA.append(ADsignal1[index][0][0])
3888  VBuffA.append(ADsignal1[index][1][1])
3889  IBuffA.append(ADsignal1[index][0][1])
3890  IBuffA.append(ADsignal1[index][1][0])
3891  if Alternate_Sweep_Mode.get() == 0:
3892  VBuffB.append(0.0) # fill as a place holder
3893  VBuffB.append(0.0) # fill as a place holder
3894  IBuffB.append(0.0) # fill as a place holder
3895  IBuffB.append(0.0) # fill as a place holder
3896  elif ADC_Mux_Mode.get() == 5: # VB and IB
3897  VBuffB.append(ADsignal1[index][0][1])
3898  VBuffB.append(ADsignal1[index][1][0])
3899  IBuffB.append(ADsignal1[index][0][0])
3900  IBuffB.append(ADsignal1[index][1][1])
3901  if Alternate_Sweep_Mode.get() == 0:
3902  VBuffA.append(0.0) # fill as a place holder
3903  VBuffA.append(0.0) # fill as a place holder
3904  IBuffA.append(0.0) # fill as a place holder
3905  IBuffA.append(0.0) # fill as a place holder
3906  else:
3907  VBuffA.append(ADsignal1[index][0][0])
3908  IBuffA.append(ADsignal1[index][0][1])
3909  VBuffB.append(ADsignal1[index][1][0])
3910  IBuffB.append(ADsignal1[index][1][1])
3911  index = index + increment
3912 #
3913  SHOWsamples = len(VBuffA)
3914  if Alternate_Sweep_Mode.get() == 1 and Two_X_Sample.get() == 1:
3915  if ADC_Mux_Mode.get() == 0: # VA and VB
3916  VBuffA = numpy.array(VBuffA)
3917  VBuffB = numpy.array(VBuffB)
3918  VBuffA = (VBuffA - InOffA) * InGainA
3919  VBuffB = (VBuffB - InOffB) * InGainB
3920  ADC_Mux_Mode.set(1) # switch mode
3921  Last_ADC_Mux_Mode = 0
3922  elif ADC_Mux_Mode.get() == 1: # IA and IB
3923  IBuffA = numpy.array(IBuffA) * 1000 # convert to mA
3924  IBuffB = numpy.array(IBuffB) * 1000 # convert to mA
3925  IBuffA = (IBuffA - CurOffA) * CurGainA
3926  IBuffB = (IBuffB - CurOffB) * CurGainB
3927  ADC_Mux_Mode.set(Last_ADC_Mux_Mode) # switch mode
3928  elif ADC_Mux_Mode.get() == 4: # VA and IA
3929  VBuffA = numpy.array(VBuffA)
3930  IBuffA = numpy.array(IBuffA) * 1000 # convert to mA
3931  IBuffA = (IBuffA - CurOffA) * CurGainA
3932  VBuffA = (VBuffA - InOffA) * InGainA
3933  ADC_Mux_Mode.set(1) # switch mode
3934  Last_ADC_Mux_Mode = 4
3935  elif ADC_Mux_Mode.get() == 5: # VB and IB
3936  VBuffB = numpy.array(VBuffB)
3937  VBuffB = (VBuffB - InOffB) * InGainB
3938  IBuffB = numpy.array(IBuffB) * 1000 # convert to mA
3939  IBuffB = (IBuffB - CurOffB) * CurGainB
3940  ADC_Mux_Mode.set(1) # switch mode
3941  Last_ADC_Mux_Mode = 5
3942  SetADC_Mux()
3943  #
3944  else:
3945  VBuffA = numpy.array(VBuffA)
3946  VBuffB = numpy.array(VBuffB)
3947  IBuffA = numpy.array(IBuffA) * 1000 # convert to mA
3948  IBuffB = numpy.array(IBuffB) * 1000 # convert to mA
3949  VBuffA = (VBuffA - InOffA) * InGainA
3950  VBuffB = (VBuffB - InOffB) * InGainB
3951  IBuffA = (IBuffA - CurOffA) * CurGainA
3952  IBuffB = (IBuffB - CurOffB) * CurGainB
3953  TRACESread = 2
3954 # temp ETS calculations
3955  if ETSDisp.get() > 0:
3956  baseFreq = SAMPLErate/DivX
3957  #
3958  VAets = []
3959  VBets = []
3960  IAets = []
3961  IBets = []
3962  index = 0
3963  try:
3964  FMul = float(eval(FminEntry.get()))
3965  if FMul < 1:
3966  FMul = 1
3967  FMulXEntry.delete(0,END)
3968  FMulXEntry.insert(0, int(FMul))
3969  if FMul > 75:
3970  FMul = 75
3971  FMulXEntry.delete(0,END)
3972  FMulXEntry.insert(0, int(FMul))
3973  except:
3974  FMulXEntry.delete(0,END)
3975  FMulXEntry.insert(0, int(FMul))
3976  Fmin = baseFreq * FMul
3977  FminE = float(SAMPLErate + FOff)
3978  Samples_Cycle = SAMPLErate/FminE # calculate number of samples per cycle
3979  # length of record set my Multiplcation factor
3980  tot_cycles = int((MulX*100)/Samples_Cycle)
3981  tot_cycles = tot_cycles + 0.1 # number of cycles in record length
3982  ETSrecord = int((MulX*50)/Samples_Cycle)
3983  if tot_cycles > SHOWsamples:
3984  tot_cycles = SHOWsamples-1
3985  # now sort RT data into ETS sample buffers
3986  while index < SHOWsamples:
3987  Ipart, Dpart = divmod( index*Samples_Cycle, 1)
3988  IndexValue = int(tot_cycles * Dpart)
3989  if IndexValue > SHOWsamples:
3990  IndexValue = SHOWsamples-1
3991  if IndexValue > tot_cycles:
3992  IndexValue = tot_cycles
3993  if ETSDir.get() == 0:
3994  VAets.append(VBuffA[IndexValue])
3995  VBets.append(VBuffB[IndexValue])
3996  IAets.append(IBuffA[IndexValue])
3997  IBets.append(IBuffB[IndexValue])
3998  else:
3999  VAets.append(VBuffA[tot_cycles-IndexValue])
4000  VBets.append(VBuffB[tot_cycles-IndexValue])
4001  IAets.append(IBuffA[tot_cycles-IndexValue])
4002  IBets.append(IBuffB[tot_cycles-IndexValue])
4003  index = index + 1
4004  SHiftFact = 5
4005  TimeCorrection = int(SHiftFact ) # correct for 5 uSec CHB time offset
4006  VBuffA = VAets
4007  VBuffB = VBets
4008  IBuffA = IAets
4009  IBuffB = IBets
4010  VBuffA = numpy.array(VBuffA)
4011  VBuffB = numpy.array(VBuffB)
4012  IBuffA = numpy.array(IBuffA)
4013  IBuffB = numpy.array(IBuffB)
4014  try:
4015  TimeCorrection = int(float(eval(ETSts.get())) * TimeCorrection)
4016  except:
4017  TimeCorrection = SHiftFact
4018  if ETSDir.get() == 0:
4019  VBuffB = numpy.roll(VBuffB, TimeCorrection)
4020  IBuffB = numpy.roll(IBuffB, TimeCorrection)
4021  else:
4022  VBuffB = numpy.roll(VBuffB, TimeCorrection)
4023  IBuffB = numpy.roll(IBuffB, TimeCorrection)
4024  SHOWsamples = twoscreens + hldn + hozpos
4025 # Check if Input channel RC high pass compensation checked
4026  if CHA_RC_HP.get() == 1 or CHAI_RC_HP.get() == 1:
4027  try:
4028  TC1A = float(cha_TC1Entry.get())
4029  if TC1A < 0:
4030  TC1A = 0
4031  cha_TC1Entry.delete(0,END)
4032  cha_TC1Entry.insert(0, TC1A)
4033  except:
4034  TC1A = CHA_TC1.get()
4035  try:
4036  TC2A = float(cha_TC2Entry.get())
4037  if TC2A < 0:
4038  TC2A = 0
4039  cha_TC2Entry.delete(0,END)
4040  cha_TC2Entry.insert(0, TC2A)
4041  except:
4042  TC2A = CHA_TC2.get()
4043  #
4044  try:
4045  Gain1A = float(cha_A1Entry.get())
4046  except:
4047  Gain1A = CHA_A1.get()
4048  try:
4049  Gain2A = float(cha_A2Entry.get())
4050  except:
4051  Gain2A = CHA_A2.get()
4052  #
4053  if len(VBuffA) > 4:
4054  VBuffA = Digital_RC_High_Pass( VBuffA, TC1A, Gain1A )
4055  VBuffA = Digital_RC_High_Pass( VBuffA, TC2A, Gain2A )
4056  if CHAI_RC_HP.get() == 1:
4057  IBuffA = Digital_RC_High_Pass( IBuffA, TC1A, Gain1A )
4058  #IBuffA = Digital_RC_High_Pass( IBuffA, TC2A, Gain2A )
4059  if CHB_RC_HP.get() == 1 or CHBI_RC_HP.get() == 1:
4060  try:
4061  TC1B = float(chb_TC1Entry.get())
4062  if TC1B < 0:
4063  TC1B = 0
4064  chb_TC1Entry.delete(0, END)
4065  chb_TC1Entry.insert(0, TC1B)
4066  except:
4067  TC1B = CHB_TC1.get()
4068  try:
4069  TC2B = float(chb_TC2Entry.get())
4070  if TC2B < 0:
4071  TC2B = 0
4072  chb_TC2Entry.delete(0, END)
4073  chb_TC2Entry.insert(0, TC2B)
4074  except:
4075  TC2B = CHB_TC2.get()
4076  #
4077  try:
4078  Gain1B = float(chb_A1Entry.get())
4079  except:
4080  Gain1B = CHB_A1.get()
4081  try:
4082  Gain2B = float(chb_A2Entry.get())
4083  except:
4084  Gain2B = CHB_A2.get()
4085  #
4086  if len(VBuffB) > 4:
4087  VBuffB = Digital_RC_High_Pass( VBuffB, TC1B, Gain1B )
4088  VBuffB = Digital_RC_High_Pass( VBuffB, TC2B, Gain2B )
4089  if CHBI_RC_HP.get() == 1:
4090  IBuffB = Digital_RC_High_Pass( IBuffB, TC1B, Gain1B )
4091  #IBuffB = Digital_RC_High_Pass( IBuffB, TC2B, Gain2B )
4092 # check if digital filter box checked
4093  if DigFiltA.get() == 1:
4094  if len(DFiltACoef) > 1:
4095  VBuffA = numpy.convolve(VBuffA, DFiltACoef)
4096  if DigFiltB.get() == 1:
4097  if len(DFiltBCoef) > 1:
4098  VBuffB = numpy.convolve(VBuffB, DFiltBCoef)
4099 # Find trigger sample point if necessary
4100  LShift = 0
4101  if TgInput.get() == 1:
4102  FindTriggerSample(VBuffA)
4103  if TgInput.get() == 2:
4104  FindTriggerSample(IBuffA)
4105  if TgInput.get() == 3:
4106  FindTriggerSample(VBuffB)
4107  if TgInput.get() == 4:
4108  FindTriggerSample(IBuffB)
4109  if TgInput.get() == 5:
4110  FindTriggerSample(VBuffA)
4111  if Is_Triggered == 0: # Trigger event not found for VBuffA so Try VBuffB
4112  FindTriggerSample(VBuffB)
4113  if TgInput.get() == 6:
4114  FindTriggerSample(VBuffA)
4115  TRIGGERsampleAltA = TRIGGERsample
4116  FindTriggerSample(VBuffB)
4117  TRIGGERsampleAltB = TRIGGERsample
4118  if TRACEmodeTime.get() == 1 and TRACEresetTime == False:
4119  # Average mode 1, add difference / TRACEaverage to array
4120  if TgInput.get() > 0: # if triggering left shift all arrays such that trigger point is at index 0
4121  LShift = 0 - TRIGGERsample
4122  if TgInput.get() == 6:
4123  LShift = 0 - TRIGGERsampleA
4124  VBuffA = numpy.roll(VBuffA, LShift)
4125  IBuffA = numpy.roll(IBuffA, LShift)
4126  LShift = 0 - TRIGGERsampleB
4127  VBuffB = numpy.roll(VBuffB, LShift)
4128  IBuffB = numpy.roll(IBuffB, LShift)
4129  else:
4130  VBuffA = numpy.roll(VBuffA, LShift)
4131  VBuffB = numpy.roll(VBuffB, LShift)
4132  IBuffA = numpy.roll(IBuffA, LShift)
4133  IBuffB = numpy.roll(IBuffB, LShift)
4134  TRIGGERsample = hozpos # set trigger sample to index 0 offset by horizontal position
4135  try:
4136  if DualMuxMode.get() == 0 and MuxScreenStatus.get() == 0: # average A voltage data only if not in dual split I/O Mux Mode
4137  VBuffA = VmemoryA + (VBuffA - VmemoryA) / TRACEaverage.get()
4138  IBuffA = ImemoryA + (IBuffA - ImemoryA) / TRACEaverage.get()
4139  if MuxScreenStatus.get() == 0: # average B voltage data only if not in Mux Mode
4140  VBuffB = VmemoryB + (VBuffB - VmemoryB) / TRACEaverage.get()
4141  IBuffB = ImemoryB + (IBuffB - ImemoryB) / TRACEaverage.get()
4142  except:
4143  # buffer size mismatch so reset memory buffers
4144  VmemoryA = VBuffA
4145  if MuxScreenStatus.get() == 0: # average B voltage data only if not in Mux Mode
4146  VmemoryB = VBuffB
4147  ImemoryA = IBuffA
4148  ImemoryB = IBuffB
4149  if TgInput.get() == 1 or TgInput.get() == 5 or TgInput.get() == 6:
4150  ReInterploateTrigger(VBuffA)
4151  if TgInput.get() == 2:
4152  ReInterploateTrigger(IBuffA)
4153  if TgInput.get() == 3 or TgInput.get() == 5 or TgInput.get() == 6:
4154  ReInterploateTrigger(VBuffB)
4155  if TgInput.get() == 4:
4156  ReInterploateTrigger(IBuffB)
4157 # DC value = average of the data record
4158  if CHA_RC_HP.get() == 1 or CHB_RC_HP.get() == 1:
4159  Endsample = hldn+onescreen # average over only one screen's worth of samples
4160  else:
4161  Endsample = SHOWsamples - 10 # average over all samples
4162  if MeasGateStatus.get() == 1:
4163  if (MeasGateRight-MeasGateLeft) > 0:
4164  hldn = int(MeasGateLeft * SAMPLErate/1000) + TRIGGERsample
4165  Endsample = int(MeasGateRight * SAMPLErate/1000) + TRIGGERsample
4166  if Endsample <= hldn:
4167  Endsample = hldn + 2
4168  DCV1 = numpy.mean(VBuffA[hldn:Endsample])
4169  DCV2 = numpy.mean(VBuffB[hldn:Endsample])
4170  # convert current values to mA
4171  DCI1 = numpy.mean(IBuffA[hldn:Endsample])
4172  DCI2 = numpy.mean(IBuffB[hldn:Endsample])
4173 # find min and max values
4174  MinV1 = numpy.amin(VBuffA[hldn:Endsample])
4175  MaxV1 = numpy.amax(VBuffA[hldn:Endsample])
4176  MinV2 = numpy.amin(VBuffB[hldn:Endsample])
4177  MaxV2 = numpy.amax(VBuffB[hldn:Endsample])
4178  MinI1 = numpy.amin(IBuffA[hldn:Endsample])
4179  MaxI1 = numpy.amax(IBuffA[hldn:Endsample])
4180  MinI2 = numpy.amin(IBuffB[hldn:Endsample])
4181  MaxI2 = numpy.amax(IBuffB[hldn:Endsample])
4182 # RMS value = square root of average of the data record squared
4183  SV1 = numpy.sqrt(numpy.mean(numpy.square(VBuffA[hldn:Endsample])))
4184  SI1 = numpy.sqrt(numpy.mean(numpy.square(IBuffA[hldn:Endsample])))
4185  SV2 = numpy.sqrt(numpy.mean(numpy.square(VBuffB[hldn:Endsample])))
4186  SI2 = numpy.sqrt(numpy.mean(numpy.square(IBuffB[hldn:Endsample])))
4187  SVA_B = numpy.sqrt(numpy.mean(numpy.square(VBuffA[hldn:Endsample]-VBuffB[hldn:Endsample])))
4188 # Transfer to mux buffers as necessary
4189  if TgInput.get() > 0 and MuxChan > -1 and TRACEmodeTime.get() != 1:
4190  # if triggering left shift all arrays such that trigger point is at index 0
4191  LShift = 0 - TRIGGERsample
4192  VBuffA = numpy.roll(VBuffA, LShift)
4193  VBuffB = numpy.roll(VBuffB, LShift)
4194  IBuffA = numpy.roll(IBuffA, LShift)
4195  IBuffB = numpy.roll(IBuffB, LShift)
4196  TRIGGERsample = hozpos # set trigger sample to index 0 offset by horizontal position
4197  if MuxChan > -1:
4198  Dval0 = devx.ctrl_transfer( 0xc0, 0x91, PIO_4, 0, 0, 1, 100)
4199  Dval1 = devx.ctrl_transfer( 0xc0, 0x91, PIO_5, 0, 0, 1, 100)
4200  if Show_CBA.get() == 1 and Dval0[0] == 0 and Dval1[0] == 0:
4201  DCVMuxA = DCV2
4202  MinVMuxA = MinV2
4203  MaxVMuxA = MaxV2
4204  MidVMuxA = (MaxV2+MinV2)/2.0
4205  PPVMuxA = MaxV2-MinV2
4206  SVMuxA = SV2
4207  VBuffMA = VBuffB
4208  if Show_CBB.get() == 1 and Dval0[0] == 1 and Dval1[0] == 0:
4209  DCVMuxB = DCV2
4210  MinVMuxB = MinV2
4211  MaxVMuxB = MaxV2
4212  MidVMuxB = (MaxV2+MinV2)/2.0
4213  PPVMuxB = MaxV2-MinV2
4214  SVMuxB = SV2
4215  VBuffMB = VBuffB
4216  if Show_CBC.get() == 1 and Dval0[0] == 0 and Dval1[0] == 1:
4217  if DualMuxMode.get() == 1:
4218  DCVMuxC = DCV1
4219  MinVMuxC = MinV1
4220  MaxVMuxC = MaxV1
4221  MidVMuxC = (MaxV1+MinV1)/2.0
4222  PPVMuxC = MaxV1-MinV1
4223  SVMuxC = SV1
4224  VBuffMC = VBuffA
4225  else:
4226  DCVMuxC = DCV2
4227  MinVMuxC = MinV2
4228  MaxVMuxC = MaxV2
4229  MidVMuxC = (MaxV2+MinV2)/2.0
4230  PPVMuxC = MaxV2-MinV2
4231  SVMuxC = SV2
4232  VBuffMC = VBuffB
4233  if Show_CBD.get() == 1 and Dval0[0] == 1 and Dval1[0] == 1:
4234  if DualMuxMode.get() == 1:
4235  DCVMuxD = DCV1
4236  MinVMuxD = MinV1
4237  MaxVMuxD = MaxV1
4238  MidVMuxD = (MaxV1+MinV1)/2.0
4239  PPVMuxD = MaxV1-MinV1
4240  SVMuxD = SV1
4241  VBuffMD = VBuffA
4242  else:
4243  DCVMuxD = DCV2
4244  MinVMuxD = MinV2
4245  MaxVMuxD = MaxV2
4246  MidVMuxD = (MaxV2+MinV2)/2.0
4247  PPVMuxD = MaxV2-MinV2
4248  SVMuxD = SV2
4249  VBuffMD = VBuffB
4250 #
4251  if TimeDisp.get() > 0:
4252  UpdateTimeAll() # Update Data, trace and time screen
4253  if XYDisp.get() > 0 and XYScreenStatus.get() > 0:
4254  UpdateXYAll() # Update Data, trace and XY screen
4255  if SingleShot.get() > 0 and Is_Triggered == 1: # Singel Shot trigger is on
4256  BStop() #
4257  SingleShot.set(0)
4258  if ManualTrigger.get() == 1: # Manual trigger is on
4259  BStop() #
4260  if MeasureStatus.get() > 0:
4262  if (RUNstatus.get() == 3) or (RUNstatus.get() == 4):
4263  if RUNstatus.get() == 3:
4264  RUNstatus.set(0)
4265  if RUNstatus.get() == 4:
4266  RUNstatus.set(1)
4267  if TimeDisp.get() > 0:
4269  if XYDisp.get() > 0 and XYScreenStatus.get() > 0:
4270  UpdateXYScreen()
4271  # update screens
4272 #
4273 # Function to calculate relative phase angle between two sine waves of the same frequency
4274 # Removes any DC content
4276  global DCV1, DCV2, VBuffA, VBuffB
4277 
4278  sum1 = 0.0
4279  sum2 = 0.0
4280  sum12 = 0.0
4281  i = 0
4282  n = len(VBuffA)
4283  while i < n:
4284  sum1 += (VBuffA[i]-DCV1)*(VBuffA[i]-DCV1)
4285  sum2 += (VBuffB[i]-DCV2)*(VBuffB[i]-DCV2)
4286  sum12 += (VBuffA[i]-DCV1)*(VBuffB[i]-DCV2)
4287  i += 1
4288  return math.acos(sum12/math.sqrt(sum1*sum2))*180.0/numpy.pi
4289 #
4290 # High Pass y[n] = alpha * (y[n-1] + x[n] - x[n-1])
4291 # Low Pass y[n] = y[n-1] + (alpha * ((x[n] - x[n-1]))
4292 # All Pass y[n] = alpha * y[n-1] - alpha * (x[n] + x[n-1])
4293 # All Pass y[n] = alpha * (y[n-1] - x[n] - x[n-1])
4294 
4295 
4297 def Digital_RC_High_Pass( InBuff, TC1, Gain ):
4298  global SAMPLErate
4299 
4300  OutBuff = []
4301  n = len(InBuff)
4302  Delta = 1.0/SAMPLErate
4303  TC = TC1 * 1.0E-6
4304  Alpha = TC / (TC + Delta)
4305  OutBuff.append(InBuff[1]-InBuff[0]) # set inital sample to derivative (difference of first two samples)
4306  i = 1
4307  while i < n:
4308  OutBuff.append( Alpha * (OutBuff[i-1] + InBuff[i] - InBuff[i-1]) )
4309  i += 1
4310  OutBuff = numpy.array(OutBuff)
4311  OutBuff = InBuff + (OutBuff * Gain)
4312  return OutBuff
4313 
4315 def Digital_RC_Low_Pass( InBuff, TC1, Gain ): # TC1 is in micro seconds
4316  global SAMPLErate
4317 
4318  OutBuff = []
4319  n = len(InBuff)
4320  Delta = 1.0/SAMPLErate
4321  TC = TC1 * 1.0E-6
4322  Alpha = Delta / (TC + Delta)
4323  i = 1
4324  OutBuff.append(Alpha*InBuff[0])
4325  while i < n:
4326  OutBuff.append( OutBuff[i-1] + (Alpha * (InBuff[i] - InBuff[i-1])) )
4327  i += 1
4328  OutBuff = numpy.array(OutBuff)
4329  OutBuff = (OutBuff * Gain)
4330  return OutBuff
4331 
4335 def shift_buffer(arr, num, fill_value=numpy.nan):
4336  result = numpy.empty_like(arr)
4337  if num > 0:
4338  result[:num] = fill_value
4339  result[num:] = arr[:-num]
4340  elif num < 0:
4341  result[num:] = fill_value
4342  result[:num] = arr[-num:]
4343  else:
4344  result[:] = arr
4345  return result
4346 
4347 
4350  global ADsignal1, FFTBuffA, FFTBuffB, SMPfft
4351  global AWGSync, AWGAMode, AWGBMode, AWGAShape, AWGAIOMode, AWGBIOMode
4352  global AWGAFreqvalue, AWGBFreqvalue, FStepSync, FSweepSync
4353  global NSteps, LoopNum, FSweepMode, FStep, FBins
4354  global StartFreqEntry, StopFreqEntry, HoldOffentry
4355  global session, CHA, CHB, devx, MaxSamples, discontloop
4356  global RUNstatus, SingleShotSA, FSweepCont, Two_X_Sample, ADC_Mux_Mode
4357  global AWGSAMPLErate, IAScreenStatus, SpectrumScreenStatus, BodeScreenStatus
4358  global NiCScreenStatus, NiCDisp, NqPScreenStatus, NqPDisp
4359  global OverRangeFlagA, OverRangeFlagB, BodeDisp, FreqDisp, IADisp
4360  global DCA, DCB, InOffA, InGainA, InOffB, InGainB
4361  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
4362  global DigFiltA, DFiltACoef, DigFiltB, DFiltBCoef
4363  global BDSweepFile, FileSweepFreq, FileSweepAmpl
4364  global PIO_0, PIO_1, PIO_2, PIO_3
4365  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2
4366  global CHA_A1, CHA_A2, CHB_A1, CHB_A2
4367  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
4368  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
4369  global Reset_Freq, AWGAFreqEntry, AWGBFreqEntry, MinigenFout, IASource, IA_Ext_Conf
4370 
4371  HalfSAMPLErate = SAMPLErate/2
4372  # Do input divider Calibration CH1VGain, CH2VGain, CH1VOffset, CH2VOffset
4373  try:
4374  InOffA = float(eval(CHAVOffsetEntry.get()))
4375  except:
4376  CHAVOffsetEntry.delete(0,END)
4377  CHAVOffsetEntry.insert(0, InOffA)
4378  try:
4379  InGainA = float(eval(CHAVGainEntry.get()))
4380  except:
4381  CHAVGainEntry.delete(0,END)
4382  CHAVGainEntry.insert(0, InGainA)
4383  try:
4384  InOffB = float(eval(CHBVOffsetEntry.get()))
4385  except:
4386  CHBVOffsetEntry.delete(0,END)
4387  CHBVOffsetEntry.insert(0, InOffB)
4388  try:
4389  InGainB = float(eval(CHBVGainEntry.get()))
4390  except:
4391  CHBVGainEntry.delete(0,END)
4392  CHBVGainEntry.insert(0, InGainB)
4393  try:
4394  HoldOff = float(eval(HoldOffentry.get()))
4395  if HoldOff < 0:
4396  HoldOff = 0
4397  HoldOffentry.delete(0,END)
4398  HoldOffentry.insert(0, HoldOff)
4399  except:
4400  HoldOffentry.delete(0,END)
4401  HoldOffentry.insert(0, HoldOff)
4402  #
4403  INITIALIZEstart()
4404  # Starting acquisition This is a HACK to get around non-continous AWG mode!
4405  # restart AWGs if indicated
4406  if BodeDisp.get() == 0: # make new noise waveforms each sweep
4407  if AWGAShape.get() == 7 and AWGAMode.get() == 0:
4408  AWGAMakeUUNoise()
4409  elif AWGAShape.get() == 8 and AWGAMode.get() == 0:
4410  AWGAMakeUGNoise()
4411  elif AWGBShape.get() == 7 and AWGBMode.get() == 0:
4412  AWGBMakeUUNoise()
4413  elif AWGBShape.get() == 8 and AWGBMode.get() == 0:
4414  AWGBMakeUGNoise()
4415  if FSweepMode.get() > 0 and BodeDisp.get() > 0: # Run Sweep Gen only if sleceted and Bode display is active
4416  if BDSweepFile.get() == 0:
4417  if LoopNum.get() <= len(FStep):
4418  FregPoint = FBins[int(FStep[LoopNum.get()-1])] # look up next frequency from list of bins
4419  else:
4420  FregPoint = FBins[FStep[0]]
4421  else:
4422  if LoopNum.get() <= len(FileSweepFreq): #
4423  FreqIndex = int((FileSweepFreq[LoopNum.get()-1]*16384)/HalfSAMPLErate)
4424  FregPoint = FBins[FreqIndex] # look up next frequency from list of bins
4425  VRMSAmpl = 10**(FileSweepAmpl[LoopNum.get()-1]/20) # convert to V RMS 0 dBV = 1V RMS
4426  else:
4427  FregPoint = FBins[FileSweepFreq[0]]
4428  VRMSAmpl = 10**(FileSweepAmpl[0]/20) # convert to V RMS 0 dBV = 1V RMS
4429  VMax = 2.5 + (1.414*VRMSAmpl) # calculate positive peak assuming sine wave
4430  VMin = 2.5 - (1.414*VRMSAmpl) # calculate negative peak assuming sine wave
4431  if FSweepMode.get() == 1: # set new CH-A amplitude
4432  AWGAAmplEntry.delete(0,END)
4433  AWGAAmplEntry.insert(4, VMin)
4434  AWGAOffsetEntry.delete(0,END)
4435  AWGAOffsetEntry.insert(4, VMax)
4436  if FSweepMode.get() == 2: # set new CH-B amplitude
4437  AWGBAmplEntry.delete(0,END)
4438  AWGBAmplEntry.insert(4, VMin)
4439  AWGBOffsetEntry.delete(0,END)
4440  AWGBOffsetEntry.insert(4, VMax)
4441  if FSweepMode.get() == 1: # set new CH-A frequency
4442  AWGAFreqEntry.delete(0,END)
4443  AWGAFreqEntry.insert(4, FregPoint)
4445  if FSweepMode.get() == 2: # set new CH-B frequency
4446  AWGBFreqEntry.delete(0,END)
4447  AWGBFreqEntry.insert(4, FregPoint)
4449  if FSweepMode.get() == 3: # set new MiniGen frequency
4450  MinigenFout.delete(0,END)
4451  MinigenFout.insert(4, FregPoint)
4452  BSendMG()
4453  if AWGSync.get() > 0:
4454  if IAScreenStatus.get() > 0 and IASource.get() == 0:
4455  if Two_X_Sample.get() == 1:
4456  AWGBIOMode.set(1)
4457  AWGBMode.set(0)
4458  else:
4459  AWGBMode.set(2)
4460  # BAWGEnab()
4461 #
4462  hldn = int(HoldOff * 100 )
4463  if hldn > MaxSamples-SMPfft:
4464  hldn = MaxSamples-SMPfft
4465  HoldOffentry.delete(0,END)
4466  HoldOffentry.insert(0, hldn/100)
4467  if hldn < 128:
4468  hldn = 128
4469  SHOWsamples = SMPfft + hldn # get holf off extra samples
4470  if BodeDisp.get() > 0: # check if doing Bode Plot
4471  if FStepSync.get() == 1: # output low - high - low pulse on PIO-0
4472  devx.ctrl_transfer( 0x40, 0x50, PIO_0, 0, 0, 0, 100)
4473  devx.ctrl_transfer( 0x40, 0x51, PIO_0, 0, 0, 0, 100)
4474  devx.ctrl_transfer( 0x40, 0x50, PIO_0, 0, 0, 0, 100)
4475  if FStepSync.get() == 2: # output high - low - high pulse on PIO-0
4476  devx.ctrl_transfer( 0x40, 0x51, PIO_0, 0, 0, 0, 100)
4477  devx.ctrl_transfer( 0x40, 0x50, PIO_0, 0, 0, 0, 100)
4478  devx.ctrl_transfer( 0x40, 0x51, PIO_0, 0, 0, 0, 100)
4479  if LoopNum.get() == 1 and FSweepSync.get() == 1: # output low - high - low pulse on PIO-1
4480  devx.ctrl_transfer( 0x40, 0x50, PIO_1, 0, 0, 0, 100)
4481  devx.ctrl_transfer( 0x40, 0x51, PIO_1, 0, 0, 0, 100)
4482  devx.ctrl_transfer( 0x40, 0x50, PIO_1, 0, 0, 0, 100)
4483  if LoopNum.get() == 1 and FSweepSync.get() == 2: # output high - low - high pulse on PIO-1
4484  devx.ctrl_transfer( 0x40, 0x51, PIO_1, 0, 0, 0, 100)
4485  devx.ctrl_transfer( 0x40, 0x50, PIO_1, 0, 0, 0, 100)
4486  devx.ctrl_transfer( 0x40, 0x51, PIO_1, 0, 0, 0, 100)
4487  if AWGScreenStatus.get() == 1: # don't try to start AWG is AWG screen is closed
4488  if IAScreenStatus.get() > 0 and IASource.get() == 0:
4489  if Two_X_Sample.get() == 1:
4490  AWGBIOMode.set(1)
4491  AWGBMode.set(0)
4492  else:
4493  AWGBMode.set(2)
4494  if AWGSync.get() > 0: # awg syn flag set so run in discontinuous mode
4495  if discontloop > 0:
4496  session.flush()
4497  else:
4498  discontloop = 1
4499  BAWGEnab()
4500  try:
4501  ADsignal1 = devx.get_samples(SHOWsamples) # get samples for both channel A and B
4502  except:
4503  donothing()
4504  # waite to finish then return to open termination
4505  devx.ctrl_transfer( 0x40, 0x51, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to open
4506  devx.ctrl_transfer( 0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
4507  devx.ctrl_transfer( 0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
4508  devx.ctrl_transfer( 0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
4509  else: # running in continuous mode
4510  ADsignal1 = devx.read(SHOWsamples, -1, True) # get samples for both channel A and B
4511  #
4512  else:
4513  if session.continuous:
4514  ADsignal1 = devx.read(SHOWsamples, -1, True)
4515  # ADsignal1 = devx.get_samples(SHOWsamples) # get samples for both channel A and B
4516  devx.ctrl_transfer( 0x40, 0x51, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to open
4517  devx.ctrl_transfer( 0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
4518  devx.ctrl_transfer( 0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
4519  devx.ctrl_transfer( 0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
4520  FFTBuffA = [] # Clear the FFTBuff array for trace A
4521  FFTBuffB = [] # Clear the FFTBuff array for trace B
4522  OverRangeFlagA = OverRangeFlagB = 0 # Clear over range flags
4523  index = hldn # skip first hldn samples
4524  if SHOWsamples != len(ADsignal1):
4525  SHOWsamples = len(ADsignal1)
4526  while index < SHOWsamples:
4527  if Two_X_Sample.get() == 1:
4528  if ADC_Mux_Mode.get() == 0: # VA and VB
4529  FFTBuffA.append(ADsignal1[index][0][0])
4530  FFTBuffA.append(ADsignal1[index][1][1])
4531  FFTBuffB.append(ADsignal1[index][0][1])
4532  FFTBuffB.append(ADsignal1[index][1][0])
4533  else:
4534  VAdata = ADsignal1[index][0][0]
4535  FFTBuffA.append(VAdata)
4536  VBdata = ADsignal1[index][1][0]
4537  FFTBuffB.append(VBdata)
4538  if VAdata > 5.0 or VAdata < 0.0:
4539  OverRangeFlagA = 1
4540 
4541  if VBdata > 5.0 or VBdata < 0.0:
4542  OverRangeFlagB = 1
4543  index = index + 1
4544 
4545  FFTBuffA = numpy.array(FFTBuffA)
4546  FFTBuffB = numpy.array(FFTBuffB)
4547  FFTBuffA = (FFTBuffA - InOffA) * InGainA
4548  FFTBuffB = (FFTBuffB - InOffB) * InGainB
4549  DCA = numpy.average(FFTBuffA)
4550  DCB = numpy.average(FFTBuffB)
4551  if CutDC.get() == 1:
4552  FFTBuffA = FFTBuffA - DCA
4553  FFTBuffB = FFTBuffB - DCB
4554 # Check if Input channel RC high pass compensation checked cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
4555  if CHA_RC_HP.get() == 1:
4556  try:
4557  TC1A = float(cha_TC1Entry.get())
4558  if TC1A < 0:
4559  TC1A = 0
4560  cha_TC1Entry.delete(0,END)
4561  cha_TC1Entry.insert(0, TC1A)
4562  except:
4563  TC1A = CHA_TC1.get()
4564  try:
4565  TC2A = float(cha_TC2Entry.get())
4566  if TC2A < 0:
4567  TC2A = 0
4568  cha_TC2Entry.delete(0,END)
4569  cha_TC2Entry.insert(0, TC2A)
4570  except:
4571  TC2A = CHA_TC2.get()
4572  #
4573  try:
4574  Gain1A = float(cha_A1Entry.get())
4575  except:
4576  Gain1A = CHA_A1.get()
4577  try:
4578  Gain2A = float(cha_A2Entry.get())
4579  except:
4580  Gain2A = CHA_A2.get()
4581  #
4582  FFTBuffA = Digital_RC_High_Pass( FFTBuffA, TC1A, Gain1A )
4583  FFTBuffA = Digital_RC_High_Pass( FFTBuffA, TC2A, Gain2A )
4584  if CHB_RC_HP.get() == 1:
4585  try:
4586  TC1B = float(chb_TC1Entry.get())
4587  if TC1B < 0:
4588  TC1B = 0
4589  chb_TC1Entry.delete(0, END)
4590  chb_TC1Entry.insert(0, TC1B)
4591  except:
4592  TC1B = CHB_TC1.get()
4593  try:
4594  TC2B = float(chb_TC2Entry.get())
4595  if TC2B < 0:
4596  TC2B = 0
4597  chb_TC2Entry.delete(0, END)
4598  chb_TC2Entry.insert(0, TC2B)
4599  except:
4600  TC2B = CHB_TC2.get()
4601  #
4602  try:
4603  Gain1B = float(chb_A1Entry.get())
4604  except:
4605  Gain1B = CHB_A1.get()
4606  try:
4607  Gain2B = float(chb_A2Entry.get())
4608  except:
4609  Gain2B = CHB_A2.get()
4610  #
4611  FFTBuffB = Digital_RC_High_Pass( FFTBuffB, TC1B, Gain1B )
4612  FFTBuffB = Digital_RC_High_Pass( FFTBuffB, TC2B, Gain2B )
4613 # check if digital filter box checked
4614  if DigFiltA.get() == 1:
4615  FFTBuffA = numpy.convolve(FFTBuffA, DFiltACoef)
4616  if DigFiltB.get() == 1:
4617  FFTBuffB = numpy.convolve(FFTBuffB, DFiltBCoef)
4618  DoFFT()
4619  if SpectrumScreenStatus.get() > 0 and FreqDisp.get() > 0:
4620  UpdateFreqAll() # Update spectrum Data, trace and screen
4621  if IAScreenStatus.get() > 0 and IADisp.get() > 0:
4622  UpdateIAAll()
4623  if BodeScreenStatus.get() > 0 and BodeDisp.get() > 0:
4624  UpdateBodeAll()
4625  if NqPScreenStatus.get() > 0 and NqPDisp.get() > 0:
4626  UpdateNqPAll()
4627  if NiCScreenStatus.get() > 0 and NiCDisp.get() > 0:
4628  UpdateNiCAll()
4629  if SingleShotSA.get() == 1: # Single shot sweep is on
4630  RUNstatus.set(0)
4631 # RUNstatus = 3: Stop
4632 # RUNstatus = 4: Stop and restart
4633  if (RUNstatus.get() == 3) or (RUNstatus.get() == 4):
4634  if RUNstatus.get() == 3:
4635  RUNstatus.set(0) # Status is stopped
4636  if RUNstatus.get() == 4:
4637  RUNstatus.set(1) # Status is (re)start
4638  if SpectrumScreenStatus.get() > 0 and FreqDisp.get() > 0:
4639  UpdateFreqScreen() # Freq UpdateScreen() call
4640  if IAScreenStatus.get() > 0 and IADisp.get() > 0:
4641  UpdateIAScreen()
4642  if FSweepMode.get() > 0 and BodeDisp.get() > 0: # Increment loop counter only if sleceted and Bode display is active
4643  LoopNum.set(LoopNum.get() + 1)
4644  if LoopNum.get() > NSteps.get():
4645  if FSweepMode.get() == 1:
4646  AWGAFreqEntry.delete(0,"end")
4647  AWGAFreqEntry.insert(0, Reset_Freq)
4648  if FSweepMode.get() == 2:
4649  AWGBFreqEntry.delete(0,"end")
4650  AWGBFreqEntry.insert(0, Reset_Freq)
4651 #
4652  LoopNum.set(1)
4653  if FSweepCont.get() == 0:
4654  RUNstatus.set(0)
4655 #
4656 
4658  global VBuffA, VBuffB, IBuffA, IBuffB, HBuffA, HBuffB
4659  global CH1pdvRange, CHAOffset, CH2pdvRange, CHBOffset
4660  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I, Xsignal
4661  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
4662  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
4663  global VABase, VATop, VBBase, VBTop
4664 
4665  if ShowC1_V.get() == 1 or Xsignal.get() == 6:
4666  CHAGridMax = (5 * CH1pdvRange ) + CHAOffset # Calculate CHA Grid Min and Max
4667  CHAGridMin = (-5 * CH1pdvRange ) + CHAOffset
4668  VAMid = (MinV1 + MaxV1)/2 # Find CHA mid value
4669  HBuffA = numpy.histogram(VBuffA, bins=5000, range=[CHAGridMin, CHAGridMax] )
4670  LowerPeak = 0
4671  UpperPeak = 0
4672  b = 0
4673  while (b < 4999):
4674  if HBuffA[0][b] > HBuffA[0][LowerPeak] and HBuffA[1][b] < VAMid:
4675  LowerPeak = b
4676  VABase = HBuffA[1][b]
4677  if HBuffA[0][b] > HBuffA[0][UpperPeak] and HBuffA[1][b] > VAMid:
4678  UpperPeak = b
4679  VATop = HBuffA[1][b]
4680  b = b + 1
4681  if ShowC2_V.get() == 1 or Xsignal.get() == 7:
4682  CHBGridMax = (5 * CH2pdvRange ) + CHBOffset # Calculate CHB Grid Min and Max
4683  CHBGridMin = (-5 * CH2pdvRange ) + CHBOffset
4684  VBMid = (MinV2 + MaxV2)/2 # Find CHB mid value
4685  HBuffB = numpy.histogram(VBuffB, bins=5000, range=[CHBGridMin, CHBGridMax] )
4686  LowerPeak = 0
4687  UpperPeak = 0
4688  b = 0
4689  while (b < 4999):
4690  if HBuffB[0][b] > HBuffB[0][LowerPeak] and HBuffB[1][b] < VBMid:
4691  LowerPeak = b
4692  VBBase = HBuffB[1][b]
4693  if HBuffB[0][b] > HBuffB[0][UpperPeak] and HBuffB[1][b] > VBMid:
4694  UpperPeak = b
4695  VBTop = HBuffB[1][b]
4696  b = b + 1
4697 
4699  global HistAsPercent
4700 
4701  if askyesno("Plot as Percent", "Plot Histogram as Percent?", parent=xywindow):
4702  HistAsPercent = 1
4703  else:
4704  HistAsPercent = 0
4705 
4706 def FindRisingEdge(Trace1, Trace2):
4707  global MinV1, MaxV1, MinV2, MaxV2, HoldOff, TRIGGERsample, TgInput, LShift
4708  global ETSrecord, DISsamples
4709  global SHOWsamples, SAMPLErate, CHAperiod, CHAfreq, CHBperiod, CHBfreq
4710  global CHAHW, CHALW, CHADCy, CHBHW, CHBLW, CHBDCy, ShowC1_V, ShowC2_V
4711  global CHABphase, CHBADelayR1, CHBADelayR2, CHBADelayF
4712 
4713  anr1 = bnr1 = 0
4714  anf1 = bnf1 = 1
4715  anr2 = bnr2 = 2
4716  hldn = int(HoldOff * SAMPLErate/1000)
4717  # print(DISsamples, len(Trace1))
4718  if TgInput.get() > 0: # if triggering right shift arrays to undo trigger left shift
4719  Trace1 = numpy.roll(Trace1, -LShift)
4720  Trace2 = numpy.roll(Trace2, -LShift)
4721  else:
4722  Trace1 = numpy.roll(Trace1, -hldn)
4723  Trace2 = numpy.roll(Trace2, -hldn)
4724  try:
4725  MidV1 = (numpy.amax(Trace1)+numpy.amin(Trace1))/2.0
4726  MidV2 = (numpy.amax(Trace2)+numpy.amin(Trace2))/2.0
4727  except:
4728  MidV1 = (MinV1+MaxV1)/2
4729  MidV2 = (MinV2+MaxV2)/2
4730 # search Trace 1
4731 
4738  Arising = [i for (i, val) in enumerate(Trace1) if val >= MidV1 and Trace1[i-1] < MidV1]
4739  Afalling = [i for (i, val) in enumerate(Trace1) if val <= MidV1 and Trace1[i-1] > MidV1]
4740  AIrising = [i - (Trace1[i] - MidV1)/(Trace1[i] - Trace1[i-1]) for i in Arising]
4741  AIfalling = [i - (MidV1 - Trace1[i])/(Trace1[i-1] - Trace1[i]) for i in Afalling]
4742 
4743  CHAfreq = SAMPLErate / numpy.mean(numpy.diff(AIrising))
4744  CHAperiod = (numpy.mean(numpy.diff(AIrising)) * 1000.0) / SAMPLErate # time in mSec
4745 # Catch zero length array?
4746  try:
4747  Dummy_read = Arising[0]
4748  except:
4749  return
4750  if len(Arising) > 0 or len(Afalling) > 0:
4751  if Arising[0] > 0:
4752  try:
4753  anr1 = AIrising[0]
4754  except:
4755  anr1 = 0
4756  try:
4757  anr2 = AIrising[1]
4758  except:
4759  anr2 = SHOWsamples
4760  try:
4761  if AIfalling[0] < AIrising[0]:
4762  anf1 = AIfalling[1]
4763  else:
4764  anf1 = AIfalling[0]
4765  except:
4766  anf1 = 1
4767  else:
4768  try:
4769  anr1 = AIrising[1]
4770  except:
4771  anr1 = 0
4772  try:
4773  anr2 = AIrising[2]
4774  except:
4775  anr2 = SHOWsamples
4776  try:
4777  if AIfalling[1] < AIrising[1]:
4778  anf1 = AIfalling[2]
4779  else:
4780  anf1 = AIfalling[1]
4781  except:
4782  anf1 = 1
4783 # search Trace 2
4784 
4791  Brising = [i for (i, val) in enumerate(Trace2) if val >= MidV2 and Trace2[i-1] < MidV2]
4792  Bfalling = [i for (i, val) in enumerate(Trace2) if val <= MidV2 and Trace2[i-1] > MidV2]
4793  BIrising = [i - (Trace2[i] - MidV2)/(Trace2[i] - Trace2[i-1]) for i in Brising]
4794  BIfalling = [i - (MidV2 - Trace2[i])/(Trace2[i-1] - Trace2[i]) for i in Bfalling]
4795 
4796  CHBfreq = SAMPLErate / numpy.mean(numpy.diff(BIrising))
4797  CHBperiod = (numpy.mean(numpy.diff(BIrising)) * 1000.0) / SAMPLErate # time in mSec
4798 # Catch zero length array?
4799  try:
4800  Dummy_read = Brising[0]
4801  except:
4802  return
4803  if len(Brising) > 0 or len(Bfalling) > 0:
4804  if Brising[0] > 0:
4805  try:
4806  bnr1 = BIrising[0]
4807  except:
4808  bnr1 = 0
4809  try:
4810  bnr2 = BIrising[1]
4811  except:
4812  bnr2 = SHOWsamples
4813  try:
4814  if BIfalling[0] < BIrising[0]:
4815  bnf1 = BIfalling[1]
4816  else:
4817  bnf1 = BIfalling[0]
4818  except:
4819  bnf1 = 1
4820  else:
4821  try:
4822  bnr1 = BIrising[1]
4823  except:
4824  bnr1 = 0
4825  try:
4826  bnr2 = BIrising[2]
4827  except:
4828  bnr2 = SHOWsamples
4829  try:
4830  if BIfalling[1] < BIrising[1]:
4831  bnf1 = BIfalling[2]
4832  else:
4833  bnf1 = BIfalling[1]
4834  except:
4835  bnf1 = 1
4836  #
4837  CHAHW = float(((anf1 - anr1) * 1000.0) / SAMPLErate)
4838  CHALW = float(((anr2 - anf1) * 1000.0) / SAMPLErate)
4839  CHADCy = float(anf1 - anr1) / float(anr2 - anr1) * 100.0 # in percent
4840  CHBHW = float(((bnf1 - bnr1) * 1000.0) / SAMPLErate)
4841  CHBLW = float(((bnr2 - bnf1) * 1000.0) / SAMPLErate)
4842  CHBDCy = float(bnf1 - bnr1) / float(bnr2 - bnr1) * 100.0 # in percent
4843 #
4844  if bnr1 > anr1:
4845  CHBADelayR1 = float((bnr1 - anr1) * 1000.0 / SAMPLErate)
4846  else:
4847  CHBADelayR1 = float((bnr2 - anr1) * 1000.0 / SAMPLErate)
4848  CHBADelayR2 = float((bnr2 - anr2) * 1000.0 / SAMPLErate)
4849  CHBADelayF = float((bnf1 - anf1) * 1000.0 / SAMPLErate)
4850  try:
4851  CHABphase = 360.0*(float((bnr1 - anr1) * 1000.0 / SAMPLErate))/CHAperiod
4852  except:
4853  CHABphase = 0.0
4854  if CHABphase < 0.0:
4855  CHABphase = CHABphase + 360.0
4856 
4858  global DX, TRIGGERsample, TRIGGERlevel
4859 
4860  DX = 0
4861  n = TRIGGERsample
4862  DY = TrgBuff[int(n)] - TrgBuff[int(n+1)]
4863  if DY != 0.0:
4864  DX = (TRIGGERlevel - TrgBuff[int(n+1)])/DY # calculate interpolated trigger point
4865  else:
4866  DX = 0
4867 
4868 def FindTriggerSample(TrgBuff): # find trigger time sample point of passed waveform array
4869  global AutoLevel, TgInput, TRIGGERlevel, TRIGGERentry, DX, SAMPLErate, Is_Triggered
4870  global HoldOffentry, HozPossentry, TRIGGERsample, TRACEsize, HozPoss, hozpos
4871  global Trigger_LPF_length, LPFTrigger
4872 
4873  # Set the TRACEsize variable
4874  TRACEsize = SHOWsamples # Set the trace length
4875  DX = 0
4876  Is_Triggered = 0
4877  if LPFTrigger.get() > 0:
4878  TFiltCoef = [] # empty coef array
4879  for n in range(Trigger_LPF_length.get()):
4880  TFiltCoef.append(float(1.0/Trigger_LPF_length.get()))
4881  TFiltCoef = numpy.array(TFiltCoef)
4882  TrgBuff = numpy.convolve(TrgBuff, TFiltCoef)
4883 
4884  if len(TrgBuff) == 0:
4885  return
4886  try:
4887  TrgMin = numpy.amin(TrgBuff)
4888  except:
4889  TrgMin = 0.0
4890  try:
4891  TrgMax = numpy.amax(TrgBuff)
4892  except:
4893  TrgMax = 0.0
4894 # Find trigger sample
4895  try:
4896  if AutoLevel.get() == 1:
4897  TRIGGERlevel = (TrgMin + TrgMax)/2
4898  TRIGGERentry.delete(0,"end")
4899  TRIGGERentry.insert(0, ' {0:.4f} '.format(TRIGGERlevel))
4900  else:
4901  TRIGGERlevel = eval(TRIGGERentry.get())
4902  except:
4903  TRIGGERentry.delete(0,END)
4904  TRIGGERentry.insert(0, TRIGGERlevel)
4905 # Start from first sample after HoldOff
4906  try:
4907  HoldOff = float(eval(HoldOffentry.get()))
4908  if HoldOff < 0:
4909  HoldOff = 0
4910  HoldOffentry.delete(0,END)
4911  HoldOffentry.insert(0, HoldOff)
4912  except:
4913  HoldOffentry.delete(0,END)
4914  HoldOffentry.insert(0, HoldOff)
4915 # slide trace left right by HozPoss
4916  try:
4917  HozPoss = float(eval(HozPossentry.get()))
4918  except:
4919  HozPossentry.delete(0,END)
4920  HozPossentry.insert(0, HozPoss)
4921 
4922  hldn = int(HoldOff * SAMPLErate/1000)
4923  hozpos = int(HozPoss * SAMPLErate/1000)
4924  if hozpos >= 0:
4925  TRIGGERsample = hldn
4926  else:
4927  TRIGGERsample = abs(hozpos)
4928 #
4929  Nmax = int(TRACEsize / 1.5) # first 2/3 of data set
4930  DX = 0
4931  n = TRIGGERsample
4932  TRIGGERlevel2 = 0.99 * TRIGGERlevel # Hysteresis to avoid triggering on noise
4933  if TRIGGERlevel2 < TrgMin:
4934  TRIGGERlevel2 = TrgMin
4935  if TRIGGERlevel2 > TrgMax:
4936  TRIGGERlevel2 = TrgMax
4937  ChInput = TrgBuff[int(n)]
4938  Prev = ChInput
4939  while ( ChInput >= TRIGGERlevel2) and n < Nmax:
4940  n = n + 1
4941  ChInput = TrgBuff[int(n)]
4942  while (ChInput <= TRIGGERlevel) and n < Nmax:
4943  Prev = ChInput
4944  n = n + 1
4945  ChInput = TrgBuff[int(n)]
4946  DY = ChInput - Prev
4947  if DY != 0.0:
4948  DX = (TRIGGERlevel - Prev)/DY # calculate interpolated trigger point
4949  else:
4950  DX = 0
4951  if TgEdge.get() == 1:
4952  TRIGGERlevel2 = 1.01 * TRIGGERlevel
4953  if TRIGGERlevel2 < TrgMin:
4954  TRIGGERlevel2 = TrgMin
4955  if TRIGGERlevel2 > TrgMax:
4956  TRIGGERlevel2 = TrgMax
4957  ChInput = TrgBuff[int(n)]
4958  Prev = ChInput
4959  while (ChInput <= TRIGGERlevel2) and n < Nmax:
4960  n = n + 1
4961  ChInput = TrgBuff[int(n)]
4962  while (ChInput >= TRIGGERlevel) and n < Nmax:
4963  Prev = ChInput
4964  n = n + 1
4965  ChInput = TrgBuff[int(n)]
4966  DY = Prev - ChInput
4967  try:
4968  DX = (Prev - TRIGGERlevel)/DY # calculate interpolated trigger point
4969  except:
4970  DX = 0
4971 
4972 # check to insure trigger point is in bounds
4973  if n < Nmax:
4974  TRIGGERsample = n - 1
4975  Is_Triggered = 1
4976  elif n > Nmax: # Didn't find edge in first 2/3 of data set
4977  TRIGGERsample = 1 + hldn # reset to begining
4978  Is_Triggered = 0
4979  if DX > 1:
4980  DX = 1 # never more than 100% of a sample period
4981  elif DX < 0:
4982  DX = 0 # never less than 0% of a sample period
4983  if math.isnan(DX):
4984  DX = 0
4985  TRIGGERsample = TRIGGERsample + hozpos
4986 
4988  global win2, DigScreenStatus
4989 
4990  DigScreenStatus.set(0)
4991  win2.destroy()
4992 
4993 def sel():
4994  global devx, DevID
4995  global D0, D1, D2, D3, D4, D5, D6, D7
4996  global PIO_0, PIO_1, PIO_2, PIO_3, PIO_4, PIO_5, PIO_6, PIO_7
4997  # sending 0x50 = set to 0, 0x51 = set to 1
4998  if D0.get() > 0:
4999  devx.ctrl_transfer( 0x40, D0.get(), PIO_0, 0, 0, 0, 100) # set PIO 0
5000  else:
5001  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_0, 0, 0, 1, 100)
5002  if D1.get() > 0:
5003  devx.ctrl_transfer( 0x40, D1.get(), PIO_1, 0, 0, 0, 100) # set PIO 1
5004  else:
5005  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_1, 0, 0, 1, 100)
5006  if D2.get() > 0:
5007  devx.ctrl_transfer( 0x40, D2.get(), PIO_2, 0, 0, 0, 100) # set PIO 2
5008  else:
5009  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_2, 0, 0, 1, 100)
5010  if D3.get() > 0:
5011  devx.ctrl_transfer( 0x40, D3.get(), PIO_3, 0, 0, 0, 100) # set PIO 3
5012  else:
5013  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_3, 0, 0, 1, 100)
5014  if D4.get() > 0:
5015  devx.ctrl_transfer( 0x40, D4.get(), PIO_4, 0, 0, 0, 100) # set PIO 4
5016  else:
5017  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_4, 0, 0, 1, 100)
5018  if D5.get() > 0:
5019  devx.ctrl_transfer( 0x40, D5.get(), PIO_5, 0, 0, 0, 100) # set PIO 5
5020  else:
5021  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_5, 0, 0, 1, 100)
5022  if D6.get() > 0:
5023  devx.ctrl_transfer( 0x40, D6.get(), PIO_6, 0, 0, 0, 100) # set PIO 6
5024  else:
5025  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_6, 0, 0, 1, 100)
5026  if D7.get() > 0:
5027  devx.ctrl_transfer( 0x40, D7.get(), PIO_7, 0, 0, 0, 100) # set PIO 7
5028  else:
5029  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_7, 0, 0, 1, 100)
5030 
5032  global D0, D1, D2, D3, D4, D5, D6, D7
5033  global PIO_0, PIO_1, PIO_2, PIO_3, PIO_4, PIO_5, PIO_6, PIO_7
5034  global DigScreenStatus, DacScreenStatus, win2, MuxScreenStatus
5035  # setup Dig output window
5036  if DigScreenStatus.get() == 0 and DacScreenStatus.get() == 0 and MuxScreenStatus.get() == 0:
5037  DigScreenStatus.set(1)
5038  win2 = Toplevel()
5039  win2.title("Dig Out")
5040  win2.resizable(FALSE,FALSE)
5041  win2.protocol("WM_DELETE_WINDOW", DestroyDigScreen)
5042  drb1 = Radiobutton(win2, text="D0-0", variable=D0, value=0x50, command=sel )
5043  drb1.grid(row=2, column=0, sticky=W)
5044  drb0z = Radiobutton(win2, text="D0-Z", variable=D0, value=0, command=sel )
5045  drb0z.grid(row=2, column=1, sticky=W)
5046  drb2 = Radiobutton(win2, text="D0-1", variable=D0, value=0x51, command=sel )
5047  drb2.grid(row=2, column=2, sticky=W)
5048  drb3 = Radiobutton(win2, text="D1-0", variable=D1, value=0x50, command=sel )
5049  drb3.grid(row=3, column=0, sticky=W)
5050  drb3z = Radiobutton(win2, text="D1-Z", variable=D1, value=0, command=sel )
5051  drb3z.grid(row=3, column=1, sticky=W)
5052  drb4 = Radiobutton(win2, text="D1-1", variable=D1, value=0x51, command=sel )
5053  drb4.grid(row=3, column=2, sticky=W)
5054  drb5 = Radiobutton(win2, text="D2-0", variable=D2, value=0x50, command=sel )
5055  drb5.grid(row=4, column=0, sticky=W)
5056  drb5z = Radiobutton(win2, text="D2-Z", variable=D2, value=0, command=sel )
5057  drb5z.grid(row=4, column=1, sticky=W)
5058  drb6 = Radiobutton(win2, text="D2-1", variable=D2, value=0x51, command=sel )
5059  drb6.grid(row=4, column=2, sticky=W)
5060  drb7 = Radiobutton(win2, text="D3-0", variable=D3, value=0x50, command=sel )
5061  drb7.grid(row=5, column=0, sticky=W)
5062  drb7z = Radiobutton(win2, text="D3-Z", variable=D3, value=0, command=sel )
5063  drb7z.grid(row=5, column=1, sticky=W)
5064  drb8 = Radiobutton(win2, text="D3-1", variable=D3, value=0x51, command=sel )
5065  drb8.grid(row=5, column=2, sticky=W)
5066  drb9 = Radiobutton(win2, text="D4-0", variable=D4, value=0x50, command=sel )
5067  drb9.grid(row=6, column=0, sticky=W)
5068  drb9z = Radiobutton(win2, text="D4-Z", variable=D4, value=0, command=sel )
5069  drb9z.grid(row=6, column=1, sticky=W)
5070  drb10 = Radiobutton(win2, text="D4-1", variable=D4, value=0x51, command=sel )
5071  drb10.grid(row=6, column=2, sticky=W)
5072  drb11 = Radiobutton(win2, text="D5-0", variable=D5, value=0x50, command=sel )
5073  drb11.grid(row=7, column=0, sticky=W)
5074  drb11z = Radiobutton(win2, text="D5-Z", variable=D5, value=0, command=sel )
5075  drb11z.grid(row=7, column=1, sticky=W)
5076  drb12 = Radiobutton(win2, text="D5-1", variable=D5, value=0x51, command=sel )
5077  drb12.grid(row=7, column=2, sticky=W)
5078  drb13 = Radiobutton(win2, text="D6-0", variable=D6, value=0x50, command=sel )
5079  drb13.grid(row=8, column=0, sticky=W)
5080  drb13z = Radiobutton(win2, text="D6-Z", variable=D6, value=0, command=sel )
5081  drb13z.grid(row=8, column=1, sticky=W)
5082  drb13 = Radiobutton(win2, text="D6-1", variable=D6, value=0x51, command=sel )
5083  drb13.grid(row=8, column=2, sticky=W)
5084  drb14 = Radiobutton(win2, text="D7-0", variable=D7, value=0x50, command=sel )
5085  drb14.grid(row=9, column=0, sticky=W)
5086  drb14z = Radiobutton(win2, text="D7-Z", variable=D7, value=0, command=sel )
5087  drb14z.grid(row=9, column=1, sticky=W)
5088  drb15 = Radiobutton(win2, text="D7-1", variable=D7, value=0x51, command=sel )
5089  drb15.grid(row=9, column=2, sticky=W)
5090 
5091  digdismissbutton = Button(win2, text="Dismiss", command=DestroyDigScreen)
5092  digdismissbutton.grid(row=10, column=0, sticky=W)
5093 
5095  global win1, DacScreenStatus
5096 
5097  DacScreenStatus.set(0)
5098  win1.destroy()
5099 
5100 def sel0(temp):
5101  global devx, DevID
5102  global PIO_0, PIO_4
5103  global DAC0
5104  # sending 0x50 = set to 0, 0x51 = set to 1
5105  if DAC0.get() == 1:
5106  devx.ctrl_transfer( 0x40, 0x50, PIO_0, 0, 0, 0, 100) # set PIO 0 0
5107  devx.ctrl_transfer( 0x40, 0x50, PIO_4, 0, 0, 0, 100) # set PIO 4 0
5108  elif DAC0.get() == 4:
5109  devx.ctrl_transfer( 0x40, 0x50, PIO_0, 0, 0, 0, 100) # set PIO 0 0
5110  devx.ctrl_transfer( 0x40, 0x51, PIO_4, 0, 0, 0, 100) # set PIO 4 1
5111  elif DAC0.get() == 2:
5112  devx.ctrl_transfer( 0x40, 0x50, PIO_0, 0, 0, 0, 100) # set PIO 0 0
5113  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_4, 0, 0, 1, 100) # set PIO 4 Z
5114  elif DAC0.get() == 3:
5115  Dval = devx.ctrl_transfer( 0xc0, 0x91, 0, 0, 0, 1, 100) # set PIO 0 Z
5116  devx.ctrl_transfer( 0x40, 0x50, PIO_4, 0, 0, 0, 100) # set PIO 4
5117  elif DAC0.get() == 5:
5118  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_0, 0, 0, 1, 100) # set PIO 0 Z
5119  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_4, 0, 0, 1, 100) # set PIO 4 Z
5120  elif DAC0.get() == 7:
5121  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_0, 0, 0, 1, 100) # set PIO 0 Z
5122  devx.ctrl_transfer( 0x40, 0x51, PIO_4, 0, 0, 0, 100) # set PIO 4 1
5123  elif DAC0.get() == 8:
5124  devx.ctrl_transfer( 0x40, 0x51, PIO_0, 0, 0, 0, 100) # set PIO 0 1
5125  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_4, 0, 0, 1, 100) # set PIO 4 Z
5126  elif DAC0.get() == 6:
5127  devx.ctrl_transfer( 0x40, 0x51, PIO_0, 0, 0, 0, 100) # set PIO 0
5128  devx.ctrl_transfer( 0x40, 0x50, PIO_4, 0, 0, 0, 100) # set PIO 4
5129  elif DAC0.get() == 9:
5130  devx.ctrl_transfer( 0x40, 0x51, PIO_0, 0, 0, 0, 100) # set PIO 0
5131  devx.ctrl_transfer( 0x40, 0x51, PIO_4, 0, 0, 0, 100) # set PIO 4
5132 
5133 def sel1(temp):
5134  global devx, DevID
5135  global PIO_1, PIO_5
5136  global DAC1
5137  # sending 0x50 = set to 0, 0x51 = set to 1
5138  if DAC1.get() == 1:
5139  devx.ctrl_transfer( 0x40, 0x50, PIO_1, 0, 0, 0, 100) # set PIO 0 0
5140  devx.ctrl_transfer( 0x40, 0x50, PIO_5, 0, 0, 0, 100) # set PIO 4 0
5141  elif DAC1.get() == 4:
5142  devx.ctrl_transfer( 0x40, 0x50, PIO_1, 0, 0, 0, 100) # set PIO 0 0
5143  devx.ctrl_transfer( 0x40, 0x51, PIO_5, 0, 0, 0, 100) # set PIO 4 1
5144  elif DAC1.get() == 2:
5145  devx.ctrl_transfer( 0x40, 0x50, PIO_1, 0, 0, 0, 100) # set PIO 0 0
5146  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_5, 0, 0, 1, 100) # set PIO 4 Z
5147  elif DAC1.get() == 3:
5148  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_1, 0, 0, 1, 100) # set PIO 0 Z
5149  devx.ctrl_transfer( 0x40, 0x50, PIO_5, 0, 0, 0, 100) # set PIO 4
5150  elif DAC1.get() == 5:
5151  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_1, 0, 0, 1, 100) # set PIO 0 Z
5152  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_5, 0, 0, 1, 100) # set PIO 4 Z
5153  elif DAC1.get() == 7:
5154  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_1, 0, 0, 1, 100) # set PIO 0 Z
5155  devx.ctrl_transfer( 0x40, 0x51, PIO_5, 0, 0, 0, 100) # set PIO 4 1
5156  elif DAC1.get() == 8:
5157  devx.ctrl_transfer( 0x40, 0x51, PIO_1, 0, 0, 0, 100) # set PIO 0 1
5158  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_5, 0, 0, 1, 100) # set PIO 4 Z
5159  elif DAC1.get() == 6:
5160  devx.ctrl_transfer( 0x40, 0x51, PIO_1, 0, 0, 0, 100) # set PIO 0
5161  devx.ctrl_transfer( 0x40, 0x50, PIO_5, 0, 0, 0, 100) # set PIO 4
5162  elif DAC1.get() == 9:
5163  devx.ctrl_transfer( 0x40, 0x51, PIO_1, 0, 0, 0, 100) # set PIO 0
5164  devx.ctrl_transfer( 0x40, 0x51, PIO_5, 0, 0, 0, 100) # set PIO 4
5165 
5166 def sel2(temp):
5167  global devx, DevID
5168  global PIO_2, PIO_6
5169  global DAC2
5170  # sending 0x50 = set to 0, 0x51 = set to 1
5171  if DAC2.get() == 1:
5172  devx.ctrl_transfer( 0x40, 0x50, PIO_2, 0, 0, 0, 100) # set PIO 0 0
5173  devx.ctrl_transfer( 0x40, 0x50, PIO_6, 0, 0, 0, 100) # set PIO 4 0
5174  elif DAC2.get() == 4:
5175  devx.ctrl_transfer( 0x40, 0x50, PIO_2, 0, 0, 0, 100) # set PIO 0 0
5176  devx.ctrl_transfer( 0x40, 0x51, PIO_6, 0, 0, 0, 100) # set PIO 4 1
5177  elif DAC2.get() == 2:
5178  devx.ctrl_transfer( 0x40, 0x50, PIO_2, 0, 0, 0, 100) # set PIO 0 0
5179  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_6, 0, 0, 1, 100) # set PIO 4 Z
5180  elif DAC2.get() == 3:
5181  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_2, 0, 0, 1, 100) # set PIO 0 Z
5182  devx.ctrl_transfer( 0x40, 0x50, PIO_6, 0, 0, 0, 100) # set PIO 4
5183  elif DAC2.get() == 5:
5184  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_2, 0, 0, 1, 100) # set PIO 0 Z
5185  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_6, 0, 0, 1, 100) # set PIO 4 Z
5186  elif DAC2.get() == 7:
5187  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_2, 0, 0, 1, 100) # set PIO 0 Z
5188  devx.ctrl_transfer( 0x40, 0x51, PIO_6, 0, 0, 0, 100) # set PIO 4 1
5189  elif DAC2.get() == 8:
5190  devx.ctrl_transfer( 0x40, 0x51, PIO_2, 0, 0, 0, 100) # set PIO 0 1
5191  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_6, 0, 0, 1, 100) # set PIO 4 Z
5192  elif DAC2.get() == 6:
5193  devx.ctrl_transfer( 0x40, 0x51, PIO_2, 0, 0, 0, 100) # set PIO 0
5194  devx.ctrl_transfer( 0x40, 0x50, PIO_6, 0, 0, 0, 100) # set PIO 4
5195  elif DAC2.get() == 9:
5196  devx.ctrl_transfer( 0x40, 0x51, PIO_2, 0, 0, 0, 100) # set PIO 0
5197  devx.ctrl_transfer( 0x40, 0x51, PIO_6, 0, 0, 0, 100) # set PIO 4
5198 
5199 def sel3(temp):
5200  global devx, DevID
5201  global PIO_3, PIO_7
5202  global DAC3
5203  # sending 0x50 = set to 0, 0x51 = set to 1
5204  if DAC3.get() == 1:
5205  devx.ctrl_transfer( 0x40, 0x50, PIO_3, 0, 0, 0, 100) # set PIO 0 0
5206  devx.ctrl_transfer( 0x40, 0x50, PIO_7, 0, 0, 0, 100) # set PIO 4 0
5207  elif DAC3.get() == 4:
5208  devx.ctrl_transfer( 0x40, 0x50, PIO_3, 0, 0, 0, 100) # set PIO 0 0
5209  devx.ctrl_transfer( 0x40, 0x51, PIO_7, 0, 0, 0, 100) # set PIO 4 1
5210  elif DAC3.get() == 2:
5211  devx.ctrl_transfer( 0x40, 0x50, PIO_3, 0, 0, 0, 100) # set PIO 0 0
5212  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_7, 0, 0, 1, 100) # set PIO 4 Z
5213  elif DAC3.get() == 3:
5214  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_3, 0, 0, 1, 100) # set PIO 0 Z
5215  devx.ctrl_transfer( 0x40, 0x50, PIO_7, 0, 0, 0, 100) # set PIO 4
5216  elif DAC3.get() == 5:
5217  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_3, 0, 0, 1, 100) # set PIO 0 Z
5218  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_7, 0, 0, 1, 100) # set PIO 4 Z
5219  elif DAC3.get() == 7:
5220  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_3, 0, 0, 1, 100) # set PIO 0 Z
5221  devx.ctrl_transfer( 0x40, 0x51, PIO_7, 0, 0, 0, 100) # set PIO 4 1
5222  elif DAC3.get() == 8:
5223  devx.ctrl_transfer( 0x40, 0x51, PIO_3, 0, 0, 0, 100) # set PIO 0 1
5224  Dval = devx.ctrl_transfer( 0xc0, 0x91, PIO_7, 0, 0, 1, 100) # set PIO 4 Z
5225  elif DAC3.get() == 6:
5226  devx.ctrl_transfer( 0x40, 0x51, PIO_3, 0, 0, 0, 100) # set PIO 0
5227  devx.ctrl_transfer( 0x40, 0x50, PIO_7, 0, 0, 0, 100) # set PIO 4
5228  elif DAC3.get() == 9:
5229  devx.ctrl_transfer( 0x40, 0x51, PIO_3, 0, 0, 0, 100) # set PIO 0
5230  devx.ctrl_transfer( 0x40, 0x51, PIO_7, 0, 0, 0, 100) # set PIO 4
5231 
5233  global DAC0, DAC1, DAC2, DAC3, SWRev, RevDate
5234  global DacScreenStatus, DigScreenStatus, win1, MuxScreenStatus
5235  # setup Dig output window
5236  if DacScreenStatus.get() == 0 and DigScreenStatus.get() == 0 and MuxScreenStatus.get() == 0:
5237  DacScreenStatus.set(1)
5238  win1 = Toplevel()
5239  win1.title("DAC Out "+ SWRev + RevDate)
5240  win1.resizable(FALSE,FALSE)
5241  win1.protocol("WM_DELETE_WINDOW", DestroyDacScreen)
5242  DAC0 = Scale(win1, from_=9, to=1, orient=VERTICAL, command=sel0, length=90)
5243  DAC0.grid(row=0, column=0, sticky=W)
5244  DAC1 = Scale(win1, from_=9, to=1, orient=VERTICAL, command=sel1, length=90)
5245  DAC1.grid(row=0, column=1, sticky=W)
5246  DAC2 = Scale(win1, from_=9, to=1, orient=VERTICAL, command=sel2, length=90)
5247  DAC2.grid(row=0, column=2, sticky=W)
5248  DAC3 = Scale(win1, from_=9, to=1, orient=VERTICAL, command=sel3, length=90)
5249  DAC3.grid(row=0, column=3, sticky=W)
5250 
5251  dismissbutton = Button(win1, text="Dismiss", command=DestroyDacScreen)
5252  dismissbutton.grid(row=1, column=0, columnspan=4, sticky=W)
5253 
5255 
5256  MakeTimeTrace() # Update the traces
5257  UpdateTimeScreen() # Update the screen
5258 
5260 
5261  MakeTimeTrace() # Update traces
5262  UpdateTimeScreen() # Update the screen
5263 
5265 
5266  MakeTimeScreen() # Update the screen
5267  root.update() # Activate updated screens
5268 
5270 
5271  MakeXYTrace() # Update the traces
5272  UpdateXYScreen() # Update the screen
5273 
5275 
5276  MakeXYTrace() # Update traces
5277  UpdateXYScreen() # Update the screen
5278 
5280 
5281  MakeXYScreen() # Update the screen
5282  root.update() # Activate updated screens
5283 
5285  global VBuffA, VBuffB, IBuffA, IBuffB
5286  global VBuffMA, VBuffMB, VBuffMC, VBuffMD, MuxScreenStatus
5287  global VmemoryA, VmemoryB, ImemoryA, ImemoryB
5288  global VmemoryMuxA, VmemoryMuxB, VmemoryMuxC, VmemoryMuxD
5289  global FFTBuffA, FFTBuffB, FFTwindowshape
5290  global AWGAwaveform, AWGBwaveform
5291  global T1Vline, T2Vline, T1Iline, T2Iline
5292  global TMAVline, TMBVline, TMCVline, TMDVline
5293  global Tmathline, TMXline, TMYline
5294  global MathString, MathAxis, MathXString, MathYString, MathXAxis, MathYAxis
5295  global Triggerline, Triggersymbol, TgInput, TgEdge, HoldOff, HoldOffentry
5296  global X0L, Y0T, GRW, GRH, MouseX, MouseY, MouseCAV, MouseCAI, MouseCBV, MouseCBI
5297  global MouseMuxA, MouseMuxB, MouseMuxC, MouseMuxD
5298  global SHOWsamples, ZOHold, AWGBMode
5299  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I
5300  global Show_CBA, Show_CBB, Show_CBC, Show_CBD
5301  global Show_MathX, Show_MathY
5302  global TRACES, TRACESread, RUNstatus
5303  global AutoCenterA, AutoCenterB
5304  global CHAsb, CHBsb, CHAOffset, CHBOffset, CHAIsb, CHBIsb, CHAIOffset, CHBIOffset
5305  global TMpdiv # Array with time / div values in ms
5306  global TMsb # Time per div spin box variable
5307  global TIMEdiv # current spin box value
5308  global SAMPLErate, SCstart, Two_X_Sample, DISsamples
5309  global TRIGGERsample, TRACEsize, DX, TRIGGERsampleAltA, TRIGGERsampleAltB
5310  global TRIGGERlevel, TRIGGERentry, AutoLevel
5311  global InOffA, InGainA, InOffB, InGainB
5312  global CurOffA, CurOffB, CurGainA, CurGainB
5313  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
5314  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
5315  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
5316  global CHAVPosEntry, CHAIPosEntry, CHAVPosEntry, CHBIPosEntry
5317  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
5318  global CHB_Asb, CHB_APosEntry, CHB_Bsb, CHB_BPosEntry
5319  global CHB_Csb, CHB_CPosEntry, CHB_Dsb, CHB_DPosEntry
5320  global HozPoss, HozPossentry
5321 
5322  # Set the TRACEsize variable
5323  if len(VBuffA) < 100:
5324  return
5325  TRACEsize = SHOWsamples # Set the trace length
5326  SCstart = 0
5327  ylo = 0.0
5328  xlo = 0.0
5329  Ymin = Y0T # Minimum position of time grid (top)
5330  Ymax = Y0T + GRH # Maximum position of time grid (bottom)
5331  Xmin = X0L # Minimum position of time grid (left)
5332  Xmax = X0L + GRW # Maximum position of time grid (right)
5333 
5334  # prevent divide by zero error
5335  if TIMEdiv < 0.0002:
5336  TIMEdiv = 0.01
5337  # Check for Auto Centering
5338  if AutoCenterA.get() > 0:
5339  CHAOffset = DCV1
5340  CHAVPosEntry.delete(0,END)
5341  CHAVPosEntry.insert(0, ' {0:.2f} '.format(CHAOffset))
5342  if AutoCenterB.get() > 0:
5343  CHBOffset = DCV2
5344  CHBVPosEntry.delete(0,END)
5345  CHBVPosEntry.insert(0, ' {0:.2f} '.format(CHBOffset))
5346  # get the vertical ranges
5347  try:
5348  CH1pdvRange = float(eval(CHAsb.get()))
5349  except:
5350  CHAsb.delete(0,END)
5351  CHAsb.insert(0, CH1pdvRange)
5352  try:
5353  CH2pdvRange = float(eval(CHBsb.get()))
5354  except:
5355  CHBsb.delete(0,END)
5356  CHBsb.insert(0, CH2pdvRange)
5357  try:
5358  CH1IpdvRange = float(eval(CHAIsb.get()))
5359  except:
5360  CHAIsb.delete(0,END)
5361  CHAIsb.insert(0, CH1IpdvRange)
5362  try:
5363  CH2IpdvRange = float(eval(CHBIsb.get()))
5364  except:
5365  CHBIsb.delete(0,END)
5366  CHBIsb.insert(0, CH2IpdvRange)
5367  # get the vertical offsets
5368  try:
5369  CHAOffset = float(eval(CHAVPosEntry.get()))
5370  except:
5371  CHAVPosEntry.delete(0,END)
5372  CHAVPosEntry.insert(0, CHAOffset)
5373  try:
5374  CHAIOffset = float(eval(CHAIPosEntry.get()))
5375  except:
5376  CHAIPosEntry.delete(0,END)
5377  CHAIPosEntry.insert(0, CHAIOffset)
5378  try:
5379  CHBOffset = float(eval(CHBVPosEntry.get()))
5380  except:
5381  CHBVPosEntry.delete(0,END)
5382  CHBVPosEntry.insert(0, CHBOffset)
5383  try:
5384  CHBIOffset = float(eval(CHBIPosEntry.get()))
5385  except:
5386  CHBIPosEntry.delete(0,END)
5387  CHBIPosEntry.insert(0, CHBIOffset)
5388  # prevent divide by zero error
5389  if CH1pdvRange < 0.001:
5390  CH1pdvRange = 0.001
5391  if CH2pdvRange < 0.001:
5392  CH2pdvRange = 0.001
5393  if CH1IpdvRange < 0.1:
5394  CH1IpdvRange = 0.1
5395  if CH2IpdvRange < 0.1:
5396  CH2IpdvRange = 0.1
5397 #
5398  try:
5399  HoldOff = float(eval(HoldOffentry.get()))
5400  if HoldOff < 0:
5401  HoldOff = 0
5402  HoldOffentry.delete(0,END)
5403  HoldOffentry.insert(0, HoldOff)
5404  except:
5405  HoldOffentry.delete(0,END)
5406  HoldOffentry.insert(0, HoldOff)
5407 #
5408  try:
5409  HozPoss = float(eval(HozPossentry.get()))
5410  except:
5411  HozPossentry.delete(0,END)
5412  HozPossentry.insert(0, HozPoss)
5413 #
5414  hldn = int(HoldOff * SAMPLErate/1000 )
5415  hozpos = int(HozPoss * SAMPLErate/1000 )
5416  if hozpos < 0:
5417  hozpos = 0
5418  # drawing the traces
5419  if TRACEsize == 0: # If no trace, skip rest of this routine
5420  T1Vline = [] # Trace line channel A V
5421  T2Vline = [] # Trace line channel B V
5422  T1Iline = []
5423  T2Iline = []
5424  TMAVline = [] # V Trace line Mux channel A
5425  TMBVline = [] # V Trace line Mux channel B
5426  TMCVline = [] # V Trace line Mux channel C
5427  TMDVline = [] # V Trace line Mux channel D
5428  Tmathline = [] # math trce line
5429  return()
5430 
5431  # set and/or corrected for in range
5432  if TgInput.get() > 0:
5433  SCmin = int(-1 * TRIGGERsample)
5434  SCmax = int(TRACEsize - TRIGGERsample - 0)
5435  else:
5436  SCmin = 0 # hldn
5437  SCmax = TRACEsize - 1
5438  if SCstart < SCmin: # No reading before start of array
5439  SCstart = SCmin
5440  if SCstart > SCmax: # No reading after end of array
5441  SCstart = SCmax
5442 
5443  # Make Trace lines etc.
5444 
5445  Yconv1 = float(GRH/10.0) / CH1pdvRange # Vertical Conversion factors from samples to screen points
5446  Yconv2 = float(GRH/10.0) / CH2pdvRange
5447  YIconv1 = float(GRH/10.0) / CH1IpdvRange
5448  YIconv2 = float(GRH/10.0) / CH2IpdvRange
5449  Xconv1 = float(GRW/10.0) / CH1pdvRange # Horizontal Conversion factors from samples to screen points
5450  Xconv2 = float(GRW/10.0) / CH2pdvRange
5451  XIconv1 = float(GRW/10.0) / CH1IpdvRange
5452  XIconv2 = float(GRW/10.0) / CH2IpdvRange
5453  if MuxScreenStatus.get() == 1: # if using analog Mux set up axis controls
5454  try:
5455  CHMApdvRange = float(eval(CHB_Asb.get()))
5456  except:
5457  CHB_Asb.delete(0,END)
5458  CHB_Asb.insert(0, CHMApdvRange)
5459  try:
5460  CHMBpdvRange = float(eval(CHB_Bsb.get()))
5461  except:
5462  CHB_Bsb.delete(0,END)
5463  CHB_Bsb.insert(0, CHMBpdvRange)
5464  try:
5465  CHMCpdvRange = float(eval(CHB_Csb.get()))
5466  except:
5467  CHB_Csb.delete(0,END)
5468  CHB_Csb.insert(0, CHMCpdvRange)
5469  try:
5470  CHMDpdvRange = float(eval(CHB_Dsb.get()))
5471  except:
5472  CHB_Dsb.delete(0,END)
5473  CHB_Dsb.insert(0, CHMDpdvRange)
5474  YconvMA = float(GRH/10.0) / CHMApdvRange
5475  YconvMB = float(GRH/10.0) / CHMBpdvRange
5476  YconvMC = float(GRH/10.0) / CHMCpdvRange
5477  YconvMD = float(GRH/10.0) / CHMDpdvRange
5478  try:
5479  CHBAOffset = float(eval(CHB_APosEntry.get()))
5480  except:
5481  CHB_APosEntry.delete(0,END)
5482  CHB_APosEntry.insert(0, CHBAOffset)
5483  try:
5484  CHBBOffset = float(eval(CHB_BPosEntry.get()))
5485  except:
5486  CHB_BPosEntry.delete(0,END)
5487  CHB_BPosEntry.insert(0, CHBBOffset)
5488  try:
5489  CHBCOffset = float(eval(CHB_CPosEntry.get()))
5490  except:
5491  CHB_CPosEntry.delete(0,END)
5492  CHB_CPosEntry.insert(0, CHBCOffset)
5493  try:
5494  CHBDOffset = float(eval(CHB_DPosEntry.get()))
5495  except:
5496  CHB_DPosEntry.delete(0,END)
5497  CHB_DPosEntry.insert(0, CHBDOffset)
5498  if MathAxis == "V-A":
5499  YconvM = Yconv1
5500  CHMOffset = CHAOffset
5501  elif MathAxis == "V-B":
5502  YconvM = Yconv2
5503  CHMOffset = CHBOffset
5504  elif MathAxis == "I-A":
5505  YconvM = YIconv1
5506  CHMOffset = CHAIOffset
5507  elif MathAxis == "I-B":
5508  YconvM = YIconv2
5509  CHMOffset = CHBIOffset
5510  else:
5511  YconvM = Yconv1
5512  CHMOffset = CHAOffset
5513 # include ploting X and Y math formulas vs time
5514  if MathYAxis == "V-A":
5515  YconvMxy = Yconv1
5516  CHMYOffset = CHAOffset
5517  elif MathYAxis == "V-B":
5518  YconvMxy = Yconv2
5519  CHMYOffset = CHBOffset
5520  elif MathYAxis == "I-A":
5521  YconvMxy = YIconv1
5522  CHMYOffset = CHAIOffset
5523  elif MathYAxis == "I-B":
5524  YconvMxy = YIconv2
5525  CHMYOffset = CHBIOffset
5526  else:
5527  YconvMxy = Yconv1
5528  CHMYOffset = CHAOffset
5529 #
5530  if MathXAxis == "V-A":
5531  XconvMxy = Yconv1
5532  CHMXOffset = CHAOffset
5533  elif MathXAxis == "V-B":
5534  XconvMxy = Yconv2
5535  CHMXOffset = CHBOffset
5536  elif MathXAxis == "I-A":
5537  XconvMxy = YIconv1
5538  CHMXOffset = CHAIOffset
5539  elif MathXAxis == "I-B":
5540  XconvMxy = YIconv2
5541  CHMXOffset = CHBIOffset
5542  else:
5543  XconvMxy = Yconv1
5544  CHMXOffset = CHAOffset
5545 #
5546  c1 = GRH / 2.0 + Y0T # fixed correction channel A
5547  c2 = GRH / 2.0 + Y0T # fixed correction channel B
5548 
5549  DISsamples = SAMPLErate * 10.0 * TIMEdiv / 1000.0 # number of samples to display
5550  T1Vline = [] # V Trace line channel A
5551  T2Vline = [] # V Trace line channel B
5552  T1Iline = [] # I Trace line channel A
5553  T2Iline = [] # I Trace line channel B
5554  TMAVline = [] # V Trace line Mux channel A
5555  TMBVline = [] # V Trace line Mux channel B
5556  TMCVline = [] # V Trace line Mux channel C
5557  TMDVline = [] # V Trace line Mux channel D
5558  Tmathline = [] # math trce line
5559  TMXline = [] # X math Trace line
5560  TMYline = [] # Y math Trace line
5561  if len(VBuffA) < 4 and len(VBuffB) < 4 and len(IBuffA) < 4 and len(IBuffB) < 4:
5562  return
5563  t = int(SCstart + TRIGGERsample) # - (TriggerPos * SAMPLErate) # t = Start sample in trace
5564  if t < 0:
5565  t = 0
5566  x = 0 # Horizontal screen pixel
5567 #
5568  ypv1 = int(c1 - Yconv1 * (VBuffA[t] - CHAOffset))
5569  ypi1 = int(c1 - YIconv1 * (IBuffA[t] - CHAIOffset))
5570  ypv2 = int(c2 - Yconv2 * (VBuffB[t] - CHBOffset))
5571  ypi2 = int(c1 - YIconv2 * (IBuffB[t] - CHBIOffset))
5572  DvY1 = DvY2 = DiY1 = DiY2 = 0
5573 #
5574  if (DISsamples <= GRW):
5575  Xstep = GRW / DISsamples
5576  if AWGBMode.get() == 2 and Two_X_Sample.get() == 0:
5577  xa = int((Xstep/-2.5) - (Xstep*DX))
5578  else:
5579  xa = 0 - int(Xstep*DX) # adjust start pixel for interpolated trigger point
5580  x = 0 - int(Xstep*DX)
5581  Tstep = 1
5582  x1 = 0 # x position of trace line
5583  xa1 = 0
5584  y1 = 0.0 # y position of trace line
5585  ypv1 = int(c1 - Yconv1 * (VBuffA[t] - CHAOffset))
5586  ytemp = IBuffA[t]
5587  ypi1 = int(c1 - YIconv1 * (ytemp - CHAIOffset))
5588  ypv2 = int(c2 - Yconv2 * (VBuffB[t] - CHBOffset))
5589  if MuxScreenStatus.get() == 1:
5590  if len(VBuffMA) > 4:
5591  ypvma = int(c2 - YconvMA * (VBuffMA[t] - CHBAOffset))
5592  if len(VBuffMB) > 4:
5593  ypvmb = int(c2 - YconvMB * (VBuffMB[t] - CHBBOffset))
5594  if len(VBuffMC) > 4:
5595  ypvmc = int(c2 - YconvMC * (VBuffMC[t] - CHBCOffset))
5596  if len(VBuffMD) > 4:
5597  ypvmd = int(c2 - YconvMD * (VBuffMD[t] - CHBDOffset))
5598  ytemp = IBuffB[t]
5599  ypi2 = int(c1 - YIconv2 * (ytemp - CHBIOffset))
5600  ypm = ypmx = ypmy = GRH / 2.0 + Y0T
5601  if TgInput.get() == 0:
5602  Xlimit = GRW
5603  else:
5604  Xlimit = GRW+Xstep
5605  while x <= Xlimit:
5606  if t < TRACEsize:
5607  xa1 = xa + X0L
5608  x1 = x + X0L
5609  y1 = int(c1 - Yconv1 * (VBuffA[t] - CHAOffset))
5610  ytemp = IBuffA[t]
5611  yi1 = int(c1 - YIconv1 * (ytemp - CHAIOffset))
5612 
5613  if y1 < Ymin: # clip waveform if going off grid
5614  y1 = Ymin
5615  if y1 > Ymax:
5616  y1 = Ymax
5617  if yi1 < Ymin:
5618  yi1 = Ymin
5619  if yi1 > Ymax:
5620  yi1 = Ymax
5621  if ShowC1_V.get() == 1 :
5622  if ZOHold.get() == 1:
5623  T1Vline.append(int(xa1))
5624  T1Vline.append(int(ypv1))
5625  T1Vline.append(int(xa1))
5626  T1Vline.append(int(y1))
5627  else:
5628  T1Vline.append(int(xa1))
5629  T1Vline.append(int(y1))
5630  DvY1 = ypv1 - y1
5631  ypv1 = y1
5632  if ShowC1_I.get() == 1:
5633  if ZOHold.get() == 1:
5634  T1Iline.append(int(xa1))
5635  T1Iline.append(int(ypi1))
5636  T1Iline.append(int(xa1))
5637  T1Iline.append(int(yi1))
5638  else:
5639  T1Iline.append(int(xa1))
5640  T1Iline.append(int(yi1))
5641  DiY1 = ypi1 - yi1
5642  ypi1 = yi1
5643  if ShowC2_V.get() == 1:
5644  y1 = int(c2 - Yconv2 * (VBuffB[t] - CHBOffset))
5645  if y1 < Ymin: # clip waveform if going off grid
5646  y1 = Ymin
5647  if y1 > Ymax:
5648  y1 = Ymax
5649  if ZOHold.get() == 1:
5650  T2Vline.append(int(x1))
5651  T2Vline.append(int(ypv2))
5652  T2Vline.append(int(x1))
5653  T2Vline.append(int(y1))
5654  else:
5655  T2Vline.append(int(x1))
5656  T2Vline.append(int(y1))
5657  DvY2 = ypv2 - y1
5658  ypv2 = y1
5659  if Show_CBA.get() == 1 and MuxScreenStatus.get() == 1 and len(VBuffMA)>4:
5660  y1 = int(c2 - YconvMA * (VBuffMA[t] - CHBAOffset))
5661  if y1 < Ymin: # clip waveform if going off grid
5662  y1 = Ymin
5663  if y1 > Ymax:
5664  y1 = Ymax
5665  if ZOHold.get() == 1:
5666  TMAVline.append(int(x1))
5667  TMAVline.append(int(ypvma))
5668  TMAVline.append(int(x1))
5669  TMAVline.append(int(y1))
5670  else:
5671  TMAVline.append(int(x1))
5672  TMAVline.append(int(y1))
5673  ypvma = y1
5674  if (MouseX - X0L) >= x and (MouseX - X0L) < (x + Xstep):
5675  Xfine = MouseX - X0L - x
5676  MouseMuxA = ypvma - (y1 - ypvma) * (Xfine/Xstep)
5677  if Show_CBB.get() == 1 and MuxScreenStatus.get() == 1 and len(VBuffMB)>4:
5678  y1 = int(c2 - YconvMB * (VBuffMB[t] - CHBBOffset))
5679  if y1 < Ymin: # clip waveform if going off grid
5680  y1 = Ymin
5681  if y1 > Ymax:
5682  y1 = Ymax
5683  if ZOHold.get() == 1:
5684  TMBVline.append(int(x1))
5685  TMBVline.append(int(ypvmb))
5686  TMBVline.append(int(x1))
5687  TMBVline.append(int(y1))
5688  else:
5689  TMBVline.append(int(x1))
5690  TMBVline.append(int(y1))
5691  ypvmb = y1
5692  if (MouseX - X0L) >= x and (MouseX - X0L) < (x + Xstep):
5693  Xfine = MouseX - X0L - x
5694  MouseMuxB = ypvmb - (y1 - ypvmb) * (Xfine/Xstep)
5695  if Show_CBC.get() == 1 and MuxScreenStatus.get() == 1 and len(VBuffMC)>4:
5696  y1 = int(c2 - YconvMC * (VBuffMC[t] - CHBCOffset))
5697  if y1 < Ymin: # clip waveform if going off grid
5698  y1 = Ymin
5699  if y1 > Ymax:
5700  y1 = Ymax
5701  if ZOHold.get() == 1:
5702  TMCVline.append(int(x1))
5703  TMCVline.append(int(ypvmc))
5704  TMCVline.append(int(x1))
5705  TMCVline.append(int(y1))
5706  else:
5707  TMCVline.append(int(x1))
5708  TMCVline.append(int(y1))
5709  ypvmc = y1
5710  if (MouseX - X0L) >= x and (MouseX - X0L) < (x + Xstep):
5711  Xfine = MouseX - X0L - x
5712  MouseMuxC = ypvmc - (y1 - ypvmc) * (Xfine/Xstep)
5713  if Show_CBD.get() == 1 and MuxScreenStatus.get() == 1 and len(VBuffMD)>4:
5714  y1 = int(c2 - YconvMD * (VBuffMD[t] - CHBDOffset))
5715  if y1 < Ymin: # clip waveform if going off grid
5716  y1 = Ymin
5717  if y1 > Ymax:
5718  y1 = Ymax
5719  if ZOHold.get() == 1:
5720  TMDVline.append(int(x1))
5721  TMDVline.append(int(ypvmd))
5722  TMDVline.append(int(x1))
5723  TMDVline.append(int(y1))
5724  else:
5725  TMDVline.append(int(x1))
5726  TMDVline.append(int(y1))
5727  ypvmd = y1
5728  if (MouseX - X0L) >= x and (MouseX - X0L) < (x + Xstep):
5729  Xfine = MouseX - X0L - x
5730  MouseMuxD = ypvmd - (y1 - ypvmd) * (Xfine/Xstep)
5731  if ShowC2_I.get() == 1:
5732  ytemp = IBuffB[t]
5733  yi1 = int(c1 - YIconv2 * (ytemp - CHBIOffset))
5734  if yi1 < Ymin:
5735  yi1 = Ymin
5736  if yi1 > Ymax:
5737  yi1 = Ymax
5738  if (ZOHold.get() == 1):
5739  T2Iline.append(int(x1))
5740  T2Iline.append(int(ypi2))
5741  T2Iline.append(int(x1))
5742  T2Iline.append(int(yi1))
5743  else:
5744  T2Iline.append(int(x1))
5745  T2Iline.append(int(yi1))
5746  DiY2 = ypi2 - yi1
5747  ypi2 = yi1
5748  if MathTrace.get() > 0:
5749  if MathTrace.get() == 1: # plot sum of CA-V and CB-V
5750  y1 = int(c1 - Yconv1 * (VBuffA[t] + VBuffB[t] - CHAOffset))
5751 
5752  elif MathTrace.get() == 2: # plot difference of CA-V and CB-V
5753  y1 = int(c1 - Yconv1 * (VBuffA[t] - VBuffB[t] - CHAOffset))
5754 
5755  elif MathTrace.get() == 3: # plot difference of CB-V and CA-V
5756  y1 = int(c2 - Yconv2 * (VBuffB[t] - VBuffA[t] - CHBOffset))
5757 
5758  elif MathTrace.get() == 4: # plot product of CA-V and CA-I
5759  Ypower = VBuffA[t] * IBuffA[t] # mAmps * Volts = mWatts
5760  ytemp = YIconv1 * (Ypower - CHAIOffset)
5761  y1 = int(c1 - ytemp)
5762 
5763  elif MathTrace.get() == 5: # plot product of CB-V and CB-I
5764  Ypower = VBuffB[t] * IBuffB[t] # mAmps * Volts = mWatts
5765  ytemp = YIconv2 * (Ypower - CHBIOffset)
5766  y1 = int(c2 - ytemp)
5767 
5768  elif MathTrace.get() == 6: # plot ratio of CA-V and CA-I
5769  Yohms = VBuffA[t] / (IBuffA[t] / 1000.0) # Volts / Amps = ohms
5770  ytemp = YIconv1 * (Yohms - CHAIOffset)
5771  y1 = int(c1 - ytemp)
5772 
5773  elif MathTrace.get() == 7: # plot ratio of CB-V and CB-I
5774  Yohms = VBuffB[t] / (IBuffB[t] / 1000.0) # Volts / Amps = ohms
5775  ytemp = YIconv2 * (Yohms - CHBIOffset)
5776  y1 = int(c2 - ytemp)
5777 
5778  elif MathTrace.get() == 8: # plot difference of CA-I and CB-I
5779  Ydif = (IBuffA[t] - IBuffB[t])# in mA
5780  ytemp = YIconv1 * (Ydif - CHAIOffset)
5781  y1 = int(c2 - ytemp)
5782 
5783  elif MathTrace.get() == 9: # plot difference of CB-I and CA-I
5784  Ydif = (IBuffB[t] - IBuffA[t]) # in mA
5785  ytemp = YIconv2 * (Ydif - CHBIOffset)
5786  y1 = int(c2 - ytemp)
5787 
5788  elif MathTrace.get() == 10: # plot ratio of CB-V and CA-V
5789  try:
5790  y1 = int(c1 - Yconv2 * ((VBuffB[t] / VBuffA[t]) - CHBOffset)) # voltage gain A to B
5791  except:
5792  y1 = int(c1 - Yconv2 * ((VBuffB[t] / 0.000001) - CHBOffset))
5793 
5794  elif MathTrace.get() == 11: # plot ratio of CB-I and CA-I
5795  try:
5796  Y1 = (IBuffB[t] / IBuffA[t]) # current gain A to B
5797  except:
5798  Y1 = (IBuffB[t] / 0.000001)
5799  ytemp = YIconv2 * (Y1 - CHBIOffset)
5800  y1 = int(c2 - ytemp)
5801 
5802  elif MathTrace.get() == 12: # plot from equation string
5803  # MathString = "(VBuffA[t]+ VBuffB[t] - CHAOffset)"
5804  try:
5805  MathResult = eval(MathString)
5806  MathResult = MathResult - CHMOffset
5807  y1 = int(c1 - YconvM * MathResult)
5808  except:
5809  RUNstatus.set(0)
5810  x = Xlimit + 1 # exit loop
5811 
5812  if y1 < Ymin: # clip waveform if going off grid
5813  y1 = Ymin
5814  if y1 > Ymax:
5815  y1 = Ymax
5816  if ZOHold.get() == 1: # connet the dots with stair step
5817  Tmathline.append(int(x1))
5818  Tmathline.append(int(ypm))
5819  Tmathline.append(int(x1))
5820  Tmathline.append(int(y1))
5821  else: # connet the dots with single line
5822  Tmathline.append(int(x1))
5823  Tmathline.append(int(y1))
5824  ypm = y1
5825  if Show_MathX.get() > 0:
5826  try:
5827  MathResult = eval(MathXString)
5828  MathResult = MathResult - CHMXOffset
5829  y1 = int(c1 - XconvMxy * MathResult)
5830  except:
5831  RUNstatus.set(0)
5832  x = Xlimit + 1 # exit loop
5833 
5834  if y1 < Ymin: # clip waveform if going off grid
5835  y1 = Ymin
5836  if y1 > Ymax:
5837  y1 = Ymax
5838  if ZOHold.get() == 1: # connet the dots with stair step
5839  TMXline.append(int(x1))
5840  TMXline.append(int(ypmx))
5841  TMXline.append(int(x1))
5842  TMXline.append(int(y1))
5843  else: # connet the dots with single line
5844  TMXline.append(int(x1))
5845  TMXline.append(int(y1))
5846  ypmx = y1
5847  if Show_MathY.get() > 0:
5848  try:
5849  MathResult = eval(MathYString)
5850  MathResult = MathResult - CHMYOffset
5851  y1 = int(c1 - YconvMxy * MathResult)
5852  except:
5853  RUNstatus.set(0)
5854  x = Xlimit + 1 # exit loop
5855 
5856  if y1 < Ymin: # clip waveform if going off grid
5857  y1 = Ymin
5858  if y1 > Ymax:
5859  y1 = Ymax
5860  if ZOHold.get() == 1: # connet the dots with stair step
5861  TMYline.append(int(x1))
5862  TMYline.append(int(ypmy))
5863  TMYline.append(int(x1))
5864  TMYline.append(int(y1))
5865  else: # connet the dots with single line
5866  TMYline.append(int(x1))
5867  TMYline.append(int(y1))
5868  ypmy = y1
5869  # remember trace verticle pixel at X mouse location
5870  if MouseX - X0L >= x and MouseX - X0L < (x + Xstep): # - Xstep
5871  Xfine = MouseX - X0L - x
5872  MouseCAV = ypv1 - (DvY1 * (Xfine/Xstep)) # interpolate along yaxis
5873  MouseCAI = ypi1 - (DiY1 * (Xfine/Xstep))
5874  MouseCBV = ypv2 - (DvY2 * (Xfine/Xstep))
5875  MouseCBI = ypi2 - (DiY2 * (Xfine/Xstep))
5876  t = int(t + Tstep)
5877  x = x + Xstep
5878  xa = xa + Xstep
5879 
5880  else: #if (DISsamples > GRW): # if the number of samples is larger than the grid width need to ship over samples
5881  Xstep = 1
5882  Tstep = DISsamples / GRW # number of samples to skip per grid pixel
5883  x1 = 0.0 # x position of trace line
5884  ylo = 0.0 # ymin position of trace 1 line
5885  yhi = 0.0 # ymax position of trace 1 line
5886 
5887  t = int(SCstart + TRIGGERsample) # - (TriggerPos * SAMPLErate) # t = Start sample in trace
5888  if t > len(VBuffA)-1:
5889  t = 0
5890  if t < 0:
5891  t = 0
5892  x = 0 # Horizontal screen pixel
5893  ft = t # time point with fractions
5894  while (x <= GRW):
5895  if (t < TRACEsize):
5896  if (t >= len(VBuffA)):
5897  t = len(VBuffA)-2
5898  x = GRW
5899  x1 = x + X0L
5900  ylo = VBuffA[t] - CHAOffset
5901  ilo = IBuffA[t] - CHAIOffset
5902  yhi = ylo
5903  ihi = ilo
5904  n = t
5905  while n < (t + Tstep) and n < TRACEsize:
5906  if ( ShowC1_V.get() == 1 ):
5907  v = VBuffA[t] - CHAOffset
5908  if v < ylo:
5909  ylo = v
5910  if v > yhi:
5911  yhi = v
5912  if ( ShowC1_I.get() == 1 ):
5913  i = IBuffA[t] - CHAIOffset
5914  if i < ilo:
5915  ilo = i
5916  if i > ihi:
5917  ihi = i
5918  n = n + 1
5919  if ( ShowC1_V.get() == 1 ):
5920  ylo = int(c1 - Yconv1 * ylo)
5921  yhi = int(c1 - Yconv1 * yhi)
5922  if (ylo < Ymin):
5923  ylo = Ymin
5924  if (ylo > Ymax):
5925  ylo = Ymax
5926  if (yhi < Ymin):
5927  yhi = Ymin
5928  if (yhi > Ymax):
5929  yhi = Ymax
5930  T1Vline.append(int(x1))
5931  T1Vline.append(int(ylo))
5932  T1Vline.append(int(x1))
5933  T1Vline.append(int(yhi))
5934  ypv1 = ylo
5935  if ( ShowC1_I.get() == 1 ):
5936  ilo = int(c1 - YIconv1 * ilo)
5937  ihi = int(c1 - YIconv1 * ihi)
5938  if (ilo < Ymin):
5939  ilo = Ymin
5940  if (ilo > Ymax):
5941  ilo = Ymax
5942  if (ihi < Ymin):
5943  ihi = Ymin
5944  if (ihi > Ymax):
5945  ihi = Ymax
5946  T1Iline.append(int(x1))
5947  T1Iline.append(int(ilo))
5948  T1Iline.append(int(x1))
5949  T1Iline.append(int(ihi))
5950  ypi1 = ilo
5951  ylo = VBuffB[t] - CHBOffset
5952  ilo = IBuffB[t] - CHBIOffset
5953  yhi = ylo
5954  ihi = ilo
5955  n = t
5956  if MuxScreenStatus.get() == 0:
5957  while n < (t + Tstep) and n < TRACEsize:
5958  if ( ShowC2_V.get() == 1 ):
5959  v = VBuffB[t] - CHBOffset
5960  if v < ylo:
5961  ylo = v
5962  if v > yhi:
5963  yhi = v
5964  if ( ShowC2_I.get() == 1 ):
5965  i = IBuffB[t] - CHBIOffset
5966  if i < ilo:
5967  ilo = i
5968  if i > ihi:
5969  ihi = i
5970  n = n + 1
5971  if ( ShowC2_V.get() == 1 ):
5972  ylo = int(c2 - Yconv2 * ylo)
5973  yhi = int(c2 - Yconv2 * yhi)
5974  if (ylo < Ymin):
5975  ylo = Ymin
5976  if (ylo > Ymax):
5977  ylo = Ymax
5978 
5979  if (yhi < Ymin):
5980  yhi = Ymin
5981  if (yhi > Ymax):
5982  yhi = Ymax
5983  T2Vline.append(int(x1))
5984  T2Vline.append(int(ylo))
5985  T2Vline.append(int(x1))
5986  T2Vline.append(int(yhi))
5987  ypv2 = ylo
5988  if ( ShowC2_I.get() == 1 ):
5989  ilo = int(c2 - YIconv2 * ilo)
5990  ihi = int(c2 - YIconv2 * ihi)
5991  if (ilo < Ymin):
5992  ilo = Ymin
5993  if (ilo > Ymax):
5994  ilo = Ymax
5995  if (ihi < Ymin):
5996  ihi = Ymin
5997  if (ihi > Ymax):
5998  ihi = Ymax
5999  T2Iline.append(int(x1))
6000  T2Iline.append(int(ilo))
6001  T2Iline.append(int(x1))
6002  T2Iline.append(int(ihi))
6003  ypi2 = ilo
6004  else:
6005  if Show_CBA.get() == 1 and len(VBuffMA)>4:
6006  if t < len(VBuffMA):
6007  ylo = VBuffMA[t] - CHBAOffset
6008  yhi = ylo
6009  n = t
6010  while n < (t + Tstep) and n < len(VBuffMA):
6011  v = VBuffMA[t] - CHBAOffset
6012  if v < ylo:
6013  ylo = v
6014  if v > yhi:
6015  yhi = v
6016  n = n + 1
6017  ylo = int(c2 - YconvMA * ylo)
6018  yhi = int(c2 - YconvMA * yhi)
6019  if (ylo < Ymin):
6020  ylo = Ymin
6021  if (ylo > Ymax):
6022  ylo = Ymax
6023  if (yhi < Ymin):
6024  yhi = Ymin
6025  if (yhi > Ymax):
6026  yhi = Ymax
6027  TMAVline.append(int(x1))
6028  TMAVline.append(int(ylo))
6029  TMAVline.append(int(x1))
6030  TMAVline.append(int(yhi))
6031  if (MouseX - X0L) > (x - Xstep) and (MouseX - X0L) < (x + Xstep):
6032  MouseMuxA = ylo
6033  if Show_CBB.get() == 1 and len(VBuffMB)>4:
6034  if t < len(VBuffMB):
6035  ylo = VBuffMB[t] - CHBBOffset
6036  yhi = ylo
6037  n = t
6038  while n < (t + Tstep) and n < len(VBuffMB):
6039  v = VBuffMB[t] - CHBBOffset
6040  if v < ylo:
6041  ylo = v
6042  if v > yhi:
6043  yhi = v
6044  n = n + 1
6045  ylo = int(c2 - YconvMB * ylo)
6046  yhi = int(c2 - YconvMB * yhi)
6047  if (ylo < Ymin):
6048  ylo = Ymin
6049  if (ylo > Ymax):
6050  ylo = Ymax
6051  if (yhi < Ymin):
6052  yhi = Ymin
6053  if (yhi > Ymax):
6054  yhi = Ymax
6055  TMBVline.append(int(x1))
6056  TMBVline.append(int(ylo))
6057  TMBVline.append(int(x1))
6058  TMBVline.append(int(yhi))
6059  if (MouseX - X0L) > (x - Xstep) and (MouseX - X0L) < (x + Xstep):
6060  MouseMuxB = ylo
6061  if Show_CBC.get() == 1 and len(VBuffMC)>4:
6062  if t < len(VBuffMC):
6063  ylo = VBuffMC[t] - CHBCOffset
6064  yhi = ylo
6065  n = t
6066  while n < (t + Tstep) and n < len(VBuffMC):
6067  v = VBuffMC[t] - CHBCOffset
6068  if v < ylo:
6069  ylo = v
6070  if v > yhi:
6071  yhi = v
6072  n = n + 1
6073  ylo = int(c2 - YconvMC * ylo)
6074  yhi = int(c2 - YconvMC * yhi)
6075  if (ylo < Ymin):
6076  ylo = Ymin
6077  if (ylo > Ymax):
6078  ylo = Ymax
6079  if (yhi < Ymin):
6080  yhi = Ymin
6081  if (yhi > Ymax):
6082  yhi = Ymax
6083  TMCVline.append(int(x1))
6084  TMCVline.append(int(ylo))
6085  TMCVline.append(int(x1))
6086  TMCVline.append(int(yhi))
6087  if (MouseX - X0L) > (x - Xstep) and (MouseX - X0L) < (x + Xstep):
6088  MouseMuxC = ylo
6089  if Show_CBD.get() == 1 and len(VBuffMD)>4:
6090  if t < len(VBuffMD):
6091  ylo = VBuffMD[t] - CHBDOffset
6092  yhi = ylo
6093  n = t
6094  while n < (t + Tstep) and n < len(VBuffMD):
6095  v = VBuffMD[t] - CHBDOffset
6096  if v < ylo:
6097  ylo = v
6098  if v > yhi:
6099  yhi = v
6100  n = n + 1
6101  ylo = int(c2 - YconvMD * ylo)
6102  yhi = int(c2 - YconvMD * yhi)
6103  if (ylo < Ymin):
6104  ylo = Ymin
6105  if (ylo > Ymax):
6106  ylo = Ymax
6107  if (yhi < Ymin):
6108  yhi = Ymin
6109  if (yhi > Ymax):
6110  yhi = Ymax
6111  TMDVline.append(int(x1))
6112  TMDVline.append(int(ylo))
6113  TMDVline.append(int(x1))
6114  TMDVline.append(int(yhi))
6115  if (MouseX - X0L) > (x - Xstep) and (MouseX - X0L) < (x + Xstep):
6116  MouseMuxD = ylo
6117  if ( ShowC2_I.get() == 1 ):
6118  while n < (t + Tstep) and n < TRACEsize:
6119  i = IBuffB[t] - CHBIOffset
6120  if i < ilo:
6121  ilo = i
6122  if i > ihi:
6123  ihi = i
6124  n = n + 1
6125  ilo = int(c2 - YIconv2 * ilo)
6126  ihi = int(c2 - YIconv2 * ihi)
6127  if (ilo < Ymin):
6128  ilo = Ymin
6129  if (ilo > Ymax):
6130  ilo = Ymax
6131  if (ihi < Ymin):
6132  ihi = Ymin
6133  if (ihi > Ymax):
6134  ihi = Ymax
6135  T2Iline.append(int(x1))
6136  T2Iline.append(int(ilo))
6137  T2Iline.append(int(x1))
6138  T2Iline.append(int(ihi))
6139  if MathTrace.get() > 0:
6140  if MathTrace.get() == 1: # plot sum of CA-V and CB-V
6141  y1 = int(c1 - Yconv1 * (VBuffA[t] + VBuffB[t] - CHAOffset))
6142 
6143  elif MathTrace.get() == 2: # plot difference of CA-V and CB-V
6144  y1 = int(c1 - Yconv1 * (VBuffA[t] - VBuffB[t] - CHAOffset))
6145 
6146  elif MathTrace.get() == 3: # plot difference of CB-V and CA-V
6147  y1 = int(c2 - Yconv2 * (VBuffB[t] - VBuffA[t] - CHBOffset))
6148 
6149  elif MathTrace.get() == 4: # plot product of CA-V and CA-I
6150  Ypower = VBuffA[t] * IBuffA[t] # mAmps * Volts = mWatts
6151  ytemp = YIconv1 * (Ypower - CHAIOffset)
6152  y1 = int(c1 - ytemp)
6153 
6154  elif MathTrace.get() == 5: # plot product of CB-V and CB-I
6155  Ypower = VBuffB[t] * IBuffB[t] # mAmps * Volts = mWatts
6156  ytemp = YIconv2 * (Ypower - CHBIOffset)
6157  y1 = int(c2 - ytemp)
6158 
6159  elif MathTrace.get() == 6: # plot ratio of CA-V and CA-I
6160  Yohms = VBuffA[t] / (IBuffA[t] / 1000.0) # Volts / Amps = ohms
6161  ytemp = YIconv1 * (Yohms- CHAIOffset)
6162  y1 = int(c1 - ytemp)
6163 
6164  elif MathTrace.get() == 7: # plot ratio of CB-V and CB-I
6165  Yohms = VBuffB[t] / (IBuffB[t] / 1000.0) # Volts / Amps = ohms
6166  ytemp = YIconv2 * (Yohms - CHBIOffset)
6167  y1 = int(c2 - ytemp)
6168 
6169  elif MathTrace.get() == 8: # plot difference of CA-I and CB-I
6170  Ydif = (IBuffA[t] - IBuffB[t]) # in mA
6171  ytemp = YIconv1 * (Ydif - CHAIOffset)
6172  y1 = int(c2 - ytemp)
6173 
6174  elif MathTrace.get() == 9: # plot difference of CB-I and CA-I
6175  Ydif = (IBuffB[t] - IBuffA[t]) # in mA
6176  ytemp = YIconv2 * (Ydif - CHBIOffset)
6177  y1 = int(c2 - ytemp)
6178 
6179  elif MathTrace.get() == 10: # plot ratio of CB-V and CA-V
6180  try:
6181  y1 = int(c1 - Yconv2 * ((VBuffB[t] / VBuffA[t]) - CHBOffset)) # voltage gain A to B
6182  except:
6183  y1 = int(c1 - Yconv2 * ((VBuffB[t] / 0.000001) - CHBOffset))
6184  elif MathTrace.get() == 11: # plot ratio of CB-I and CA-I
6185  try:
6186  Y1 = (IBuffB[t] / IBuffA[t]) # current gain A to B
6187  except:
6188  Y1 = (IBuffB[t] / 0.000001)
6189  ytemp = YIconv2 * (Y1 - CHBIOffset)
6190  y1 = int(c2 - ytemp)
6191 
6192  elif MathTrace.get() == 12: # plot from equation string
6193  # MathString = "(VBuffA[t]+ VBuffB[t] - CHAOffset)"
6194  try:
6195  MathResult = eval(MathString)
6196  MathResult = MathResult - CHMOffset
6197  y1 = int(c1 - YconvM * MathResult)
6198  except:
6199  RUNstatus.set(0)
6200  x = GRW + 1
6201 
6202  if (y1 < Ymin):
6203  y1 = Ymin
6204  if (y1 > Ymax):
6205  y1 = Ymax
6206  if (ZOHold.get() == 1):
6207  Tmathline.append(int(x1))
6208  Tmathline.append(int(ypm))
6209  Tmathline.append(int(x1))
6210  Tmathline.append(int(y1))
6211  else:
6212  Tmathline.append(int(x1))
6213  Tmathline.append(int(y1))
6214  ypm = y1
6215  if Show_MathX.get() > 0:
6216  try:
6217  MathResult = eval(MathXString)
6218  MathResult = MathResult - CHMXOffset
6219  y1 = int(c1 - XconvMxy * MathResult)
6220  except:
6221  RUNstatus.set(0)
6222  x = GRW + 1
6223 
6224  if y1 < Ymin: # clip waveform if going off grid
6225  y1 = Ymin
6226  if y1 > Ymax:
6227  y1 = Ymax
6228  if ZOHold.get() == 1: # connet the dots with stair step
6229  TMXline.append(int(x1))
6230  TMXline.append(int(ypmx))
6231  TMXline.append(int(x1))
6232  TMXline.append(int(y1))
6233  else: # connet the dots with single line
6234  TMXline.append(int(x1))
6235  TMXline.append(int(y1))
6236  ypmx = y1
6237  if Show_MathY.get() > 0:
6238  try:
6239  MathResult = eval(MathYString)
6240  MathResult = MathResult - CHMYOffset
6241  y1 = int(c1 - YconvMxy * MathResult)
6242  except:
6243  RUNstatus.set(0)
6244  x = GRW + 1
6245 
6246  if y1 < Ymin: # clip waveform if going off grid
6247  y1 = Ymin
6248  if y1 > Ymax:
6249  y1 = Ymax
6250  if ZOHold.get() == 1: # connet the dots with stair step
6251  TMYline.append(int(x1))
6252  TMYline.append(int(ypmy))
6253  TMYline.append(int(x1))
6254  TMYline.append(int(y1))
6255  else: # connet the dots with single line
6256  TMYline.append(int(x1))
6257  TMYline.append(int(y1))
6258  ypmy = y1
6259  ft = ft + Tstep
6260  if (MouseX - X0L) == x: # > (x - 1) and (MouseX - X0L) < (x + 1):
6261  MouseCAV = ypv1
6262  MouseCAI = ypi1
6263  MouseCBV = ypv2
6264  MouseCBI = ypi2
6265  t = int(ft)
6266  if (t > len(VBuffA)):
6267  t = len(VBuffA)-2
6268  x = GRW
6269  x = x + Xstep
6270 
6271  # Make trigger triangle pointer
6272  Triggerline = [] # Trigger pointer
6273  Triggersymbol = [] # Trigger symbol
6274  if TgInput.get() > 0:
6275  if TgInput.get() == 1 or TgInput.get() == 5: # triggering on CA-V
6276  x1 = X0L
6277  ytemp = Yconv1 * (float(TRIGGERlevel)-CHAOffset) # / InGainA
6278  y1 = int(c1 - ytemp)
6279  elif TgInput.get() == 2: # triggering on CA-I
6280  x1 = X0L+GRW
6281  y1 = int(c1 - YIconv1 * (float(TRIGGERlevel) - CHAIOffset))
6282  elif TgInput.get() == 3: # triggering on CB-V
6283  x1 = X0L
6284  ytemp = Yconv2 * (float(TRIGGERlevel)-CHBOffset) # / InGainB
6285  y1 = int(c2 - ytemp)
6286  elif TgInput.get() == 4: # triggering on CB-I
6287  x1 = X0L+GRW
6288  y1 = int(c2 - YIconv2 * (float(TRIGGERlevel) - CHBIOffset))
6289 
6290  if (y1 < Ymin):
6291  y1 = Ymin
6292  if (y1 > Ymax):
6293  y1 = Ymax
6294  Triggerline.append(int(x1-5))
6295  Triggerline.append(int(y1+5))
6296  Triggerline.append(int(x1+5))
6297  Triggerline.append(int(y1))
6298  Triggerline.append(int(x1-5))
6299  Triggerline.append(int(y1-5))
6300  Triggerline.append(int(x1-5))
6301  Triggerline.append(int(y1+5))
6302  x1 = X0L + (GRW/2)
6303  if TgEdge.get() == 0: # draw rising edge symbol
6304  y1 = -3
6305  y2 = -13
6306  else:
6307  y1 = -13
6308  y2 = -3
6309  Triggersymbol.append(int(x1-10))
6310  Triggersymbol.append(int(Ymin+y1))
6311  Triggersymbol.append(int(x1))
6312  Triggersymbol.append(int(Ymin+y1))
6313  Triggersymbol.append(int(x1))
6314  Triggersymbol.append(int(Ymin+y2))
6315  Triggersymbol.append(int(x1+10))
6316  Triggersymbol.append(int(Ymin+y2))
6317 
6319  global VBuffA, VBuffB, IBuffA, IBuffB
6320  global VmemoryA, VmemoryB, ImemoryA, ImemoryB
6321  global TXYline, MathXString, MathYString, MathXAxis, MathYAxis
6322  global HoldOff, HoldOffentry
6323  global X0LXY, Y0TXY, GRWXY, GRHXY
6324  global YminXY, YmaxXY, XminXY, XmaxXY
6325  global SHOWsamples, ZOHold, AWGBMode
6326  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I
6327  global TRACES, TRACESread, RUNstatus
6328  global Xsignal, Ysignal
6329  global CHAsbxy, CHBsbxy, CHAOffset, CHBOffset, CHAIsbxy, CHBIsbxy, CHAIOffset, CHBIOffset
6330  global TMpdiv # Array with time / div values in ms
6331  global TMsb # Time per div spin box variable
6332  global TIMEdiv # current spin box value
6333  global SAMPLErate
6334  global SCstart, MathString
6335  global TRIGGERsample, TRACEsize, DX
6336  global TRIGGERlevel, TRIGGERentry, AutoLevel
6337  global InOffA, InGainA, InOffB, InGainB
6338  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2
6339  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2
6340  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
6341  global CHAVPosEntryxy, CHAIPosEntryxy, CHAVPosEntryxy, CHBIPosEntryxy
6342  global CHAIGainEntry, CHBIGainEntry, CHAIOffsetEntry, CHBIOffsetEntry
6343  global HozPoss, HozPossentry
6344 
6345  # Set the TRACEsize variable
6346  if len(VBuffA) < 100:
6347  return
6348  TRACEsize = SHOWsamples # Set the trace length
6349  SCstart = 0
6350  ylo = 0.0
6351  xlo = 0.0
6352  # get the vertical ranges
6353  try:
6354  CH1pdvRange = float(eval(CHAsbxy.get()))
6355  except:
6356  CHAsbxy.delete(0,END)
6357  CHAsbxy.insert(0, CH1pdvRange)
6358  try:
6359  CH2pdvRange = float(eval(CHBsbxy.get()))
6360  except:
6361  CHBsbxy.delete(0,END)
6362  CHBsbxy.insert(0, CH2pdvRange)
6363  try:
6364  CH1IpdvRange = float(eval(CHAIsbxy.get()))
6365  except:
6366  CHAIsbxy.delete(0,END)
6367  CHAIsbxy.insert(0, CH1IpdvRange)
6368  try:
6369  CH2IpdvRange = float(eval(CHBIsbxy.get()))
6370  except:
6371  CHBIsbxy.delete(0,END)
6372  CHBIsbxy.insert(0, CH2IpdvRange)
6373  # get the vertical offsets
6374  try:
6375  CHAOffset = float(eval(CHAVPosEntryxy.get()))
6376  except:
6377  CHAVPosEntryxy.delete(0,END)
6378  CHAVPosEntryxy.insert(0, CHAOffset)
6379  try:
6380  CHAIOffset = float(eval(CHAIPosEntryxy.get()))
6381  except:
6382  CHAIPosEntryxy.delete(0,END)
6383  CHAIPosEntryxy.insert(0, CHAIOffset)
6384  try:
6385  CHBOffset = float(eval(CHBVPosEntryxy.get()))
6386  except:
6387  CHBVPosEntry.delete(0,END)
6388  CHBVPosEntry.insert(0, CHBOffset)
6389  try:
6390  CHBIOffset = float(eval(CHBIPosEntryxy.get()))
6391  except:
6392  CHBIPosEntryxy.delete(0,END)
6393  CHBIPosEntryxy.insert(0, CHBIOffset)
6394  # prevent divide by zero error
6395  if CH1pdvRange < 0.001:
6396  CH1pdvRange = 0.001
6397  if CH2pdvRange < 0.001:
6398  CH2pdvRange = 0.001
6399  if CH1IpdvRange < 0.1:
6400  CH1IpdvRange = 0.1
6401  if CH2IpdvRange < 0.1:
6402  CH2IpdvRange = 0.1
6403  #
6404  Yconv1 = float(GRHXY/10.0) / CH1pdvRange # Vertical Conversion factors from samples to screen points
6405  Yconv2 = float(GRHXY/10.0) / CH2pdvRange
6406  YIconv1 = float(GRHXY/10.0) / CH1IpdvRange
6407  YIconv2 = float(GRHXY/10.0) / CH2IpdvRange
6408  Xconv1 = float(GRWXY/10.0) / CH1pdvRange # Horizontal Conversion factors from samples to screen points
6409  Xconv2 = float(GRWXY/10.0) / CH2pdvRange
6410  XIconv1 = float(GRWXY/10.0) / CH1IpdvRange
6411  XIconv2 = float(GRWXY/10.0) / CH2IpdvRange
6412 
6413  if MathYAxis == "V-A":
6414  YconvMxy = Yconv1
6415  CHMYOffset = CHAOffset
6416  elif MathYAxis == "V-B":
6417  YconvMxy = Yconv2
6418  CHMYOffset = CHBOffset
6419  elif MathYAxis == "I-A":
6420  YconvMxy = YIconv1
6421  CHMYOffset = CHAIOffset
6422  elif MathYAxis == "I-B":
6423  YconvMxy = YIconv2
6424  CHMYOffset = CHBIOffset
6425  else:
6426  YconvMxy = Yconv1
6427  CHMYOffset = CHAOffset
6428  if MathXAxis == "V-A":
6429  XconvMxy = Xconv1
6430  CHMXOffset = CHAOffset
6431  elif MathXAxis == "V-B":
6432  XconvMxy = Xconv2
6433  CHMXOffset = CHBOffset
6434  elif MathYAxis == "I-A":
6435  XconvMxy = XIconv1
6436  CHMXOffset = CHAIOffset
6437  elif MathXAxis == "I-B":
6438  XconvMxy = XIconv2
6439  CHMXOffset = CHBIOffset
6440  else:
6441  XconvMxy = Xconv1
6442  CHMXOffset = CHAOffset
6443  # draw an X/Y plot
6444  TXYline = [] # XY Trace line
6445  t = int(TRIGGERsample) # skip over sampled before hold off time and trigger point
6446  c1 = GRHXY / 2.0 + Y0TXY # fixed correction channel A
6447  c2 = GRWXY / 2.0 + X0LXY # Hor correction factor
6448  while (t < TRACEsize):
6449  if (Xsignal.get() == 3 and Ysignal.get() == 1): # mode CAV/CBV
6450  ylo = VBuffA[t] - CHAOffset
6451  xlo = VBuffB[t] - CHBOffset
6452  ylo = int(c1 - Yconv1 * ylo)
6453  xlo = int(c2 + Xconv2 * xlo)
6454  elif (Xsignal.get() == 1 and Ysignal.get() == 3): # mode CBV/CAV
6455  ylo = VBuffB[t] - CHBOffset
6456  xlo = VBuffA[t] - CHAOffset
6457  ylo = int(c1 - Yconv2 * ylo)
6458  xlo = int(c2 + Xconv1 * xlo)
6459  elif (Xsignal.get() == 5 and Ysignal.get() == 3): # mode CBV/Math
6460  if ( MathTrace.get() == 2): # plot difference of CA-V and CB-V
6461  ylo = VBuffB[t] - CHBOffset
6462  ylo = int(c1 - Yconv2 * ylo)
6463  xlo = VBuffA[t] - VBuffB[t] - CHAOffset
6464  xlo = int(c2 + Xconv1 * xlo)
6465  elif (Xsignal.get() == 5 and Ysignal.get() == 4): # mode CBI/Math
6466  if ( MathTrace.get() == 2): # plot difference of CA-V and CB-V
6467  ylo = (IBuffB[t]) - CHBIOffset
6468  ylo = int(c1 - YIconv2 * ylo)
6469  xlo = VBuffA[t] - VBuffB[t] - CHAOffset
6470  xlo = int(c2 + Xconv1 * xlo)
6471  elif (Xsignal.get() == 5 and Ysignal.get() == 2): # mode CAI/Math
6472  if MathTrace.get() == 3: # plot difference of CB-V and CA-V
6473  ylo = (IBuffA[t]) - CHAIOffset
6474  ylo = int(c1 - YIconv1 * ylo)
6475  xlo = VBuffB[t] - VBuffA[t] - CHBOffset
6476  xlo = int(c2 + Xconv2 * xlo)
6477  elif (Xsignal.get() == 3 and Ysignal.get() == 5): # mode Math/CBV
6478  if MathTrace.get() == 2: # plot difference of CA-V and CB-V
6479  ylo = VBuffA[t] - VBuffB[t] - CHAOffset
6480  ylo = int(c1 - Yconv1 * ylo)
6481  xlo = VBuffB[t] - CHBOffset
6482  xlo = int(c2 + Xconv2 * xlo)
6483  elif (Xsignal.get() == 5 and Ysignal.get() == 1): # mode CAV/Math
6484  if MathTrace.get() == 3: # plot difference of CB-V and CA-V
6485  ylo = VBuffA[t] - CHAOffset
6486  ylo = int(c1 - Yconv1 * ylo)
6487  xlo = VBuffB[t] - VBuffA[t] - CHBOffset
6488  xlo = int(c2 + Xconv2 * xlo)
6489  elif (Xsignal.get() == 1 and Ysignal.get() == 5): # mode Math/CAV
6490  if MathTrace.get() == 3: # plot difference of CB-V and CA-V
6491  ylo = VBuffB[t] - VBuffA[t] - CHBOffset
6492  ylo = int(c1 - Yconv2 * ylo)
6493  xlo = VBuffA[t] - CHAOffset
6494  xlo = int(c2 + Xconv1 * xlo)
6495  elif (Xsignal.get() == 1 and Ysignal.get() == 2): # mode CAI/CAV
6496  ylo = (IBuffA[t]) - CHAIOffset
6497  xlo = VBuffA[t] - CHAOffset
6498  ylo = int(c1 - YIconv1 * ylo)
6499  xlo = int(c2 + Xconv1 * xlo)
6500  elif (Xsignal.get() == 3 and Ysignal.get() == 2): # mode CAI/CBV
6501  ylo = (IBuffA[t]) - CHAIOffset
6502  xlo = VBuffB[t] - CHBOffset
6503  ylo = int(c1 - YIconv1 * ylo)
6504  xlo = int(c2 + Xconv2 * xlo)
6505  elif (Xsignal.get() == 2 and Ysignal.get() == 1): # mode CAV/CAI
6506  ylo = VBuffA[t] - CHAOffset
6507  xlo = (IBuffA[t]) - CHAIOffset
6508  ylo = int(c1 - Yconv1 * ylo)
6509  xlo = int(c2 + XIconv1 * xlo)
6510  elif (Xsignal.get() == 2 and Ysignal.get() == 3): # mode CBV/CAI
6511  ylo = VBuffB[t] - CHBOffset
6512  xlo = (IBuffA[t]) - CHAIOffset
6513  ylo = int(c1 - Yconv2 * ylo)
6514  xlo = int(c2 + XIconv1 * xlo)
6515  elif (Xsignal.get() == 3 and Ysignal.get() == 4): # mode CBI/CBV
6516  ylo = (IBuffB[t]) - CHBIOffset
6517  xlo = VBuffB[t] - CHBOffset
6518  ylo = int(c1 - YIconv2 * ylo)
6519  xlo = int(c2 + Xconv2 * xlo)
6520  elif (Xsignal.get() == 4 and Ysignal.get() == 3): # mode CBV/CBI
6521  ylo = VBuffB[t] - CHBOffset
6522  xlo = (IBuffB[t]) - CHBIOffset
6523  ylo = int(c1 - Yconv2 * ylo)
6524  xlo = int(c2 + XIconv2 * xlo)
6525  elif (Xsignal.get() == 4 and Ysignal.get() == 2): # mode CAI/CBI
6526  ylo = (IBuffA[t]) - CHAIOffset
6527  xlo = (IBuffB[t]) - CHBIOffset
6528  ylo = int(c1 - YIconv1 * ylo)
6529  xlo = int(c2 + XIconv2 * xlo)
6530  elif (Xsignal.get() == 2 and Ysignal.get() == 4): # mode CBI/CAI
6531  ylo = (IBuffB[t]) - CHBIOffset
6532  xlo = (IBuffA[t]) - CHAIOffset
6533  ylo = int(c1 - YIconv2 * ylo)
6534  xlo = int(c2 + XIconv1 * xlo)
6535  elif (Xsignal.get() == 1 and Ysignal.get() == 4): # mode CBI/CAV
6536  ylo = (IBuffB[t]) - CHBIOffset
6537  xlo = VBuffA[t] - CHAOffset
6538  ylo = int(c1 - YIconv2 * ylo)
6539  xlo = int(c2 + Xconv1 * xlo)
6540  elif (Xsignal.get() == 5 and Ysignal.get() == 5): # mode MathYString/MathXString
6541  try:
6542  MathResult = eval(MathYString)
6543  MathResult = MathResult - CHMYOffset
6544  ylo = int(c1 - YconvMxy * MathResult)
6545  except:
6546  RUNstatus.set(0)
6547  try:
6548  MathResult = eval(MathXString)
6549  MathResult = MathResult - CHMXOffset
6550  xlo = int(c2 + XconvMxy * MathResult)
6551  except:
6552  RUNstatus.set(0)
6553  if ylo < YminXY: # clip waveform if going off grid
6554  ylo = YminXY
6555  if ylo > YmaxXY:
6556  ylo = YmaxXY
6557  if xlo < XminXY: # clip waveform if going off grid
6558  xlo = XminXY
6559  if xlo > XmaxXY:
6560  xlo = XmaxXY
6561  TXYline.append(int(xlo))
6562  TXYline.append(int(ylo))
6563  t = int(t + 1)
6564 
6566  global T1Vline, T2Vline, T1Iline, T2Iline, TXYline # active trave lines
6567  global TMXline, TMYline
6568  global T1VRline, T2VRline, T1IRline, T2IRline # reference trace lines
6569  global Triggerline, Triggersymbol, Tmathline, TMRline, TXYRline
6570  global VBuffA, VBuffB, IBuffA, IBuffB
6571  global VBuffMA, VBuffMB, VBuffMC, VBuffMD, MuxScreenStatus
6572  global TMAVline, TMBVline, TMCVline, TMDVline, TMCRline, TMBRline
6573  global VmemoryA, VmemoryB, VmemoryA, ImemoryB
6574  global X0L # Left top X value
6575  global Y0T # Left top Y value
6576  global GRW # Screenwidth
6577  global GRH # Screenheight
6578  global FontSize, EnableHSsampling, ETSDisp, MinigenScreenStatus
6579  global LabelPlotText, PlotLabelText # plot custom label text flag
6580  global MouseX, MouseY, MouseWidget, MouseCAV, MouseCAI, MouseCBV, MouseCBI
6581  global MouseMuxA, MouseMuxB, MouseMuxC, MouseMuxD
6582  global ShowXCur, ShowYCur, TCursor, VCursor
6583  global SHOWsamples # Number of samples in data record
6584  global ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I, ShowRXY, Show_MathX, Show_MathY
6585  global ShowRA_V, ShowRA_I, ShowRB_V, ShowRB_I, ShowMath
6586  global Show_CBA, Show_CBB, Show_CBC, Show_CBD, MathUnits, MathXUnits, MathYUnits
6587  global Xsignal, Ysignal, MathTrace, MathAxis, MathXAxis, MathYAxis
6588  global RUNstatus, SingleShot, ManualTrigger, session # 0 stopped, 1 start, 2 running, 3 stop now, 4 stop and restart
6589  global CHAsb # V range spinbox Index for channel 1
6590  global CHBsb # V range spinbox Index for channel 2
6591  global CHAOffset # Position value for channel 1 V
6592  global CHBOffset # Position value for channel 2 V
6593  global CHAIsb # I range spinbox Index for channel 1
6594  global CHBIsb # I range spinbox Index for channel 2
6595  global CHAIOffset # Postion value for channel 1 I
6596  global CHBIOffset # position value for channel 2 I
6597  global TMpdiv # Array with time / div values in ms
6598  global TMsb # Time per div spin box variable
6599  global TIMEdiv, Mulx, DISsamples # current spin box value
6600  global SAMPLErate, contloop, discontloop, HtMulEntry
6601  global TRIGGERsample, TRIGGERlevel, HoldOff, HoldOffentry, TgInput
6602  global COLORgrid, COLORzeroline, COLORtext, COLORtrigger, COLORtrace7, COLORtraceR7 # The colors
6603  global COLORtrace1, COLORtrace2, COLORtrace3, COLORtrace4, COLORtrace5, COLORtrace6
6604  global COLORtraceR1, COLORtraceR2, COLORtraceR3, COLORtraceR4, COLORtraceR5, COLORtraceR6
6605  global CANVASwidth, CANVASheight
6606  global TRACErefresh, TRACEmode, TRACEwidth, GridWidth
6607  global ScreenTrefresh, SmoothCurves, Is_Triggered
6608  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2, CHAHW, CHALW, CHADCy, CHAperiod, CHAfreq
6609  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2, CHBHW, CHBLW, CHBDCy, CHBperiod, CHBfreq
6610  global InOffA, InGainA, InOffB, InGainB
6611  global CurOffA, CurOffB, CurGainA, CurGainB
6612  # Analog Mux channel measurement variables
6613  global DCVMuxA, MinVMuxA, MaxVMuxA, MidVMuxA, PPVMuxA, SVMuxA
6614  global DCVMuxB, MinVMuxB, MaxVMuxB, MidVMuxB, PPVMuxB, SVMuxB
6615  global DCVMuxC, MinVMuxC, MaxVMuxC, MidVMuxC, PPVMuxC, SVMuxC
6616  global DCVMuxD, MinVMuxD, MaxVMuxD, MidVMuxD, PPVMuxD, SVMuxD
6617  global SV1, SI1, SV2, SI2, CHABphase, SVA_B
6618  global MeasDCV1, MeasMinV1, MeasMaxV1, MeasMidV1, MeasPPV1
6619  global MeasDCI1, MeasMinI1, MeasMaxI1, MeasMidI1, MeasPPI1
6620  global MeasDCV2, MeasMinV2, MeasMaxV2, MeasMidV2, MeasPPV2
6621  global MeasDCI2, MeasMinI2, MeasMaxI2, MeasMidI2, MeasPPI2
6622  global MeasRMSV1, MeasRMSI1, MeasRMSV2, MeasRMSI2, MeasPhase, MeasRMSVA_B
6623  global MeasAHW, MeasALW, MeasADCy, MeasAPER, MeasAFREQ
6624  global MeasBHW, MeasBLW, MeasBDCy, MeasBPER, MeasBFREQ
6625  global AWGAShape, AWGBShape, MeasDiffAB, MeasDiffBA
6626  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
6627  global CHAVPosEntry, CHAIPosEntry, CHAVPosEntry, CHBIPosEntry
6628  global CH1pdvRange, CHAOffset, CH2pdvRange, CHBOffset
6629  global CHB_Asb, CHB_APosEntry, CHB_Bsb, CHB_BPosEntry
6630  global CHB_Csb, CHB_CPosEntry, CHB_Dsb, CHB_DPosEntry
6631  global DacScreenStatus, DigScreenStatus, CHA_RC_HP, CHB_RC_HP
6632  global D0, D1, D2, D3, D4, D5, D6, D7
6633  global DevID, devx, MarkerNum, MarkerScale, MeasGateLeft, MeasGateRight, MeasGateStatus
6634  global HozPoss, HozPossentry
6635  global VABase, VATop, VBBase, VBTop, UserALabel, UserAString, UserBLabel, UserBString
6636  global MeasTopV1, MeasBaseV1, MeasTopV2, MeasBaseV2, MeasUserA, MeasUserB
6637  global CHBADelayR1, CHBADelayR2, CHBADelayF, MeasDelay
6638  #
6639  Ymin = Y0T # Minimum position of time grid (top)
6640  Ymax = Y0T + GRH # Maximum position of time grid (bottom)
6641 
6642  # DISsamples = (10.0 * TIMEdiv) # grid width in time
6643  Tstep = (10.0 * TIMEdiv) / GRW # time in mS per pixel
6644  # get the vertical ranges
6645  try:
6646  CH1pdvRange = float(eval(CHAsb.get()))
6647  except:
6648  CHAsb.delete(0,END)
6649  CHAsb.insert(0, CH1pdvRange)
6650  try:
6651  CH2pdvRange = float(eval(CHBsb.get()))
6652  except:
6653  CHBsb.delete(0,END)
6654  CHBsb.insert(0, CH2pdvRange)
6655  try:
6656  CH1IpdvRange = float(eval(CHAIsb.get()))
6657  except:
6658  CHAIsb.delete(0,END)
6659  CHAIsb.insert(0, CH1IpdvRange)
6660  try:
6661  CH2IpdvRange = float(eval(CHBIsb.get()))
6662  except:
6663  CHBIsb.delete(0,END)
6664  CHBIsb.insert(0, CH2IpdvRange)
6665  # get the vertical offsets
6666  try:
6667  CHAOffset = float(eval(CHAVPosEntry.get()))
6668  except:
6669  CHAVPosEntry.delete(0,END)
6670  CHAVPosEntry.insert(0, CHAOffset)
6671  try:
6672  CHAIOffset = float(eval(CHAIPosEntry.get()))
6673  except:
6674  CHAIPosEntry.delete(0,END)
6675  CHAIPosEntry.insert(0, CHAIOffset)
6676  try:
6677  CHBOffset = float(eval(CHBVPosEntry.get()))
6678  except:
6679  CHBVPosEntry.delete(0,END)
6680  CHBVPosEntry.insert(0, CHBOffset)
6681  try:
6682  CHBIOffset = float(eval(CHBIPosEntry.get()))
6683  except:
6684  CHBIPosEntry.delete(0,END)
6685  CHBIPosEntry.insert(0, CHBIOffset)
6686  try:
6687  HoldOff = float(eval(HoldOffentry.get()))
6688  if HoldOff < 0:
6689  HoldOff = 0
6690  except:
6691  HoldOffentry.delete(0,END)
6692  HoldOffentry.insert(0, HoldOff)
6693  if ETSDisp.get() > 0 or MinigenScreenStatus.get() > 0:
6694  try:
6695  Mulx = float(eval(HtMulEntry.get()))
6696  if Mulx < 1:
6697  Mulx = 1
6698  except:
6699  Mulx = 1
6700  if EnableHSsampling > 0:
6701  HtMulEntry.delete(0,END)
6702  HtMulEntry.insert(0, 1)
6703  else:
6704  Mulx = 1
6705  # slide trace left right by HozPoss
6706  try:
6707  HozPoss = float(eval(HozPossentry.get()))
6708  except:
6709  HozPossentry.delete(0,END)
6710  HozPossentry.insert(0, HozPoss)
6711  if MuxScreenStatus.get() == 1: # if using analog Mux set up axis controls
6712  try:
6713  CHMApdvRange = float(eval(CHB_Asb.get()))
6714  except:
6715  CHB_Asb.delete(0,END)
6716  CHB_Asb.insert(0, CHMApdvRange)
6717  try:
6718  CHMBpdvRange = float(eval(CHB_Bsb.get()))
6719  except:
6720  CHB_Bsb.delete(0,END)
6721  CHB_Bsb.insert(0, CHMBpdvRange)
6722  try:
6723  CHMCpdvRange = float(eval(CHB_Csb.get()))
6724  except:
6725  CHB_Csb.delete(0,END)
6726  CHB_Csb.insert(0, CHMCpdvRange)
6727  try:
6728  CHMDpdvRange = float(eval(CHB_Dsb.get()))
6729  except:
6730  CHB_Dsb.delete(0,END)
6731  CHB_Dsb.insert(0, CHMDpdvRange)
6732  if CHMApdvRange < 0.001:
6733  CHMApdvRange = 0.001
6734  if CHMBpdvRange < 0.001:
6735  CHMBpdvRange = 0.001
6736  if CHMCpdvRange < 0.001:
6737  CHMCpdvRange = 0.001
6738  if CHMDpdvRange < 0.001:
6739  CHMDpdvRange = 0.001
6740  try:
6741  CHBAOffset = float(eval(CHB_APosEntry.get()))
6742  except:
6743  CHB_APosEntry.delete(0,END)
6744  CHB_APosEntry.insert(0, CHBAOffset)
6745  try:
6746  CHBBOffset = float(eval(CHB_BPosEntry.get()))
6747  except:
6748  CHB_BPosEntry.delete(0,END)
6749  CHB_BPosEntry.insert(0, CHBBOffset)
6750  try:
6751  CHBCOffset = float(eval(CHB_CPosEntry.get()))
6752  except:
6753  CHB_CPosEntry.delete(0,END)
6754  CHB_CPosEntry.insert(0, CHBCOffset)
6755  try:
6756  CHBDOffset = float(eval(CHB_DPosEntry.get()))
6757  except:
6758  CHB_DPosEntry.delete(0,END)
6759  CHB_DPosEntry.insert(0, CHBDOffset)
6760  # prevent divide by zero error
6761  if CH1pdvRange < 0.001:
6762  CH1pdvRange = 0.001
6763  if CH2pdvRange < 0.001:
6764  CH2pdvRange = 0.001
6765  if CH1IpdvRange < 0.1:
6766  CH1IpdvRange = 0.1
6767  if CH2IpdvRange < 0.1:
6768  CH2IpdvRange = 0.1
6769  vt = HoldOff + HozPoss # invert sign and scale to mSec
6770  if ScreenTrefresh.get() == 0:
6771  # Delete all items on the screen
6772  ca.delete(ALL) # remove all items
6773  MarkerNum = 0
6774  # Draw horizontal grid lines
6775  i = 0
6776  x1 = X0L
6777  x2 = X0L + GRW
6778  mg_siz = GRW/10.0
6779  mg_inc = mg_siz/5.0
6780  MathFlag1 = (MathAxis == "V-A" and MathTrace.get() == 12) or (MathXAxis == "V-A" and Show_MathX.get() == 1) or (MathYAxis == "V-A" and Show_MathY.get() == 1)
6781  MathFlag2 = (MathAxis == "V-B" and MathTrace.get() == 12) or (MathXAxis == "V-B" and Show_MathX.get() == 1) or (MathYAxis == "V-B" and Show_MathY.get() == 1)
6782  MathFlag3 = (MathAxis == "I-A" and MathTrace.get() == 12) or (MathXAxis == "I-A" and Show_MathX.get() == 1) or (MathYAxis == "I-A" and Show_MathY.get() == 1)
6783  MathFlag4 = (MathAxis == "I-B" and MathTrace.get() == 12) or (MathXAxis == "I-B" and Show_MathX.get() == 1) or (MathYAxis == "I-B" and Show_MathY.get() == 1)
6784  # vertical scale text labels
6785  RightOffset = FontSize * 3
6786  LeftOffset = int(FontSize/2)
6787  if (ShowC1_V.get() == 1 or MathTrace.get() == 1 or MathTrace.get() == 2 or MathFlag1):
6788  ca.create_text(x1-LeftOffset, 12, text="CA-V", fill=COLORtrace1, anchor="e", font=("arial", FontSize-1 ))
6789  if (ShowC1_I.get() == 1 or MathTrace.get() == 4 or MathTrace.get() == 6 or MathTrace.get() == 8 or MathFlag3):
6790  ca.create_text(x2+LeftOffset, 12, text="CA-I", fill=COLORtrace3, anchor="w", font=("arial", FontSize-1 ))
6791  if (ShowC2_V.get() == 1 or MathTrace.get() == 3 or MathTrace.get() == 10 or MathFlag2):
6792  ca.create_text(x1-RightOffset+2, 12, text="CB-V", fill=COLORtrace2, anchor="e", font=("arial", FontSize-1 )) #26
6793  if (ShowC2_I.get() == 1 or MathTrace.get() == 5 or MathTrace.get() == 7 or MathTrace.get() == 9 or MathTrace.get() == 11 or MathFlag4):
6794  ca.create_text(x2+RightOffset+4, 12, text="CB-I", fill=COLORtrace4, anchor="w", font=("arial", FontSize-1 )) #28
6795  #
6796  while (i < 11):
6797  y = Y0T + i * GRH/10.0
6798  Dline = [x1,y,x2,y]
6799  if i == 5:
6800  ca.create_line(Dline, fill=COLORzeroline, width=GridWidth.get()) # Blue line at center of grid
6801  k = 0
6802  while (k < 10):
6803  l = 1
6804  while (l < 5):
6805  Dline = [x1+k*mg_siz+l*mg_inc,y-5,x1+k*mg_siz+l*mg_inc,y+5]
6806  ca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
6807  l = l + 1
6808  k = k + 1
6809  else:
6810  ca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
6811 
6812  if (ShowC1_V.get() == 1 or MathTrace.get() == 1 or MathTrace.get() == 2 or MathFlag1):
6813  Vaxis_value = (((5-i) * CH1pdvRange ) + CHAOffset)
6814  # Vaxis_label = ' {0:.2f} '.format(Vaxis_value)
6815  Vaxis_label = str(round(Vaxis_value,3 ))
6816  ca.create_text(x1-LeftOffset, y, text=Vaxis_label, fill=COLORtrace1, anchor="e", font=("arial", FontSize ))
6817 
6818  if (ShowC1_I.get() == 1 or MathTrace.get() == 4 or MathTrace.get() == 6 or MathTrace.get() == 8 or MathFlag3):
6819  Iaxis_value = 1.0 * (((5-i) * CH1IpdvRange ) + CHAIOffset)
6820  Iaxis_label = str(round(Iaxis_value, 3))
6821  ca.create_text(x2+LeftOffset, y, text=Iaxis_label, fill=COLORtrace3, anchor="w", font=("arial", FontSize ))
6822 
6823  if (ShowC2_V.get() == 1 or MathTrace.get() == 3 or MathTrace.get() == 10 or MathFlag2):
6824  Vaxis_value = (((5-i) * CH2pdvRange ) + CHBOffset)
6825  Vaxis_label = str(round(Vaxis_value, 3))
6826  ca.create_text(x1-RightOffset+2, y, text=Vaxis_label, fill=COLORtrace2, anchor="e", font=("arial", FontSize )) # 26
6827 
6828  if (ShowC2_I.get() == 1 or MathTrace.get() == 5 or MathTrace.get() == 7 or MathTrace.get() == 9 or MathTrace.get() == 11 or MathFlag4):
6829  Iaxis_value = 1.0 * (((5-i) * CH2IpdvRange ) + CHBIOffset)
6830  Iaxis_label = str(round(Iaxis_value, 3))
6831  ca.create_text(x2+RightOffset+4, y, text=Iaxis_label, fill=COLORtrace4, anchor="w", font=("arial", FontSize )) # 28
6832  if MuxScreenStatus.get() == 1:
6833  if Show_CBA.get() == 1:
6834  Vaxis_value = (((5-i) * CHMApdvRange ) + CHBAOffset)
6835  Vaxis_label = str(round(Vaxis_value, 3))
6836  ca.create_text(x1-RightOffset+2, y, text=Vaxis_label, fill=COLORtrace2, anchor="e", font=("arial", FontSize )) # 26
6837  if Show_CBB.get() == 1:
6838  Iaxis_value = 1.0 * (((5-i) * CHMBpdvRange ) + CHBBOffset)
6839  Iaxis_label = str(round(Iaxis_value, 3))
6840  ca.create_text(x2+LeftOffset, y, text=Iaxis_label, fill=COLORtrace6, anchor="w", font=("arial", FontSize ))
6841  if Show_CBC.get() == 1:
6842  Iaxis_value = 1.0 * (((5-i) * CHMCpdvRange ) + CHBCOffset)
6843  Iaxis_label = str(round(Iaxis_value, 3))
6844  ca.create_text(x2+RightOffset-3, y, text=Iaxis_label, fill=COLORtrace7, anchor="w", font=("arial", FontSize )) # 21
6845  if Show_CBD.get() == 1:
6846  Iaxis_value = 1.0 * (((5-i) * CHMDpdvRange ) + CHBDOffset)
6847  Iaxis_label = str(round(Iaxis_value, 3))
6848  ca.create_text(x2+RightOffset+10, y, text=Iaxis_label, fill=COLORtrace4, anchor="w", font=("arial", FontSize )) # 38
6849  i = i + 1
6850  # Draw vertical grid lines
6851  i = 0
6852  y1 = Y0T
6853  y2 = Y0T + GRH
6854  mg_siz = GRH/10.0
6855  mg_inc = mg_siz/5.0
6856  vx = TIMEdiv/Mulx
6857  vt = HoldOff/Mulx # invert sign and scale to mSec
6858  # vx = TIMEdiv
6859  while (i < 11):
6860  x = X0L + i * GRW/10.0
6861  Dline = [x,y1,x,y2]
6862  if (i == 5):
6863  ca.create_line(Dline, fill=COLORzeroline, width=GridWidth.get()) # Blue vertical line at center of grid
6864  k = 0
6865  while (k < 10):
6866  l = 1
6867  while (l < 5):
6868  Dline = [x-5,y1+k*mg_siz+l*mg_inc,x+5,y1+k*mg_siz+l*mg_inc]
6869  ca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
6870  l = l + 1
6871  k = k + 1
6872  #
6873  if vx >= 1000:
6874  axis_value = ((i * vx)+ vt) / 1000.0
6875  axis_label = ' {0:.1f} '.format(axis_value) + " S"
6876  if vx < 1000 and vx >= 1:
6877  axis_value = (i * vx) + vt
6878  axis_label = ' {0:.1f} '.format(axis_value) + " mS"
6879  if vx < 1:
6880  axis_value = ((i * vx) + vt) * 1000.0
6881  axis_label = ' {0:.1f} '.format(axis_value) + " uS"
6882  ca.create_text(x, y2+3, text=axis_label, fill=COLORgrid, anchor="n", font=("arial", FontSize ))
6883  else:
6884  ca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
6885  if vx >= 1000:
6886  axis_value = ((i * vx)+ vt) / 1000.0
6887  axis_label = ' {0:.1f} '.format(axis_value) + " S"
6888  if vx < 1000 and vx >= 1:
6889  axis_value = (i * vx) + vt
6890  axis_label = ' {0:.1f} '.format(axis_value) + " mS"
6891  if vx < 1:
6892  axis_value = ((i * vx) + vt) * 1000.0
6893  axis_label = ' {0:.1f} '.format(axis_value) + " uS"
6894  ca.create_text(x, y2+3, text=axis_label, fill=COLORgrid, anchor="n", font=("arial", FontSize ))
6895 
6896  i = i + 1
6897  # Write the trigger line if available
6898  if len(Triggerline) > 2: # Avoid writing lines with 1 coordinate
6899  ca.create_polygon(Triggerline, outline=COLORtrigger, fill=COLORtrigger, width=1)
6900  ca.create_line(Triggersymbol, fill=COLORtrigger, width=GridWidth.get())
6901  if TgInput.get() == 1:
6902  TgLabel = "CA-V"
6903  if TgInput.get() == 2:
6904  TgLabel = "CA-I"
6905  if TgInput.get() == 3:
6906  TgLabel = "CB-V"
6907  if TgInput.get() == 4:
6908  TgLabel = "CB-I"
6909  if TgInput.get() == 5:
6910  TgLabel = "VA or VB"
6911  if TgInput.get() == 6:
6912  TgLabel = "Alternate"
6913  if Is_Triggered == 1:
6914  TgLabel = TgLabel + " Triggered"
6915  else:
6916  TgLabel = TgLabel + " Not Triggered"
6917  if SingleShot.get() > 0:
6918  TgLabel = TgLabel + " Armed"
6919  x = X0L + (GRW/2) + 12
6920  ca.create_text(x, Ymin-FontSize, text=TgLabel, fill=COLORtrigger, anchor="w", font=("arial", FontSize ))
6921  # Draw T - V Cursor lines if required
6922  if MarkerScale.get() == 0:
6923  Yconv1 = float(GRH/10.0) / CH1pdvRange
6924  Yoffset1 = CHAOffset
6925  COLORmarker = COLORtrace1
6926  Units = " V"
6927  if MarkerScale.get() == 1:
6928  MouseY = MouseCAV
6929  Yconv1 = float(GRH/10.0) / CH1pdvRange
6930  Yoffset1 = CHAOffset
6931  COLORmarker = COLORtrace1
6932  Units = " V"
6933  if MarkerScale.get() == 2:
6934  MouseY = MouseCBV
6935  Yconv1 = float(GRH/10.0) / CH2pdvRange
6936  Yoffset1 = CHBOffset
6937  COLORmarker = COLORtrace2
6938  Units = " V"
6939  if MarkerScale.get() == 3:
6940  MouseY = MouseCAI
6941  Yconv1 = float(GRH/10.0) / CH1IpdvRange
6942  Yoffset1 = CHAIOffset
6943  COLORmarker = COLORtrace3
6944  Units = " mA"
6945  if MarkerScale.get() == 4:
6946  MouseY = MouseCBI
6947  Yconv1 = float(GRH/10.0) / CH2IpdvRange
6948  Yoffset1 = CHBIOffset
6949  COLORmarker = COLORtrace4
6950  Units = " mA"
6951  # Analog Mux settings
6952  if MarkerScale.get() == 5:
6953  MouseY = MouseMuxA
6954  Yconv1 = float(GRH/10.0) / CHMApdvRange
6955  Yoffset1 = CHBAOffset
6956  COLORmarker = COLORtrace2
6957  Units = " V"
6958  if MarkerScale.get() == 6:
6959  MouseY = MouseMuxB
6960  Yconv1 = float(GRH/10.0) / CHMBpdvRange
6961  Yoffset1 = CHBBOffset
6962  COLORmarker = COLORtrace6
6963  Units = " V"
6964  if MarkerScale.get() == 7:
6965  MouseY = MouseMuxC
6966  Yconv1 = float(GRH/10.0) / CHMCpdvRange
6967  Yoffset1 = CHBCOffset
6968  COLORmarker = COLORtrace7
6969  Units = " V"
6970  if MarkerScale.get() == 8:
6971  MouseY = MouseMuxD
6972  Yconv1 = float(GRH/10.0) / CHMDpdvRange
6973  Yoffset1 = CHBDOffset
6974  COLORmarker = COLORtrace4
6975  Units = " V"
6976 #
6977  if ShowTCur.get() > 0:
6978  Dline = [TCursor, Y0T, TCursor, Y0T+GRH]
6979  ca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
6980  Tpoint = ((TCursor-X0L) * Tstep) + vt
6981  Tpoint = Tpoint/Mulx
6982  if Tpoint >= 1000:
6983  axis_value = Tpoint / 1000.0
6984  V_label = ' {0:.2f} '.format(axis_value) + " S"
6985  if Tpoint < 1000 and Tpoint >= 1:
6986  axis_value = Tpoint
6987  V_label = ' {0:.2f} '.format(axis_value) + " mS"
6988  if Tpoint < 1:
6989  axis_value = Tpoint * 1000.0
6990  V_label = ' {0:.2f} '.format(axis_value) + " uS"
6991  ca.create_text(TCursor, Y0T+GRH+6, text=V_label, fill=COLORtext, anchor="n", font=("arial", FontSize ))
6992  if ShowVCur.get() > 0:
6993  Dline = [X0L, VCursor, X0L+GRW, VCursor]
6994  ca.create_line(Dline, dash=(4,3), fill=COLORmarker, width=GridWidth.get())
6995  c1 = GRH / 2 + Y0T # fixed Y correction
6996  yvolts = ((VCursor-c1)/Yconv1) - Yoffset1
6997  V1String = ' {0:.3f} '.format(-yvolts)
6998  V_label = V1String + Units
6999  ca.create_text(X0L+GRW+2, VCursor, text=V_label, fill=COLORmarker, anchor="w", font=("arial", FontSize ))
7000  if ShowTCur.get() == 0 and ShowVCur.get() == 0 and MouseWidget == ca:
7001  if MouseX > X0L and MouseX < X0L+GRW and MouseY > Y0T and MouseY < Y0T+GRH:
7002  Dline = [MouseX, Y0T, MouseX, Y0T+GRH]
7003  ca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
7004  ca.create_oval(MouseX-GridWidth.get(), MouseY-GridWidth.get(), MouseX+GridWidth.get(), MouseY+GridWidth.get(), outline=COLORtrigger, fill=COLORtrigger, width=GridWidth.get())
7005  Tpoint = ((MouseX-X0L) * Tstep) + vt
7006  Tpoint = Tpoint/Mulx
7007  if Tpoint >= 1000:
7008  axis_value = Tpoint / 1000.0
7009  V_label = ' {0:.2f} '.format(axis_value) + " S"
7010  if Tpoint < 1000 and Tpoint >= 1:
7011  axis_value = Tpoint
7012  V_label = ' {0:.2f} '.format(axis_value) + " mS"
7013  if Tpoint < 1:
7014  axis_value = Tpoint * 1000.0
7015  V_label = ' {0:.2f} '.format(axis_value) + " uS"
7016  ca.create_text(MouseX, Y0T+GRH+6, text=V_label, fill=COLORtext, anchor="n", font=("arial", FontSize ))
7017  Dline = [X0L, MouseY, X0L+GRW, MouseY]
7018  ca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
7019  c1 = GRH / 2 + Y0T # fixed Y correction
7020  yvolts = ((MouseY-c1)/Yconv1) - Yoffset1
7021  V1String = ' {0:.3f} '.format(-yvolts)
7022  V_label = V1String + Units
7023  ca.create_text(X0L+GRW+2, MouseY, text=V_label, fill=COLORmarker, anchor="w", font=("arial", FontSize ))
7024 #
7025  if MeasGateStatus.get() == 1:
7026  LeftGate = X0L + MeasGateLeft / Tstep
7027  RightGate = X0L + MeasGateRight / Tstep
7028  ca.create_line(LeftGate, Y0T, LeftGate, Y0T+GRH, dash=(5,3), width=GridWidth.get(), fill=COLORtrace5)
7029  ca.create_line(RightGate, Y0T, RightGate, Y0T+GRH, dash=(5,3), width=GridWidth.get(), fill=COLORtrace7)
7030  #
7031  # TString = ' {0:.2f} '.format(Tpoint)
7032  DT = (MeasGateRight-MeasGateLeft)/Mulx
7033  if DT == 0.0:
7034  DT = 1.0
7035  if DT >= 1000:
7036  axis_value = DT / 1000.0
7037  DeltaT = ' {0:.2f} '.format(axis_value) + " S "
7038  if DT < 1000 and DT >= 1:
7039  axis_value = DT
7040  DeltaT = ' {0:.2f} '.format(axis_value) + " mS "
7041  if DT < 1:
7042  axis_value = DT * 1000.0
7043  DeltaT = ' {0:.2f} '.format(axis_value) + " uS "
7044  # DeltaT = ' {0:.3f} '.format(Tpoint-PrevT)
7045  DFreq = ' {0:.3f} '.format(1.0/DT)
7046  V_label = " Delta T" + DeltaT
7047  #V_label = V_label + Units
7048  V_label = V_label + ", Freq " + DFreq + " KHz"
7049  # place in upper left unless specified otherwise
7050  x = X0L + 5
7051  y = Y0T + 7
7052  Justify = 'w'
7053  if MarkerLoc == 'UR' or MarkerLoc == 'ur':
7054  x = X0L + GRW - 5
7055  y = Y0T + 7
7056  Justify = 'e'
7057  if MarkerLoc == 'LL' or MarkerLoc == 'll':
7058  x = X0L + 5
7059  y = Y0T + GRH + 7 - (MarkerNum*10)
7060  Justify = 'w'
7061  if MarkerLoc == 'LR' or MarkerLoc == 'lr':
7062  x = X0L + GRW - 5
7063  y = Y0T + GRH + 7
7064  Justify = 'e'
7065  ca.create_text(x, y, text=V_label, fill=COLORtrace5, anchor=Justify, font=("arial", FontSize ))
7066  #
7067 #
7068  SmoothBool = SmoothCurves.get()
7069  # Write the traces if available
7070  if len(T1Vline) > 4: # Avoid writing lines with 1 coordinate
7071  ca.create_line(T1Vline, fill=COLORtrace1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get()) # Write the voltage trace 1
7072  if len(T1Iline) > 4: # Avoid writing lines with 1 coordinate
7073  ca.create_line(T1Iline, fill=COLORtrace3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get()) # Write the current trace 1
7074  if len(T2Vline) > 4: # Write the trace 2 if active
7075  ca.create_line(T2Vline, fill=COLORtrace2, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7076  if len(T2Iline) > 4:
7077  ca.create_line(T2Iline, fill=COLORtrace4, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7078  if len(Tmathline) > 4 and MathTrace.get() > 0: # Write Math tace if active
7079  ca.create_line(Tmathline, fill=COLORtrace5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7080  if len(TMXline) > 4 : # Write X Math tace if active
7081  ca.create_line(TMXline, fill=COLORtrace6, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7082  if len(TMYline) > 4 : # Write Y Math tace if active
7083  ca.create_line(TMYline, fill=COLORtrace7, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7084  if MuxScreenStatus.get() == 1:
7085  if len(TMAVline) > 4: # Avoid writing lines with 1 coordinate
7086  ca.create_line(TMAVline, fill=COLORtrace2, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7087  if len(TMBVline) > 4: # Avoid writing lines with 1 coordinate
7088  ca.create_line(TMBVline, fill=COLORtrace6, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7089  if len(TMCVline) > 4: # Avoid writing lines with 1 coordinate
7090  ca.create_line(TMCVline, fill=COLORtrace7, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7091  if len(TMDVline) > 4: # Avoid writing lines with 1 coordinate
7092  ca.create_line(TMDVline, fill=COLORtrace4, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7093  if ShowRB_V.get() == 1 and len(TMBRline) > 4:
7094  ca.create_line(TMBRline, fill=COLORtraceR6, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7095  if ShowRB_I.get() == 1 and len(TMCRline) > 4:
7096  ca.create_line(TMCRline, fill=COLORtraceR7, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7097  if ShowRA_V.get() == 1 and len(T1VRline) > 4:
7098  ca.create_line(T1VRline, fill=COLORtraceR1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7099  if ShowRA_I.get() == 1 and len(T1IRline) > 4:
7100  ca.create_line(T1IRline, fill=COLORtraceR3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7101  if ShowRB_V.get() == 1 and len(T2VRline) > 4:
7102  ca.create_line(T2VRline, fill=COLORtraceR2, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7103  if ShowRB_I.get() == 1 and len(T2IRline) > 4:
7104  ca.create_line(T2IRline, fill=COLORtraceR4, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7105  if ShowMath.get() == 1 and len(TMRline) > 4:
7106  ca.create_line(TMRline, fill=COLORtraceR5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
7107 
7108  # General information on top of the grid
7109  # Sweep information
7110  if session.continuous:
7111  sttxt = "Running Continuous"
7112  else:
7113  sttxt = "Running Discontinuous"
7114  if TRACEmodeTime.get() == 1:
7115  sttxt = sttxt + " Averaging"
7116  if ManualTrigger.get() == 1:
7117  sttxt = "Manual Trigger"
7118  if (RUNstatus.get() == 0) or (RUNstatus.get() == 3):
7119  sttxt = "Stopped"
7120  if ScreenTrefresh.get() == 1:
7121  sttxt = sttxt + " Persistance ON"
7122  # Delete text at bottom of screen
7123  de = ca.find_enclosed( X0L-1, Y0T+GRH+12, CANVASwidth, Y0T+GRH+100)
7124  for n in de:
7125  ca.delete(n)
7126  # Delete text at top of screen
7127  de = ca.find_enclosed( X0L-1, -1, CANVASwidth, 20)
7128  for n in de:
7129  ca.delete(n)
7130  if LabelPlotText.get() > 0:
7131  txt = PlotLabelText + " Sample rate: " + str(SAMPLErate) + " " + sttxt
7132  else:
7133  txt = "Device ID " + DevID[17:31] + " Sample rate: " + str(SAMPLErate) + " " + sttxt
7134  x = X0L+2
7135  y = 12
7136  ca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
7137  # digital I/O indicators
7138  x2 = X0L + GRW
7139  BoxColor = "#808080" # gray
7140  if DacScreenStatus.get() == 0 and (DigScreenStatus.get() == 1 or MuxScreenStatus.get() == 1):
7141  if D0.get() == 0 and D4.get() == 0:
7142  Dval = devx.ctrl_transfer( 0xc0, 0x91, 4, 0, 0, 1, 100)
7143  if Dval[0] == 1:
7144  BoxColor = "#00ff00" # 100% green
7145  elif Dval[0] == 0:
7146  BoxColor = "#ff0000" # 100% red
7147  ca.create_rectangle(x2-12, 6, x2, 18, fill=BoxColor)
7148  else:
7149  ca.create_rectangle(x2-12, 6, x2, 18, fill="yellow")
7150  if D1.get() == 0 and D5.get() == 0:
7151  Dval = devx.ctrl_transfer( 0xc0, 0x91, 5, 0, 0, 1, 100)
7152  if Dval[0] == 1:
7153  BoxColor = "#00ff00" # 100% green
7154  elif Dval[0] == 0:
7155  BoxColor = "#ff0000" # 100% red
7156  ca.create_rectangle(x2-26, 6, x2-14, 18, fill=BoxColor)
7157  else:
7158  ca.create_rectangle(x2-26, 6, x2-14, 18, fill="yellow")
7159  if D2.get() == 0 and D6.get() == 0:
7160  Dval = devx.ctrl_transfer( 0xc0, 0x91, 6, 0, 0, 1, 100)
7161  if Dval[0] == 1:
7162  BoxColor = "#00ff00" # 100% green
7163  elif Dval[0] == 0:
7164  BoxColor = "#ff0000" # 100% red
7165  ca.create_rectangle(x2-40, 6, x2-28, 18, fill=BoxColor)
7166  else:
7167  ca.create_rectangle(x2-40, 6, x2-28, 18, fill="yellow")
7168  if D3.get() == 0 and D7.get() == 0:
7169  Dval = devx.ctrl_transfer( 0xc0, 0x91, 7, 0, 0, 1, 100)
7170  if Dval[0] == 1:
7171  BoxColor = "#00ff00" # 100% green
7172  elif Dval[0] == 0:
7173  BoxColor = "#ff0000" # 100% red
7174  ca.create_rectangle(x2-54, 6, x2-42, 18, fill=BoxColor)
7175  else:
7176  ca.create_rectangle(x2-54, 6, x2-42, 18, fill="yellow")
7177  ca.create_text(x2-56, 12, text="Digital Inputs", anchor=E, fill=COLORtext)
7178  # Time sweep information and view at information
7179  vx = TIMEdiv/Mulx
7180  if vx >= 1000:
7181  txt = ' {0:.2f} '.format(vx / 1000.0) + " S/div"
7182  if vx < 1000 and vx >= 1:
7183  txt = ' {0:.2f} '.format(vx) + " mS/div"
7184  if vx < 1:
7185  txt = ' {0:.2f} '.format(vx * 1000.0) + " uS/div"
7186 
7187  txt = txt + " "
7188  #
7189  txt = txt + "View at "
7190  if abs(vt) >= 1000:
7191  txt = txt + str(int(vt / 1000.0)) + " S "
7192  if abs(vt) < 1000 and abs(vt) >= 1:
7193  txt = txt + str(int(vt)) + " mS "
7194  if abs(vt) < 1:
7195  txt = txt + str(int(vt * 1000.0)) + " uS "
7196  # print period and frequency of displayed channels
7197  if ShowC1_V.get() == 1 or ShowC2_V.get() == 1:
7198  if ETSDisp.get() > 0:
7199  FindRisingEdge(VBuffA[:int(DISsamples)],VBuffB[:int(DISsamples)])
7200  else:
7201  FindRisingEdge(VBuffA,VBuffB)
7202  if ShowC1_V.get() == 1:
7203  if MeasAHW.get() == 1:
7204  txt = txt + " CA Hi Width = " + ' {0:.3f} '.format(CHAHW/Mulx) + " mS "
7205  if MeasALW.get() == 1:
7206  txt = txt + " CA Lo Width = " + ' {0:.3f} '.format(CHALW/Mulx) + " mS "
7207  if MeasADCy.get() == 1:
7208  txt = txt + " CA DutyCycle = " + ' {0:.1f} '.format(CHADCy) + " % "
7209  if MeasAPER.get() == 1:
7210  txt = txt + " CA Period = " + ' {0:.3f} '.format(CHAperiod/Mulx) + " mS "
7211  if MeasAFREQ.get() == 1:
7212  txt = txt + " CA Freq = "
7213  ChaF = CHAfreq*Mulx
7214  if ChaF < 1000:
7215  V1String = ' {0:.1f} '.format(ChaF)
7216  txt = txt + str(V1String) + " Hz "
7217  if ChaF > 1000 and ChaF < 1000000:
7218  V1String = ' {0:.1f} '.format(ChaF/1000)
7219  txt = txt + str(V1String) + " KHz "
7220  if ChaF > 1000000:
7221  V1String = ' {0:.1f} '.format(ChaF/1000000)
7222  txt = txt + str(V1String) + " MHz "
7223  #txt = txt + " CA Freq = " + ' {0:.1f} '.format(CHAfreq) + " Hz "
7224  if ShowC2_V.get() == 1:
7225  if MeasBHW.get() == 1:
7226  txt = txt + " CB Hi Width = " + ' {0:.3f} '.format(CHBHW/Mulx) + " mS "
7227  if MeasBLW.get() == 1:
7228  txt = txt + " CB Lo Width = " + ' {0:.3f} '.format(CHBLW/Mulx) + " mS "
7229  if MeasBDCy.get() == 1:
7230  txt = txt + " CB DutyCycle = " + ' {0:.1f} '.format(CHBDCy) + " % "
7231  if MeasBPER.get() == 1:
7232  txt = txt + " CB Period = " + ' {0:.3f} '.format(CHBperiod/Mulx) + " mS "
7233  if MeasBFREQ.get() == 1:
7234  txt = txt + " CB Freq = "
7235  ChaF = CHBfreq*Mulx
7236  if ChaF < 1000:
7237  V1String = ' {0:.1f} '.format(ChaF)
7238  txt = txt + str(V1String) + " Hz "
7239  if ChaF > 1000 and ChaF < 1000000:
7240  V1String = ' {0:.1f} '.format(ChaF/1000)
7241  txt = txt + str(V1String) + " KHz "
7242  if ChaF > 1000000:
7243  V1String = ' {0:.1f} '.format(ChaF/1000000)
7244  txt = txt + str(V1String) + " MHz "
7245  #txt = txt + " CB Freq = " + ' {0:.1f} '.format(CHBfreq) + " Hz "
7246  if MuxScreenStatus.get() == 0:
7247  if MeasPhase.get() == 1:
7248  txt = txt + " CA-B Phase = " + ' {0:.1f} '.format(CHABphase) + " deg "
7249  if MeasDelay.get() == 1:
7250  txt = txt + " CB-A Delay = " + ' {0:.3f} '.format(CHBADelayR1) + " mS "
7251 
7252  x = X0L
7253  y = Y0T+GRH+int(2.5 *FontSize) # 20
7254  ca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
7255  if MeasTopV1.get() == 1 or MeasBaseV1.get() == 1 or MeasTopV2.get() == 1 or MeasBaseV2.get() == 1:
7256  MakeHistogram()
7257  txt = " "
7258  if ShowC1_V.get() == 1:
7259  # Channel A information
7260  if CHA_RC_HP.get() == 1:
7261  txt = "CHA: HP "
7262  else:
7263  txt = "CHA: "
7264  txt = txt + str(CH1pdvRange) + " V/div"
7265  if MeasDCV1.get() == 1:
7266  txt = txt + " AvgV = " + ' {0:.4f} '.format(DCV1)
7267  if MeasMaxV1.get() == 1:
7268  txt = txt + " MaxV = " + ' {0:.4f} '.format(MaxV1)
7269  if MeasTopV1.get() == 1:
7270  txt = txt + " Top = " + ' {0:.4f} '.format(VATop)
7271  if MeasMinV1.get() == 1:
7272  txt = txt + " MinV = " + ' {0:.4f} '.format(MinV1)
7273  if MeasBaseV1.get() == 1:
7274  txt = txt + " Base = " + ' {0:.4f} '.format(VABase)
7275  if MeasMidV1.get() == 1:
7276  MidV1 = (MaxV1+MinV1)/2.0
7277  txt = txt + " MidV = " + ' {0:.4f} '.format(MidV1)
7278  if MeasPPV1.get() == 1:
7279  PPV1 = MaxV1-MinV1
7280  txt = txt + " P-PV = " + ' {0:.4f} '.format(PPV1)
7281  if MeasRMSV1.get() == 1:
7282  txt = txt + " RMS = " + ' {0:.4f} '.format(SV1)
7283  if MeasRMSVA_B.get() == 1:
7284  txt = txt + " A-B RMS = " + ' {0:.4f} '.format(SVA_B)
7285  if MeasDiffAB.get() == 1:
7286  txt = txt + " CA-CB = " + ' {0:.4f} '.format(DCV1-DCV2)
7287  if MeasUserA.get() == 1:
7288  try:
7289  TempValue = eval(UserAString)
7290  V1String = ' {0:.4f} '.format(TempValue)
7291  except:
7292  V1String = "####"
7293  txt = txt + UserALabel + " = " + V1String
7294  if (ShowC1_I.get() == 1 and ShowC1_V.get() == 0):
7295  txt = "CHA: "
7296  txt = txt + str(CH1IpdvRange) + " mA/div"
7297  elif (ShowC1_I.get() == 1 and ShowC1_V.get() == 1):
7298  txt = txt + "CHA: "
7299  txt = txt + str(CH1IpdvRange) + " mA/div"
7300  if ShowC1_I.get() == 1:
7301  if MeasDCI1.get() == 1:
7302  V1String = ' {0:.2f} '.format(DCI1)
7303  txt = txt + " AvgI = " + V1String
7304  if AWGAShape.get() == 0: # if this is a DC measurement calc resistance
7305  try:
7306  Resvalue = (DCV1/DCI1)*1000
7307  txt = txt + " Res = " + ' {0:.1f} '.format(Resvalue)
7308  except:
7309  txt = txt + " Res = OverRange"
7310  if MeasMaxI1.get() == 1:
7311  txt = txt + " MaxI = " + ' {0:.2f} '.format(MaxI1)
7312  if MeasMinI1.get() == 1:
7313  txt = txt + " MinI = " + ' {0:.2f} '.format(MinI1)
7314  if MeasMidI1.get() == 1:
7315  MidI1 = (MaxI1+MinI1)/2.0
7316  txt = txt + " MidV = " + ' {0:.2f} '.format(MidI1)
7317  if MeasPPI1.get() == 1:
7318  PPI1 = MaxI1-MinI1
7319  txt = txt + " P-PI = " + ' {0:.2f} '.format(PPI1)
7320  if MeasRMSI1.get() == 1:
7321  txt = txt + " RMS = " + ' {0:.4f} '.format(SI1)
7322 
7323  x = X0L
7324  y = Y0T+GRH+(4*FontSize) # 32
7325  ca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
7326  txt= " "
7327  # Channel B information
7328  if MuxScreenStatus.get() == 1:
7329  txt = "CHB-Mux: "
7330  if Show_CBA.get() > 0:
7331  FindRisingEdge(VBuffA,VBuffMA)
7332  elif Show_CBB.get() > 0:
7333  FindRisingEdge(VBuffA,VBuffMB)
7334  elif Show_CBC.get() > 0:
7335  FindRisingEdge(VBuffA,VBuffMC)
7336  elif Show_CBD.get() > 0:
7337  FindRisingEdge(VBuffA,VBuffMD)
7338  if MeasPhase.get() == 1:
7339  txt = txt + " CA-Mux Phase = " + ' {0:.1f} '.format(CHABphase) + " deg "
7340  if MeasDelay.get() == 1:
7341  txt = txt + " Mux-CA Delay = " + ' {0:.3f} '.format(CHBADelayR1) + " mS "
7342  if MeasUserB.get() == 1:
7343  try:
7344  TempValue = eval(UserBString)
7345  V1String = ' {0:.4f} '.format(TempValue)
7346  except:
7347  V1String = "####"
7348  txt = txt + UserBLabel + " = " + V1String
7349  if ShowC2_V.get() == 1:
7350  if CHB_RC_HP.get() == 1:
7351  txt = "CHB: HP "
7352  else:
7353  txt = "CHB: "
7354  txt = txt + str(CH2pdvRange) + " V/div"
7355  if MeasDCV2.get() == 1:
7356  txt = txt + " AvgV = " + ' {0:.4f} '.format(DCV2)
7357  if MeasMaxV2.get() == 1:
7358  txt = txt + " MaxV = " + ' {0:.4f} '.format(MaxV2)
7359  if MeasTopV2.get() == 1:
7360  txt = txt + " Top = " + ' {0:.4f} '.format(VBTop)
7361  if MeasMinV2.get() == 1:
7362  txt = txt + " MinV = " + ' {0:.4f} '.format(MinV2)
7363  if MeasBaseV2.get() == 1:
7364  txt = txt + " Base = " + ' {0:.4f} '.format(VBBase)
7365  if MeasMidV2.get() == 1:
7366  MidV2 = (MaxV2+MinV2)/2.0
7367  txt = txt + " MidV = " + ' {0:.4f} '.format(MidV2)
7368  if MeasPPV2.get() == 1:
7369  PPV2 = MaxV2-MinV2
7370  txt = txt + " P-PV = " + ' {0:.4f} '.format(PPV2)
7371  if MeasRMSV2.get() == 1:
7372  txt = txt + " RMS = " + ' {0:.4f} '.format(SV2)
7373  if MeasDiffBA.get() == 1:
7374  txt = txt + " CB-CA = " + ' {0:.4f} '.format(DCV2-DCV1)
7375  if MeasUserB.get() == 1:
7376  try:
7377  TempValue = eval(UserBString)
7378  V1String = ' {0:.4f} '.format(TempValue)
7379  except:
7380  V1String = "####"
7381  txt = txt + UserBLabel + " = " + V1String
7382  if (ShowC2_I.get() == 1 and ShowC2_V.get() == 0):
7383  txt = "CHB: "
7384  txt = txt + str(CH2IpdvRange) + " mA/div"
7385  elif (ShowC2_I.get() == 1 and ShowC2_V.get() == 1):
7386  txt = txt + "CHB: "
7387  txt = txt + str(CH2IpdvRange) + " mA/div"
7388  if ShowC2_I.get() == 1:
7389  if MeasDCI2.get() == 1:
7390  V1String = ' {0:.2f} '.format(DCI2)
7391  txt = txt + " AvgI = " + V1String
7392  if AWGBShape.get() == 0: # if this is a DC measurement calc resistance
7393  try:
7394  Resvalue = (DCV2/DCI2)*1000
7395  R1String = ' {0:.1f} '.format(Resvalue)
7396  txt = txt + " Res = " + R1String
7397  except:
7398  txt = txt + " Res = OverRange"
7399  if MeasMaxI2.get() == 1:
7400  txt = txt + " MaxI = " + ' {0:.2f} '.format(MaxI2)
7401  if MeasMinI2.get() == 1:
7402  txt = txt + " MinI = " + ' {0:.2f} '.format(MinI2)
7403  if MeasMidI2.get() == 1:
7404  MidI2 = (MaxI2+MinI2)/2.0
7405  txt = txt + " MidV = " + ' {0:.2f} '.format(MidI2)
7406  if MeasPPI2.get() == 1:
7407  PPI2 = MaxI2-MinI2
7408  txt = txt + " P-PI = " + ' {0:.2f} '.format(PPI2)
7409  if MeasRMSI2.get() == 1:
7410  txt = txt + " RMS = " + ' {0:.4f} '.format(SI2)
7411 
7412  x = X0L
7413  y = Y0T+GRH+int(5.5*FontSize) # 44
7414  ca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
7415 
7417  global TXYline # active trave lines
7418  global Tmathline, TMRline, TXYRline
7419  global X0LXY # Left top X value
7420  global Y0TXY # Left top Y value
7421  global GRWXY # Screenwidth
7422  global GRHXY # Screenheight
7423  global FontSize, LabelPlotText, PlotLabelText
7424  global XYca, MouseX, MouseY, MouseWidget
7425  global ShowXCur, ShowYCur, XCursor, YCursor
7426  global SHOWsamples # Number of samples in data record
7427  global ShowRXY, ShowMath, MathUnits, MathXUnits, MathYUnits
7428  global Xsignal, Ysignal, MathXAxis, MathYAxis
7429  global RUNstatus, SingleShot, ManualTrigger # 0 stopped, 1 start, 2 running, 3 stop now, 4 stop and restart
7430  global CHAsbxy # spinbox Index for channel 1 V
7431  global CHBsbxy # spinbox Index for channel 2 V
7432  global CHAOffset # Offset value for channel 1 V
7433  global CHBOffset # Offset value for channel 2 V
7434  global CHAIsbxy # spinbox Index for channel 1 I
7435  global CHBIsbxy # spinbox Index for channel 2 I
7436  global CHAIOffset # Offset value for channel 1 I
7437  global CHBIOffset # Offset value for channel 2 I
7438  global TMpdiv # Array with time / div values in ms
7439  global TMsb # Time per div spin box variable
7440  global TIMEdiv # current spin box value
7441  global SAMPLErate
7442  global TRIGGERsample, TRIGGERlevel, HoldOff, HoldOffentry
7443  global COLORgrid, COLORzeroline, COLORtext, COLORtrigger, COLORtrace7 # The colors
7444  global COLORtrace1, COLORtrace2, COLORtrace3, COLORtrace4, COLORtrace5
7445  global COLORtraceR1, COLORtraceR2, COLORtraceR3, COLORtraceR4, COLORtraceR5
7446  global CANVASwidthXY, CANVASheightXY, COLORXmarker, COLORYmarker
7447  global TRACErefresh, TRACEmode, TRACEwidth, GridWidth
7448  global ScreenXYrefresh, SmoothCurves
7449  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2, CHAHW, CHALW, CHADCy, CHAperiod, CHAfreq
7450  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2, CHBHW, CHBLW, CHBDCy, CHBperiod, CHBfreq
7451  global SV1, SI1, SV2, SI2, CHABphase
7452  global MeasDCV1, MeasMinV1, MeasMaxV1, MeasMidV1, MeasPPV1
7453  global MeasDCI1, MeasMinI1, MeasMaxI1, MeasMidI1, MeasPPI1
7454  global MeasDCV2, MeasMinV2, MeasMaxV2, MeasMidV2, MeasPPV2
7455  global MeasDCI2, MeasMinI2, MeasMaxI2, MeasMidI2, MeasPPI2
7456  global MeasRMSV1, MeasRMSI1, MeasRMSV2, MeasRMSI2, MeasPhase
7457  global MeasAHW, MeasALW, MeasADCy, MeasAPER, MeasAFREQ
7458  global MeasBHW, MeasBLW, MeasBDCy, MeasBPER, MeasBFREQ
7459  global AWGAShape, AWGBShape
7460  global CHAVGainEntry, CHBVGainEntry, CHAVOffsetEntry, CHBVOffsetEntry
7461  global CHAVPosEntry, CHAIPosEntry, CHAVPosEntry, CHBIPosEntry
7462  global CH1pdvRange, CHAOffset, CH2pdvRange, CHBOffset
7463  global DacScreenStatus, DigScreenStatus
7464  global D0, D1, D2, D3, D4, D5, D6, D7
7465  global DevID, devx, MarkerNum, MarkerScale
7466  global HozPoss, HozPossentry
7467  global HistAsPercent, VBuffA, VBuffB, HBuffA, HBuffB
7468  global VABase, VATop, VBBase, VBTop, UserALabel, UserAString, UserBLabel, UserBString
7469  global MeasTopV1, MeasBaseV1, MeasTopV2, MeasBaseV2, MeasUserA, MeasUserB
7470  #
7471  Ymin = Y0TXY # Minimum position of screen grid (top)
7472  Ymax = Y0TXY + GRHXY # Maximum position of screen grid (bottom)
7473  try:
7474  InOffA = float(eval(CHAVOffsetEntry.get()))
7475  except:
7476  CHAVOffsetEntry.delete(0,END)
7477  CHAVOffsetEntry.insert(0, InOffA)
7478  try:
7479  InGainA = float(eval(CHAVGainEntry.get()))
7480  except:
7481  CHAVGainEntry.delete(0,END)
7482  CHAVGainEntry.insert(0, InGainA)
7483  try:
7484  InOffB = float(eval(CHBVOffsetEntry.get()))
7485  except:
7486  CHBVOffsetEntry.delete(0,END)
7487  CHBVOffsetEntry.insert(0, InOffB)
7488  try:
7489  InGainB = float(eval(CHBVGainEntry.get()))
7490  except:
7491  CHBVGainEntry.delete(0,END)
7492  CHBVGainEntry.insert(0, InGainB)
7493 #
7494  try:
7495  CH1pdvRange = float(eval(CHAsbxy.get()))
7496  except:
7497  CHAsbxy.delete(0,END)
7498  CHAsbxy.insert(0, CH1pdvRange)
7499  try:
7500  CH2pdvRange = float(eval(CHBsbxy.get()))
7501  except:
7502  CHBsbxy.delete(0,END)
7503  CHBsbxy.insert(0, CH2pdvRange)
7504  try:
7505  CH1IpdvRange = float(eval(CHAIsbxy.get()))
7506  except:
7507  CHAIsbxy.delete(0,END)
7508  CHAIsbxy.insert(0, CH1IpdvRange)
7509  try:
7510  CH2IpdvRange = float(eval(CHBIsbxy.get()))
7511  except:
7512  CHBIsbxy.delete(0,END)
7513  CHBIsbxy.insert(0, CH2IpdvRange)
7514  # get the vertical offsets
7515  try:
7516  CHAOffset = float(eval(CHAVPosEntryxy.get()))
7517  except:
7518  CHAVPosEntryxy.delete(0,END)
7519  CHAVPosEntryxy.insert(0, CHAOffset)
7520  try:
7521  CHAIOffset = float(eval(CHAIPosEntryxy.get()))
7522  except:
7523  CHAIPosEntryxy.delete(0,END)
7524  CHAIPosEntryxy.insert(0, CHAIOffset)
7525  try:
7526  CHBOffset = float(eval(CHBVPosEntryxy.get()))
7527  except:
7528  CHBVPosEntry.delete(0,END)
7529  CHBVPosEntry.insert(0, CHBOffset)
7530  try:
7531  CHBIOffset = float(eval(CHBIPosEntryxy.get()))
7532  except:
7533  CHBIPosEntryxy.delete(0,END)
7534  CHBIPosEntryxy.insert(0, CHBIOffset)
7535  # prevent divide by zero error
7536  if CH1pdvRange < 0.001:
7537  CH1pdvRange = 0.001
7538  if CH2pdvRange < 0.001:
7539  CH2pdvRange = 0.001
7540  if CH1IpdvRange < 0.05:
7541  CH1IpdvRange = 0.05
7542  if CH2IpdvRange < 0.05:
7543  CH2IpdvRange = 0.05
7544  # If drawing histograms adjust offset based on range such that bottom grid is zero
7545  if Xsignal.get() == 6:
7546  CHAIOffset = 5 * CH1IpdvRange
7547  if Xsignal.get() == 7:
7548  CHBIOffset = 5 * CH2IpdvRange
7549  if ScreenXYrefresh.get() == 0:
7550  # Delete all items on the screen
7551  MarkerNum = 0
7552  XYca.delete(ALL) # remove all items
7553  # Draw horizontal grid lines
7554  i = 0
7555  x1 = X0LXY
7556  x2 = X0LXY + GRWXY
7557  mg_siz = GRWXY/10.0
7558  mg_inc = mg_siz/5.0
7559  while (i < 11):
7560  y = Y0TXY + i * GRHXY/10.0
7561  Dline = [x1,y,x2,y]
7562  if i == 5:
7563  XYca.create_line(Dline, fill=COLORzeroline, width=GridWidth.get()) # Blue line at center of grid
7564  k = 0
7565  while (k < 10):
7566  l = 1
7567  while (l < 5):
7568  Dline = [x1+k*mg_siz+l*mg_inc,y-5,x1+k*mg_siz+l*mg_inc,y+5]
7569  XYca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
7570  l = l + 1
7571  k = k + 1
7572  else:
7573  XYca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
7574  if Ysignal.get() == 2 or Xsignal.get() == 6:
7575  Iaxis_value = 1.0 * (((5-i) * CH1IpdvRange ) + CHAIOffset)
7576  Iaxis_label = str(round(Iaxis_value, 3))
7577  XYca.create_text(x1-3, y, text=Iaxis_label, fill=COLORtrace3, anchor="e", font=("arial", FontSize ))
7578  elif Ysignal.get() == 4 or Xsignal.get() == 7:
7579  Iaxis_value = 1.0 * (((5-i) * CH2IpdvRange ) + CHBIOffset)
7580  Iaxis_label = str(round(Iaxis_value, 3))
7581  XYca.create_text(x1-3, y, text=Iaxis_label, fill=COLORtrace4, anchor="e", font=("arial", FontSize ))
7582  elif Ysignal.get() == 1:
7583  Vaxis_value = (((5-i) * CH1pdvRange ) + CHAOffset)
7584  Vaxis_label = str(round(Vaxis_value, 3))
7585  XYca.create_text(x1-3, y, text=Vaxis_label, fill=COLORtrace1, anchor="e", font=("arial", FontSize ))
7586  elif Ysignal.get() == 3:
7587  Vaxis_value = (((5-i) * CH2pdvRange ) + CHBOffset)
7588  Vaxis_label = str(round(Vaxis_value, 3))
7589  XYca.create_text(x1-3, y, text=Vaxis_label, fill=COLORtrace2, anchor="e", font=("arial", FontSize ))
7590  elif Ysignal.get() == 5:
7591  TempCOLOR = COLORtrace5
7592  if MathTrace.get() == 2:
7593  Vaxis_value = (((5-i) * CH1pdvRange ) + CHAOffset)
7594  elif MathTrace.get() == 3:
7595  Vaxis_value = (((5-i) * CH2pdvRange ) + CHBOffset)
7596  else:
7597  if MathYAxis == "V-A":
7598  Vaxis_value = (((5-i) * CH1pdvRange ) + CHAOffset)
7599  TempCOLOR = COLORtrace1
7600  elif MathYAxis == "V-B":
7601  Vaxis_value = (((5-i) * CH2pdvRange ) + CHBOffset)
7602  TempCOLOR = COLORtrace2
7603  elif MathYAxis == "I-A":
7604  Vaxis_value = 1.0 * (((5-i) * CH1IpdvRange ) + CHAIOffset)
7605  TempCOLOR = COLORtrace3
7606  elif MathYAxis == "I-B":
7607  Vaxis_value = 1.0 * (((5-i) * CH2IpdvRange ) + CHBIOffset)
7608  TempCOLOR = COLORtrace4
7609  else:
7610  Vaxis_value = (((5-i) * CH1pdvRange ) + CHAOffset)
7611  Vaxis_label = str(round(Vaxis_value, 3))
7612  XYca.create_text(x1-3, y, text=Vaxis_label, fill=TempCOLOR, anchor="e", font=("arial", FontSize ))
7613  i = i + 1
7614  # Draw vertical grid lines
7615  i = 0
7616  y1 = Y0TXY
7617  y2 = Y0TXY + GRHXY
7618  mg_siz = GRHXY/10.0
7619  mg_inc = mg_siz/5.0
7620  #
7621  while (i < 11):
7622  x = X0LXY + i * GRWXY/10.0
7623  Dline = [x,y1,x,y2]
7624  if (i == 5):
7625  XYca.create_line(Dline, fill=COLORzeroline, width=GridWidth.get()) # Blue vertical line at center of grid
7626  k = 0
7627  while (k < 10):
7628  l = 1
7629  while (l < 5):
7630  Dline = [x-5,y1+k*mg_siz+l*mg_inc,x+5,y1+k*mg_siz+l*mg_inc]
7631  XYca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
7632  l = l + 1
7633  k = k + 1
7634  if Xsignal.get() == 1 or Xsignal.get() == 6: #
7635  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7636  Vaxis_label = str(round(Vaxis_value, 3))
7637  XYca.create_text(x, y2+3, text=Vaxis_label, fill=COLORtrace1, anchor="n", font=("arial", FontSize ))
7638  elif Xsignal.get() == 3 or Xsignal.get() == 7:
7639  Vaxis_value = (((i-5) * CH2pdvRange ) + CHBOffset)
7640  Vaxis_label = str(round(Vaxis_value, 3))
7641  XYca.create_text(x, y2+3, text=Vaxis_label, fill=COLORtrace2, anchor="n", font=("arial", FontSize ))
7642  elif Xsignal.get() == 2:
7643  Iaxis_value = 1.0 * (((i-5) * CH1IpdvRange ) + CHAIOffset)
7644  Iaxis_label = str(round(Iaxis_value, 3))
7645  XYca.create_text(x, y2+3, text=Iaxis_label, fill=COLORtrace3, anchor="n", font=("arial", FontSize ))
7646  elif Xsignal.get() == 4:
7647  Iaxis_value = 1.0 * (((i-5) * CH2IpdvRange ) + CHBIOffset)
7648  Iaxis_label = str(round(Iaxis_value, 3))
7649  XYca.create_text(x, y2+3, text=Iaxis_label, fill=COLORtrace4, anchor="n", font=("arial", FontSize ))
7650  elif Xsignal.get() == 5:
7651  TempCOLOR = COLORtrace5
7652  if MathTrace.get() == 2:
7653  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7654  elif MathTrace.get() == 3:
7655  Vaxis_value = (((i-5) * CH2pdvRange ) + CHBOffset)
7656  else:
7657  if MathXAxis == "V-A":
7658  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7659  TempCOLOR = COLORtrace1
7660  elif MathXAxis == "V-B":
7661  Vaxis_value = (((i-5) * CH2pdvRange ) + CHBOffset)
7662  TempCOLOR = COLORtrace2
7663  elif MathXAxis == "I-A":
7664  Vaxis_value = 1.0 * (((i-5) * CH1IpdvRange ) + CHAIOffset)
7665  TempCOLOR = COLORtrace3
7666  elif MathXAxis == "I-B":
7667  Vaxis_value = 1.0 * (((i-5) * CH2IpdvRange ) + CHBIOffset)
7668  TempCOLOR = COLORtrace4
7669  else:
7670  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7671  TempCOLOR = COLORtrace5
7672  Vaxis_label = str(round(Vaxis_value, 3))
7673  XYca.create_text(x, y2+3, text=Vaxis_label, fill=TempCOLOR, anchor="n", font=("arial", FontSize ))
7674  else:
7675  XYca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
7676  if Xsignal.get() == 1 or Xsignal.get() == 6:
7677  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7678  Vaxis_label = str(round(Vaxis_value, 3))
7679  XYca.create_text(x, y2+3, text=Vaxis_label, fill=COLORtrace1, anchor="n", font=("arial", FontSize ))
7680  elif Xsignal.get() == 3 or Xsignal.get() == 7:
7681  Vaxis_value = (((i-5) * CH2pdvRange ) + CHBOffset)
7682  Vaxis_label = str(round(Vaxis_value, 3))
7683  XYca.create_text(x, y2+3, text=Vaxis_label, fill=COLORtrace2, anchor="n", font=("arial", FontSize ))
7684  elif Xsignal.get() == 2:
7685  Iaxis_value = 1.0 * (((i-5) * CH1IpdvRange ) + CHAIOffset)
7686  Iaxis_label = str(round(Iaxis_value, 3))
7687  XYca.create_text(x, y2+3, text=Iaxis_label, fill=COLORtrace3, anchor="n", font=("arial", FontSize ))
7688  elif Xsignal.get() == 4:
7689  Iaxis_value = 1.0 * (((i-5) * CH2IpdvRange ) + CHBIOffset)
7690  Iaxis_label = str(round(Iaxis_value, 3))
7691  XYca.create_text(x, y2+3, text=Iaxis_label, fill=COLORtrace4, anchor="n", font=("arial", FontSize ))
7692  elif Xsignal.get() == 5:
7693  TempCOLOR = COLORtrace5
7694  if MathTrace.get() == 2:
7695  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7696  elif MathTrace.get() == 3:
7697  Vaxis_value = (((i-5) * CH2pdvRange ) + CHBOffset)
7698  else:
7699  if MathXAxis == "V-A":
7700  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7701  TempCOLOR = COLORtrace1
7702  elif MathXAxis == "V-B":
7703  Vaxis_value = (((i-5) * CH2pdvRange ) + CHBOffset)
7704  TempCOLOR = COLORtrace2
7705  elif MathXAxis == "I-A":
7706  Vaxis_value = 1.0 * (((i-5) * CH1IpdvRange ) + CHAIOffset)
7707  TempCOLOR = COLORtrace3
7708  elif MathXAxis == "I-B":
7709  Vaxis_value = 1.0 * (((i-5) * CH2IpdvRange ) + CHBIOffset)
7710  TempCOLOR = COLORtrace4
7711  else:
7712  Vaxis_value = (((i-5) * CH1pdvRange ) + CHAOffset)
7713  Vaxis_label = str(round(Vaxis_value, 3))
7714  XYca.create_text(x, y2+3, text=Vaxis_label, fill=TempCOLOR, anchor="n", font=("arial", FontSize ))
7715  i = i + 1
7716 # Draw traces
7717  if len(TXYline) > 4: # Avoid writing lines with 1 coordinate
7718  if Xsignal.get() == 1:
7719  XYca.create_line(TXYline, fill=COLORtrace1, width=TRACEwidth.get())
7720  elif Xsignal.get() == 2:
7721  XYca.create_line(TXYline, fill=COLORtrace3, width=TRACEwidth.get())
7722  elif Xsignal.get() == 3:
7723  XYca.create_line(TXYline, fill=COLORtrace2, width=TRACEwidth.get())
7724  elif Xsignal.get() == 4:
7725  XYca.create_line(TXYline, fill=COLORtrace4, width=TRACEwidth.get())
7726  elif Xsignal.get() == 5 or Ysignal.get() == 5:
7727  XYca.create_line(TXYline, fill=COLORtrace5, width=TRACEwidth.get())
7728  if len(TXYRline) > 4 and ShowRXY.get() == 1:
7729  XYca.create_line(TXYRline, fill=COLORtraceR1, width=TRACEwidth.get())
7730 # Draw Histogram Traces
7731  if Xsignal.get() == 6:
7732  MakeHistogram()
7733  b = 0
7734  Yconv1 = float(GRHXY/10.0) / CH1IpdvRange
7735  Xconv1 = float(GRWXY/10.0) / CH1pdvRange
7736  y1 = Y0TXY + GRHXY
7737  # print Yconv1, y1
7738  c2 = GRWXY / 2.0 + X0LXY # Hor correction factor
7739  while b < 4999: #
7740  if HistAsPercent == 1: # convert to percent of total sample count
7741  ylo = float(HBuffA[0][b]) / len(VBuffA)
7742  ylo = ylo * 100.0
7743  else:
7744  ylo = HBuffA[0][b] #
7745  ylo = int(y1 - (Yconv1 * ylo))
7746  if ylo > Ymax:
7747  ylo = Ymax
7748  if ylo < Ymin:
7749  ylo = Ymin
7750  xlo = HBuffA[1][b] - CHAOffset
7751  xlo = int(c2 + Xconv1 * xlo)
7752  Dline = [xlo,y1,xlo,ylo]
7753  XYca.create_line(Dline, fill=COLORtrace1)
7754  b = b + 1
7755  if Xsignal.get() == 7:
7756  MakeHistogram()
7757  b = 0
7758  Yconv1 = float(GRHXY/10.0) / CH2IpdvRange
7759  Xconv1 = float(GRWXY/10.0) / CH2pdvRange
7760  y1 = Y0TXY + GRHXY
7761  c2 = GRWXY / 2.0 + X0LXY # Hor correction factor
7762  while b < 4999: #
7763  if HistAsPercent == 1: # convert to percent
7764  ylo = float(HBuffB[0][b]) / len(VBuffB)
7765  ylo = ylo * 100.0
7766  else:
7767  ylo = HBuffB[0][b]
7768  ylo = int(y1 - Yconv1 * ylo)
7769  if ylo > Ymax:
7770  ylo = Ymax
7771  if ylo < Ymin:
7772  ylo = Ymin
7773  xlo = HBuffB[1][b] - CHBOffset
7774  xlo = int(c2 + Xconv1 * xlo)
7775  Dline = [xlo,y1,xlo,ylo]
7776  XYca.create_line(Dline, fill=COLORtrace2)
7777  b = b + 1
7778 # Draw X - Y Cursor lines if required
7779  COLORXmarker = COLORtrace1
7780  COLORYmarker = COLORtrace2
7781  if Xsignal.get() == 1 or Xsignal.get() == 6:
7782  Xconv1 = float(GRWXY/10) / CH1pdvRange
7783  Xoffset1 = CHAOffset
7784  COLORXmarker = COLORtrace1
7785  X_label = " V"
7786  if Xsignal.get() == 2:
7787  Xconv1 = float(GRWXY/10) / CH1IpdvRange
7788  Xoffset1 = CHAIOffset
7789  COLORXmarker = COLORtrace3
7790  X_label = " mA"
7791  if Xsignal.get() == 3 or Xsignal.get() == 7:
7792  Xconv1 = float(GRWXY/10) / CH2pdvRange
7793  Xoffset1 = CHBOffset
7794  COLORXmarker = COLORtrace2
7795  X_label = " V"
7796  if Xsignal.get() == 4:
7797  Xconv1 = float(GRWXY/10) / CH2IpdvRange
7798  Xoffset1 = CHBIOffset
7799  COLORmarker = COLORtrace4
7800  X_label = " mA"
7801  if Xsignal.get() == 5:
7802  X_label = MathXUnits
7803  if MathXAxis == "V-A":
7804  Xconv1 = float(GRWXY/10) / CH1pdvRange
7805  Xoffset1 = CHAOffset
7806  COLORXmarker = COLORtrace1
7807  elif MathXAxis == "V-B":
7808  Xconv1 = float(GRWXY/10) / CH2pdvRange
7809  Xoffset1 = CHBOffset
7810  COLORXmarker = COLORtrace2
7811  elif MathXAxis == "I-A":
7812  Xconv1 = float(GRWXY/10) / CH1IpdvRange
7813  Xoffset1 = CHAIOffset
7814  COLORXmarker = COLORtrace3
7815  elif MathXAxis == "I-B":
7816  Xconv1 = float(GRWXY/10) / CH2IpdvRange
7817  Xoffset1 = CHBIOffset
7818  COLORXmarker = COLORtrace4
7819  else:
7820  Xconv1 = float(GRWXY/10) / CH1pdvRange
7821  Xoffset1 = CHAOffset
7822  COLORXmarker = COLORtrace1
7823 #
7824  if Ysignal.get() == 1 or Ysignal.get() == 6:
7825  Yconv1 = float(GRHXY/10.0) / CH1pdvRange
7826  Yoffset1 = CHAOffset
7827  COLORYmarker = COLORtrace1
7828  Y_label = " V"
7829  if Ysignal.get() == 2:
7830  Yconv1 = float(GRHXY/10.0) / CH1IpdvRange
7831  Yoffset1 = CHAIOffset
7832  COLORYmarker = COLORtrace3
7833  Y_label = " mA"
7834  if Ysignal.get() == 3 or Ysignal.get() == 7:
7835  Yconv1 = float(GRHXY/10.0) / CH2pdvRange
7836  Yoffset1 = CHBOffset
7837  COLORYmarker = COLORtrace2
7838  Y_label = " V"
7839  if Ysignal.get() == 4:
7840  Yconv1 = float(GRHXY/10.0) / CH2IpdvRange
7841  Yoffset1 = CHBIOffset
7842  COLORYmarker = COLORtrace4
7843  Y_label = " mA"
7844  if Ysignal.get() == 5:
7845  Y_label = MathYUnits
7846  if MathYAxis == "V-A":
7847  Yconv1 = float(GRHXY/10.0) / CH1pdvRange
7848  Yoffset1 = CHAOffset
7849  COLORYmarker = COLORtrace1
7850  elif MathYAxis == "V-B":
7851  Yconv1 = float(GRHXY/10.0) / CH2pdvRange
7852  Yoffset1 = CHBOffset
7853  COLORYmarker = COLORtrace2
7854  elif MathYAxis == "I-A":
7855  Yconv1 = float(GRHXY/10.0) / CH1IpdvRange
7856  Yoffset1 = CHAIOffset
7857  COLORYmarker = COLORtrace3
7858  elif MathYAxis == "I-B":
7859  Yconv1 = float(GRHXY/10.0) / CH2IpdvRange
7860  Yoffset1 = CHBIOffset
7861  COLORYmarker = COLORtrace4
7862  else:
7863  Yconv1 = float(GRHXY/10.0) / CH1pdvRange
7864  Yoffset1 = CHAOffset
7865  COLORYmarker = COLORtrace1
7866  if ShowXCur.get() > 0:
7867  Dline = [XCursor, Y0TXY, XCursor, Y0TXY+GRHXY]
7868  XYca.create_line(Dline, dash=(4,3), fill=COLORXmarker, width=GridWidth.get())
7869  c1 = GRWXY / 2.0 + X0LXY # fixed X correction
7870  xvolts = Xoffset1 - ((c1-XCursor)/Xconv1)
7871  XString = ' {0:.3f} '.format(xvolts)
7872  V_label = XString + X_label
7873  XYca.create_text(XCursor+1, YCursor-5, text=V_label, fill=COLORXmarker, anchor="w", font=("arial", FontSize ))
7874  if ShowYCur.get() > 0:
7875  Dline = [X0LXY, YCursor, X0LXY+GRWXY, YCursor]
7876  XYca.create_line(Dline, dash=(4,3), fill=COLORYmarker, width=GridWidth.get())
7877  c1 = GRHXY / 2.0 + Y0TXY # fixed Y correction
7878  yvolts = ((YCursor-c1)/Yconv1) - Yoffset1
7879  V1String = ' {0:.3f} '.format(-yvolts)
7880  V_label = V1String + Y_label
7881  XYca.create_text(XCursor+1, YCursor+5, text=V_label, fill=COLORYmarker, anchor="w", font=("arial", FontSize ))
7882  if ShowXCur.get() == 0 and ShowYCur.get() == 0 and MouseWidget == XYca:
7883  if MouseX > X0LXY and MouseX < X0LXY+GRWXY and MouseY > Y0TXY and MouseY < Y0TXY+GRHXY:
7884  Dline = [MouseX, Y0TXY, MouseX, Y0TXY+GRHXY]
7885  XYca.create_line(Dline, dash=(4,3), fill=COLORXmarker, width=GridWidth.get())
7886  c1 = GRWXY / 2.0 + X0LXY # fixed X correction
7887  xvolts = Xoffset1 - ((c1-XCursor)/Xconv1)
7888  XString = ' {0:.3f} '.format(xvolts)
7889  V_label = XString + X_label
7890  XYca.create_text(MouseX+1, MouseY-5, text=V_label, fill=COLORXmarker, anchor="w", font=("arial", FontSize ))
7891  Dline = [X0LXY, MouseY, X0LXY+GRWXY, MouseY]
7892  XYca.create_line(Dline, dash=(4,3), fill=COLORYmarker, width=GridWidth.get())
7893  c1 = GRHXY / 2 + Y0TXY # fixed Y correction
7894  yvolts = ((MouseY-c1)/Yconv1) - Yoffset1
7895  V1String = ' {0:.3f} '.format(-yvolts)
7896  V_label = V1String + Y_label
7897  XYca.create_text(MouseX+1, MouseY+5, text=V_label, fill=COLORYmarker, anchor="w", font=("arial", FontSize ))
7898 #
7899 # General information on top of the grid
7900 # Sweep information
7901  sttxt = "Running"
7902  if TRACEmodeTime.get() == 1:
7903  sttxt = sttxt + " Averaging"
7904  if ManualTrigger.get() == 1:
7905  sttxt = "Manual Trigger"
7906  if (RUNstatus.get() == 0) or (RUNstatus.get() == 3):
7907  sttxt = "Stopped"
7908  if ScreenXYrefresh.get() == 1:
7909  sttxt = sttxt + " Persistance ON"
7910  # Delete text at bottom of screen
7911  de = XYca.find_enclosed( X0LXY-1, Y0TXY+GRHXY+19, CANVASwidthXY, Y0TXY+GRHXY+100)
7912  for n in de:
7913  XYca.delete(n)
7914  # Delete text at top of screen
7915  de = XYca.find_enclosed( X0LXY-1, -1, CANVASwidthXY, 20)
7916  for n in de:
7917  XYca.delete(n)
7918  if LabelPlotText.get() > 0:
7919  txt = PlotLabelText + " Sample rate: " + str(SAMPLErate) + " " + sttxt
7920  else:
7921  txt = "Device ID " + DevID[17:31] + " Sample rate: " + str(SAMPLErate) + " " + sttxt
7922  x = X0LXY
7923  y = 12
7924  XYca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
7925  # digital I/O indicators
7926  x2 = X0LXY + GRWXY
7927  BoxColor = "#808080" # gray
7928  if DacScreenStatus.get() == 0 and DigScreenStatus.get() == 1 :
7929  if D0.get() == 0 and D4.get() == 0:
7930  Dval = devx.ctrl_transfer( 0xc0, 0x91, 4, 0, 0, 1, 100)
7931  if Dval[0] == 1:
7932  BoxColor = "#00ff00" # 100% green
7933  elif Dval[0] == 0:
7934  BoxColor = "#ff0000" # 100% red
7935  XYca.create_rectangle(x2-12, 6, x2, 18, fill=BoxColor)
7936  else:
7937  XYca.create_rectangle(x2-12, 6, x2, 18, fill="yellow")
7938  if D1.get() == 0 and D5.get() == 0:
7939  Dval = devx.ctrl_transfer( 0xc0, 0x91, 5, 0, 0, 1, 100)
7940  if Dval[0] == 1:
7941  BoxColor = "#00ff00" # 100% green
7942  elif Dval[0] == 0:
7943  BoxColor = "#ff0000" # 100% red
7944  XYca.create_rectangle(x2-26, 6, x2-14, 18, fill=BoxColor)
7945  else:
7946  XYca.create_rectangle(x2-26, 6, x2-14, 18, fill="yellow")
7947  if D2.get() == 0 and D6.get() == 0:
7948  Dval = devx.ctrl_transfer( 0xc0, 0x91, 6, 0, 0, 1, 100)
7949  if Dval[0] == 1:
7950  BoxColor = "#00ff00" # 100% green
7951  elif Dval[0] == 0:
7952  BoxColor = "#ff0000" # 100% red
7953  XYca.create_rectangle(x2-40, 6, x2-28, 18, fill=BoxColor)
7954  else:
7955  XYca.create_rectangle(x2-40, 6, x2-28, 18, fill="yellow")
7956  if D3.get() == 0 and D7.get() == 0:
7957  Dval = devx.ctrl_transfer( 0xc0, 0x91, 7, 0, 0, 1, 100)
7958  if Dval[0] == 1:
7959  BoxColor = "#00ff00" # 100% green
7960  elif Dval[0] == 0:
7961  BoxColor = "#ff0000" # 100% red
7962  XYca.create_rectangle(x2-54, 6, x2-42, 18, fill=BoxColor)
7963  else:
7964  XYca.create_rectangle(x2-54, 6, x2-42, 18, fill="yellow")
7965  XYca.create_text(x2-56, 12, text="Digital Inputs", anchor=E, fill=COLORtext)
7966  # print period and frequency of displayed channels
7967  txt = " "
7968  if Xsignal.get() == 1 or Xsignal.get() == 3:
7969  FindRisingEdge(VBuffA, VBuffB)
7970  if Xsignal.get() == 1:
7971  if MeasAHW.get() == 1:
7972  txt = txt + " CA Hi Width = " + ' {0:.2f} '.format(CHAHW) + " mS "
7973  if MeasALW.get() == 1:
7974  txt = txt + " CA Lo Width = " + ' {0:.2f} '.format(CHALW) + " mS "
7975  if MeasADCy.get() == 1:
7976  txt = txt + " CA DutyCycle = " + ' {0:.1f} '.format(CHADCy) + " % "
7977  if MeasAPER.get() == 1:
7978  txt = txt + " CA Period = " + ' {0:.2f} '.format(CHAperiod) + " mS "
7979  if MeasAFREQ.get() == 1:
7980  txt = txt + " CA Freq = " + ' {0:.1f} '.format(CHAfreq) + " Hz "
7981  if Xsignal.get() == 3:
7982  if MeasBHW.get() == 1:
7983  txt = txt + " CB Hi Width = " + ' {0:.2f} '.format(CHBHW) + " mS "
7984  if MeasBLW.get() == 1:
7985  txt = txt + " CB Lo Width = " + ' {0:.2f} '.format(CHBLW) + " mS "
7986  if MeasBDCy.get() == 1:
7987  txt = txt + " CB DutyCycle = " + ' {0:.1f} '.format(CHBDCy) + " % "
7988  if MeasBPER.get() == 1:
7989  txt = txt + " CB Period = " + ' {0:.2f} '.format(CHBperiod) + " mS "
7990  if MeasBFREQ.get() == 1:
7991  txt = txt + " CB Freq = " + ' {0:.1f} '.format(CHBfreq) + " Hz "
7992  if MeasPhase.get() == 1:
7993  txt = txt + " CA-B Phase = " + ' {0:.1f} '.format(CHABphase) + " deg "
7994 
7995  x = X0LXY
7996  y = Y0TXY+GRHXY+int(2.5*FontSize) # 20
7997  XYca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
7998  txt = " "
7999  if Xsignal.get() == 1 or Ysignal.get() == 1 or Xsignal.get() == 6:
8000  # Channel A information
8001  txt = "CHA: "
8002  txt = txt + str(CH1pdvRange) + " V/div"
8003  if MeasDCV1.get() == 1:
8004  txt = txt + " AvgV = " + ' {0:.4f} '.format(DCV1)
8005  if MeasMaxV1.get() == 1:
8006  txt = txt + " MaxV = " + ' {0:.4f} '.format(MaxV1)
8007  if MeasTopV1.get() == 1:
8008  txt = txt + " Top = " + ' {0:.4f} '.format(VATop)
8009  if MeasMinV1.get() == 1:
8010  txt = txt + " MinV = " + ' {0:.4f} '.format(MinV1)
8011  if MeasBaseV1.get() == 1:
8012  txt = txt + " Top = " + ' {0:.4f} '.format(VABase)
8013  if MeasMidV1.get() == 1:
8014  MidV1 = (MaxV1+MinV1)/2
8015  txt = txt + " MidV = " + ' {0:.4f} '.format(MidV1)
8016  if MeasPPV1.get() == 1:
8017  PPV1 = MaxV1-MinV1
8018  txt = txt + " P-PV = " + ' {0:.4f} '.format(PPV1)
8019  if MeasRMSV1.get() == 1:
8020  txt = txt + " RMS = " + ' {0:.4f} '.format(SV1)
8021  if MeasUserA.get() == 1:
8022  try:
8023  TempValue = eval(UserAString)
8024  V1String = ' {0:.4f} '.format(TempValue)
8025  except:
8026  V1String = "####"
8027  txt = txt + UserALabel + " = " + V1String
8028  if Xsignal.get() == 2:
8029  txt = "CHA: "
8030  txt = txt + str(CH1IpdvRange) + " mA/div"
8031  elif (Xsignal.get() == 2):
8032  txt = txt + "CHA: "
8033  txt = txt + str(CH1IpdvRange) + " mA/div"
8034  if Xsignal.get() == 2 or Ysignal.get() == 2:
8035  if MeasDCI1.get() == 1:
8036  V1String = ' {0:.2f} '.format(DCI1)
8037  txt = txt + " AvgI = " + V1String
8038  if AWGAShape.get() == 0: # if this is a DC measurement calc resistance
8039  try:
8040  Resvalue = (DCV1/DCI1)*1000
8041  txt = txt + " Res = " + ' {0:.1f} '.format(Resvalue)
8042  except:
8043  txt = txt + " Res = OverRange"
8044  if MeasMaxI1.get() == 1:
8045  txt = txt + " MaxI = " + ' {0:.2f} '.format(MaxI1)
8046  if MeasMinI1.get() == 1:
8047  txt = txt + " MinI = " + ' {0:.2f} '.format(MinI1)
8048  if MeasMidI1.get() == 1:
8049  MidI1 = (MaxI1+MinI1)/2
8050  txt = txt + " MidV = " + ' {0:.2f} '.format(MidI1)
8051  if MeasPPI1.get() == 1:
8052  PPI1 = MaxI1-MinI1
8053  txt = txt + " P-PI = " + ' {0:.2f} '.format(PPI1)
8054  if MeasRMSI1.get() == 1:
8055  txt = txt + " RMS = " + ' {0:.4f} '.format(SI1)
8056 
8057  x = X0LXY
8058  y = Y0TXY+GRHXY+int(4*FontSize) # 32
8059  XYca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
8060  txt= " "
8061  # Channel B information
8062  if Xsignal.get() == 3 or Ysignal.get() == 3 or Xsignal.get() == 7:
8063  txt = "CHB: "
8064  txt = txt + str(CH2pdvRange) + " V/div"
8065  if MeasDCV2.get() == 1:
8066  txt = txt + " AvgV = " + ' {0:.4f} '.format(DCV2)
8067  if MeasMaxV2.get() == 1:
8068  txt = txt + " MaxV = " + ' {0:.4f} '.format(MaxV2)
8069  if MeasTopV2.get() == 1:
8070  txt = txt + " Top = " + ' {0:.4f} '.format(VBTop)
8071  if MeasMinV2.get() == 1:
8072  txt = txt + " MinV = " + ' {0:.4f} '.format(MinV2)
8073  if MeasBaseV2.get() == 1:
8074  txt = txt + " Top = " + ' {0:.4f} '.format(VBBase)
8075  if MeasMidV2.get() == 1:
8076  MidV2 = (MaxV2+MinV2)/2
8077  txt = txt + " MidV = " + ' {0:.4f} '.format(MidV2)
8078  if MeasPPV2.get() == 1:
8079  PPV2 = MaxV2-MinV2
8080  txt = txt + " P-PV = " + ' {0:.4f} '.format(PPV2)
8081  if MeasRMSV2.get() == 1:
8082  txt = txt + " RMS = " + ' {0:.4f} '.format(SV2)
8083  if MeasUserB.get() == 1:
8084  try:
8085  TempValue = eval(UserBString)
8086  V1String = ' {0:.4f} '.format(TempValue)
8087  except:
8088  V1String = "####"
8089  txt = txt + UserBLabel + " = " + V1String
8090  if Xsignal.get() == 4:
8091  txt = "CHB: "
8092  txt = txt + str(CH2IpdvRange) + " mA/div"
8093  elif Xsignal.get() == 4:
8094  txt = txt + "CHB: "
8095  txt = txt + str(CH2IpdvRange) + " mA/div"
8096  if Xsignal.get() == 4 or Ysignal.get() == 4:
8097  if MeasDCI2.get() == 1:
8098  V1String = ' {0:.2f} '.format(DCI2)
8099  txt = txt + " AvgI = " + V1String
8100  if AWGBShape.get() == 0: # if this is a DC measurement calc resistance
8101  try:
8102  Resvalue = (DCV2/DCI2)*1000
8103  txt = txt + " Res = " + ' {0:.1f} '.format(Resvalue)
8104  except:
8105  txt = txt + " Res = OverRange"
8106  if MeasMaxI2.get() == 1:
8107  txt = txt + " MaxI = " + ' {0:.2f} '.format(MaxI2)
8108  if MeasMinI2.get() == 1:
8109  txt = txt + " MinI = " + ' {0:.2f} '.format(MinI2)
8110  if MeasMidI2.get() == 1:
8111  MidI2 = (MaxI2+MinI2)/2
8112  txt = txt + " MidV = " + ' {0:.2f} '.format(MidI2)
8113  if MeasPPI2.get() == 1:
8114  PPI2 = MaxI2-MinI2
8115  txt = txt + " P-PI = " + ' {0:.2f} '.format(PPI2)
8116  if MeasRMSI2.get() == 1:
8117  txt = txt + " RMS = " + ' {0:.4f} '.format(SI2)
8118 
8119  x = X0LXY
8120  y = Y0TXY+GRHXY+int(5.5 * FontSize) # 44
8121  XYca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
8122 #
8124  global MarkerScale, CHAlab, CHBlab, CHAIlab, CHBIlab
8125 
8126  if MarkerScale.get() != 1:
8127  MarkerScale.set(1)
8128  CHAlab.config(style="Rtrace1.TButton")
8129  CHBlab.config(style="Strace2.TButton")
8130  CHAIlab.config(style="Strace3.TButton")
8131  CHBIlab.config(style="Strace4.TButton")
8132  else:
8133  MarkerScale.set(0)
8134 #
8136  global MarkerScale, CHAlab, CHBlab, CHAIlab, CHBIlab
8137 
8138  if MarkerScale.get() != 3:
8139  MarkerScale.set(3)
8140  CHAlab.config(style="Strace1.TButton")
8141  CHBlab.config(style="Strace2.TButton")
8142  CHAIlab.config(style="Rtrace3.TButton")
8143  CHBIlab.config(style="Strace4.TButton")
8144  else:
8145  MarkerScale.set(0)
8146 
8148  global MarkerScale, CHAlab, CHBlab, CHAIlab, CHBIlab
8149 
8150  if MarkerScale.get() != 2:
8151  MarkerScale.set(2)
8152  CHAlab.config(style="Strace1.TButton")
8153  CHBlab.config(style="Rtrace2.TButton")
8154  CHAIlab.config(style="Strace3.TButton")
8155  CHBIlab.config(style="Strace4.TButton")
8156  else:
8157  MarkerScale.set(0)
8158 
8160  global MarkerScale, CHAlab, CHBlab, CHAIlab, CHBIlab
8161 
8162  if MarkerScale.get() != 3:
8163  MarkerScale.set(4)
8164  CHAlab.config(style="Strace1.TButton")
8165  CHBlab.config(style="Strace2.TButton")
8166  CHAIlab.config(style="Strace3.TButton")
8167  CHBIlab.config(style="Rtrace4.TButton")
8168  else:
8169  MarkerScale.set(0)
8170 #
8172  global MarkerXYScale, CHAxylab, CHBxylab
8173 
8174  MarkerXYScale.set(1)
8175  CHAxylab.config(style="Rtrace1.TButton")
8176  CHBxylab.config(style="Strace2.TButton")
8177 
8179  global MarkerXYScale, CHAxylab, CHBxylab
8180 
8181  MarkerXYScale.set(2)
8182  CHBxylab.config(style="Rtrace2.TButton")
8183  CHAxylab.config(style="Strace1.TButton")
8184 #
8186  global ShowTCur, ShowVCur, TCursor, VCursor, RUNstatus, ca
8187 
8188  TCursor = event.x
8189  VCursor = event.y
8190  if RUNstatus.get() == 0:
8192  ca.bind_all('<MouseWheel>', onCanvasClickScroll)
8193 
8195  global ShowTCur, ShowVCur, TCursor, VCursor, RUNstatus, ca, MWcount
8196  global MeasGateStatus, MeasGateLeft, MeasGateRight, TIMEdiv, GRW
8197 
8198  ShiftKeyDwn = event.state & 1
8199  if event.widget == ca:
8200  if ShowTCur.get() > 0 or ShowVCur.get() > 0: # move cursors if shown
8201  if ShowTCur.get() > 0 and ShiftKeyDwn == 0:
8202  # respond to Linux or Windows wheel event
8203  if event.num == 5 or event.delta == -120:
8204  TCursor -= 1
8205  if event.num == 4 or event.delta == 120:
8206  TCursor += 1
8207  elif ShowVCur.get() > 0 or ShiftKeyDwn == 1:
8208  # respond to Linux or Windows wheel event
8209  if event.num == 5 or event.delta == -120:
8210  VCursor += 1
8211  if event.num == 4 or event.delta == 120:
8212  VCursor -= 1
8213 
8217  else:
8218  if MeasGateStatus.get() == 1:
8219  Tstep = (TIMEdiv / GRW) / 10 # time in mS per pixel
8220  if ShiftKeyDwn == 0:
8221  if event.num == 5 or event.delta == -120:
8222  MeasGateLeft = MeasGateLeft + (-100 * Tstep)
8223  if event.num == 4 or event.delta == 120:
8224  MeasGateLeft = MeasGateLeft + (100 * Tstep)
8225  # MeasGateLeft = MeasGateLeft + (event.delta * Tstep) #+ HoldOff
8226  if ShiftKeyDwn == 1:
8227  if event.num == 5 or event.delta == -120:
8228  MeasGateRight = MeasGateRight + (-100 * Tstep)
8229  if event.num == 4 or event.delta == 120:
8230  MeasGateRight = MeasGateRight + (100 * Tstep)
8231  #MeasGateRight = MeasGateRight + (event.delta * Tstep) #+ HoldOff
8232  try:
8233  onSpinBoxScroll(event) # if cursor are not showing scroll the Horx time base
8234  except:
8235  donothing()
8236  if RUNstatus.get() == 0:
8238 
8239 def onCanvasUpArrow(event):
8240  global ShowVCur, VCursor, YCursor, dBCursor, BdBCursor, RUNstatus, ca, XYca, Freqca, Bodeca
8241 
8242  shift_key = event.state & 1
8243  if event.widget == ca:
8244  if ShowVCur.get() > 0 and shift_key == 0:
8245  VCursor = VCursor - 1
8246  elif ShowVCur.get() > 0 and shift_key == 1:
8247  VCursor = VCursor - 5
8248  if RUNstatus.get() == 0:
8250  try:
8251  if event.widget == XYca:
8252  if ShowYCur.get() > 0 and shift_key == 0:
8253  YCursor = YCursor - 1
8254  elif ShowYCur.get() > 0 and shift_key == 1:
8255  YCursor = YCursor - 5
8256  if RUNstatus.get() == 0:
8257  UpdateXYScreen()
8258  except:
8259  donothing()
8260  try:
8261  if event.widget == Freqca:
8262  if ShowdBCur.get() > 0 and shift_key == 0:
8263  dBCursor = dBCursor - 1
8264  elif ShowdBCur.get() > 0 and shift_key == 1:
8265  dBCursor = dBCursor - 5
8266  if RUNstatus.get() == 0:
8268  except:
8269  donothing()
8270  try:
8271  if event.widget == Bodeca:
8272  if ShowBdBCur.get() > 0 and shift_key == 0:
8273  BdBCursor = BdBCursor - 1
8274  elif ShowBdBCur.get() > 0 and shift_key == 1:
8275  BdBCursor = BdBCursor - 5
8276  if RUNstatus.get() == 0:
8278  except:
8279  donothing()
8280 
8282  global ShowVCur, VCursor, YCursor, dBCursor, BdBCursor, RUNstatus, ca, XYca, Freqca
8283 
8284  shift_key = event.state & 1
8285  if event.widget == ca:
8286  if ShowVCur.get() > 0 and shift_key == 0:
8287  VCursor = VCursor + 1
8288  elif ShowVCur.get() > 0 and shift_key == 1:
8289  VCursor = VCursor + 5
8290  if RUNstatus.get() == 0:
8292  try:
8293  if event.widget == XYca:
8294  if ShowYCur.get() > 0 and shift_key == 0:
8295  YCursor = YCursor + 1
8296  elif ShowYCur.get() > 0 and shift_key == 1:
8297  YCursor = YCursor + 5
8298  if RUNstatus.get() == 0:
8299  UpdateXYScreen()
8300  except:
8301  donothing()
8302  try:
8303  if event.widget == Freqca:
8304  if ShowdBCur.get() > 0 and shift_key == 0:
8305  dBCursor = dBCursor + 1
8306  elif ShowdBCur.get() > 0 and shift_key == 1:
8307  dBCursor = dBCursor + 5
8308  if RUNstatus.get() == 0:
8310  except:
8311  donothing()
8312  try:
8313  if event.widget == Bodeca:
8314  if ShowBdBCur.get() > 0 and shift_key == 0:
8315  BdBCursor = BdBCursor + 1
8316  elif ShowBdBCur.get() > 0 and shift_key == 1:
8317  BdBCursor = BdBCursor + 5
8318  if RUNstatus.get() == 0:
8320  except:
8321  donothing()
8322 
8324  global ShowTCur, TCursor, XCursor, FCursor, BPCursor, RUNstatus, ca, XYca, Freqca
8325 
8326  shift_key = event.state & 1
8327  if event.widget == ca:
8328  if ShowTCur.get() > 0 and shift_key == 0:
8329  TCursor = TCursor - 1
8330  elif ShowTCur.get() > 0 and shift_key == 1:
8331  TCursor = TCursor - 5
8332  if RUNstatus.get() == 0:
8334  try:
8335  if event.widget == XYca:
8336  if ShowXCur.get() > 0 and shift_key == 0:
8337  XCursor = XCursor - 1
8338  elif ShowXCur.get() > 0 and shift_key == 1:
8339  XCursor = XCursor - 5
8340  if RUNstatus.get() == 0:
8341  UpdateXYScreen()
8342  except:
8343  donothing()
8344  try:
8345  if event.widget == Freqca:
8346  if ShowFCur.get() > 0 and shift_key == 0:
8347  FCursor = FCursor - 1
8348  elif ShowFCur.get() > 0 and shift_key == 1:
8349  FCursor = FCursor - 5
8350  if RUNstatus.get() == 0:
8352  except:
8353  donothing()
8354  try:
8355  if event.widget == Bodeca:
8356  if ShowBPCur.get() > 0 and shift_key == 0:
8357  BPCursor = BPCursor - 1
8358  elif ShowBPCur.get() > 0 and shift_key == 1:
8359  BPCursor = BPCursor - 5
8360  if RUNstatus.get() == 0:
8362  except:
8363  donothing()
8364 
8366  global ShowTCur, TCursor, XCursor, FCursor, BPCursor, RUNstatus, ca, XYca, Freqca
8367 
8368  shift_key = event.state & 1
8369  if event.widget == ca:
8370  if ShowTCur.get() > 0 and shift_key == 0:
8371  TCursor = TCursor + 1
8372  elif ShowTCur.get() > 0 and shift_key == 1:
8373  TCursor = TCursor + 5
8374  if RUNstatus.get() == 0:
8376  try:
8377  if event.widget == XYca:
8378  if ShowXCur.get() > 0 and shift_key == 0:
8379  XCursor = XCursor + 1
8380  elif ShowXCur.get() > 0 and shift_key == 1:
8381  XCursor = XCursor + 5
8382  if RUNstatus.get() == 0:
8383  UpdateXYScreen()
8384  except:
8385  donothing()
8386  try:
8387  if event.widget == Freqca:
8388  if ShowFCur.get() > 0 and shift_key == 0:
8389  FCursor = FCursor + 1
8390  elif ShowFCur.get() > 0 and shift_key == 1:
8391  FCursor = FCursor + 5
8392  if RUNstatus.get() == 0:
8394  except:
8395  donothing()
8396  try:
8397  if event.widget == Bodeca:
8398  if ShowBPCur.get() > 0 and shift_key == 0:
8399  BPCursor = BPCursor + 1
8400  elif ShowBPCur.get() > 0 and shift_key == 1:
8401  BPCursor = BPCursor + 5
8402  if RUNstatus.get() == 0:
8404  except:
8405  donothing()
8406 
8407 def onCanvasSpaceBar(event):
8408  global RUNstatus, ca, XYca, Freqca, Bodeca, IAca
8409 
8410  if event.widget == ca:
8411  if RUNstatus.get() == 0:
8412  BStart()
8413  elif RUNstatus.get() > 0:
8414  BStop()
8415  try:
8416  if event.widget == XYca:
8417  if RUNstatus.get() == 0:
8418  BStart()
8419  elif RUNstatus.get() > 0:
8420  BStop()
8421  except:
8422  donothing()
8423  try:
8424  if event.widget == IAca:
8425  if RUNstatus.get() == 0:
8426  BStart()
8427  elif RUNstatus.get() > 0:
8428  BStop()
8429  except:
8430  donothing()
8431  try:
8432  if event.widget == Freqca:
8433  if RUNstatus.get() == 0:
8434  BStartSA()
8435  elif RUNstatus.get() > 0:
8436  BStopSA()
8437  except:
8438  donothing()
8439  try:
8440  if event.widget == Bodeca:
8441  if RUNstatus.get() == 0:
8442  BStartBP()
8443  elif RUNstatus.get() > 0:
8444  BStopBP()
8445  except:
8446  donothing()
8447 #
8449  global X0L # Left top X value
8450  global Y0T # Left top Y value
8451  global GRW # Screenwidth
8452  global GRH # Screenheight
8453  global FontSize
8454  global ca, MarkerLoc, Mulx
8455  global HoldOffentry, Xsignal, Ysignal, COLORgrid, COLORtext
8456  global TMsb, CHAsb, CHBsb, CHAIsb, CHBIsb, MarkerScale
8457  global CHAVPosEntry, CHAIPosEntry, CHBVPosEntry, CHBIPosEntry
8458  global SAMPLErate, RUNstatus, MarkerNum, PrevV, PrevT
8459  global COLORtrace1, COLORtrace2, MathUnits, MathXUnits, MathYUnits
8460  global CH1pdvRange, CH2pdvRange, CH1IpdvRange, CH2IpdvRange
8461  global CHAOffset, CHAIOffset, CHBOffset, CHBIOffset
8462  global CHB_Asb, CHB_APosEntry, CHB_Bsb, CHB_BPosEntry
8463  global CHB_Csb, CHB_CPosEntry, CHB_Dsb, CHB_DPosEntry
8464  global MeasGateLeft, MeasGateRight, MeasGateStatus, MeasGateNum, TMsb, SAMPLErate
8465 
8466  try:
8467  HoldOff = float(eval(HoldOffentry.get()))
8468  if HoldOff < 0:
8469  HoldOff = 0
8470  except:
8471  HoldOffentry.delete(0,END)
8472  HoldOffentry.insert(0, HoldOff)
8473  # get time scale
8474  try:
8475  TIMEdiv = float(eval(TMsb.get()))
8476  except:
8477  TIMEdiv = 0.5
8478  TMsb.delete(0,"end")
8479  TMsb.insert(0,TIMEdiv)
8480  # prevent divide by zero error
8481  if TIMEdiv < 0.0002:
8482  TIMEdiv = 0.01
8483  # add markers only if stopped
8484  if (RUNstatus.get() == 0):
8485  MarkerNum = MarkerNum + 1
8486  # get the vertical ranges
8487  try:
8488  CH1pdvRange = float(eval(CHAsb.get()))
8489  except:
8490  CHAsb.delete(0,END)
8491  CHAsb.insert(0, CH1pdvRange)
8492  try:
8493  CH2pdvRange = float(eval(CHBsb.get()))
8494  except:
8495  CHBsb.delete(0,END)
8496  CHBsb.insert(0, CH2pdvRange)
8497  try:
8498  CH1IpdvRange = float(eval(CHAIsb.get()))
8499  except:
8500  CHAIsb.delete(0,END)
8501  CHAIsb.insert(0, CH1IpdvRange)
8502  try:
8503  CH2IpdvRange = float(eval(CHBIsb.get()))
8504  except:
8505  CHBIsb.delete(0,END)
8506  CHBIsb.insert(0, CH2IpdvRange)
8507  # get the vertical offsets
8508  try:
8509  CHAOffset = float(eval(CHAVPosEntry.get()))
8510  except:
8511  CHAVPosEntry.delete(0,END)
8512  CHAVPosEntry.insert(0, CHAOffset)
8513  try:
8514  CHAIOffset = float(eval(CHAIPosEntry.get()))
8515  except:
8516  CHAIPosEntry.delete(0,END)
8517  CHAIPosEntry.insert(0, CHAIOffset)
8518  try:
8519  CHBOffset = float(eval(CHBVPosEntry.get()))
8520  except:
8521  CHBVPosEntry.delete(0,END)
8522  CHBVPosEntry.insert(0, CHBOffset)
8523  try:
8524  CHBIOffset = float(eval(CHBIPosEntry.get()))
8525  except:
8526  CHBIPosEntry.delete(0,END)
8527  CHBIPosEntry.insert(0, CHBIOffset)
8528  # prevent divide by zero error
8529  if CH1pdvRange < 0.001:
8530  CH1pdvRange = 0.001
8531  if CH2pdvRange < 0.001:
8532  CH2pdvRange = 0.001
8533  if CH1IpdvRange < 1.0:
8534  CH1IpdvRange = 1.0
8535  if CH2IpdvRange < 1.0:
8536  CH2IpdvRange = 1.0
8537 #
8538  if MuxScreenStatus.get() == 1: # if using analog Mux set up axis controls
8539  try:
8540  CHMApdvRange = float(eval(CHB_Asb.get()))
8541  except:
8542  CHB_Asb.delete(0,END)
8543  CHB_Asb.insert(0, CHMApdvRange)
8544  try:
8545  CHMBpdvRange = float(eval(CHB_Bsb.get()))
8546  except:
8547  CHB_Bsb.delete(0,END)
8548  CHB_Bsb.insert(0, CHMBpdvRange)
8549  try:
8550  CHMCpdvRange = float(eval(CHB_Csb.get()))
8551  except:
8552  CHB_Csb.delete(0,END)
8553  CHB_Csb.insert(0, CHMCpdvRange)
8554  try:
8555  CHMDpdvRange = float(eval(CHB_Dsb.get()))
8556  except:
8557  CHB_Dsb.delete(0,END)
8558  CHB_Dsb.insert(0, CHMDpdvRange)
8559  YconvMA = float(GRH/10.0) / CHMApdvRange
8560  YconvMB = float(GRH/10.0) / CHMBpdvRange
8561  YconvMC = float(GRH/10.0) / CHMCpdvRange
8562  YconvMD = float(GRH/10.0) / CHMDpdvRange
8563  try:
8564  CHBAOffset = float(eval(CHB_APosEntry.get()))
8565  except:
8566  CHB_APosEntry.delete(0,END)
8567  CHB_APosEntry.insert(0, CHBAOffset)
8568  try:
8569  CHBBOffset = float(eval(CHB_BPosEntry.get()))
8570  except:
8571  CHB_BPosEntry.delete(0,END)
8572  CHB_BPosEntry.insert(0, CHBBOffset)
8573  try:
8574  CHBCOffset = float(eval(CHB_CPosEntry.get()))
8575  except:
8576  CHB_CPosEntry.delete(0,END)
8577  CHB_CPosEntry.insert(0, CHBCOffset)
8578  try:
8579  CHBDOffset = float(eval(CHB_DPosEntry.get()))
8580  except:
8581  CHB_DPosEntry.delete(0,END)
8582  CHB_DPosEntry.insert(0, CHBDOffset)
8583  Yoffset1 = CHAOffset
8584  if MarkerScale.get() == 1:
8585  Yconv1 = float(GRH/10.0) / CH1pdvRange
8586  Yoffset1 = CHAOffset
8587  COLORmarker = COLORtrace1
8588  Units = " V"
8589  elif MarkerScale.get() == 2:
8590  Yconv1 = float(GRH/10.0) / CH2pdvRange
8591  Yoffset1 = CHBOffset
8592  COLORmarker = COLORtrace2
8593  Units = " V"
8594  elif MarkerScale.get() == 3:
8595  Yconv1 = float(GRH/10.0) / CH1IpdvRange
8596  Yoffset1 = CHAIOffset
8597  COLORmarker = COLORtrace3
8598  Units = " mA"
8599  elif MarkerScale.get() == 4:
8600  Yconv1 = float(GRH/10.0) / CH2IpdvRange
8601  Yoffset1 = CHBIOffset
8602  COLORmarker = COLORtrace4
8603  Units = " mA"
8604  # Aanalog Mux settings
8605  elif MarkerScale.get() == 5:
8606  Yconv1 = float(GRH/10.0) / CHMApdvRange
8607  Yoffset1 = CHBAOffset
8608  COLORmarker = COLORtrace2
8609  Units = " V"
8610  elif MarkerScale.get() == 6:
8611  Yconv1 = float(GRH/10.0) / CHMBpdvRange
8612  Yoffset1 = CHBBOffset
8613  COLORmarker = COLORtrace6
8614  Units = " V"
8615  elif MarkerScale.get() == 7:
8616  Yconv1 = float(GRH/10.0) / CHMCpdvRange
8617  Yoffset1 = CHBCOffset
8618  COLORmarker = COLORtrace7
8619  Units = " V"
8620  elif MarkerScale.get() == 8:
8621  Yconv1 = float(GRH/10.0) / CHMDpdvRange
8622  Yoffset1 = CHBDOffset
8623  COLORmarker = COLORtrace4
8624  Units = " V"
8625  else:
8626  Yconv1 = float(GRH/10.0) / CH1pdvRange
8627  Yoffset1 = CHAOffset
8628  COLORmarker = COLORtrace1
8629  Units = " V"
8630  #
8631  c1 = GRH / 2.0 + Y0T # fixed correction channel A
8632  xc1 = GRW / 2.0 + X0L
8633  c2 = GRH / 2.0 + Y0T # fixed correction channel B
8634  # draw X at marker point and number
8635  ca.create_line(event.x-4, event.y-4,event.x+4, event.y+5, fill=COLORtext)
8636  ca.create_line(event.x+4, event.y-4,event.x-4, event.y+5, fill=COLORtext)
8637  # DISsamples = (10.0 * TIMEdiv) # grid width in time
8638  Tstep = (10.0 * TIMEdiv) / GRW # time in mS per pixel
8639  Tpoint = ((event.x-X0L) * Tstep) + HoldOff
8640  #
8641  Tpoint = Tpoint/Mulx
8642  if Tpoint >= 1000:
8643  axis_value = Tpoint / 1000.0
8644  TString = ' {0:.2f} '.format(axis_value) + " S "
8645  if Tpoint < 1000 and Tpoint >= 1:
8646  axis_value = Tpoint
8647  TString = ' {0:.2f} '.format(axis_value) + " mS "
8648  if Tpoint < 1:
8649  axis_value = Tpoint * 1000.0
8650  TString = ' {0:.2f} '.format(axis_value) + " uS "
8651  # TString = ' {0:.2f} '.format(Tpoint)
8652  yvolts = ((event.y-c1)/Yconv1) - Yoffset1
8653  if MarkerScale.get() == 1 or MarkerScale.get() == 2:
8654  V1String = ' {0:.3f} '.format(-yvolts)
8655  else:
8656  V1String = ' {0:.1f} '.format(-yvolts)
8657  V_label = str(MarkerNum) + " " + TString + V1String
8658  V_label = V_label + Units
8659  if MarkerNum > 1:
8660  if MarkerScale.get() == 1 or MarkerScale.get() == 2:
8661  DeltaV = ' {0:.3f} '.format(PrevV-yvolts)
8662  else:
8663  DeltaV = ' {0:.1f} '.format(PrevV-yvolts)
8664  DT = (Tpoint-PrevT)
8665  if Tpoint >= 1000:
8666  axis_value = DT / 1000.0
8667  DeltaT = ' {0:.2f} '.format(axis_value) + " S "
8668  if Tpoint < 1000 and Tpoint >= 1:
8669  axis_value = DT
8670  DeltaT = ' {0:.2f} '.format(axis_value) + " mS "
8671  if Tpoint < 1:
8672  axis_value = DT * 1000.0
8673  DeltaT = ' {0:.2f} '.format(axis_value) + " uS "
8674  # DeltaT = ' {0:.3f} '.format(Tpoint-PrevT)
8675  DFreq = ' {0:.3f} '.format(1.0/(Tpoint-PrevT))
8676  V_label = V_label + " Delta " + DeltaT + DeltaV
8677  V_label = V_label + Units
8678  V_label = V_label + ", Freq " + DFreq + " KHz"
8679  # place in upper left unless specified otherwise
8680  x = X0L + 5
8681  y = Y0T + 3 + (MarkerNum*10)
8682  Justify = 'w'
8683  if MarkerLoc == 'UR' or MarkerLoc == 'ur':
8684  x = X0L + GRW - 5
8685  y = Y0T + 3 + (MarkerNum*10)
8686  Justify = 'e'
8687  if MarkerLoc == 'LL' or MarkerLoc == 'll':
8688  x = X0L + 5
8689  y = Y0T + GRH + 3 - (MarkerNum*10)
8690  Justify = 'w'
8691  if MarkerLoc == 'LR' or MarkerLoc == 'lr':
8692  x = X0L + GRW - 5
8693  y = Y0T + GRH + 3 - (MarkerNum*10)
8694  Justify = 'e'
8695  ca.create_text(event.x+4, event.y, text=str(MarkerNum), fill=COLORtext, anchor=Justify, font=("arial", FontSize ))
8696  ca.create_text(x, y, text=V_label, fill=COLORmarker, anchor=Justify, font=("arial", FontSize ))
8697  PrevV = yvolts
8698  PrevT = Tpoint
8699  else:
8700  if MeasGateStatus.get() == 1:
8701  #DISsamples = (10.0 * TIMEdiv) # grid width in time
8702  Tstep = (10.0 * TIMEdiv) / GRW # time in mS per pixel
8703  if MeasGateNum == 0:
8704  MeasGateLeft = ((event.x-X0L) * Tstep) #+ HoldOff
8705  MeasGateNum = 1
8706  else:
8707  MeasGateRight = ((event.x-X0L) * Tstep) #+ HoldOff
8708  MeasGateNum = 0
8709  LeftGate = X0L + MeasGateLeft / Tstep
8710  RightGate = X0L + MeasGateRight / Tstep
8711  ca.create_line(LeftGate, Y0T, LeftGate, Y0T+GRH, fill=COLORtext)
8712  ca.create_line(RightGate, Y0T, RightGate, Y0T+GRH, fill=COLORtext)
8713 
8714 #
8715 def onCanvasOne(event):
8716  global ShowC1_V
8717 
8718  if ShowC1_V.get() == 0:
8719  ShowC1_V.set(1)
8720  else:
8721  ShowC1_V.set(0)
8722 #
8723 def onCanvasTwo(event):
8724  global ShowC2_V
8725 
8726  if ShowC2_V.get() == 0:
8727  ShowC2_V.set(1)
8728  else:
8729  ShowC2_V.set(0)
8730 #
8731 def onCanvasThree(event):
8732  global ShowC1_I
8733 
8734  if ShowC1_I.get() == 0:
8735  ShowC1_I.set(1)
8736  else:
8737  ShowC1_I.set(0)
8738 #
8739 def onCanvasFour(event):
8740  global ShowC2_I
8741 
8742  if ShowC2_I.get() == 0:
8743  ShowC2_I.set(1)
8744  else:
8745  ShowC2_I.set(0)
8746 #
8747 def onCanvasFive(event):
8748  global MathTrace
8749 
8750  MathTrace.set(1)
8751 #
8752 def onCanvasSix(event):
8753  global MathTrace
8754 
8755  MathTrace.set(2)
8756 #
8757 def onCanvasSeven(event):
8758  global MathTrace
8759 
8760  MathTrace.set(3)
8761 #
8762 def onCanvasEight(event):
8763  global MathTrace
8764 
8765  MathTrace.set(10)
8766 #
8767 def onCanvasNine(event):
8768  global MathTrace
8769 
8770  MathTrace.set(12)
8771 #
8772 def onCanvasZero(event):
8773  global MathTrace
8774 
8775  MathTrace.set(0)
8776 #
8777 def onCanvasTrising(event):
8778  global TgEdge
8779 
8780  TgEdge.set(0)
8781 #
8782 def onCanvasTfalling(event):
8783  global TgEdge
8784 
8785  TgEdge.set(1)
8786 #
8787 def onCanvasSnap(event):
8788 
8789  BSnapShot()
8790 #
8791 def onCanvasAverage(event):
8792  global TRACEmodeTime
8793 
8794  if TRACEmodeTime.get() == 0:
8795  TRACEmodeTime.set(1)
8796  else:
8797  TRACEmodeTime.set(0)
8798 #
8799 def onCanvasShowTcur(event):
8800  global ShowTCur
8801 
8802  if ShowTCur.get() == 0:
8803  ShowTCur.set(1)
8804  else:
8805  ShowTCur.set(0)
8806 #
8807 def onCanvasShowVcur(event):
8808  global ShowVCur
8809 
8810  if ShowVCur.get() == 0:
8811  ShowVCur.set(1)
8812  else:
8813  ShowVCur.set(0)
8814 #
8816  global ShowXCur, ShowYCur, XCursor, YCursor, RUNstatus, XYca
8817 
8818  XCursor = event.x
8819  YCursor = event.y
8820  if RUNstatus.get() == 0:
8821  UpdateXYScreen()
8822  XYca.bind_all('<MouseWheel>', onCanvasXYScrollClick)
8823 #
8825  global ShowXCur, ShowYCur, XCursor, YCursor, RUNstatus
8826  if event.widget == XYca:
8827  if ShowXCur.get() > 0 or ShowYCur.get() > 0: # move cursors if shown
8828  ShiftKeyDwn = event.state & 1
8829  if ShowXCur.get() > 0 and ShiftKeyDwn == 0:
8830  # respond to Linux or Windows wheel event
8831  if event.num == 5 or event.delta == -120:
8832  XCursor -= 1
8833  if event.num == 4 or event.delta == 120:
8834  XCursor += 1
8835  # XCursor = XCursor + event.delta/100
8836  elif ShowYCur.get() > 0 or ShiftKeyDwn == 1:
8837  # respond to Linux or Windows wheel event
8838  if event.num == 5 or event.delta == -120:
8839  YCursor += 1
8840  if event.num == 4 or event.delta == 120:
8841  YCursor -= 1
8842  #YCursor = YCursor - event.delta/100
8843  if RUNstatus.get() == 0:
8844  UpdateXYScreen()
8845 #
8847  global X0LXY # Left top X value
8848  global Y0TXY # Left top Y value
8849  global GRWXY # Screenwidth
8850  global GRHXY # Screenheight
8851  global FontSize
8852  global XYca
8853  global HoldOffentry, Xsignal, Ysignal, COLORgrid, COLORtext
8854  global TMsb, CHAsbxy, CHBsbxy, CHAIsbxy, CHBIsbxy, MarkerScale
8855  global CHAVPosEntryxy, CHAIPosEntryxy, CHBVPosEntryxy, CHBIPosEntryxy
8856  global SAMPLErate, RUNstatus, MarkerNum, PrevX, PrevY
8857  global COLORtrace1, COLORtrace2, MathUnits, MathXUnits, MathYUnits
8858  global CH1pdvRange, CH2pdvRange, CH1IpdvRange, CH2IpdvRange
8859  global CHAOffset, CHAIOffset, CHBOffset, CHBIOffset
8860  # add markers only if stopped
8861  #
8862  if (RUNstatus.get() == 0):
8863  MarkerNum = MarkerNum + 1
8864  try:
8865  CH1pdvRange = float(eval(CHAsbxy.get()))
8866  except:
8867  CHAsbxy.delete(0,END)
8868  CHAsbxy.insert(0, CH1pdvRange)
8869  try:
8870  CH2pdvRange = float(eval(CHBsbxy.get()))
8871  except:
8872  CHBsb.delete(0,END)
8873  CHBsb.insert(0, CH2pdvRange)
8874  try:
8875  CH1IpdvRange = float(eval(CHAIsbxy.get()))
8876  except:
8877  CHAIsbxy.delete(0,END)
8878  CHAIsbxy.insert(0, CH1IpdvRange)
8879  try:
8880  CH2IpdvRange = float(eval(CHBIsbxy.get()))
8881  except:
8882  CHBIsbxy.delete(0,END)
8883  CHBIsbxy.insert(0, CH2IpdvRange)
8884  # get the vertical offsets
8885  try:
8886  CHAOffset = float(eval(CHAVPosEntryxy.get()))
8887  except:
8888  CHAVPosEntryxy.delete(0,END)
8889  CHAVPosEntryxy.insert(0, CHAOffset)
8890  try:
8891  CHAIOffset = float(eval(CHAIPosEntryxy.get()))
8892  except:
8893  CHAIPosEntryxy.delete(0,END)
8894  CHAIPosEntryxy.insert(0, CHAIOffset)
8895  try:
8896  CHBOffset = float(eval(CHBVPosEntryxy.get()))
8897  except:
8898  CHBVPosEntryxy.delete(0,END)
8899  CHBVPosEntryxy.insert(0, CHBOffset)
8900  try:
8901  CHBIOffset = float(eval(CHBIPosEntryxy.get()))
8902  except:
8903  CHBIPosEntryxy.delete(0,END)
8904  CHBIPosEntryxy.insert(0, CHBIOffset)
8905  # prevent divide by zero error
8906  if CH1pdvRange < 0.001:
8907  CH1pdvRange = 0.001
8908  if CH2pdvRange < 0.001:
8909  CH2pdvRange = 0.001
8910  if CH1IpdvRange < 1.0:
8911  CH1IpdvRange = 1.0
8912  if CH2IpdvRange < 1.0:
8913  CH2IpdvRange = 1.0
8914  try:
8915  HoldOff = float(eval(HoldOffentry.get()))
8916  if HoldOff < 0:
8917  HoldOff = 0
8918  except:
8919  HoldOffentry.delete(0,END)
8920  HoldOffentry.insert(0, HoldOff)
8921  #
8922  Yconv1 = float(GRHXY/10) / CH1pdvRange # Conversion factors from samples to screen points
8923  Xconv1 = float(GRWXY/10) / CH1pdvRange
8924  Yconv2 = float(GRHXY/10) / CH2pdvRange
8925  Xconv2 = float(GRWXY/10) / CH2pdvRange
8926  YIconv1 = float(GRHXY/10) / CH1IpdvRange
8927  YIconv2 = float(GRHXY/10) / CH2IpdvRange
8928  COLORmarker = COLORtext
8929  Yoffset1 = CHAOffset
8930  c1 = GRHXY / 2 + Y0TXY # fixed correction channel A
8931  xc1 = GRWXY / 2 + X0LXY
8932  c2 = GRHXY / 2 + Y0TXY # fixed correction channel B
8933  # draw X at marker point and number
8934  XYca.create_line(event.x-4, event.y-4,event.x+4, event.y+5, fill=COLORtext)
8935  XYca.create_line(event.x+4, event.y-4,event.x-4, event.y+5, fill=COLORtext)
8936  XYca.create_text(event.x+4, event.y, text=str(MarkerNum), fill=COLORtext, anchor="w", font=("arial", FontSize ))
8937  V_label = str(MarkerNum) + " "
8938  x = X0LXY + 5
8939  y = Y0TXY + 3 + (MarkerNum*10)
8940  xvolts = ((xc1-event.x)/Xconv1) - CHAOffset # preset the variable
8941  if (Xsignal.get()==1 or Xsignal.get()==5) and (Ysignal.get()==3 or Ysignal.get()==5):
8942  yvolts = ((event.y-c2)/Yconv2) - CHBOffset
8943  xvolts = ((xc1-event.x)/Xconv1) - CHAOffset
8944  VyString = ' {0:.3f} '.format(-yvolts)
8945  VxString = ' {0:.3f} '.format(-xvolts)
8946  V_label = V_label + VxString + " V, " + VyString + " V"
8947  if MarkerNum > 1:
8948  DeltaY = ' {0:.3f} '.format(PrevY-yvolts)
8949  DeltaX = ' {0:.3f} '.format(PrevX-xvolts)
8950  V_label = V_label + " Delta " + DeltaX + " V, " + DeltaY + " V"
8951  PrevY = yvolts
8952  elif (Xsignal.get()==3 or Xsignal.get()==5) and (Ysignal.get()==1 or Ysignal.get()==5):
8953  yvolts = ((event.y-c1)/Yconv1) - CHAOffset
8954  xvolts = ((xc1-event.x)/Xconv2) - CHBOffset
8955  VyString = ' {0:.3f} '.format(-yvolts)
8956  VxString = ' {0:.3f} '.format(-xvolts)
8957  V_label = V_label + VxString + " V, " + VyString + " V"
8958  if MarkerNum > 1:
8959  DeltaY = ' {0:.3f} '.format(PrevY-yvolts)
8960  DeltaX = ' {0:.3f} '.format(PrevX-xvolts)
8961  V_label = V_label + " Delta " + DeltaX + " V, " + DeltaY + " V"
8962  PrevY = yvolts
8963  elif (Xsignal.get()==1 or Xsignal.get()==5) and (Ysignal.get()==2 or Ysignal.get()==5):
8964  xvolts = ((xc1-event.x)/Xconv1) - CHAOffset
8965  ymA = ((event.y-c2)/YIconv1) - CHAIOffset
8966  VxString = ' {0:.3f} '.format(-xvolts)
8967  VyString = ' {0:.1f} '.format(-ymA)
8968  V_label = V_label + VxString + " V, " + VyString + " mA"
8969  if MarkerNum > 1:
8970  DeltaY = ' {0:.2f} '.format(PrevY-ymA)
8971  DeltaX = ' {0:.3f} '.format(PrevX-xvolts)
8972  DeltaR = ' {0:.3f} '.format(((PrevX-xvolts)/(PrevY-ymA))*1000)
8973  V_label = V_label + " Delta " + DeltaX + " V, " + DeltaY + " mA"
8974  V_label = V_label + ", dV/dI " + DeltaR
8975  PrevY = ymA
8976  elif (Xsignal.get()==3 or Xsignal.get()==5) and (Ysignal.get()==4 or Ysignal.get()==5):
8977  xvolts = ((xc1-event.x)/Xconv2) - CHBOffset
8978  ymA = ((event.y-c2)/YIconv2) - CHBIOffset
8979  VxString = ' {0:.3f} '.format(-xvolts)
8980  VyString = ' {0:.1f} '.format(-ymA)
8981  V_label = V_label + VxString + " V, " + VyString + " mA"
8982  if MarkerNum > 1:
8983  DeltaY = ' {0:.2f} '.format(PrevY-ymA)
8984  DeltaX = ' {0:.3f} '.format(PrevX-xvolts)
8985  DeltaR = ' {0:.3f} '.format(((PrevX-xvolts)/(PrevY-ymA))*1000)
8986  V_label = V_label + " Delta " + DeltaX + " V, " + DeltaY + " mA"
8987  V_label = V_label + ", dV/dI " + DeltaR
8988  PrevY = ymA
8989  elif (Xsignal.get()==3 or Xsignal.get()==5) and (Ysignal.get()==2 or Ysignal.get()==5):
8990  xvolts = ((xc1-event.x)/Xconv2) - CHBOffset
8991  ymA = ((event.y-c2)/YIconv1) - CHAIOffset
8992  VxString = ' {0:.3f} '.format(-xvolts)
8993  VyString = ' {0:.1f} '.format(-ymA)
8994  V_label = V_label + VxString + " V, " + VyString + " mA"
8995  if MarkerNum > 1:
8996  DeltaY = ' {0:.2f} '.format(PrevY-ymA)
8997  DeltaX = ' {0:.3f} '.format(PrevX-xvolts)
8998  DeltaR = ' {0:.3f} '.format(((PrevX-xvolts)/(PrevY-ymA))*1000)
8999  V_label = V_label + " Delta " + DeltaX + " V, " + DeltaY + " mA"
9000  V_label = V_label + ", dV/dI " + DeltaR
9001  PrevY = ymA
9002  elif (Xsignal.get()==1 or Xsignal.get()==5) and (Ysignal.get()==4 or Ysignal.get()==5):
9003  xvolts = ((xc1-event.x)/Xconv1) - CHAOffset
9004  ymA = ((event.y-c2)/YIconv2) - CHBIOffset
9005  VxString = ' {0:.3f} '.format(-xvolts)
9006  VyString = ' {0:.1f} '.format(-ymA)
9007  V_label = V_label + VxString + " V, " + VyString + " mA"
9008  if MarkerNum > 1:
9009  DeltaY = ' {0:.2f} '.format(PrevY-ymA)
9010  DeltaX = ' {0:.3f} '.format(PrevX-xvolts)
9011  DeltaR = ' {0:.3f} '.format(((PrevX-xvolts)/(PrevY-ymA))*1000)
9012  V_label = V_label + " Delta " + DeltaX + " V, " + DeltaY + " mA"
9013  V_label = V_label + ", dV/dI " + DeltaR
9014  PrevY = ymA
9015  XYca.create_text(x, y, text=V_label, fill=COLORtext, anchor="w", font=("arial", FontSize ))
9016  PrevX = xvolts
9017 #
9018 def SchroederPhase(Length, NrTones, Ampl):
9019  # Generate a Schroeder Phase (Chirp) of Length samples and having NrTones
9020  OutArray = []
9021  OutArray = Ampl*numpy.cos(numpy.linspace(0, 2*numpy.pi, Length)) # the fundamental
9022  k = 2
9023  while k <= NrTones:
9024  # Add all harmonics up to NrTones
9025  Harmonic = Ampl*numpy.cos(numpy.linspace(0, k*2*numpy.pi, Length)+(numpy.pi*k*k/NrTones))
9026  OutArray = OutArray + Harmonic
9027  k = k + 1
9028  OutArray = OutArray + 2.5 # Center wavefrom on 2.5 V
9029  return(OutArray)
9030 #
9031 def Wrap(InArray, WrFactor):
9032  # Build new array by skipping WrFactor samples and wrapping back around
9033  # [1,2,3,4,5,6} becomes [1,3,5,2,4,6]
9034  # effectively multiplies the frequency content by WrFactor
9035  OutArray = []
9036  OutArray = numpy.array(OutArray)
9037  InArray = numpy.array(InArray)
9038  EndIndex = len(InArray)
9039  StartIndex = 0
9040  while StartIndex < WrFactor:
9041  OutArray = numpy.concatenate((OutArray, InArray[StartIndex:EndIndex:WrFactor]), axis=0)
9042  StartIndex = StartIndex + 1
9043  return OutArray
9044 #
9045 def UnWrap(InArray, WrFactor):
9046  # Build new array by splitting arrray into WrFactor sections and interleaving samples from each section
9047  # [1,2,3,4,5,6} becomes [1,4,2,5,3,6]
9048  # effectively divided the frequency content by WrFactor
9049  OutArray = []
9050  InArray = numpy.array(InArray)
9051  EndIndex = int(len(InArray)/WrFactor)
9052  StartIndex = 0
9053  while StartIndex < EndIndex:
9054  LoopIndex = 0
9055  while LoopIndex < WrFactor:
9056  OutArray.append(InArray[StartIndex+LoopIndex])
9057  LoopIndex = LoopIndex + 1
9058  StartIndex = StartIndex + 1
9059  OutArray = numpy.array(OutArray)
9060  return OutArray
9061 #
9062 def Write_WAV(data, repeat, filename):
9063  global SAMPLErate
9064  # write data array to mono .wav file 100KSPS
9065  # copy buffer repeat times in output file
9066  # Use : Write_WAV(VBuffB, 2, "write_wave_1.wav")
9067  wavfile = wave.open(filename, "w")
9068  nchannels = 1
9069  sampwidth = 2
9070  framerate = SAMPLErate
9071  amplitude = 32766
9072  nframes = len(data)
9073  comptype = "NONE"
9074  compname = "not compressed"
9075  wavfile.setparams((nchannels,
9076  sampwidth,
9077  framerate,
9078  nframes,
9079  comptype,
9080  compname))
9081  # Normalize data
9082  ArrN = numpy.array(data)
9083  ArrN /= numpy.max(numpy.abs(data))
9084  frames = []
9085  for s in ArrN:
9086  mul = int(s * amplitude)
9087  # print "s: %f mul: %d" % (s, mul)
9088  frames.append(struct.pack('h', mul))
9089  print( len(frames))
9090  frames = ''.join(frames)
9091  print( len(frames))
9092  for x in xrange(0, repeat):
9093  print( x )
9094  wavfile.writeframes(frames)
9095  wavfile.close()
9096 
9097 # =========== Awg functions ==================
9098 def BAWGAAmpl(temp):
9099  global AWGAAmplEntry, AWGAAmplvalue, AWGAMode, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9100  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9101 
9102  try:
9103  AWGAAmplvalue = float(eval(AWGAAmplEntry.get()))
9104  except:
9105  AWGAAmplEntry.delete(0,"end")
9106  AWGAAmplEntry.insert(0, AWGAAmplvalue)
9107  #
9108  if AWG_Amp_Mode.get() == 0: # 0 = Min/Max mode
9109  if AWGAMode.get() == 0: # Source Voltage measure current mode
9110  if AWGAAmplvalue > 5.00:
9111  AWGAAmplvalue = 5.00
9112  AWGAAmplEntry.delete(0,"end")
9113  AWGAAmplEntry.insert(0, AWGAAmplvalue)
9114  if AWGAAmplvalue < 0.00:
9115  AWGAAmplvalue = 0.00
9116  AWGAAmplEntry.delete(0,"end")
9117  AWGAAmplEntry.insert(0, AWGAAmplvalue)
9118  elif AWG_Amp_Mode.get() == 1: # 1 = Amp/Offset
9119  if AWGAMode.get() == 0: # Source Voltage measure current mode
9120  if AWGAAmplvalue > (2.5 / AWGA_Ext_Gain.get()):
9121  AWGAAmplvalue = 2.5 / AWGA_Ext_Gain.get()
9122  AWGAAmplEntry.delete(0,"end")
9123  AWGAAmplEntry.insert(0, AWGAAmplvalue)
9124  if AWGAAmplvalue < (-2.50 / AWGA_Ext_Gain.get()):
9125  AWGAAmplvalue = -2.50 / AWGA_Ext_Gain.get()
9126  AWGAAmplEntry.delete(0,"end")
9127  AWGAAmplEntry.insert(0, AWGAAmplvalue)
9128  if AWGAMode.get() == 1: # Source current measure voltage mode
9129  if AWGAAmplvalue > 200.00:
9130  AWGAAmplvalue = 200.00
9131  AWGAAmplEntry.delete(0,"end")
9132  AWGAAmplEntry.insert(0, AWGAAmplvalue)
9133  if AWGAAmplvalue < -200.00:
9134  AWGAAmplvalue = -200.00
9135  AWGAAmplEntry.delete(0,"end")
9136  AWGAAmplEntry.insert(0, AWGAAmplvalue)
9137 #
9138 def BAWGAOffset(temp):
9139  global AWGAOffsetEntry, AWGAOffsetvalue, AWGAMode, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9140  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9141 
9142  try:
9143  AWGAOffsetvalue = float(eval(AWGAOffsetEntry.get()))
9144  except:
9145  AWGAOffsetEntry.delete(0,"end")
9146  AWGAOffsetEntry.insert(0, AWGAOffsetvalue)
9147  if AWG_Amp_Mode.get() == 0: # 0 = Min/Max mode
9148  if AWGAMode.get() == 0: # Source Voltage measure current mode
9149  if AWGAOffsetvalue > 5.00:
9150  AWGAOffsetvalue = 5.00
9151  AWGAOffsetEntry.delete(0,"end")
9152  AWGAOffsetEntry.insert(0, AWGAOffsetvalue)
9153  if AWGAOffsetvalue < 0.00:
9154  AWGAOffsetvalue = 0.00
9155  AWGAOffsetEntry.delete(0,"end")
9156  AWGAOffsetEntry.insert(0, AWGAOffsetvalue)
9157  elif AWG_Amp_Mode.get() == 1: # 1 = Amp/Offset
9158  if AWGAOffsetvalue > (2.50-AWGA_Ext_Offset.get()):
9159  AWGAOffsetvalue = 2.50-AWGA_Ext_Offset.get()
9160  AWGAOffsetEntry.delete(0,"end")
9161  AWGAOffsetEntry.insert(0, AWGAOffsetvalue)
9162  if AWGAOffsetvalue < (-2.50-AWGA_Ext_Offset.get()):
9163  AWGAOffsetvalue = -2.50-AWGA_Ext_Offset.get()
9164  AWGAOffsetEntry.delete(0,"end")
9165  AWGAOffsetEntry.insert(0, AWGAOffsetvalue)
9166  if AWGAMode.get() == 1: # Source current measure voltage mode
9167  if AWGAOffsetvalue > 200.00:
9168  AWGAOffsetvalue = 200.00
9169  AWGAOffsetEntry.delete(0,"end")
9170  AWGAOffsetEntry.insert(0, AWGAOffsetvalue)
9171  if AWGAOffsetvalue < -200.00:
9172  AWGAOffsetvalue = -200.00
9173  AWGAOffsetEntry.delete(0,"end")
9174  AWGAOffsetEntry.insert(0, AWGAOffsetvalue)
9175 #
9176 def BAWGAFreq(temp):
9177  global AWGAFreqEntry, AWGAFreqvalue, AWG_2X
9178  global BodeScreenStatus, BodeDisp
9179 
9180  try:
9181  AWGAFreqvalue = float(eval(AWGAFreqEntry.get()))
9182  except:
9183  AWGAFreqEntry.delete(0,"end")
9184  AWGAFreqEntry.insert(0, AWGAFreqvalue)
9185  if AWG_2X.get() == 1:
9186  if BodeScreenStatus.get() > 0 and BodeDisp.get() > 0:
9187  if AWGAFreqvalue > 90000: # max freq is 90KHz foe Bode Plots
9188  AWGAFreqvalue = 90000
9189  AWGAFreqEntry.delete(0,"end")
9190  AWGAFreqEntry.insert(0, AWGAFreqvalue)
9191  else:
9192  if AWGAFreqvalue > 50000: # max freq is 50KHz
9193  AWGAFreqvalue = 50000
9194  AWGAFreqEntry.delete(0,"end")
9195  AWGAFreqEntry.insert(0, AWGAFreqvalue)
9196  else:
9197  if AWGAFreqvalue > 25000: # max freq is 25KHz
9198  AWGAFreqvalue = 25000
9199  AWGAFreqEntry.delete(0,"end")
9200  AWGAFreqEntry.insert(0, AWGAFreqvalue)
9201  if AWGAFreqvalue < 0: # Set negative frequency entry to 0
9202  AWGAFreqvalue = 10
9203  AWGAFreqEntry.delete(0,"end")
9204  AWGAFreqEntry.insert(0, AWGAFreqvalue)
9205  #UpdateAWGA()
9206 
9208  global AWGAPhaseDelay, phasealab, awgaph, awgadel
9209 
9210  if AWGAPhaseDelay.get() == 0:
9211  phasealab.configure(text="Deg")
9212  awgaph.configure(style="WPhase.TRadiobutton")
9213  awgadel.configure(style="GPhase.TRadiobutton")
9214  elif AWGAPhaseDelay.get() == 1:
9215  phasealab.configure(text="mSec")
9216  awgaph.configure(style="GPhase.TRadiobutton")
9217  awgadel.configure(style="WPhase.TRadiobutton")
9218 
9219 def BAWGAPhase(temp):
9220  global AWGAPhaseEntry, AWGAPhasevalue
9221 
9222  try:
9223  AWGAPhasevalue = float(eval(AWGAPhaseEntry.get()))
9224  except:
9225  AWGAPhaseEntry.delete(0,"end")
9226  AWGAPhaseEntry.insert(0, AWGAPhasevalue)
9227 
9228  if AWGAPhasevalue > 360: # max phase is 360 degrees
9229  AWGAPhasevalue = 360
9230  AWGAPhaseEntry.delete(0,"end")
9231  AWGAPhaseEntry.insert(0, AWGAPhasevalue)
9232  if AWGAPhasevalue < 0: # min phase is 0 degrees
9233  AWGAPhasevalue = 0
9234  AWGAPhaseEntry.delete(0,"end")
9235  AWGAPhaseEntry.insert(0, AWGAPhasevalue)
9236 
9237 def BAWGADutyCycle(temp):
9238  global AWGADutyCycleEntry, AWGADutyCyclevalue
9239 
9240  try:
9241  AWGADutyCyclevalue = float(eval(AWGADutyCycleEntry.get()))/100
9242  except:
9243  AWGADutyCycleEntry.delete(0,"end")
9244  AWGADutyCycleEntry.insert(0, AWGADutyCyclevalue)
9245 
9246  if AWGADutyCyclevalue > 1: # max duty cycle is 100%
9247  AWGADutyCyclevalue = 1
9248  AWGADutyCycleEntry.delete(0,"end")
9249  AWGADutyCycleEntry.insert(0, AWGADutyCyclevalue*100)
9250  if AWGADutyCyclevalue < 0: # min duty cycle is 0%
9251  AWGADutyCyclevalue = 0
9252  AWGADutyCycleEntry.delete(0,"end")
9253  AWGADutyCycleEntry.insert(0, AWGADutyCyclevalue)
9254  #UpdateAWGA()
9255 
9257  global AWGAShape, AWGAWave, phasealab, duty1lab
9258 
9259  if AWGAShape.get() == 0:
9260  AWGAWave = 'dc'
9261  duty1lab.config(text="%")
9262  BAWGAPhaseDelay()
9263  if AWGAShape.get() == 1:
9264  AWGAWave = 'sine'
9265  duty1lab.config(text="%")
9266  BAWGAPhaseDelay()
9267  if AWGAShape.get() == 2:
9268  AWGAWave = 'triangle'
9269  duty1lab.config(text="%")
9270  BAWGAPhaseDelay()
9271  if AWGAShape.get() == 3:
9272  AWGAWave = 'sawtooth'
9273  duty1lab.config(text="%")
9274  BAWGAPhaseDelay()
9275  if AWGAShape.get() == 4:
9276  AWGAWave = 'square'
9277  duty1lab.config(text="%")
9278  BAWGAPhaseDelay()
9279  if AWGAShape.get() == 5:
9280  AWGAWave = 'stairstep'
9281  duty1lab.config(text="%")
9282  BAWGAPhaseDelay()
9283  if AWGAShape.get() > 5:
9284  AWGAWave = 'arbitrary'
9285  # UpdateAWGA()
9286 
9288  global AWGAwaveform, AWGALength, awgwindow, AWG_2X, AWGA2X, AWGAcsvFile
9289 
9290  # Read values from CVS file
9291  filename = askopenfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent=awgwindow)
9292  AWGAcsvFile = filename
9293  AWGALoadCSV()
9294 #
9296  global AWGAwaveform, AWGALength, awgwindow, AWG_2X, AWGA2X, AWGAcsvFile
9297 
9298  try:
9299  CSVFile = open(AWGAcsvFile)
9300  # dialect = csv.Sniffer().sniff(CSVFile.read(128))
9301  CSVFile.seek(0)
9302  #csv_f = csv.reader(CSVFile, dialect)
9303  csv_f = csv.reader(CSVFile, csv.excel)
9304  except:
9305  showwarning("WARNING","No such file found or wrong format!", parent=awgwindow)
9306  # print csv_f.dialect
9307  AWGAwaveform = []
9308  ColumnNum = 0
9309  ColumnSel = 0
9310  RowNum = 0
9311  for row in csv_f:
9312  # print 'found row = ', row
9313  if len(row) > 1 and ColumnSel == 0:
9314  RequestColumn = askstring("Which Column?", "File contains 1 to " + str(len(row)) + " columns\n\nEnter column number to import:\n", initialvalue=1, parent=awgwindow)
9315  ColumnNum = int(RequestColumn) - 1
9316  ColumnLen = str(len(row))
9317  ColumnSel = 1
9318  try:
9319  colnum = 0
9320  for col in row:
9321  if colnum == ColumnNum:
9322  AWGAwaveform.append(float(col))
9323  colnum += 1
9324  except:
9325  print( 'skipping non-numeric row', RowNum)
9326  RowNum += 1
9327  AWGAwaveform = numpy.array(AWGAwaveform)
9329  CSVFile.close()
9330  UpdateAwgCont()
9331 
9332 # Split 2X sampled AWGAwaveform array into odd and even sample arrays
9334  global AWG_2X, AWGA2X, AWGAwaveform
9335 
9336  if AWG_2X.get() == 1:
9337  Tempwaveform = []
9338  AWGA2X = []
9339  AWGA2X = AWGAwaveform[1::2] # odd numbered samples
9340  Tempwaveform = AWGAwaveform[::2] # even numbered samples Tempwaveform
9341  AWGAwaveform = Tempwaveform
9342 #
9344  global AWGABurstFlag, AWGACycles, AWGABurstDelay
9345 
9346  if AWGABurstFlag.get() == 1:
9347  AWGACyclesString = askstring("AWG A Burst Mode", "Current number of cycles " + str(AWGACycles) + "\n\nNew number of cycles:\n", initialvalue=str(AWGACycles), parent=awgwindow)
9348  if (AWGACyclesString == None): # If Cancel pressed, then None
9349  return
9350  AWGACycles = int(AWGACyclesString)
9351  AWGADelayString = askstring("AWG A Burst Mode", "Current Burst delay " + str(AWGABurstDelay) + "\n\nNew burst delay in mS:\n", initialvalue=str(AWGABurstDelay), parent=awgwindow)
9352  if (AWGADelayString == None): # If Cancel pressed, then None
9353  return
9354  AWGABurstDelay = float(AWGADelayString)
9355  ReMakeAWGwaves()
9356 #
9358  global AWGAwaveform, AWGALength, AWGAShape, awgwindow, AWGBwaveform, AWGBLength, AWGBShape
9359  global AWG_2X, AWGA2X, AWGAwavFile
9360 
9361 # Read values from WAV file
9362  filename = askopenfilename(defaultextension = ".wav", filetypes=[("WAV files", "*.wav")], parent=awgwindow)
9363  AWGAwavFile = filename
9364  AWGALoadWAV()
9365 #
9367  global AWGAwaveform, AWGALength, AWGAShape, awgwindow, AWGBwaveform, AWGBLength, AWGBShape
9368  global AWG_2X, AWGA2X, AWGAwavFile
9369 
9370  try:
9371  spf = wave.open(AWGAwavFile,'r')
9372  except:
9373  showwarning("WARNING","No such file found or wrong format!", parent=awgwindow)
9374  AWGAwaveform = []
9375  AWGBwaveform = []
9376  Length = spf.getnframes()
9377  if Length > 90000:
9378  Length = 90000
9379  # If Stereo put first channel in AWGA and second channel in AWGB
9380  if spf.getnchannels() == 2:
9381  showwarning("Split Stereo","Left to AWGA Right to AWGB", parent=awgwindow)
9382  signal = spf.readframes(Length)
9383  Stereo = numpy.fromstring(signal, 'Int16') # convert strings to Int
9384  n = 0
9385  while n < Length*2:
9386  AWGAwaveform.append((Stereo[n] * 2.5 / 32768) + 2.5)
9387  n = n + 1
9388  AWGBwaveform.append((Stereo[n] * 2.5 / 32768) + 2.5)
9389  n = n + 1
9390  AWGAwaveform = numpy.array(AWGAwaveform)
9391  AWGBwaveform = numpy.array(AWGBwaveform)
9392  AWGBShape.set(AWGAShape.get())
9393  else:
9394  #Extract Raw Audio from Wav File
9395  signal = spf.readframes(Length)
9396  WAVsignal = numpy.fromstring(signal, 'Int16') # convert strings to Int
9397  # offset and scale for 0 5 V range
9398  AWGAwaveform = (WAVsignal * 2.5 / 32768) + 2.5
9399  AWGAwaveform = numpy.array(AWGAwaveform)
9401  spf.close()
9402  UpdateAwgCont()
9403 
9405  global AWGAwaveform, AWGALength, awgwindow
9406 
9407  filename = asksaveasfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent=awgwindow)
9408  numpy.savetxt(filename, AWGAwaveform, delimiter=",", fmt='%2.4f')
9409 
9411  global AWGAwaveform, AWGSAMPLErate, VBuffA, VBuffB, IBuffA, IBuffB
9412  global AWGBwaveform, VmemoryA, VmemoryB, ImemoryA, ImemoryB, AWGAMathString
9413  global FFTBuffA, FFTBuffB, FFTwindowshape, AWGALength, awgwindow
9414  global DFiltACoef, DFiltBCoef, AWGAShapeLabel
9415  global AWG_2X, AWGA2X
9416 
9417  TempString = AWGAMathString
9418  AWGAShapeLabel.config(text = "Math" ) # change displayed value
9419  AWGAMathString = askstring("AWG A Math Formula", "Current Formula: " + AWGAMathString + "\n\nNew Formula:\n", initialvalue=AWGAMathString, parent=awgwindow)
9420  if (AWGAMathString == None): # If Cancel pressed, then None
9421  AWGAMathString = TempString
9422  return
9423  AWGAwaveform = eval(AWGAMathString)
9424  AWGAwaveform = numpy.array(AWGAwaveform)
9426  UpdateAwgCont()
9427 #
9429  global AWGAwaveform, AWGSAMPLErate, VBuffA, VBuffB, IBuffA, IBuffB
9430  global AWGBwaveform, VmemoryA, VmemoryB, ImemoryA, ImemoryB, AWGAMathString
9431  global FFTBuffA, FFTBuffB, FFTwindowshape, AWGALength, awgwindow
9432  global DFiltACoef, DFiltBCoef, AWGAShapeLabel
9433  global AWG_2X, AWGA2X
9434 
9435  AWGAwaveform = eval(AWGAMathString)
9436  AWGAwaveform = numpy.array(AWGAwaveform)
9438  UpdateAwgCont()
9439 #
9441  global AWGAwaveform, AWGSAMPLErate, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAperiodvalue
9442  global AWGADutyCyclevalue, AWGAFreqvalue, duty1lab, AWGAgain, AWGAoffset, AWGAPhaseDelay, AWGAMode
9443  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate, phasealab, AWG_Amp_Mode
9444  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9445 
9446  BAWGAAmpl(0)
9447  BAWGAOffset(0)
9448  BAWGAFreq(0)
9449  BAWGAPhase(0)
9450  BAWGADutyCycle(0)
9451 
9452  if AWGAFreqvalue < 10.0: # if frequency is less than 10 Hz use libsmu sine function
9453  AWGAShape.set(1)
9454  BAWGAShape()
9455  UpdateAwgCont()
9456  return
9457 
9458  if AWGAFreqvalue > 0.0:
9459  if AWG_2X.get() == 1:
9460  AWGAperiodvalue = (BaseSampleRate*2)/AWGAFreqvalue
9461  else:
9462  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9463  else:
9464  AWGAperiodvalue = 10.0
9465 
9466  if AWGAPhaseDelay.get() == 0:
9467  if AWGAPhasevalue > 0:
9468  AWGAdelayvalue = AWGAperiodvalue * AWGAPhasevalue / 360.0
9469  else:
9470  AWGAdelayvalue = 0.0
9471  elif AWGAPhaseDelay.get() == 1:
9472  AWGAdelayvalue = AWGAPhasevalue * SAMPLErate / 1000
9473  Cycles = int(32768/AWGAperiodvalue)
9474  if Cycles < 1:
9475  Cycles = 1
9476  RecLength = int(Cycles * AWGAperiodvalue)
9477  if RecLength % 2 != 0: # make sure record length is even so 2X mode works for all Freq
9478  RecLength = RecLength + 1
9479  AWGAwaveform = []
9480  AWGAwaveform = numpy.cos(numpy.linspace(0, 2*Cycles*numpy.pi, RecLength))
9481 
9482  if AWG_Amp_Mode.get() == 0:
9483  if AWGAMode.get() == 1: # convert to mA
9484  amplitude = (AWGAOffsetvalue-AWGAAmplvalue) / -2000.0
9485  offset = (AWGAOffsetvalue+AWGAAmplvalue) / 2000.0
9486  else:
9487  amplitude = (AWGAOffsetvalue-AWGAAmplvalue) / -2.0
9488  offset = (AWGAOffsetvalue+AWGAAmplvalue) / 2.0
9489  else:
9490  if AWGAMode.get() == 1: # convert to mA
9491  amplitude = AWGAAmplvalue/1000.0
9492  offset = AWGAOffsetvalue/1000.0
9493  else:
9494  amplitude = AWGAAmplvalue*AWGA_Ext_Gain.get()
9495  offset = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get()
9496  AWGAwaveform = (AWGAwaveform * amplitude) + offset # scale and offset the waveform
9497  AWGAwaveform = numpy.roll(AWGAwaveform, int(AWGAdelayvalue))
9498 #
9500  BAWGAPhaseDelay()
9501  duty1lab.config(text="%")
9502  UpdateAwgCont()
9503 #
9505  global AWGAwaveform, AWGSAMPLErate, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAperiodvalue
9506  global AWGADutyCyclevalue, AWGAFreqvalue, duty1lab, AWGAgain, AWGAoffset, AWGAPhaseDelay, AWGAMode
9507  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate, phasealab, AWG_Amp_Mode
9508  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9509 
9510  BAWGAAmpl(0)
9511  BAWGAOffset(0)
9512  BAWGAFreq(0)
9513 # uses dyty cycle entry for Modulation index and phase entry for Modulation frequency
9514  duty1lab.config(text = "M Index")
9515  phasealab.config(text = "M Freq")
9516 
9517  if AWGAFreqvalue > 0.0:
9518  if AWG_2X.get() == 1:
9519  AWGAperiodvalue = (BaseSampleRate*2)/AWGAFreqvalue
9520  else:
9521  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9522  else:
9523  AWGAperiodvalue = 10.0
9524 
9525  try:
9526  ModFreq = float(eval(AWGAPhaseEntry.get()))
9527  except:
9528  ModFreq = 10
9529  AWGAPhaseEntry.delete(0,"end")
9530  AWGAPhaseEntry.insert(0, ModFreq)
9531 
9532  if ModFreq < 10:
9533  ModFreq = 10
9534  AWGAPhaseEntry.delete(0,"end")
9535  AWGAPhaseEntry.insert(0, ModFreq)
9536 
9537  if AWG_2X.get() == 1:
9538  MODperiodvalue = (BaseSampleRate*2)/ModFreq
9539  else:
9540  MODperiodvalue = BaseSampleRate/ModFreq
9541 
9542  try:
9543  ModIndex = float(eval(AWGADutyCycleEntry.get()))
9544  except:
9545  ModIndex = 1.0
9546  AWGADutyCycleEntry.delete(0,"end")
9547  AWGADutyCycleEntry.insert(0, ModIndex)
9548 
9549  ModCycles = int(32768/MODperiodvalue) # find a whole number of cycles
9550  if ModCycles < 1:
9551  ModCycles = 1
9552  RecLength = int(ModCycles * MODperiodvalue)
9553  if RecLength % 2 != 0: # make sure record length is even so 2X mode works for all Freq
9554  RecLength = RecLength + 1
9555  CarCycles = int(RecLength/AWGAperiodvalue) # insure a whole number of carrier cycles in record
9556  AWGAwaveform = []
9557  AWGAwaveform = numpy.sin( (numpy.linspace(0, CarCycles*2*numpy.pi, RecLength)) - ModIndex*numpy.cos(numpy.linspace(0, ModCycles*2*numpy.pi, RecLength)) )
9558  if AWG_Amp_Mode.get() == 0:
9559  if AWGAMode.get() == 1: # convert to mA
9560  amplitude = (AWGAOffsetvalue-AWGAAmplvalue) / -2000.0
9561  offset = (AWGAOffsetvalue+AWGAAmplvalue) / 2000.0
9562  else:
9563  amplitude = (AWGAOffsetvalue-AWGAAmplvalue) / -2.0
9564  offset = (AWGAOffsetvalue+AWGAAmplvalue) / 2.0
9565  else:
9566  if AWGAMode.get() == 1: # convert to mA
9567  amplitude = AWGAAmplvalue/1000.0
9568  offset = AWGAOffsetvalue/1000.0
9569  else:
9570  amplitude = AWGAAmplvalue*AWGA_Ext_Gain.get()
9571  offset = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get()
9572  AWGAwaveform = (AWGAwaveform * amplitude) + offset # scale and offset the waveform
9573  AWGAwaveform = numpy.roll(AWGAwaveform, int(AWGAdelayvalue))
9574 #
9575  SplitAWGAwaveform() # if needed
9576  UpdateAwgCont()
9577 #
9579  global AWGAwaveform, AWGSAMPLErate, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAperiodvalue
9580  global AWGADutyCyclevalue, AWGAFreqvalue, duty1lab, AWGAgain, AWGAoffset, AWGAPhaseDelay, AWGAMode
9581  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate, phasealab, AWG_Amp_Mode
9582  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9583 
9584  BAWGAAmpl(0)
9585  BAWGAOffset(0)
9586  BAWGAFreq(0)
9587 # uses dyty cycle entry for Modulation index and phase entry for Modulation frequency
9588  duty1lab.config(text = "M Index")
9589  phasealab.config(text = "M Freq")
9590 
9591  if AWGAFreqvalue > 0.0:
9592  if AWG_2X.get() == 1:
9593  AWGAperiodvalue = (BaseSampleRate*2)/AWGAFreqvalue
9594  else:
9595  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9596  else:
9597  AWGAperiodvalue = 10.0
9598 
9599  try:
9600  ModFreq = float(eval(AWGAPhaseEntry.get()))
9601  except:
9602  ModFreq = 10
9603  AWGAPhaseEntry.delete(0,"end")
9604  AWGAPhaseEntry.insert(0, ModFreq)
9605 
9606  if ModFreq < 10:
9607  ModFreq = 10
9608  AWGAPhaseEntry.delete(0,"end")
9609  AWGAPhaseEntry.insert(0, ModFreq)
9610 
9611  if AWG_2X.get() == 1:
9612  MODperiodvalue = (BaseSampleRate*2)/ModFreq
9613  else:
9614  MODperiodvalue = BaseSampleRate/ModFreq
9615 
9616  try:
9617  ModIndex = float(eval(AWGADutyCycleEntry.get()))/200.0
9618  except:
9619  ModIndex = 50.0
9620  AWGADutyCycleEntry.delete(0,"end")
9621  AWGADutyCycleEntry.insert(0, ModIndex)
9622 
9623  ModCycles = int(32768/MODperiodvalue) # find a whole number of cycles
9624  if ModCycles < 1:
9625  ModCycles = 1
9626  RecLength = int(ModCycles * MODperiodvalue)
9627  if RecLength % 2 != 0: # make sure record length is even so 2X mode works for all Freq
9628  RecLength = RecLength + 1
9629  CarCycles = int(RecLength/AWGAperiodvalue) # insure a whole number of carrier cycles in record
9630  AWGAwaveform = []
9631  AWGAwaveform = numpy.sin(numpy.linspace(0, CarCycles*2*numpy.pi, RecLength)) * (0.5+(ModIndex*(numpy.cos(numpy.linspace(0, ModCycles*2*numpy.pi, RecLength)))))
9632  if AWG_Amp_Mode.get() == 0:
9633  if AWGAMode.get() == 1: # convert to mA
9634  amplitude = (AWGAOffsetvalue-AWGAAmplvalue) / -2000.0
9635  offset = (AWGAOffsetvalue+AWGAAmplvalue) / 2000.0
9636  else:
9637  amplitude = (AWGAOffsetvalue-AWGAAmplvalue) / -2.0
9638  offset = (AWGAOffsetvalue+AWGAAmplvalue) / 2.0
9639  else:
9640  if AWGAMode.get() == 1: # convert to mA
9641  amplitude = AWGAAmplvalue/1000.0
9642  offset = AWGAOffsetvalue/1000.0
9643  else:
9644  amplitude = AWGAAmplvalue*AWGA_Ext_Gain.get()
9645  offset = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get()
9646  AWGAwaveform = (AWGAwaveform * amplitude) + offset # scale and offset the waveform
9647  AWGAwaveform = numpy.roll(AWGAwaveform, int(AWGAdelayvalue))
9648 #
9649  SplitAWGAwaveform() # if needed
9650  UpdateAwgCont()
9651 #
9653  global AWGAwaveform, AWGSAMPLErate, AWGAAmplvalue, AWGAOffsetvalue, AWGALength
9654  global AWGADutyCyclevalue, AWGAFreqvalue, duty1lab, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9655  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
9656  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9657 
9658  BAWGAAmpl(0)
9659  BAWGAOffset(0)
9660  BAWGAFreq(0)
9661  BAWGAPhase(0)
9662  BAWGADutyCycle(0)
9663 
9664  if AWGAFreqvalue > 0.0:
9665  if AWG_2X.get() == 1:
9666  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
9667  else:
9668  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9669  else:
9670  AWGAperiodvalue = 0.0
9671  if AWG_Amp_Mode.get() == 1:
9672  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
9673  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
9674  else:
9675  MaxV = AWGAOffsetvalue
9676  MinV = AWGAAmplvalue
9677 
9678  PulseWidth = int(AWGADutyCyclevalue*100)
9679  PulseSamples = int(AWGAperiodvalue/PulseWidth)
9680  AWGAwaveform = []
9681  for i in range(PulseSamples): #(i = 0; i < cPulse; i++)
9682  v = round(PulseWidth/2*(1+numpy.sin(i*2*numpy.pi/PulseSamples)))
9683  # print(v)
9684  for j in range(PulseWidth): #(j = 0; j < cLength; j++)
9685  if j >= v:
9686  AWGAwaveform.append(MaxV) # j>=v?1:0
9687  else:
9688  AWGAwaveform.append(MinV) # j>=v?1:0
9690  duty1lab.config(text="PWidth")
9691  UpdateAwgCont()
9692 #
9694  global AWGAwaveform, AWGSAMPLErate, AWGAAmplvalue, AWGAOffsetvalue, AWGALength
9695  global AWGADutyCyclevalue, AWGAFreqvalue, duty1lab, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9696  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
9697  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9698 
9699  BAWGAAmpl(0)
9700  BAWGAOffset(0)
9701  BAWGAFreq(0)
9702  BAWGADutyCycle(0)
9703 
9704  Max_term = int(AWGADutyCyclevalue*100)
9705  if AWG_2X.get() == 1:
9706  TempRate = (BaseSampleRate*2)
9707  else:
9708  TempRate = BaseSampleRate
9709  AWGAwaveform = []
9710  AWGAwaveform = numpy.cos(numpy.linspace(0, 2*numpy.pi, TempRate/AWGAFreqvalue)) # the fundamental
9711  k = 3
9712  while k <= Max_term:
9713  # Add odd harmonics up to max_term
9714  Harmonic = (math.sin(k*numpy.pi/2.0)/k)*(numpy.cos(numpy.linspace(0, k*2*numpy.pi, TempRate/AWGAFreqvalue)))
9715  AWGAwaveform = AWGAwaveform + Harmonic
9716  k = k + 2 # skip even numbers
9717  if AWG_Amp_Mode.get() == 0:
9718  amplitude = (AWGAOffsetvalue-AWGAAmplvalue)/2.0
9719  offset = (AWGAOffsetvalue+AWGAAmplvalue)/2.0
9720  else:
9721  amplitude = AWGAAmplvalue*AWGA_Ext_Gain.get()
9722  offset = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get()
9723  AWGAwaveform = (AWGAwaveform * amplitude) + offset # scale and offset the waveform
9725  duty1lab.config(text="Harmonics")
9726  UpdateAwgCont()
9727 #
9729  global AWGAwaveform, AWGSampleRate, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAperiodvalue
9730  global AWGADutyCyclevalue, AWGAFreqvalue, duty1lab, AWGAgain, AWGAoffset, AWGAPhaseDelay
9731  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9732  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9733 
9734  BAWGAAmpl(0)
9735  BAWGAOffset(0)
9736  BAWGAFreq(0)
9737  BAWGAPhase(0)
9738  BAWGADutyCycle(0)
9739 
9740  if AWGAFreqvalue > 0.0:
9741  if AWG_2X.get() == 1:
9742  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
9743  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
9744  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
9745  AWGAperiodvalue = AWGAperiodvalue + 1
9746  else:
9747  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9748  SamplesPermS = int(BaseSampleRate/1000) # 100
9749  else:
9750  AWGAperiodvalue = 0.0
9751  if AWG_Amp_Mode.get() == 1:
9752  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
9753  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
9754  else:
9755  MaxV = AWGAOffsetvalue
9756  MinV = AWGAAmplvalue
9757 
9758  if AWGAPhaseDelay.get() == 0:
9759  if AWGAPhasevalue > 0:
9760  AWGAdelayvalue = AWGAperiodvalue * AWGAPhasevalue / 360.0
9761  else:
9762  AWGAdelayvalue = 0.0
9763  elif AWGAPhaseDelay.get() == 1:
9764  AWGAdelayvalue = AWGAPhasevalue * SAMPLErate / 1000
9765 
9766  Cycles = int(AWGADutyCyclevalue*100)
9767  NCycles = -1 * Cycles
9768  AWGAwaveform = []
9769  AWGAwaveform = numpy.sinc(numpy.linspace(NCycles, Cycles, SAMPLErate/AWGAFreqvalue))
9770  amplitude = (MaxV-MinV) / 2.0
9771  offset = (MaxV+MinV) / 2.0
9772  AWGAwaveform = (AWGAwaveform * amplitude) + offset # scale and offset the waveform
9773  Cycles = int(37500/AWGAperiodvalue)
9774  if Cycles < 1:
9775  Cycles = 1
9776  if Cycles > 1:
9777  Extend = int((Cycles-1.0)*AWGAperiodvalue/2.0)
9778  AWGAwaveform = numpy.pad(AWGAwaveform, (Extend,Extend), 'wrap')
9779  AWGAwaveform = numpy.roll(AWGAwaveform, int(AWGAdelayvalue))
9781  #BAWGAPhaseDelay()
9782  duty1lab.config(text="Cycles")
9783  UpdateAwgCont()
9784 #
9786  global AWGAwaveform, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAPhaseDelay, phasealab, duty1lab
9787  global AWGAFreqvalue, AWGAperiodvalue, AWGSAMPLErate, AWGADutyCyclevalue, AWGAPhasevalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9788  global AWGABurstFlag, AWGACycles, AWGABurstDelay
9789  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
9790  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9791 
9792  BAWGAAmpl(0)
9793  BAWGAOffset(0)
9794  BAWGAFreq(0)
9795  BAWGAPhase(0)
9796  BAWGADutyCycle(0)
9797 
9798  if AWGAFreqvalue > 0.0:
9799  if AWG_2X.get() == 1:
9800  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
9801  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
9802  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
9803  AWGAperiodvalue = AWGAperiodvalue + 1
9804  else:
9805  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9806  SamplesPermS = int(BaseSampleRate/1000) # 100
9807  else:
9808  AWGAperiodvalue = 0.0
9809  if AWG_Amp_Mode.get() == 1:
9810  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
9811  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
9812  else:
9813  MaxV = AWGAOffsetvalue
9814  MinV = AWGAAmplvalue
9815  AWGAwaveform = []
9816  SlopeValue = int(AWGAPhasevalue*SamplesPermS)
9817  if SlopeValue <= 0:
9818  SlopeValue = 1
9819  PulseWidth = int(AWGAperiodvalue * AWGADutyCyclevalue)
9820  if PulseWidth <=0:
9821  PulseWidth = 1
9822  Remainder = int((AWGAperiodvalue - PulseWidth - SlopeValue)/2)
9823  if Remainder <= 0:
9824  Remainder = 1
9825  PulseWidth = PulseWidth - SlopeValue
9826  if PulseWidth <=0:
9827  PulseWidth = 1
9828  StepAmp = (MaxV - MinV)/2
9829  StepOff = (MaxV + MinV)/2
9830  AWGAwaveform = StepAmp * (numpy.cos(numpy.linspace(0, 2*numpy.pi, SlopeValue*2))) + StepOff
9831  MidArray = numpy.ones(PulseWidth) * MinV
9832  AWGAwaveform = numpy.insert(AWGAwaveform, SlopeValue, MidArray)
9833  AWGAwaveform = numpy.pad(AWGAwaveform, (Remainder, Remainder), 'edge')
9834  if AWGABurstFlag.get() == 1:
9835  TempOneCycle = AWGAwaveform
9836  for i in range(AWGACycles-1):
9837  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
9838  TempDelay = int(AWGABurstDelay*SamplesPermS/2) # convert mS to samples
9839  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, TempDelay), 'edge')
9841  duty1lab.config(text="%")
9842  phasealab.config(text = "Rise Time")
9843  UpdateAwgCont()
9844 #
9846  global AWGAwaveform, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAPhaseDelay, phasealab, duty1lab
9847  global AWGAFreqvalue, AWGAperiodvalue, AWGSAMPLErate, AWGADutyCyclevalue, AWGAPhasevalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9848  global AWGABurstFlag, AWGACycles, AWGABurstDelay
9849  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
9850  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9851 
9852  BAWGAAmpl(0)
9853  BAWGAOffset(0)
9854  BAWGAFreq(0)
9855  BAWGAPhase(0)
9856  BAWGADutyCycle(0)
9857 
9858  if AWGAFreqvalue > 0.0:
9859  if AWG_2X.get() == 1:
9860  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
9861  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
9862  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
9863  AWGAperiodvalue = AWGAperiodvalue + 1
9864  else:
9865  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9866  SamplesPermS = int(BaseSampleRate/1000) # 100
9867  else:
9868  AWGAperiodvalue = 0.0
9869  if AWG_Amp_Mode.get() == 1:
9870  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
9871  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
9872  else:
9873  MaxV = AWGAOffsetvalue
9874  MinV = AWGAAmplvalue
9875  AWGAwaveform = []
9876  SlopeValue = int(AWGAPhasevalue*SamplesPermS) # convert mS to samples
9877  if SlopeValue <= 0:
9878  SlopeValue = 1
9879  PulseWidth = int(AWGAperiodvalue * AWGADutyCyclevalue)
9880  if PulseWidth <=0:
9881  PulseWidth = 1
9882  Remainder = int(AWGAperiodvalue - PulseWidth) - SlopeValue
9883  if Remainder <= 0:
9884  Remainder = 1
9885  PulseWidth = PulseWidth - SlopeValue
9886  if PulseWidth <=0:
9887  PulseWidth = 1
9888  StepValue = (MaxV - MinV) / SlopeValue
9889  SampleValue = MinV
9890  for i in range(SlopeValue):
9891  AWGAwaveform.append(SampleValue)
9892  SampleValue = SampleValue + StepValue
9893  for i in range(PulseWidth):
9894  AWGAwaveform.append(MaxV)
9895  for i in range(SlopeValue):
9896  AWGAwaveform.append(SampleValue)
9897  SampleValue = SampleValue - StepValue
9898  for i in range(Remainder):
9899  AWGAwaveform.append(MinV)
9900  if AWGABurstFlag.get() == 1:
9901  TempOneCycle = AWGAwaveform
9902  for i in range(AWGACycles-1):
9903  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
9904  TempDelay = int(AWGABurstDelay*SamplesPermS/2) # convert mS to samples
9905  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, TempDelay), 'edge')
9907  duty1lab.config(text="%")
9908  phasealab.config(text = "Rise Time")
9909  UpdateAwgCont()
9910 #
9912  global AWGAwaveform, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAPhaseDelay, phasealab, duty1lab
9913  global AWGAFreqvalue, AWGAperiodvalue, AWGSAMPLErate, AWGADutyCyclevalue, AWGAPhasevalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9914  global AWGABurstFlag, AWGACycles, AWGABurstDelay
9915  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
9916  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9917 
9918  BAWGAAmpl(0)
9919  BAWGAOffset(0)
9920  BAWGAFreq(0)
9921  BAWGAPhase(0)
9922 
9923  try:
9924  AWGADutyCyclevalue = float(eval(AWGADutyCycleEntry.get()))
9925  except:
9926  AWGADutyCycleEntry.delete(0,"end")
9927  AWGADutyCycleEntry.insert(0, AWGADutyCyclevalue)
9928 
9929  if AWGAFreqvalue > 0.0:
9930  if AWG_2X.get() == 1:
9931  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
9932  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
9933  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
9934  AWGAperiodvalue = AWGAperiodvalue + 1
9935  else:
9936  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
9937  SamplesPermS = int(BaseSampleRate/1000) # 100
9938  else:
9939  AWGAperiodvalue = 0.0
9940  if AWG_Amp_Mode.get() == 1:
9941  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
9942  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
9943  else:
9944  MaxV = AWGAOffsetvalue
9945  MinV = AWGAAmplvalue
9946  AWGAwaveform = []
9947  SlopeValue = int(AWGAPhasevalue*SamplesPermS) # convert mS to samples
9948  if SlopeValue <= 0:
9949  SlopeValue = 1
9950  PulseWidth = int(AWGADutyCyclevalue*SamplesPermS) # convert mS to samples
9951  if PulseWidth <=0:
9952  PulseWidth = 1
9953  Remainder = int(AWGAperiodvalue - PulseWidth) - SlopeValue
9954  if Remainder <= 0:
9955  Remainder = 1
9956  PulseWidth = PulseWidth - SlopeValue
9957  if PulseWidth <=0:
9958  PulseWidth = 1
9959  StepValue = (MaxV - MinV) / SlopeValue
9960  SampleValue = MinV
9961  for i in range(SlopeValue):
9962  AWGAwaveform.append(SampleValue)
9963  SampleValue = SampleValue + StepValue
9964  for i in range(PulseWidth):
9965  AWGAwaveform.append(MaxV)
9966  for i in range(SlopeValue):
9967  AWGAwaveform.append(SampleValue)
9968  SampleValue = SampleValue - StepValue
9969  for i in range(Remainder):
9970  AWGAwaveform.append(MinV)
9971  if AWGABurstFlag.get() == 1:
9972  TempOneCycle = AWGAwaveform
9973  for i in range(AWGACycles-1):
9974  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
9975  TempDelay = int(AWGABurstDelay*SamplesPermS/2) # convert mS to samples
9976  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, TempDelay), 'edge')
9978  duty1lab.config(text="Width mS")
9979  phasealab.config(text = "Rise Time")
9980  UpdateAwgCont()
9981 #
9983  global AWGAwaveform, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAPhaseDelay, phasealab, duty1lab
9984  global AWGAFreqvalue, AWGAperiodvalue, AWGSAMPLErate, AWGADutyCyclevalue, AWGAPhasevalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
9985  global AWGABurstFlag, AWGACycles, AWGABurstDelay
9986  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
9987  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
9988 
9989  BAWGAAmpl(0)
9990  BAWGAOffset(0)
9991  BAWGAFreq(0)
9992  BAWGAPhase(0)
9993  BAWGADutyCycle(0)
9994 
9995  if AWGAFreqvalue > 0.0:
9996  if AWG_2X.get() == 1:
9997  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
9998  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
9999  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
10000  AWGAperiodvalue = AWGAperiodvalue + 1
10001  else:
10002  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
10003  SamplesPermS = int(BaseSampleRate/1000) # 100
10004  else:
10005  AWGAperiodvalue = 0.0
10006  if AWG_Amp_Mode.get() == 1:
10007  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
10008  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
10009  else:
10010  MaxV = AWGAOffsetvalue
10011  MinV = AWGAAmplvalue
10012  AWGAwaveform = []
10013  SlopeValue = int(AWGAPhasevalue*SamplesPermS) # convert mS to samples
10014  if SlopeValue <= 0:
10015  SlopeValue = 1
10016  PulseWidth = int(AWGAperiodvalue * AWGADutyCyclevalue)
10017  if PulseWidth <=0:
10018  PulseWidth = 1
10019  Remainder = int(AWGAperiodvalue - PulseWidth)
10020  if Remainder <= 0:
10021  Remainder = 1
10022  PulseWidth = PulseWidth - SlopeValue
10023  if PulseWidth <=0:
10024  PulseWidth = 1
10025  StepValue = (MaxV - MinV) / SlopeValue
10026  SampleValue = MinV
10027  for i in range(SlopeValue):
10028  AWGAwaveform.append(SampleValue)
10029  SampleValue = SampleValue + StepValue
10030  for i in range(PulseWidth):
10031  AWGAwaveform.append(MaxV)
10032  for i in range(Remainder):
10033  AWGAwaveform.append(MinV)
10034  if AWGABurstFlag.get() == 1:
10035  TempOneCycle = AWGAwaveform
10036  for i in range(AWGACycles-1):
10037  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
10038  TempDelay = int(AWGABurstDelay*SamplesPermS/2) # convert mS to samples
10039  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, TempDelay), 'edge')
10041  duty1lab.config(text="%")
10042  phasealab.config(text = "Slope Time")
10043  UpdateAwgCont()
10044 #
10046  global AWGAwaveform, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAPhaseDelay, duty1lab
10047  global AWGAFreqvalue, AWGAperiodvalue, AWGSAMPLErate, AWGADutyCyclevalue, AWGAPhasevalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10048  global AWGABurstFlag, AWGACycles, AWGABurstDelay
10049  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
10050  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10051 
10052  BAWGAAmpl(0)
10053  BAWGAOffset(0)
10054  BAWGAFreq(0)
10055  BAWGAPhase(0)
10056  BAWGADutyCycle(0)
10057 
10058  if AWGAFreqvalue > 0.0:
10059  if AWG_2X.get() == 1:
10060  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
10061  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
10062  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
10063  AWGAperiodvalue = AWGAperiodvalue + 1
10064  else:
10065  AWGAperiodvalue = AWGSAMPLErate/AWGAFreqvalue
10066  SamplesPermS = int(BaseSampleRate/1000) # 100
10067  else:
10068  AWGAperiodvalue = 0.0
10069  if AWG_Amp_Mode.get() == 1:
10070  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
10071  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
10072  else:
10073  MaxV = AWGAOffsetvalue
10074  MinV = AWGAAmplvalue
10075  #
10076  if AWGAPhaseDelay.get() == 0:
10077  if AWGAPhasevalue > 0:
10078  AWGAdelayvalue = AWGAperiodvalue * AWGAPhasevalue / 360.0
10079  else:
10080  AWGAdelayvalue = 0.0
10081  elif AWGAPhaseDelay.get() == 1:
10082  AWGAdelayvalue = AWGAPhasevalue * SAMPLErate / 1000
10083  #
10084  AWGAwaveform = []
10085  PulseWidth = int(AWGAperiodvalue * AWGADutyCyclevalue)
10086  if PulseWidth <=0:
10087  PulseWidth = 1
10088  Remainder = int(AWGAperiodvalue - PulseWidth)
10089  if Remainder <= 0:
10090  Remainder = 1
10091  UpStepValue = (MaxV - MinV) / PulseWidth
10092  DownStepValue = (MaxV - MinV) / Remainder
10093  SampleValue = MinV
10094  for i in range(PulseWidth):
10095  AWGAwaveform.append(SampleValue)
10096  SampleValue = SampleValue + UpStepValue
10097  for i in range(Remainder):
10098  AWGAwaveform.append(SampleValue)
10099  SampleValue = SampleValue - DownStepValue
10100  AWGAwaveform = numpy.roll(AWGAwaveform, int(AWGAdelayvalue))
10101  if AWGABurstFlag.get() == 1:
10102  TempOneCycle = AWGAwaveform
10103  for i in range(AWGACycles-1):
10104  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
10105  TempDelay = int(AWGABurstDelay*SamplesPermS) # convert mS to samples
10106  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, 0), 'edge')
10108  BAWGAPhaseDelay()
10109  duty1lab.config(text = "Symmetry")
10110  UpdateAwgCont()
10111 #
10113  global AWGAwaveform, AWGAAmplvalue, AWGAOffsetvalue, AWGALength, AWGAPhaseDelay, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10114  global AWGAFreqvalue, AWGAperiodvalue, AWGSAMPLErate, AWGADutyCyclevalue, AWGAPhasevalue
10115  global AWGABurstFlag, AWGACycles, AWGABurstDelay
10116  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
10117  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10118 
10119  BAWGAAmpl(0)
10120  BAWGAOffset(0)
10121  BAWGAFreq(0)
10122  BAWGAPhase(0)
10123  BAWGADutyCycle(0)
10124 
10125  if AWGAFreqvalue > 0.0:
10126  if AWG_2X.get() == 1:
10127  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
10128  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
10129  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
10130  AWGAperiodvalue = AWGAperiodvalue + 1
10131  else:
10132  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
10133  SamplesPermS = int(BaseSampleRate/1000) # 100
10134  else:
10135  AWGAperiodvalue = 0.0
10136  if AWG_Amp_Mode.get() == 1:
10137  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
10138  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
10139  else:
10140  MaxV = AWGAOffsetvalue
10141  MinV = AWGAAmplvalue
10142  AWGAwaveform = []
10143  PulseWidth = int(AWGAperiodvalue * AWGADutyCyclevalue / 2.0)
10144  if AWGAPhaseDelay.get() == 0:
10145  DelayValue = int(AWGAperiodvalue*(AWGAPhasevalue/360))
10146  elif AWGAPhaseDelay.get() == 1:
10147  DelayValue = int(AWGAPhasevalue*SamplesPermS)
10148  for i in range(DelayValue-PulseWidth):
10149  AWGAwaveform.append((MinV+MaxV)/2.0)
10150  for i in range(PulseWidth):
10151  AWGAwaveform.append(MaxV)
10152  for i in range(PulseWidth):
10153  AWGAwaveform.append(MinV)
10154  DelayValue = int(AWGAperiodvalue-DelayValue)
10155  for i in range(DelayValue-PulseWidth):
10156  AWGAwaveform.append((MinV+MaxV)/2.0)
10157  if AWGABurstFlag.get() == 1:
10158  TempOneCycle = AWGAwaveform
10159  for i in range(AWGACycles-1):
10160  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
10161  TempDelay = int(AWGABurstDelay*SamplesPermS) # convert mS to samples
10162  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, 0), 'edge')
10164  UpdateAwgCont()
10165 
10167  global AWGAwaveform, AWGSAMPLErate, AWGAAmplvalue, AWGAOffsetvalue, AWGAFreqvalue
10168  global AWGALength, AWGAperiodvalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10169  global AWGABurstFlag, AWGACycles, AWGABurstDelay
10170  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
10171  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10172 
10173  BAWGAAmpl(0)
10174  BAWGAOffset(0)
10175  BAWGAFreq(0)
10176 
10177  if AWGAFreqvalue > 0.0:
10178  if AWG_2X.get() == 1:
10179  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
10180  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
10181  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
10182  AWGAperiodvalue = AWGAperiodvalue + 1
10183  else:
10184  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
10185  SamplesPermS = int(BaseSampleRate/1000) # 100
10186  else:
10187  AWGAperiodvalue = 0.0
10188  if AWG_Amp_Mode.get() == 1:
10189  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
10190  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
10191  else:
10192  if AWGAAmplvalue > AWGAOffsetvalue:
10193  MinV = AWGAOffsetvalue
10194  MaxV = AWGAAmplvalue
10195  else:
10196  MaxV = AWGAOffsetvalue
10197  MinV = AWGAAmplvalue
10198  AWGAwaveform = []
10199  AWGAwaveform = numpy.random.uniform(MinV, MaxV, int(AWGAperiodvalue))
10200  Mid = (MaxV+MinV)/2.0
10201  if AWGABurstFlag.get() == 1:
10202  TempOneCycle = AWGAwaveform
10203  for i in range(AWGACycles-1):
10204  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
10205  TempDelay = int(AWGABurstDelay*SamplesPermS) # convert mS to samples
10206  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, 0), 'constant', constant_values=(Mid))
10208  UpdateAwgCont()
10209 
10211  global AWGAwaveform, AWGSAMPLErate, AWGAAmplvalue, AWGAOffsetvalue, AWGAFreqvalue
10212  global AWGALength, AWGAperiodvalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10213  global AWGABurstFlag, AWGACycles, AWGABurstDelay
10214  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
10215  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10216 
10217  BAWGAAmpl(0)
10218  BAWGAOffset(0)
10219  BAWGAFreq(0)
10220 
10221  if AWGAFreqvalue > 0.0:
10222  if AWG_2X.get() == 1:
10223  AWGAperiodvalue = int((BaseSampleRate*2)/AWGAFreqvalue)
10224  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
10225  if AWGAperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
10226  AWGAperiodvalue = AWGAperiodvalue + 1
10227  else:
10228  AWGAperiodvalue = BaseSampleRate/AWGAFreqvalue
10229  SamplesPermS = int(BaseSampleRate/1000) # 100
10230  else:
10231  AWGAperiodvalue = 0.0
10232  if AWG_Amp_Mode.get() == 1:
10233  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
10234  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
10235  else:
10236  if AWGAAmplvalue > AWGAOffsetvalue:
10237  MinV = AWGAOffsetvalue
10238  MaxV = AWGAAmplvalue
10239  else:
10240  MaxV = AWGAOffsetvalue
10241  MinV = AWGAAmplvalue
10242  AWGAwaveform = []
10243  AWGAwaveform = numpy.random.normal((MinV+MaxV)/2, (MaxV-MinV)/3, int(AWGAperiodvalue))
10244  Mid = (MaxV+MinV)/2.0
10245  if AWGABurstFlag.get() == 1:
10246  TempOneCycle = AWGAwaveform
10247  for i in range(AWGACycles-1):
10248  AWGAwaveform = numpy.concatenate((AWGAwaveform, TempOneCycle))
10249  TempDelay = int(AWGABurstDelay*SamplesPermS) # convert mS to samples
10250  AWGAwaveform = numpy.pad(AWGAwaveform, (TempDelay, 0), 'constant', constant_values=(Mid))
10252  UpdateAwgCont()
10253 
10255  global AWGAMode, AWGAIOMode, AWGAModeLabel, DevID, session, devx, DevOne, CHA, HWRevOne
10256  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10257 
10258  if AWGAMode.get() == 0: # Source Voltage measure current mode
10259  label_txt = "SVMI"
10260  elif AWGAMode.get() == 1: # Source current measure voltage mode
10261  label_txt = "SIMV"
10262  elif AWGAMode.get() == 2: # High impedance mode
10263  label_txt = "Hi-Z"
10264  if AWGAIOMode.get() > 0: # Split Input / Output mode
10265  if HWRevOne == "D":
10266  if AWGAMode.get() == 0:
10267  AWGAMode.set(1)
10268  CHA.set_mode('i') # channel must be in source current mode for rev D boards
10269  label_txt = "SIMV"
10270  label_txt = label_txt + " Split I/O"
10271  label_txt = label_txt + " Mode"
10272  AWGAModeLabel.config(text = label_txt ) # change displayed value
10273  ReMakeAWGwaves()
10274  #UpdateAwgCont()
10275 
10277  global AWGAAmplvalue, AWGAOffsetvalue
10278  global AWGAFreqvalue, AWGAPhasevalue, AWGAPhaseDelay
10279  global AWGADutyCyclevalue, FSweepMode, AWGARepeatFlag, AWGSync
10280  global AWGAWave, AWGAMode, AWGATerm, AWGAwaveform, AWGAIOMode
10281  global CHA, CHB, AWGSAMPLErate, DevID, devx, HWRevOne, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10282  global amp1lab, off1lab, AWGA2X, AWGA2X, AWGBWave, AWGBRepeatFlag
10283  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10284 
10285  BAWGAAmpl(0)
10286  BAWGAOffset(0)
10287  BAWGAFreq(0)
10288  BAWGAPhase(0)
10289  BAWGADutyCycle(0)
10290  BAWGAShape()
10291 
10292  if AWG_Amp_Mode.get() == 0: # 0 = Min/Max mode, 1 = Amp/Offset
10293  amp1lab.config(text = "Min Ch A" ) # change displayed value
10294  off1lab.config(text = "Max Ch A" ) # change displayed value
10295  else:
10296  amp1lab.config(text = "Amp Ch A" )
10297  off1lab.config(text = "Off Ch A" )
10298 
10299  if AWGAFreqvalue > 0.0:
10300  AWGAperiodvalue = AWGSAMPLErate/AWGAFreqvalue
10301  else:
10302  AWGAperiodvalue = 0.0
10303 
10304  if AWGAPhaseDelay.get() == 0:
10305  if AWGAWave == 'square':
10306  AWGAPhasevalue = AWGAPhasevalue + 270.0
10307  if AWGAPhasevalue > 359:
10308  AWGAPhasevalue = AWGAPhasevalue - 360
10309  if AWGAPhasevalue > 0:
10310  AWGAdelayvalue = AWGAperiodvalue * AWGAPhasevalue / 360.0
10311  else:
10312  AWGAdelayvalue = 0.0
10313  elif AWGAPhaseDelay.get() == 1:
10314  AWGAdelayvalue = AWGAPhasevalue * 100
10315 
10316  if AWGATerm.get() == 0: # Open termination
10317  devx.ctrl_transfer( 0x40, 0x51, 32, 0, 0, 0, 100) # set 2.5 V switch to open
10318  devx.ctrl_transfer( 0x40, 0x51, 33, 0, 0, 0, 100) # set GND switch to open
10319  elif AWGATerm.get() == 1: # 50 Ohm termination to GND
10320  devx.ctrl_transfer( 0x40, 0x51, 32, 0, 0, 0, 100) # set 2.5 V switch to open
10321  devx.ctrl_transfer( 0x40, 0x50, 33, 0, 0, 0, 100) # set GND switch to closed
10322  elif AWGATerm.get() == 2: # 50 Ohm termination to +2.5 Volts
10323  devx.ctrl_transfer( 0x40, 0x50, 32, 0, 0, 0, 100) # set 2.5 V switch to closed
10324  devx.ctrl_transfer( 0x40, 0x51, 33, 0, 0, 0, 100) # set GND switch to open
10325 
10326  if AWGAWave == 'dc':
10327  if AWG_2X.get() == 2:
10328  AWGAWave == 'arbitrary'
10329  CHA.arbitrary(AWGB2X, AWGBRepeatFlag.get())
10330  else:
10331  if AWGAMode.get() == 0: # Source Voltage measure current mode
10332  if AWGAIOMode.get() == 0:
10333  CHA.mode = Mode.SVMI # Put CHA in SVMI mode
10334  else:
10335  CHA.mode = Mode.SVMI_SPLIT # Put CHA in SVMI split mode
10336  CHA.constant(AWGAOffsetvalue)
10337  #
10338  if AWGAMode.get() == 1: # Source current measure voltage mode
10339  if AWGAIOMode.get() == 0:
10340  CHA.mode = Mode.SIMV # Put CHA in SIMV mode
10341  else:
10342  CHA.mode = Mode.SIMV_SPLIT # Put CHA in SIMV split mode
10343  CHA.constant(AWGAOffsetvalue/1000)
10344  #
10345  if AWGAMode.get() == 2: # High impedance mode
10346  if AWGAIOMode.get() == 0:
10347  CHA.mode = Mode.HI_Z # Put CHA in Hi Z mode
10348  else:
10349  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z split mode
10350  #
10351  if AWGAIOMode.get() > 0: # Split Input / Output mode
10352  if HWRevOne == "D":
10353  AWGAMode.set(1)
10354  CHA.mode = Mode.SIMV_SPLIT # channel must be in source current mode
10355 #
10356  else:
10357  if AWGAMode.get() == 0: # Source Voltage measure current mode
10358  if AWGAIOMode.get() == 0:
10359  CHA.mode = Mode.SVMI # Put CHA in SVMI mode
10360  else:
10361  CHA.mode = Mode.SVMI_SPLIT # Put CHA in SVMI split mode
10362  if AWGAMode.get() == 1: # Source current measure voltage mode
10363  if AWGAIOMode.get() == 0:
10364  CHA.mode = Mode.SIMV # Put CHA in SIMV mode
10365  else:
10366  CHA.mode = Mode.SIMV_SPLIT # Put CHA in SIMV split mode
10367  AWGAOffsetvalue = AWGAOffsetvalue/1000
10368  AWGAAmplvalue = AWGAAmplvalue/1000
10369  if AWGAMode.get() == 2: # High impedance mode
10370  if AWGAIOMode.get() == 0:
10371  CHA.mode = Mode.HI_Z # Put CHA in Hi Z mode
10372  else:
10373  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z split mode
10374  else:
10375  if AWG_Amp_Mode.get() == 1:
10376  MaxV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() + (AWGAAmplvalue * AWGA_Ext_Gain.get())
10377  MinV = (AWGAOffsetvalue * AWGA_Ext_Gain.get()) + AWGA_Ext_Offset.get() - (AWGAAmplvalue * AWGA_Ext_Gain.get())
10378  else:
10379  MaxV = AWGAOffsetvalue
10380  MinV = AWGAAmplvalue
10381  try:
10382  if AWGAWave == 'sine':
10383  CHA.sine(MaxV, MinV, AWGAperiodvalue, AWGAdelayvalue)
10384  elif AWGAWave == 'triangle':
10385  CHA.triangle(MaxV, MinV, AWGAperiodvalue, AWGAdelayvalue)
10386  elif AWGAWave == 'sawtooth':
10387  CHA.sawtooth(MaxV, MinV, AWGAperiodvalue, AWGAdelayvalue)
10388  elif AWGAWave == 'square':
10389  CHA.square(MaxV, MinV, AWGAperiodvalue, AWGAdelayvalue, AWGADutyCyclevalue)
10390  elif AWGAWave == 'stairstep':
10391  CHA.stairstep(MaxV, MinV, AWGAperiodvalue, AWGAdelayvalue)
10392  elif AWGAWave == 'arbitrary':
10393  if AWGSync.get() == 0:
10394  AWGARepeatFlag.set(1)
10395  if AWG_2X.get() == 2:
10396  AWGAWave == 'arbitrary'
10397  CHA.arbitrary(AWGB2X, AWGBRepeatFlag.get())
10398  else:
10399  CHA.arbitrary(AWGAwaveform, AWGARepeatFlag.get()) # set repeat flag
10400  except:
10401  donothing()
10402  if AWGAIOMode.get() > 0: # Split Input / Output mode
10403  if HWRevOne == "D":
10404  AWGAMode.set(1)
10405  CHA.mode = Mode.SIMV_SPLIT # channel must be in source current mode
10406 # AWG B functions
10408  global AWGAAmplEntry, AWGBAmplEntry, AWGAOffsetEntry, AWGBOffsetEntry, AWGAFreqEntry, AWGBFreqEntry
10409  global AWGAPhaseEntry, AWGBPhaseEntry, AWGADutyCycleEntry, AWGBDutyCycleEntry, AWGAShape, AWGBShape
10410  global BisCompA
10411 
10412  # if BisCompA.get() == 1:
10413  # sawp Min and Max values
10414  AWGBAmplvalue = float(eval(AWGAAmplEntry.get()))
10415  AWGBOffsetvalue = float(eval(AWGAOffsetEntry.get()))
10416  AWGBAmplEntry.delete(0,"end")
10417  AWGBAmplEntry.insert(0, AWGBOffsetvalue)
10418  AWGBOffsetEntry.delete(0,"end")
10419  AWGBOffsetEntry.insert(0, AWGBAmplvalue)
10420  # copy everything else
10421  AWGBFreqvalue = float(eval(AWGAFreqEntry.get()))
10422  AWGBFreqEntry.delete(0,"end")
10423  AWGBFreqEntry.insert(0, AWGBFreqvalue)
10424  AWGBPhasevalue = float(eval(AWGAPhaseEntry.get()))
10425  AWGBPhaseEntry.delete(0,"end")
10426  AWGBPhaseEntry.insert(0, AWGBPhasevalue)
10427  AWGBDutyCyclevalue = float(eval(AWGADutyCycleEntry.get()))
10428  AWGBDutyCycleEntry.delete(0,"end")
10429  AWGBDutyCycleEntry.insert(0, AWGBDutyCyclevalue)
10430  AWGBShape.set(AWGAShape.get())
10431  #
10432 # ReMakeAWGwaves()
10433 # UpdateAwgCont()
10434 #
10436  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
10437 
10438  if AWGBBurstFlag.get() == 1:
10439  AWGBCyclesString = askstring("AWG B Burst Mode", "Current number of cycles " + str(AWGBCycles) + "\n\nNew number of cycles:\n", initialvalue=str(AWGBCycles), parent=awgwindow)
10440  if (AWGBCyclesString == None): # If Cancel pressed, then None
10441  return
10442  AWGBCycles = int(AWGBCyclesString)
10443  AWGBDelayString = askstring("AWG B Burst Mode", "Current Burst delay " + str(AWGBBurstDelay) + "\n\nNew burst delay in mS:\n", initialvalue=str(AWGBBurstDelay), parent=awgwindow)
10444  if (AWGBDelayString == None): # If Cancel pressed, then None
10445  return
10446  AWGBBurstDelay = float(AWGBDelayString)
10447  ReMakeAWGwaves()
10448 #
10449 def BAWGBAmpl(temp):
10450  global AWGBAmplEntry, AWGBAmplvalue, AWGBMode, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10451  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10452 
10453  try:
10454  AWGBAmplvalue = float(eval(AWGBAmplEntry.get()))
10455  except:
10456  AWGBAmplEntry.delete(0,"end")
10457  AWGBAmplEntry.insert(0, AWGBAmplvalue)
10458  #
10459  if AWGBMode.get() == 0: # Source Voltage measure current mode
10460  if AWG_Amp_Mode.get() == 0: # 0 = Min/Max
10461  if AWGBAmplvalue > 5.00:
10462  AWGBAmplvalue = 5.00
10463  AWGBAmplEntry.delete(0,"end")
10464  AWGBAmplEntry.insert(0, AWGBAmplvalue)
10465  if AWGBAmplvalue < 0.00:
10466  AWGBAmplvalue = 0.00
10467  AWGBAmplEntry.delete(0,"end")
10468  AWGBAmplEntry.insert(0, AWGBAmplvalue)
10469  elif AWG_Amp_Mode.get() == 1: # 1 = Amp/Offset
10470  if AWGBAmplvalue > (2.5 / AWGB_Ext_Gain.get()):
10471  AWGBAmplvalue = 2.5 / AWGB_Ext_Gain.get()
10472  AWGBAmplEntry.delete(0,"end")
10473  AWGBAmplEntry.insert(0, AWGBAmplvalue)
10474  if AWGBAmplvalue < (-2.50 / AWGB_Ext_Gain.get()):
10475  AWGBAmplvalue = -2.50 / AWGB_Ext_Gain.get()
10476  AWGBAmplEntry.delete(0,"end")
10477  AWGBAmplEntry.insert(0, AWGBAmplvalue)
10478  elif AWGBMode.get() == 1: # Source current measure voltage mode
10479  if AWGBAmplvalue > 200.00:
10480  AWGBAmplvalue = 200.00
10481  AWGBAmplEntry.delete(0,"end")
10482  AWGBAmplEntry.insert(0, AWGBAmplvalue)
10483  if AWGBAmplvalue < -200.00:
10484  AWGBAmplvalue = -200.00
10485  AWGBAmplEntry.delete(0,"end")
10486  AWGBAmplEntry.insert(0, AWGBAmplvalue)
10487 #
10488 def BAWGBOffset(temp):
10489  global AWGBOffsetEntry, AWGBOffsetvalue, AWGBMode, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10490  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10491 
10492  try:
10493  AWGBOffsetvalue = float(eval(AWGBOffsetEntry.get()))
10494  except:
10495  AWGBOffsetEntry.delete(0,"end")
10496  AWGBOffsetEntry.insert(0, AWGBOffsetvalue)
10497  if AWG_Amp_Mode.get() == 0: # 0 = Min/Max mode
10498  if AWGBMode.get() == 0: # Source Voltage measure current mode
10499  if AWGBOffsetvalue > 5.00:
10500  AWGBOffsetvalue = 5.00
10501  AWGBOffsetEntry.delete(0,"end")
10502  AWGBOffsetEntry.insert(0, AWGBOffsetvalue)
10503  if AWGBOffsetvalue < 0.00:
10504  AWGBOffsetvalue = 0.00
10505  AWGBOffsetEntry.delete(0,"end")
10506  AWGBOffsetEntry.insert(0, AWGBOffsetvalue)
10507  elif AWG_Amp_Mode.get() == 1: # 1 = Amp/Offset
10508  if AWGBOffsetvalue > (2.50-AWGB_Ext_Offset.get()):
10509  AWGBOffsetvalue = 2.50-AWGB_Ext_Offset.get()
10510  AWGBOffsetEntry.delete(0,"end")
10511  AWGBOffsetEntry.insert(0, AWGBOffsetvalue)
10512  if AWGBOffsetvalue < (-2.50-AWGB_Ext_Offset.get()):
10513  AWGBOffsetvalue = -2.50-AWGB_Ext_Offset.get()
10514  AWGBOffsetEntry.delete(0,"end")
10515  AWGBOffsetEntry.insert(0, AWGBOffsetvalue)
10516  if AWGBMode.get() == 1: # Source current measure voltage mode
10517  if AWGBOffsetvalue > 200.00:
10518  AWGBOffsetvalue = 200.00
10519  AWGBOffsetEntry.delete(0,"end")
10520  AWGBOffsetEntry.insert(0, AWGBOffsetvalue)
10521  if AWGBOffsetvalue < -200.00:
10522  AWGBOffsetvalue = -200.00
10523  AWGBOffsetEntry.delete(0,"end")
10524  AWGBOffsetEntry.insert(0, AWGBOffsetvalue)
10525 #
10526 def BAWGBFreq(temp):
10527  global AWGBFreqEntry, AWGBFreqvalue, AWG_2X
10528  global BodeScreenStatus, BodeDisp
10529 
10530  try:
10531  AWGBFreqvalue = float(eval(AWGBFreqEntry.get()))
10532  except:
10533  AWGBFreqEntry.delete(0,"end")
10534  AWGBFreqEntry.insert(0, AWGBFreqvalue)
10535  if AWG_2X.get() == 2:
10536  if BodeScreenStatus.get() > 0 and BodeDisp.get() > 0:
10537  if AWGBFreqvalue > 90000: # max freq is 90KHz for Bode plotting
10538  AWGBFreqvalue = 90000
10539  AWGBFreqEntry.delete(0,"end")
10540  AWGBFreqEntry.insert(0, AWGBFreqvalue)
10541  else:
10542  if AWGBFreqvalue > 50000: # max freq is 50KHz
10543  AWGBFreqvalue = 50000
10544  AWGBFreqEntry.delete(0,"end")
10545  AWGBFreqEntry.insert(0, AWGBFreqvalue)
10546  else:
10547  if AWGBFreqvalue > 25000: # max freq is 25KHz
10548  AWGBFreqvalue = 25000
10549  AWGBFreqEntry.delete(0,"end")
10550  AWGBFreqEntry.insert(0, AWGBFreqvalue)
10551  if AWGBFreqvalue < 0: # Set negative frequency entry to 0
10552  AWGBFreqvalue = 10
10553  AWGBFreqEntry.delete(0,"end")
10554  AWGBFreqEntry.insert(0, AWGBFreqvalue)
10555  # UpdateAWGB()
10556 
10558  global AWGbPhaseDelay, phaseblab, awgbph, awgbdel
10559 
10560  if AWGBPhaseDelay.get() == 0:
10561  phaseblab.configure(text="Deg")
10562  awgbph.configure(style="WPhase.TRadiobutton")
10563  awgbdel.configure(style="GPhase.TRadiobutton")
10564  elif AWGBPhaseDelay.get() == 1:
10565  phaseblab.configure(text="mSec")
10566  awgbph.configure(style="GPhase.TRadiobutton")
10567  awgbdel.configure(style="WPhase.TRadiobutton")
10568 
10569 def BAWGBPhase(temp):
10570  global AWGBPhaseEntry, AWGBPhasevalue
10571 
10572  try:
10573  AWGBPhasevalue = float(eval(AWGBPhaseEntry.get()))
10574  except:
10575  AWGBPhaseEntry.delete(0,"end")
10576  AWGBPhaseEntry.insert(0, AWGBPhasevalue)
10577 
10578  if AWGBPhasevalue > 360: # max phase is 360 degrees
10579  AWGBPhasevalue = 360
10580  AWGBPhaseEntry.delete(0,"end")
10581  AWGBPhaseEntry.insert(0, AWGBPhasevalue)
10582  if AWGBPhasevalue < 0: # min phase is 0 degrees
10583  AWGBPhasevalue = 0
10584  AWGBPhaseEntry.delete(0,"end")
10585  AWGBPhaseEntry.insert(0, AWGBPhasevalue)
10586 
10587 def BAWGBDutyCycle(temp):
10588  global AWGBDutyCycleEntry, AWGBDutyCyclevalue
10589 
10590  try:
10591  AWGBDutyCyclevalue = float(eval(AWGBDutyCycleEntry.get()))/100
10592  except:
10593  AWGBDutyCycleEntry.delete(0,"end")
10594  AWGBDutyCycleEntry.insert(0, AWGBDutyCyclevalue)
10595 
10596  if AWGBDutyCyclevalue > 1: # max duty cycle is 100%
10597  AWGBDutyCyclevalue = 1
10598  AWGBDutyCycleEntry.delete(0,"end")
10599  AWGBDutyCycleEntry.insert(0, AWGBDutyCyclevalue*100)
10600  if AWGBDutyCyclevalue < 0: # min duty cycle is 0%
10601  AWGBDutyCyclevalue = 0
10602  AWGBDutyCycleEntry.delete(0,"end")
10603  AWGBDutyCycleEntry.insert(0, AWGBDutyCyclevalue)
10604  # UpdateAWGB()
10605 
10607  global AWGBShape, AWGBWave, duty2lab, AWG_2X, CHA, CHB
10608 
10609  if AWGBShape.get() == 0:
10610  AWGBWave = 'dc'
10611  duty2lab.config(text="%")
10612  BAWGBPhaseDelay()
10613  if AWGBShape.get() == 1:
10614  AWGBWave = 'sine'
10615  duty2lab.config(text="%")
10616  BAWGBPhaseDelay()
10617  if AWGBShape.get() == 2:
10618  AWGBWave = 'triangle'
10619  duty2lab.config(text="%")
10620  BAWGBPhaseDelay()
10621  if AWGBShape.get() == 3:
10622  AWGBWave = 'sawtooth'
10623  duty2lab.config(text="%")
10624  BAWGBPhaseDelay()
10625  if AWGBShape.get() == 4:
10626  AWGBWave = 'square'
10627  duty2lab.config(text="%")
10628  BAWGBPhaseDelay()
10629  if AWGBShape.get() == 5:
10630  AWGBWave = 'stairstep'
10631  duty2lab.config(text="%")
10632  BAWGBPhaseDelay()
10633  if AWGBShape.get() > 5:
10634  AWGBWave = 'arbitrary'
10635  if AWG_2X.get() == 1:
10636  CHB.mode = CHA.mode
10637  AWGBWave = 'arbitrary'
10638  # UpdateAWGB()
10639 
10641  global AWGBwaveform, AWGBLength, awgwindow, AWG_2X, AWGB2X, AWGBcsvFile
10642 
10643  # Read values from CVS file
10644  filename = askopenfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent=awgwindow)
10645  AWGBcsvFile = filename
10646  AWGBLoadCSV()
10647 #
10649  global AWGBwaveform, AWGBLength, awgwindow, AWG_2X, AWGB2X, AWGBcsvFile
10650 
10651  try:
10652  CSVFile = open(AWGBcsvFile)
10653  # dialect = csv.Sniffer().sniff(CSVFile.read(128), delimiters=None)
10654  CSVFile.seek(0)
10655  #csv_f = csv.reader(CSVFile, dialect)
10656  csv_f = csv.reader(CSVFile, csv.excel)
10657  except:
10658  showwarning("WARNING","No such file found or wrong format!", parent=awgwindow)
10659  AWGBwaveform = []
10660  ColumnNum = 0
10661  ColumnSel = 0
10662  RowNum = 0
10663  for row in csv_f:
10664  if len(row) > 1 and ColumnSel == 0:
10665  RequestColumn = askstring("Which Column?", "File contains 1 to " + str(len(row)) + " columns\n\nEnter column number to import:\n", initialvalue=1, parent=awgwindow)
10666  ColumnNum = int(RequestColumn) - 1
10667  ColumnLen = str(len(row))
10668  ColumnSel = 1
10669  try:
10670  colnum = 0
10671  for col in row:
10672  if colnum == ColumnNum:
10673  AWGBwaveform.append(float(col))
10674  colnum += 1
10675  except:
10676  print( 'skipping non-numeric row', RowNum)
10677  RowNum += 1
10678  AWGBwaveform = numpy.array(AWGBwaveform)
10680  CSVFile.close()
10681  UpdateAwgCont()
10682 
10683 # Split 2X sampled AWGBwaveform array into odd and even sample arrays
10685  global AWG_2X, AWGB2X, AWGBwaveform
10686 
10687  if AWG_2X.get() == 2:
10688  Tempwaveform = []
10689  AWGB2X = []
10690  AWGB2X = AWGBwaveform[::2] # even numbered samples
10691  Tempwaveform = AWGBwaveform[1::2] # odd numbered samples Tempwaveform
10692  AWGBwaveform = Tempwaveform
10693 #
10695  global AWGBwaveform, AWGBLength, awgwindow, AWGBwavFile
10696  global AWG_2X, AWGA2X
10697 
10698 # Read values from WAV file
10699  filename = askopenfilename(defaultextension = ".wav", filetypes=[("WAV files", "*.wav")], parent=awgwindow)
10700  AWGBwavFile = filename
10701  AWGBLoadWAV()
10702 #
10704  global AWGBwaveform, AWGBLength, awgwindow, AWGBwavFile
10705  global AWG_2X, AWGA2X
10706 
10707  try:
10708  spf = wave.open(AWGBwavFile,'r')
10709  except:
10710  showwarning("WARNING","No such file found or wrong format!", parent=awgwindow)
10711  AWGBwaveform = []
10712  #If Stereo
10713  if spf.getnchannels() == 2:
10714  showwarning("WARNING","Only mono files supported!", parent=awgwindow)
10715  return()
10716  #Extract Raw Audio from Wav File
10717  Length = spf.getnframes()
10718  if Length > 90000: # limit to first 90K samples
10719  Length = 90000
10720  signal = spf.readframes(Length)
10721  WAVsignal = numpy.fromstring(signal, 'Int16') # convert strings to Int
10722  # offset and scale for 0 5 V range
10723  AWGBwaveform = (WAVsignal * 2.5 / 32768) + 2.5
10724  AWGBwaveform = numpy.array(AWGBwaveform)
10726  spf.close()
10727  UpdateAwgCont()
10728 
10730  global AWGBwaveform, AWGBLength, awgwindow
10731 
10732  filename = asksaveasfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent=awgwindow)
10733  numpy.savetxt(filename, AWGBwaveform, delimiter=",", fmt='%2.4f')
10734 
10736  global AWGAwaveform, AWGSAMPLErate, VBuffA, VBuffB, IBuffA, IBuffB
10737  global AWGBwaveform, VmemoryA, VmemoryB, ImemoryA, ImemoryB, AWGBMathString
10738  global FFTBuffA, FFTBuffB, FFTwindowshape, AWGBLength, awgwindow
10739  global DFiltACoef, DFiltBCoef, AWGBShapeLabel
10740  global AWG_2X, AWGA2X
10741 
10742  TempString = AWGBMathString
10743  AWGBShapeLabel.config(text = "Math" ) # change displayed value
10744  AWGBMathString = askstring("AWG B Math Formula", "Current Formula: " + AWGBMathString + "\n\nNew Formula:\n", initialvalue=AWGBMathString, parent=awgwindow)
10745  if (AWGBMathString == None): # If Cancel pressed, then None
10746  AWGBMathString = TempString
10747  return
10748  AWGBwaveform = eval(AWGBMathString)
10749  AWGBwaveform = numpy.array(AWGBwaveform)
10751  UpdateAwgCont()
10752 #
10754  global AWGAwaveform, AWGSAMPLErate, VBuffA, VBuffB, IBuffA, IBuffB
10755  global AWGBwaveform, VmemoryA, VmemoryB, ImemoryA, ImemoryB, AWGBMathString
10756  global FFTBuffA, FFTBuffB, FFTwindowshape, AWGBLength, awgwindow
10757  global DFiltACoef, DFiltBCoef, AWGBShapeLabel
10758  global AWG_2X, AWGA2X
10759 
10760  AWGBwaveform = eval(AWGBMathString)
10761  AWGBwaveform = numpy.array(AWGBwaveform)
10763  UpdateAwgCont()
10764 #
10766  global AWGBwaveform, AWGSAMPLErate, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBFreqvalue, awgwindow
10767  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10768  global AWGA2X, AWG_2X, SAMPLErate, BaseSampleRate
10769  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10770 
10771  Max_term = int(AWGBDutyCyclevalue*100)
10772 
10773  BAWGBAmpl(0)
10774  BAWGBOffset(0)
10775  BAWGBFreq(0)
10776  if AWG_2X.get() == 1:
10777  TempRate = (BaseSampleRate*2)
10778  else:
10779  TempRate = BaseSampleRate
10780  AWGBwaveform = []
10781  AWGBwaveform = numpy.cos(numpy.linspace(0, 2*numpy.pi, TempRate/AWGBFreqvalue)) # the fundamental
10782  k = 3
10783  while k <= Max_term:
10784  # Add odd harmonics up to max_term
10785  Harmonic = (math.sin(k*numpy.pi/2)/k)*(numpy.cos(numpy.linspace(0, k*2*numpy.pi, TempRate/AWGBFreqvalue)))
10786  AWGBwaveform = AWGBwaveform + Harmonic
10787  k = k + 2 # skip even numbers
10788  if AWG_Amp_Mode.get() == 0:
10789  amplitude = (AWGBOffsetvalue-AWGBAmplvalue)/2
10790  offset = (AWGBOffsetvalue+AWGBAmplvalue)/2
10791  else:
10792  amplitude = AWGBAmplvalue*AWGB_Ext_Gain.get()
10793  offset = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get()
10794  AWGBwaveform = (AWGBwaveform * amplitude) + offset # scale and offset the waveform
10796  duty2lab.config(text="Harmonics")
10797  UpdateAwgCont()
10798 #
10800  global AWGBwaveform, AWGSAMPLErate, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBperiodvalue
10801  global AWGBDutyCyclevalue, AWGBFreqvalue, duty2lab, AWGBgain, AWGBoffset, AWGBPhaseDelay, AWGBMode
10802  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate, AWG_Amp_Mode
10803  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10804 
10805  BAWGBAmpl(0)
10806  BAWGBOffset(0)
10807  BAWGBFreq(0)
10808  BAWGBPhase(0)
10809  BAWGBDutyCycle(0)
10810 
10811  if AWGBFreqvalue < 10.0: # if frequency is less than 10 Hz use libsmu sine function
10812  AWGBShape.set(1)
10813  BAWGBShape()
10814  UpdateAwgCont()
10815  return
10816 
10817  if AWGBFreqvalue > 0.0:
10818  if AWG_2X.get() == 2:
10819  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
10820  else:
10821  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
10822  else:
10823  AWGBperiodvalue = 10.0
10824 
10825  if AWGBPhaseDelay.get() == 0:
10826  if AWGBPhasevalue > 0:
10827  AWGBdelayvalue = AWGBperiodvalue * AWGBPhasevalue / 360.0
10828  else:
10829  AWGBdelayvalue = 0.0
10830  elif AWGBPhaseDelay.get() == 1:
10831  AWGBdelayvalue = AWGBPhasevalue * AWGSAMPLErate / 1000
10832  Cycles = int(32768/AWGBperiodvalue)
10833  if Cycles < 1:
10834  Cycles = 1
10835  RecLength = int(Cycles * AWGBperiodvalue)
10836  if RecLength % 2 != 0: # make sure record length is even so 2X mode works for all Freq
10837  RecLength = RecLength + 1
10838  AWGBwaveform = []
10839  AWGBwaveform = numpy.cos(numpy.linspace(0, 2*Cycles*numpy.pi, RecLength))
10840 
10841  if AWG_Amp_Mode.get() == 0:
10842  if AWGBMode.get() == 1: # convert to mA
10843  amplitude = (AWGBOffsetvalue-AWGBAmplvalue) / -2000.0
10844  offset = (AWGBOffsetvalue+AWGBAmplvalue) / 2000.0
10845  else:
10846  amplitude = (AWGBOffsetvalue-AWGBAmplvalue) / -2.0
10847  offset = (AWGBOffsetvalue+AWGBAmplvalue) / 2.0
10848  else:
10849  if AWGBMode.get() == 1: # convert to mA
10850  amplitude = AWGBAmplvalue/1000.0
10851  offset = AWGBOffsetvalue/1000.0
10852  else:
10853  amplitude = AWGBAmplvalue*AWGB_Ext_Gain.get()
10854  offset = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get()
10855  AWGBwaveform = (AWGBwaveform * amplitude) + offset # scale and offset the waveform
10856  AWGBwaveform = numpy.roll(AWGBwaveform, int(AWGBdelayvalue))
10857  #
10858  if AWG_2X.get() == 2:
10859  Tempwaveform = []
10860  AWGB2X = []
10861  AWGB2X = AWGBwaveform[::2] # even numbered samples
10862  Tempwaveform = AWGBwaveform[1::2] # odd numbered samples Tempwaveform
10863  AWGBwaveform = Tempwaveform
10864  BAWGBPhaseDelay()
10865  duty2lab.config(text="%")
10866  UpdateAwgCont()
10867 #
10869  global AWGBwaveform, AWGSAMPLErate, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength
10870  global AWGBDutyCyclevalue, AWGBFreqvalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10871  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
10872  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10873 
10874  BAWGBAmpl(0)
10875  BAWGBOffset(0)
10876  BAWGBFreq(0)
10877  BAWGBPhase(0)
10878  BAWGBDutyCycle(0)
10879 
10880  if AWGBFreqvalue > 0.0:
10881  if AWG_2X.get() == 2:
10882  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
10883  else:
10884  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
10885  else:
10886  AWGBperiodvalue = 0.0
10887  if AWG_Amp_Mode.get() == 1:
10888  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
10889  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
10890  else:
10891  MaxV = AWGBOffsetvalue
10892  MinV = AWGBAmplvalue
10893 
10894  PulseWidth = int(AWGBDutyCyclevalue*100)
10895  PulseSamples = int(AWGBperiodvalue/PulseWidth)
10896  AWGBwaveform = []
10897  for i in range(PulseSamples): #(i = 0; i < cPulse; i++)
10898  v = round(PulseWidth/2*(1+numpy.sin(i*2*numpy.pi/PulseSamples)))
10899  # print(v)
10900  for j in range(PulseWidth): #(j = 0; j < cLength; j++)
10901  if j >= v:
10902  AWGBwaveform.append(MaxV) # j>=v?1:0
10903  else:
10904  AWGBwaveform.append(MinV) # j>=v?1:0
10906  duty2lab.config(text="PWidth")
10907  UpdateAwgCont()
10908 #
10910  global AWGBwaveform, AWGSampleRate, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBperiodvalue
10911  global AWGBDutyCyclevalue, AWGBFreqvalue, duty2lab, AWGBgain, AWGBoffset, AWGBPhaseDelay
10912  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10913  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10914 
10915  BAWGBAmpl(0)
10916  BAWGBOffset(0)
10917  BAWGBFreq(0)
10918  BAWGBPhase(0)
10919  BAWGBDutyCycle(0)
10920 
10921  if AWGBFreqvalue > 0.0:
10922  if AWG_2X.get() == 1:
10923  AWGBperiodvalue = int((BaseSampleRate*2)/AWGBFreqvalue)
10924  if AWGBperiodvalue % 2 != 0: # make sure record length is even so 2X mode works for all Freq
10925  AWGBperiodvalue = AWGBperiodvalue + 1
10926  else:
10927  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
10928  else:
10929  AWGBperiodvalue = 0.0
10930  if AWG_Amp_Mode.get() == 1:
10931  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
10932  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
10933  else:
10934  MaxV = AWGBOffsetvalue
10935  MinV = AWGBAmplvalue
10936 
10937  if AWGBPhaseDelay.get() == 0:
10938  if AWGBPhasevalue > 0:
10939  AWGBdelayvalue = AWGBperiodvalue * AWGBPhasevalue / 360.0
10940  else:
10941  AWGBdelayvalue = 0.0
10942  elif AWGBPhaseDelay.get() == 1:
10943  AWGBdelayvalue = AWGBPhasevalue * SampleRate / 1000
10944 
10945  Cycles = int(AWGBDutyCyclevalue*100)
10946  NCycles = -1 * Cycles
10947  AWGBwaveform = []
10948  AWGBwaveform = numpy.sinc(numpy.linspace(NCycles, Cycles, SAMPLErate/AWGBFreqvalue))
10949  amplitude = (MaxV-MinV) / 2.0
10950  offset = (MaxV+MinV) / 2.0
10951  AWGBwaveform = (AWGBwaveform * amplitude) + offset # scale and offset the waveform
10952  Cycles = int(37500/AWGBperiodvalue)
10953  if Cycles < 1:
10954  Cycles = 1
10955  if Cycles > 1:
10956  Extend = int((Cycles-1.0)*AWGBperiodvalue/2.0)
10957  AWGBwaveform = numpy.pad(AWGBwaveform, (Extend,Extend), 'wrap')
10958  AWGBwaveform = numpy.roll(AWGBwaveform, int(AWGBdelayvalue))
10960  #BAWGAPhaseDelay()
10961  duty2lab.config(text="Cycles")
10962  UpdateAwgCont()
10963 #
10965  global AWGBwaveform, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBPhaseDelay
10966  global AWGBFreqvalue, AWGBperiodvalue, AWGSAMPLErate, AWGBDutyCyclevalue, AWGBPhasevalue
10967  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
10968  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
10969  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
10970  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
10971 
10972  BAWGBAmpl(0)
10973  BAWGBOffset(0)
10974  BAWGBFreq(0)
10975  BAWGBPhase(0)
10976  BAWGBDutyCycle(0)
10977 
10978  if AWGBFreqvalue > 0.0:
10979  if AWG_2X.get() == 2:
10980  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
10981  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
10982  else:
10983  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
10984  SamplesPermS = int(BaseSampleRate/1000) # 100
10985  else:
10986  AWGBperiodvalue = 0.0
10987  if AWG_Amp_Mode.get() == 1:
10988  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
10989  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
10990  else:
10991  MaxV = AWGBOffsetvalue
10992  MinV = AWGBAmplvalue
10993  AWGBwaveform = []
10994  SlopeValue = int(AWGBPhasevalue*SamplesPermS)
10995  if SlopeValue <= 0:
10996  SlopeValue = 1
10997  PulseWidth = int(AWGBperiodvalue * AWGBDutyCyclevalue)
10998  if PulseWidth <=0:
10999  PulseWidth = 1
11000  Remainder = int((AWGBperiodvalue - PulseWidth - SlopeValue)/2)
11001  if Remainder <= 0:
11002  Remainder = 1
11003  PulseWidth = PulseWidth - SlopeValue
11004  if PulseWidth <=0:
11005  PulseWidth = 1
11006  StepAmp = (MaxV - MinV)/2
11007  StepOff = (MaxV + MinV)/2
11008  AWGBwaveform = StepAmp * (numpy.cos(numpy.linspace(0, 2*numpy.pi, SlopeValue*2))) + StepOff
11009  MidArray = numpy.ones(PulseWidth) * MinV
11010  AWGBwaveform = numpy.insert(AWGBwaveform, SlopeValue, MidArray)
11011  AWGBwaveform = numpy.pad(AWGBwaveform, (Remainder, Remainder), 'edge')
11012  if AWGBBurstFlag.get() == 1:
11013  TempOneCycle = AWGBwaveform
11014  for i in range(AWGBCycles-1):
11015  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11016  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11017  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'edge')
11019  duty2lab.config(text="%")
11020  phaseblab.config(text = "Rise Time")
11021  UpdateAwgCont()
11022 #
11024  global AWGBwaveform, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBPhaseDelay
11025  global AWGBFreqvalue, AWGBperiodvalue, AWGSAMPLErate, AWGBDutyCyclevalue, AWGBPhasevalue
11026  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11027  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
11028  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
11029  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11030 
11031  BAWGBAmpl(0)
11032  BAWGBOffset(0)
11033  BAWGBFreq(0)
11034  BAWGBPhase(0)
11035  BAWGBDutyCycle(0)
11036 
11037  if AWGBFreqvalue > 0.0:
11038  if AWG_2X.get() == 2:
11039  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
11040  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
11041  else:
11042  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
11043  SamplesPermS = int(BaseSampleRate/1000) # 100
11044  else:
11045  AWGBperiodvalue = 0.0
11046  if AWG_Amp_Mode.get() == 1:
11047  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11048  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11049  else:
11050  MaxV = AWGBOffsetvalue
11051  MinV = AWGBAmplvalue
11052  AWGBwaveform = []
11053  SlopeValue = int(AWGBPhasevalue*SamplesPermS) # convert mS to samples
11054  if SlopeValue <= 0:
11055  SlopeValue = 1
11056  PulseWidth = int(AWGBperiodvalue * AWGBDutyCyclevalue)
11057  if PulseWidth <=0:
11058  PulseWidth = 1
11059  Remainder = int(AWGBperiodvalue - PulseWidth) - SlopeValue
11060  if Remainder <= 0:
11061  Remainder = 1
11062  PulseWidth = PulseWidth - SlopeValue
11063  if PulseWidth <=0:
11064  PulseWidth = 1
11065  StepValue = (MaxV - MinV) / SlopeValue
11066  SampleValue = MinV
11067  for i in range(SlopeValue):
11068  AWGBwaveform.append(SampleValue)
11069  SampleValue = SampleValue + StepValue
11070  for i in range(PulseWidth):
11071  AWGBwaveform.append(MaxV)
11072  for i in range(SlopeValue):
11073  AWGBwaveform.append(SampleValue)
11074  SampleValue = SampleValue - StepValue
11075  for i in range(Remainder):
11076  AWGBwaveform.append(MinV)
11077  if AWGBBurstFlag.get() == 1:
11078  TempOneCycle = AWGBwaveform
11079  for i in range(AWGBCycles-1):
11080  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11081  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11082  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'edge')
11084  duty2lab.config(text="%")
11085  phaseblab.config(text = "Rise Time")
11086  UpdateAwgCont()
11087 #
11089  global AWGBwaveform, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBPhaseDelay
11090  global AWGBFreqvalue, AWGBperiodvalue, AWGSAMPLErate, AWGBDutyCyclevalue, AWGBPhasevalue
11091  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11092  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
11093  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
11094  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11095 
11096  BAWGBAmpl(0)
11097  BAWGBOffset(0)
11098  BAWGBFreq(0)
11099  BAWGBPhase(0)
11100 
11101  try:
11102  AWGBDutyCyclevalue = float(eval(AWGBDutyCycleEntry.get()))
11103  except:
11104  AWGBDutyCycleEntry.delete(0,"end")
11105  AWGBDutyCycleEntry.insert(0, AWGBDutyCyclevalue)
11106 
11107  if AWGBFreqvalue > 0.0:
11108  if AWG_2X.get() == 2:
11109  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
11110  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
11111  else:
11112  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
11113  SamplesPermS = int(BaseSampleRate/1000) # 100
11114  else:
11115  AWGBperiodvalue = 0.0
11116  if AWG_Amp_Mode.get() == 1:
11117  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11118  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11119  else:
11120  MaxV = AWGBOffsetvalue
11121  MinV = AWGBAmplvalue
11122  AWGBwaveform = []
11123  SlopeValue = int(AWGBPhasevalue*SamplesPermS) # convert mS to samples
11124  if SlopeValue <= 0:
11125  SlopeValue = 1
11126  PulseWidth = int(AWGBDutyCyclevalue*SamplesPermS) # convert mS to samples
11127  if PulseWidth <=0:
11128  PulseWidth = 1
11129  Remainder = int(AWGBperiodvalue - PulseWidth) - SlopeValue
11130  if Remainder <= 0:
11131  Remainder = 1
11132  PulseWidth = PulseWidth - SlopeValue
11133  if PulseWidth <=0:
11134  PulseWidth = 1
11135  StepValue = (MaxV - MinV) / SlopeValue
11136  SampleValue = MinV
11137  for i in range(SlopeValue):
11138  AWGBwaveform.append(SampleValue)
11139  SampleValue = SampleValue + StepValue
11140  for i in range(PulseWidth):
11141  AWGBwaveform.append(MaxV)
11142  for i in range(SlopeValue):
11143  AWGBwaveform.append(SampleValue)
11144  SampleValue = SampleValue - StepValue
11145  for i in range(Remainder):
11146  AWGBwaveform.append(MinV)
11147  if AWGBBurstFlag.get() == 1:
11148  TempOneCycle = AWGBwaveform
11149  for i in range(AWGBCycles-1):
11150  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11151  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11152  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'edge')
11154  duty2lab.config(text="Width mS")
11155  phaseblab.config(text = "Rise Time")
11156  UpdateAwgCont()
11157 #
11159  global AWGBwaveform, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBPhaseDelay
11160  global AWGBFreqvalue, AWGBperiodvalue, AWGSAMPLErate, AWGBDutyCyclevalue, AWGBPhasevalue
11161  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11162  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
11163  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
11164  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11165 
11166  BAWGBAmpl(0)
11167  BAWGBOffset(0)
11168  BAWGBFreq(0)
11169  BAWGBPhase(0)
11170  BAWGBDutyCycle(0)
11171 
11172  if AWGBFreqvalue > 0.0:
11173  if AWG_2X.get() == 2:
11174  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
11175  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
11176  else:
11177  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
11178  SamplesPermS = int(BaseSampleRate/1000) # 100
11179  else:
11180  AWGBperiodvalue = 0.0
11181  if AWG_Amp_Mode.get() == 1:
11182  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11183  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11184  else:
11185  MaxV = AWGBOffsetvalue
11186  MinV = AWGBAmplvalue
11187  AWGBwaveform = []
11188  SlopeValue = int(AWGBPhasevalue*SamplesPermS)
11189  if SlopeValue <= 0:
11190  SlopeValue = 1
11191  PulseWidth = int(AWGBperiodvalue * AWGBDutyCyclevalue)
11192  if PulseWidth <=0:
11193  PulseWidth = 1
11194  Remainder = int(AWGBperiodvalue - PulseWidth)
11195  if Remainder <= 0:
11196  Remainder = 1
11197  PulseWidth = PulseWidth - SlopeValue
11198  if PulseWidth <=0:
11199  PulseWidth = 1
11200  StepValue = (MaxV - MinV) / SlopeValue
11201  SampleValue = MinV
11202  for i in range(SlopeValue):
11203  AWGBwaveform.append(SampleValue)
11204  SampleValue = SampleValue + StepValue
11205  for i in range(PulseWidth):
11206  AWGBwaveform.append(MaxV)
11207  for i in range(Remainder):
11208  AWGBwaveform.append(MinV)
11209  if AWGBBurstFlag.get() == 1:
11210  TempOneCycle = AWGBwaveform
11211  for i in range(AWGBCycles-1):
11212  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11213  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11214  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'edge')
11216  duty2lab.config(text="%")
11217  phaseblab.config(text = "Slope Time")
11218  UpdateAwgCont()
11219 #
11221  global AWGBwaveform, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBPhaseDelay
11222  global AWGBFreqvalue, AWGBperiodvalue, AWGSAMPLErate, AWGBDutyCyclevalue, AWGBPhasevalue
11223  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11224  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
11225  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
11226  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11227 
11228  BAWGBAmpl(0)
11229  BAWGBOffset(0)
11230  BAWGBFreq(0)
11231  BAWGBPhase(0)
11232  BAWGBDutyCycle(0)
11233 
11234  if AWGBFreqvalue > 0.0:
11235  if AWG_2X.get() == 2:
11236  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
11237  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
11238  else:
11239  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
11240  SamplesPermS = int(BaseSampleRate/1000) # 100
11241  else:
11242  AWGBperiodvalue = 0.0
11243  if AWG_Amp_Mode.get() == 1:
11244  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11245  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11246  else:
11247  MaxV = AWGBOffsetvalue
11248  MinV = AWGBAmplvalue
11249  #
11250  if AWGBPhaseDelay.get() == 0:
11251  if AWGBPhasevalue > 0:
11252  AWGBdelayvalue = AWGBperiodvalue * AWGBPhasevalue / 360.0
11253  else:
11254  AWGBdelayvalue = 0.0
11255  elif AWGBPhaseDelay.get() == 1:
11256  AWGBdelayvalue = AWGBPhasevalue * AWGSAMPLErate / 1000
11257  #
11258  AWGBwaveform = []
11259  PulseWidth = int(AWGBperiodvalue * AWGBDutyCyclevalue)
11260  if PulseWidth <=0:
11261  PulseWidth = 1
11262  Remainder = int(AWGBperiodvalue - PulseWidth)
11263  if Remainder <= 0:
11264  Remainder = 1
11265  UpStepValue = (MaxV - MinV) / PulseWidth
11266  DownStepValue = (MaxV - MinV) / Remainder
11267  SampleValue = MinV
11268  for i in range(PulseWidth):
11269  AWGBwaveform.append(SampleValue)
11270  SampleValue = SampleValue + UpStepValue
11271  for i in range(Remainder):
11272  AWGBwaveform.append(SampleValue)
11273  SampleValue = SampleValue - DownStepValue
11274  AWGBwaveform = numpy.roll(AWGBwaveform, int(AWGBdelayvalue))
11275  if AWGBBurstFlag.get() == 1:
11276  TempOneCycle = AWGBwaveform
11277  for i in range(AWGBCycles-1):
11278  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11279  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11280  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'edge')
11282  BAWGBPhaseDelay()
11283  duty2lab.config(text = "Symmetry")
11284  UpdateAwgCont()
11285 #
11287  global AWGBwaveform, AWGBAmplvalue, AWGBOffsetvalue, AWGBLength, AWGBPhaseDelay
11288  global AWGBFreqvalue, AWGBperiodvalue, AWGSAMPLErate, AWGBDutyCyclevalue, AWGBPhasevalue
11289  global AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11290  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
11291  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
11292  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11293 
11294  BAWGBAmpl(0)
11295  BAWGBOffset(0)
11296  BAWGBFreq(0)
11297  BAWGBPhase(0)
11298  BAWGBDutyCycle(0)
11299 
11300  if AWGBFreqvalue > 0.0:
11301  if AWG_2X.get() == 2:
11302  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
11303  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
11304  else:
11305  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
11306  SamplesPermS = int(BaseSampleRate/1000) # 100
11307  else:
11308  AWGBperiodvalue = 0.0
11309  if AWG_Amp_Mode.get() == 1:
11310  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11311  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11312  else:
11313  MaxV = AWGBOffsetvalue
11314  MinV = AWGBAmplvalue
11315  AWGBwaveform = []
11316  PulseWidth = int(AWGBperiodvalue * AWGBDutyCyclevalue / 2)
11317  if AWGBPhaseDelay.get() == 0:
11318  DelayValue = int(AWGBperiodvalue*(AWGBPhasevalue/360))
11319  elif AWGBPhaseDelay.get() == 1:
11320  DelayValue = int(AWGBPhasevalue*SamplesPermS)
11321  for i in range(DelayValue-PulseWidth):
11322  AWGBwaveform.append((MinV+MaxV)/2)
11323  for i in range(PulseWidth):
11324  AWGBwaveform.append(MaxV)
11325  for i in range(PulseWidth):
11326  AWGBwaveform.append(MinV)
11327  DelayValue = int(AWGBperiodvalue-DelayValue)
11328  for i in range(DelayValue-PulseWidth):
11329  AWGBwaveform.append((MinV+MaxV)/2)
11330  if AWGBBurstFlag.get() == 1:
11331  TempOneCycle = AWGBwaveform
11332  for i in range(AWGBCycles-1):
11333  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11334  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11335  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'edge')
11337  UpdateAwgCont()
11338 
11340  global AWGBwaveform, AWGSAMPLErate, AWGBAmplvalue, AWGBOffsetvalue, AWGBFreqvalue
11341  global AWGBLength, AWGBperiodvalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11342  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
11343  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
11344  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11345 
11346  BAWGBAmpl(0)
11347  BAWGBOffset(0)
11348  BAWGBFreq(0)
11349 
11350  if AWGBFreqvalue > 0.0:
11351  if AWG_2X.get() == 2:
11352  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
11353  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
11354  else:
11355  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
11356  SamplesPermS = int(BaseSampleRate/1000) # 100
11357  else:
11358  AWGBperiodvalue = 0.0
11359 
11360  if AWGBAmplvalue > AWGBOffsetvalue:
11361  MinV = AWGBOffsetvalue
11362  MaxV = AWGBAmplvalue
11363  else:
11364  MaxV = AWGBOffsetvalue
11365  MinV = AWGBAmplvalue
11366  if AWG_Amp_Mode.get() == 1:
11367  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11368  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11369  AWGBwaveform = []
11370  AWGBwaveform = numpy.random.uniform(MinV, MaxV, int(AWGBperiodvalue))
11371  Mid = (MaxV+MinV)/2
11372  if AWGBBurstFlag.get() == 1:
11373  TempOneCycle = AWGBwaveform
11374  for i in range(AWGBCycles-1):
11375  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11376  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11377  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'constant', constant_values=(Mid))
11379  UpdateAwgCont()
11380 
11382  global AWGBwaveform, AWGSAMPLErate, AWGBAmplvalue, AWGBOffsetvalue, AWGBFreqvalue
11383  global AWGBLength, AWGBperiodvalue, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11384  global AWGBBurstFlag, AWGBCycles, AWGBBurstDelay
11385  global AWGB2X, AWG_2X, SAMPLErate, BaseSampleRate
11386  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11387 
11388  BAWGBAmpl(0)
11389  BAWGBOffset(0)
11390  BAWGBFreq(0)
11391 
11392  if AWGBFreqvalue > 0.0:
11393  if AWG_2X.get() == 2:
11394  AWGBperiodvalue = (BaseSampleRate*2)/AWGBFreqvalue
11395  SamplesPermS = int((BaseSampleRate*2)/1000) # 200
11396  else:
11397  AWGBperiodvalue = BaseSampleRate/AWGBFreqvalue
11398  SamplesPermS = int(BaseSampleRate/1000) # 100
11399  else:
11400  AWGBperiodvalue = 0.0
11401  if AWGBAmplvalue > AWGBOffsetvalue:
11402  MinV = AWGBOffsetvalue
11403  MaxV = AWGBAmplvalue
11404  else:
11405  MaxV = AWGBOffsetvalue
11406  MinV = AWGBAmplvalue
11407  if AWG_Amp_Mode.get() == 1:
11408  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11409  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11410  AWGBwaveform = []
11411  AWGBwaveform = numpy.random.normal((MinV+MaxV)/2, (MaxV-MinV)/3, int(AWGBperiodvalue))
11412  Mid = (MaxV+MinV)/2
11413  if AWGBBurstFlag.get() == 1:
11414  TempOneCycle = AWGBwaveform
11415  for i in range(AWGBCycles-1):
11416  AWGBwaveform = numpy.concatenate((AWGBwaveform, TempOneCycle))
11417  TempDelay = int(AWGBBurstDelay*SamplesPermS) # convert mS to samples
11418  AWGBwaveform = numpy.pad(AWGBwaveform, (TempDelay, 0), 'constant', constant_values=(Mid))
11420  UpdateAwgCont()
11421 
11423  global AWGBMode, AWGBIOMode, AWGBModeLabel, DevID, devx, DevOne, CHB, HWRevOne
11424 
11425  if AWGBMode.get() == 0: # Source Voltage measure current mode
11426  label_txt = "SVMI"
11427  elif AWGBMode.get() == 1: # Source current measure voltage mode
11428  label_txt = "SIMV"
11429  elif AWGBMode.get() == 2: # High impedance mode
11430  label_txt = "Hi-Z"
11431  if AWGBIOMode.get() > 0: # Split Input / Output mode
11432  if HWRevOne == "D":
11433  if AWGBMode.get() == 0:
11434  AWGBMode.set(1)
11435  CHB.set_mode('i') # channel must be in source current mode for rev D boards
11436  label_txt = "SIMV"
11437  label_txt = label_txt + " Split I/O"
11438  label_txt = label_txt + " Mode"
11439  AWGBModeLabel.config(text = label_txt ) # change displayed value
11440  ReMakeAWGwaves()
11441  #UpdateAwgCont()
11442 
11444  global AWGBAmplvalue, AWGBOffsetvalue, AWGA2X, AWG_2X
11445  global AWGBFreqvalue, AWGBPhasevalue, AWGBPhaseDelay
11446  global AWGBDutyCyclevalue, FSweepMode, AWGBRepeatFlag, AWGSync
11447  global AWGBWave, AWGBMode, AWGBTerm, AWGBwaveform, AWGBIOMode
11448  global CHA, CHB, AWGSAMPLErate, DevID, devx, HWRevOne
11449  global amp2lab, off2lab, AWG_Amp_Mode # 0 = Min/Max mode, 1 = Amp/Offset
11450  global AWGA2X, AWGB2X, AWGAWave, AWGARepeatFlag
11451  global AWGA_Ext_Gain, AWGA_Ext_Offset, AWGB_Ext_Gain, AWGB_Ext_Offset
11452 
11453  if AWG_Amp_Mode.get() == 0: # 0 = Min/Max mode, 1 = Amp/Offset
11454  amp2lab.config(text = "Min Ch B" ) # change displayed value
11455  off2lab.config(text = "Max Ch B" ) # change displayed value
11456  else:
11457  amp2lab.config(text = "Amp Ch B" )
11458  off2lab.config(text = "Off Ch B" )
11459 #
11460  if AWG_2X.get() == 1:
11461  AWGBWave = 'arbitrary'
11462  if AWGBFreqvalue > 0.0:
11463  AWGBperiodvalue = AWGSAMPLErate/AWGBFreqvalue
11464  else:
11465  AWGBperiodvalue = 0.0
11466 #
11467  if AWGBPhaseDelay.get() == 0:
11468  if AWGBWave == 'square':
11469  AWGBPhasevalue = AWGBPhasevalue + 270.0
11470  if AWGBPhasevalue > 359:
11471  AWGBPhasevalue = AWGBPhasevalue - 360
11472  if AWGBPhasevalue > 0:
11473  AWGBdelayvalue = AWGBperiodvalue * AWGBPhasevalue / 360.0
11474  else:
11475  AWGBdelayvalue = 0.0
11476  elif AWGBPhaseDelay.get() == 1:
11477  AWGBdelayvalue = AWGBPhasevalue * 100
11478 #
11479  if AWGBTerm.get() == 0: # Open termination
11480  devx.ctrl_transfer( 0x40, 0x51, 37, 0, 0, 0, 100) # set 2.5 V switch to open
11481  devx.ctrl_transfer( 0x40, 0x51, 38, 0, 0, 0, 100) # set GND switch to open
11482  elif AWGBTerm.get() == 1: # 50 Ohm termination to GND
11483  devx.ctrl_transfer( 0x40, 0x51, 37, 0, 0, 0, 100) # set 2.5 V switch to open
11484  devx.ctrl_transfer( 0x40, 0x50, 38, 0, 0, 0, 100) # set GND switch to closed
11485  elif AWGBTerm.get() == 2: # 50 Ohm termination to +2.5 Volts
11486  devx.ctrl_transfer( 0x40, 0x50, 37, 0, 0, 0, 100) # set 2.5 V switch to closed
11487  devx.ctrl_transfer( 0x40, 0x51, 38, 0, 0, 0, 100) # set GND switch to open
11488 
11489  if AWGBWave == 'dc':
11490  if AWG_2X.get() == 1:
11491  AWGBWave == 'arbitrary'
11492  CHB.arbitrary(AWGA2X, AWGARepeatFlag.get())
11493  else:
11494  if AWGBMode.get() == 0: # Source Voltage measure current mode
11495  if AWGBIOMode.get() == 0:
11496  CHB.mode = Mode.SVMI # Put CHB in SVMI mode
11497  else:
11498  CHB.mode = Mode.SVMI_SPLIT # Put CHB in SVMI split mode
11499  CHB.constant(AWGBOffsetvalue)
11500  if AWGBMode.get() == 1: # Source current measure Voltage mode
11501  if AWGBIOMode.get() == 0:
11502  CHB.mode = Mode.SIMV # Put CHB in SIMV mode
11503  else:
11504  CHB.mode = Mode.SIMV_SPLIT # Put CHB in SIMV split mode
11505  CHB.constant(AWGBOffsetvalue/1000)
11506  if AWGBMode.get() == 2: # Hi impedance mode
11507  if AWGBIOMode.get() == 0:
11508  CHB.mode = Mode.HI_Z # Put CHB in Hi Z mode
11509  else:
11510  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z split mode
11511 #
11512  if AWGBIOMode.get() > 0: # Split Input / Output mode
11513  if HWRevOne == "D":
11514  AWGBMode.set(1)
11515  CHB.mode = Mode.SIMV_SPLIT # channel must be in source current mode
11516 #
11517  else:
11518  if AWGBMode.get() == 0: # Source Voltage measure current mode
11519  if AWGBIOMode.get() == 0:
11520  CHB.mode = Mode.SVMI # Put CHB in SVMI mode
11521  else:
11522  CHB.mode = Mode.SVMI_SPLIT # Put CHB in SVMI split mode
11523  if AWGBMode.get() == 1: # Source current measure Voltage mode
11524  if AWGBIOMode.get() == 0:
11525  CHB.mode = Mode.SIMV # Put CHB in SIMV mode
11526  else:
11527  CHB.mode = Mode.SIMV_SPLIT # Put CHB in SIMV split mode
11528  AWGBOffsetvalue = AWGBOffsetvalue/1000
11529  AWGBAmplvalue = AWGBAmplvalue/1000
11530  if AWGBMode.get() == 2: # Hi impedance mode
11531  if AWGBIOMode.get() == 0:
11532  CHB.mode = Mode.HI_Z # Put CHB in Hi Z mode
11533  else:
11534  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z split mode
11535  else:
11536  if AWG_Amp_Mode.get() == 1:
11537  MaxV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() + (AWGBAmplvalue * AWGB_Ext_Gain.get())
11538  MinV = (AWGBOffsetvalue * AWGB_Ext_Gain.get()) + AWGB_Ext_Offset.get() - (AWGBAmplvalue * AWGB_Ext_Gain.get())
11539  else:
11540  MaxV = AWGBOffsetvalue
11541  MinV = AWGBAmplvalue
11542  try: # keep going even if low level library returns an error
11543  if AWGBWave == 'sine':
11544  CHB.sine(MaxV, MinV, AWGBperiodvalue, AWGBdelayvalue)
11545  elif AWGBWave == 'triangle':
11546  CHB.triangle(MaxV, MinV, AWGBperiodvalue, AWGBdelayvalue)
11547  elif AWGBWave == 'sawtooth':
11548  CHB.sawtooth(MaxV, MinV, AWGBperiodvalue, AWGBdelayvalue)
11549  elif AWGBWave == 'square':
11550  CHB.square(MaxV, MinV, AWGBperiodvalue, AWGBdelayvalue, AWGBDutyCyclevalue)
11551  elif AWGBWave == 'stairstep':
11552  CHB.stairstep(MaxV, MinV, AWGBperiodvalue, AWGBdelayvalue)
11553  elif AWGBWave == 'arbitrary':
11554  if AWGSync.get() == 0:
11555  AWGBRepeatFlag.set(1)
11556  if AWG_2X.get() == 1:
11557  AWGBWave == 'arbitrary'
11558  CHB.arbitrary(AWGA2X, AWGARepeatFlag.get())
11559  else:
11560  CHB.arbitrary(AWGBwaveform, AWGBRepeatFlag.get()) # set repeat flag
11561  except:
11562  donothing()
11563  if AWGBIOMode.get() > 0: # Split Input / Output mode
11564  if HWRevOne == "D":
11565  AWGBMode.set(1)
11566  CHB.mode = Mode.SIMV_SPLIT # channel must be in source current mode
11567 #
11569  global session, CHA, CHB, AWGSync
11570  # if running and in continuous streaming mode temp stop, flush buffer and restart to change AWG settings
11571  if (RUNstatus.get() == 1) and AWGSync.get() == 0:
11572  if session.continuous:
11573  session.end()
11574  BAWGEnab() # set-up new AWG settings
11575  time.sleep(0.01) # wait awhile here for some reason
11576  session.start(0)
11577 #
11579  ReMakeAWGwaves()
11580 
11581 def BAWGEnab():
11582  global AWGAMode, AWGBMode, AWGSync
11583  global CHA, CHB, discontloop, contloop, session
11584 
11585  # Stream = False
11586  # print "Updateing AWGs"
11587  BAWGAAmpl(0)
11588  BAWGAOffset(0)
11589  BAWGAFreq(0)
11590  BAWGAPhase(0)
11591  BAWGADutyCycle(0)
11592  BAWGAShape()
11593  BAWGBAmpl(0)
11594  BAWGBOffset(0)
11595  BAWGBFreq(0)
11596  BAWGBPhase(0)
11597  BAWGBDutyCycle(0)
11598  BAWGBShape()
11599  UpdateAWGA()
11600  UpdateAWGB()
11601 
11602 def BAWGSync():
11603  global RUNstatus, AWGSync, session, CHA, CHB, IAScreenStatus, IADisp
11604 
11605  if (RUNstatus.get() == 1): # do this only if running
11606  if IAScreenStatus.get() > 0 and IADisp.get() > 0:
11607  AWGSync.set(1)
11608  return
11609  if AWGSync.get() == 0:
11610  #UpdateAwgCont()
11611  session.flush()
11612  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z mode
11613  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z mode
11614  BAWGEnab()
11615  session.start(0)
11616  time.sleep(0.02) # wait awhile here for some reason
11617  elif session.continuous:
11618  session.end()
11619  session.flush()
11620  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z mode
11621  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z mode
11622 
11623 # ======= Spectrum Analyzer functions ===========
11624 #
11626  global CANVASwidthF, CANVASheightF, freqwindow
11627  global COLORtext
11628  # ask for file name
11629  filename = asksaveasfilename(defaultextension = ".eps", filetypes=[("Encapsulated Postscript", "*.eps")], parent=freqwindow)
11630  Orient = askyesno("Rotation","Save in Landscape (Yes) or Portrait (No):\n", parent=freqwindow)
11631  if MarkerNum > 0 or ColorMode.get() > 0:
11632  Freqca.postscript(file=filename, height=CANVASheightF, width=CANVASwidthF, colormode='color', rotate=Orient)
11633  else: # temp change text color to black
11634  COLORtext = "#000000"
11636  # save postscript file
11637  Freqca.postscript(file=filename, height=CANVASheightF, width=CANVASwidthF, colormode='color', rotate=Orient)
11638  #
11639  COLORtext = "#ffffff"
11641 #
11642 def Bnot():
11643  print( "Routine not made yet")
11644 
11646  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P
11647  ShowC1_VdB.set(1)
11648  ShowC1_P.set(1)
11649  ShowC2_VdB.set(1)
11650  ShowC2_P.set(1)
11651 
11653  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P
11654  ShowC1_VdB.set(0)
11655  ShowC1_P.set(0)
11656  ShowC2_VdB.set(0)
11657  ShowC2_P.set(0)
11658 
11660  global RUNstatus
11661  global FreqTraceMode
11662 
11663  FreqTraceMode.set(1)
11664  if RUNstatus.get() == 0: # Update if stopped
11666  if RUNstatus.get() == 2: # Restart if running
11667  RUNstatus.set(4)
11668 
11670  global RUNstatus
11671  global FreqTraceMode
11672 
11673  FreqTraceMode.set(2)
11674  if RUNstatus.get() == 0: # Update if stopped
11676  if RUNstatus.get() == 2: # Restart if running
11677  RUNstatus.set(4)
11678 
11680  global RUNstatus, TRACEaverage, FreqTraceMode, freqwindow
11681 
11682  FreqTraceMode.set(3)
11683 
11684  if RUNstatus.get() == 0: # Update if stopped
11686  if RUNstatus.get() == 2: # Restart if running
11687  RUNstatus.set(4)
11688 
11690  global FreqTraceMode, TRACEresetFreq
11691 
11692  if FreqTraceMode.get()==3:
11693  TRACEresetFreq = True
11694 
11696  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P, ShowMathSA
11697  global T1Fline, T2Fline, T1FRline, T2FRline, TFRMline, TFMline
11698  global T1Pline, T2Pline, T1PRline, T2PRline
11699  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB
11700  global PeakxM, PeakyM, PeakMdb, PeakfreqM
11701  global PeakfreqA, PeakfreqB, PeakfreqRA, PeakfreqRB
11702  global PeakxRA, PeakyRA, PeakxRB, PeakyRB, PeakdbRA, PeakdbRB
11703  global PeakxRM, PeakyRM, PeakRMdb, PeakfreqRM
11704 
11705  if ShowC1_VdB.get() == 1:
11706  T1FRline = T1Fline
11707  PeakxRA = PeakxA
11708  PeakyRA = PeakyA
11709  PeakdbRA = PeakdbA
11710  PeakfreqRA = PeakfreqA
11711  if ShowC2_VdB.get() == 1:
11712  T2FRline = T2Fline
11713  PeakxRB = PeakxB
11714  PeakyRB = PeakyB
11715  PeakdbRB = PeakdbB
11716  PeakfreqRB = PeakfreqB
11717  if ShowC1_P.get() == 1:
11718  T1PRline = T1Pline
11719  if ShowC2_P.get() == 1:
11720  T2PRline = T2Pline
11721  if ShowMathSA.get() > 0:
11722  TFRMline = TFMline
11723  PeakxRM = PeakxM
11724  PeakyRM = PeakyM
11725  PeakRMdb = PeakMdb
11726  PeakfreqRM = PeakfreqM
11727 
11728  UpdateFreqTrace() # Always Update
11729 #
11731  global ShowCA_VdB, ShowCA_P, ShowCB_VdB, ShowCB_P, ShowMathBP
11732  global Show_Rseries, Show_Xseries, Show_Magnitude, Show_Angle
11733  global TAFline, TBFline, TAFRline, TBFRline, TBPRMline, TBPMline
11734  global TAPline, TBPline, TAPRline, TBPRline
11735  global TIARline, TIAXline, TIAMagline, TIAAngline
11736  global RefIARline, RefIAXline, RefIAMagline, RefIAAngline
11737  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB
11738  global PeakxM, PeakyM, PeakMdb, PeakfreqM
11739  global PeakfreqA, PeakfreqB, PeakfreqRA, PeakfreqRB
11740  global PeakxRA, PeakyRA, PeakxRB, PeakyRB, PeakdbRA, PeakdbRB
11741  global PeakxRM, PeakyRM, PeakRMdb, PeakfreqRM
11742 
11743  if ShowCA_VdB.get() == 1:
11744  TAFRline = TAFline
11745  PeakxRA = PeakxA
11746  PeakyRA = PeakyA
11747  PeakdbRA = PeakdbA
11748  PeakfreqRA = PeakfreqA
11749  if ShowCB_VdB.get() == 1:
11750  TBFRline = TBFline
11751  PeakxRB = PeakxB
11752  PeakyRB = PeakyB
11753  PeakdbRB = PeakdbB
11754  PeakfreqRB = PeakfreqB
11755  if ShowCA_P.get() == 1:
11756  TAPRline = TAPline
11757  if ShowCB_P.get() == 1:
11758  TBPRline = TBPline
11759  if ShowMathBP.get() > 0:
11760  TBPRMline = TBPMline
11761  PeakxRM = PeakxM
11762  PeakyRM = PeakyM
11763  PeakRMdb = PeakMdb
11764  PeakfreqRM = PeakfreqM
11765  if Show_Rseries.get() > 0:
11766  RefIARline = TIARline
11767  if Show_Xseries.get() > 0:
11768  RefIAXline = TIAXline
11769  if Show_Magnitude.get() > 0:
11770  RefIAMagline = TIAMagline
11771  if Show_Angle.get() > 0:
11772  RefIAAngline = TIAAngline
11773  UpdateBodeTrace() # Always Update
11774 #
11775 def BCSVfile(): # Store the trace as CSV file [frequency, magnitude or dB value]
11776  global FSweepAdB, FSweepBdB, FSweepAPh, FSweepBPh, FStep, FBins, bodewindow
11777  global SAMPLErate, ShowCA_VdB, ShowCA_P, ShowCB_VdB, ShowCB_P
11778 
11779  # Set the TRACEsize variable
11780  if ShowCA_VdB.get() == 1:
11781  TRACEsize = len(FSweepAdB) # Set the trace length
11782  elif ShowCA_VdB.get() == 1:
11783  TRACEsize = len(FSweepBdB)
11784  if TRACEsize == 0: # If no trace, skip rest of this routine
11785  return()
11786 # ask if save as magnitude or dB
11787  dB = askyesno("Mag or dB: ","Save amplidude data as dB (Yes) or Mag (No):\n", parent=bodewindow)
11788 # Yes 1 = dB, No 0 = Mag
11789  # Make the file name and open it
11790  tme = strftime("%Y%b%d-%H%M%S", gmtime()) # The time
11791  filename = "Bode-" + tme
11792  filename = filename + ".csv"
11793  # open file to save data
11794  filename = asksaveasfilename(initialfile = filename, defaultextension = ".csv",
11795  filetypes=[("Comma Separated Values", "*.csv")], parent=bodewindow)
11796  DataFile = open(filename,'a') # Open output file
11797  HeaderString = 'Frequency-#, '
11798  if ShowCA_VdB.get() == 1:
11799  if dB == 1:
11800  HeaderString = HeaderString + 'CA-dB, '
11801  if dB == 0:
11802  HeaderString = HeaderString + 'CA-Mag, '
11803  if ShowCB_VdB.get() == 1:
11804  if dB == 1:
11805  HeaderString = HeaderString + 'CB-dB, '
11806  if dB == 0:
11807  HeaderString = HeaderString + 'CB-Mag, '
11808  if ShowCA_P.get() == 1:
11809  HeaderString = HeaderString + 'Phase A-B, '
11810  if ShowCB_P.get() == 1:
11811  HeaderString = HeaderString + 'Phase B-A, '
11812  HeaderString = HeaderString + '\n'
11813  DataFile.write( HeaderString )
11814 
11815  n = 0
11816  while n < len(FSweepAdB):
11817  F = FBins[FStep[n]] # look up frequency bin in list of bins
11818  txt = str(F)
11819  if ShowCA_VdB.get() == 1:
11820  V = 10 * math.log10(float(FSweepAdB[n])) + 17 # Add 17 dB for max value of +10 dB
11821  if dB == 0:
11822  V = 10.0**(V/20.0)
11823  txt = txt + "," + str(V)
11824  if ShowCB_VdB.get() == 1:
11825  V = 10 * math.log10(float(FSweepBdB[n])) + 17 # Add 17 dB for max value of +10 dB
11826  if dB == 0:
11827  V = 10.0**(V/20.0)
11828  txt = txt + "," + str(V)
11829  if ShowCA_P.get() == 1:
11830  RelPhase = FSweepAPh[n]#-FSweepBPh[n]
11831  if RelPhase > 180:
11832  RelPhase = RelPhase - 360
11833  elif RelPhase < -180:
11834  RelPhase = RelPhase + 360
11835  txt = txt + "," + str(RelPhase)
11836  if ShowCB_P.get() == 1:
11837  RelPhase = FSweepBPh[n]#-FSweepAPh[n]
11838  if RelPhase > 180:
11839  RelPhase = RelPhase - 360
11840  elif RelPhase < -180:
11841  RelPhase = RelPhase + 360
11842  txt = txt + "," + str(RelPhase)
11843  txt = txt + "\n"
11844  DataFile.write(txt)
11845  n = n + 1
11846 
11847  DataFile.close() # Close the file
11848 
11850  global iawindow, FStep, FBins
11851  global NetworkScreenStatus, NSweepSeriesR, NSweepSeriesX, NSweepSeriesMag, NSweepSeriesAng
11852 
11853  if NetworkScreenStatus.get() > 0:
11854  tme = strftime("%Y%b%d-%H%M%S", gmtime()) # The time
11855  filename = "Impedance-" + tme
11856  filename = filename + ".csv"
11857  # open file to save data
11858  filename = asksaveasfilename(initialfile = filename, defaultextension = ".csv",
11859  filetypes=[("Comma Separated Values", "*.csv")], parent=iawindow)
11860  DataFile = open(filename,'a') # Open output file
11861  HeaderString = 'Frequency, Series R, Seriec X, Series Z, Series Angle'
11862  HeaderString = HeaderString + '\n'
11863  DataFile.write( HeaderString )
11864 
11865  n = 0
11866  while n < len(NSweepSeriesR):
11867  F = FBins[FStep[n]] # look up frequency bin in list of bins
11868  txt = str(F) + "," + str(NSweepSeriesR[n]) + "," + str(NSweepSeriesX[n]) + "," + str(NSweepSeriesMag[n]) + "," + str(NSweepSeriesAng[n])
11869  txt = txt + "\n"
11870  DataFile.write(txt)
11871  n = n + 1
11872  DataFile.close() # Close the file
11873  else:
11874  return
11875 #
11876 def BStartSA():
11877  global RUNstatus, PowerStatus, devx, PwrBt, freqwindow, session, AWGSync, contloop, discontloop
11878  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P, ShowMathSA, DevID, FWRevOne, StopFreqEntry
11879  global Two_X_Sample, ADC_Mux_Mode, ShowAWGASA, ShowAWGBSA
11880 
11881  #AWGSync.set(0) # always run in continuous mode
11882  if DevID == "No Device":
11883  showwarning("WARNING","No Device Plugged In!")
11884  elif FWRevOne == 0.0:
11885  showwarning("WARNING","Out of data Firmware!")
11886  else:
11887  if PowerStatus == 0:
11888  PowerStatus = 1
11889  PwrBt.config(style="Pwr.TButton",text="PWR-On")
11890  devx.ctrl_transfer( 0x40, 0x51, 49, 0, 0, 0, 100) # turn on analog power
11891 
11892  if (ShowC1_VdB.get() == 0 and
11893  ShowC2_VdB.get() == 0 and
11894  ShowMathSA.get() == 0 and
11895  ShowAWGASA.get() == 0 and
11896  ShowAWGBSA.get() == 0 and
11897  ShowC1_P.get() == 0 and
11898  ShowC2_P.get() == 0):
11899  showwarning("WARNING","Select at least one trace first", parent=freqwindow)
11900  return()
11901  try:
11902  StopFrequency = float(StopFreqEntry.get())
11903  except:
11904  StopFreqEntry.delete(0,"end")
11905  StopFreqEntry.insert(0,50000)
11906  StopFrequency = 50000
11907  if FWRevOne > 2.16:
11908  if StopFrequency >= 50000:
11909  Two_X_Sample.set(1)
11910  else:
11911  Two_X_Sample.set(0)
11912  ADC_Mux_Mode.set(0)
11913  SetADC_Mux()
11914  #
11915  BStart()
11916 #
11917  UpdateFreqAll() # Always Update
11918 
11919 def BStopSA():
11920  global RUNstatus, session, AWGSync
11921 
11922  if (RUNstatus.get() == 1):
11923  RUNstatus.set(0)
11924  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z split mode
11925  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z split mode
11926  if AWGSync.get() == 0: # running in continuous mode
11927  CHA.constant(0.0)
11928  CHB.constant(0.0)
11929  # print "Stoping continuous mode"
11930  if session.continuous:
11931  # print "Stoping Is Continuous? ", session.continuous
11932  time.sleep(0.02)
11933  #print "Is Continuous? ", session.continuous
11934  else:
11935  contloop = 0
11936  discontloop = 1
11937  session.cancel()
11938  elif (RUNstatus.get() == 2):
11939  RUNstatus.set(3)
11940  elif (RUNstatus.get() == 3):
11941  RUNstatus.set(3)
11942  elif (RUNstatus.get() == 4):
11943  RUNstatus.set(3)
11944  UpdateFreqAll() # Always Update
11945 
11946 def Blevel1():
11947  global DBlevel
11948  global RUNstatus
11949 
11950  DBlevel.set(DBlevel.get() - 1)
11951 
11952  if RUNstatus.get() == 0: # Update if stopped
11953  UpdateFreqTrace()
11954 
11955 def Blevel2():
11956  global DBlevel
11957  global RUNstatus
11958 
11959  DBlevel.set(DBlevel.get() + 1)
11960 
11961  if RUNstatus.get() == 0: # Update if stopped
11962  UpdateFreqTrace()
11963 
11964 def Blevel3():
11965  global DBlevel
11966  global RUNstatus
11967 
11968  DBlevel.set(DBlevel.get() - 10)
11969 
11970  if RUNstatus.get() == 0: # Update if stopped
11971  UpdateFreqTrace()
11972 
11973 def Blevel4():
11974  global DBlevel
11975  global RUNstatus
11976 
11977  DBlevel.set(DBlevel.get() + 10)
11978 
11979  if RUNstatus.get() == 0: # Update if stopped
11980  UpdateFreqTrace()
11981 #
11983  global RUNstatus, SpectrumScreenStatus, IAScreenStatus
11984  global SMPfftpwrTwo, SMPfft, FFTwindow
11985  global TRACEresetFreq, PhAScreenStatus
11986 
11987  if FFTwindow.get() != 8:
11988  if (SMPfftpwrTwo.get() > 6): # Min 64
11989  SMPfftpwrTwo.set(SMPfftpwrTwo.get() - 1)
11990  TRACEresetFreq = True # Reset trace peak and trace average
11991  SMPfft = 2 ** int(SMPfftpwrTwo.get())
11992 
11993  if RUNstatus.get() == 0: # Update if stopped
11994  if SpectrumScreenStatus.get() > 0:
11996  if IAScreenStatus.get() > 0:
11997  UpdateIAScreen()
11998  if PhAScreenStatus.get() > 0:
11999  UpdatePhAScreen()
12000  if RUNstatus.get() == 2: # Restart if running
12001  RUNstatus.set(4)
12002 
12004  global RUNstatus, PhAScreenStatus
12005  global SMPfftpwrTwo, SMPfft, FFTwindow
12006  global TRACEresetFreq, SpectrumScreenStatus, IAScreenStatus
12007 
12008  if FFTwindow.get() != 8:
12009  if (SMPfftpwrTwo.get() < 16): # Max 65536
12010  SMPfftpwrTwo.set(SMPfftpwrTwo.get() + 1)
12011  TRACEresetFREQ = True # Reset trace peak and trace average
12012  SMPfft = 2 ** int(SMPfftpwrTwo.get())
12013 
12014  if RUNstatus.get() == 0: # Update if stopped
12015  if SpectrumScreenStatus.get() > 0:
12017  if IAScreenStatus.get() > 0:
12018  UpdateIAScreen()
12019  if PhAScreenStatus.get() > 0:
12020  UpdatePhAScreen()
12021  if RUNstatus.get() == 2: # Restart if running
12022  RUNstatus.set(4)
12023 
12024 def BDBdiv1():
12025  global DBdivindex
12026  global RUNstatus
12027 
12028  if (DBdivindex.get() >= 1):
12029  DBdivindex.set(DBdivindex.get() - 1)
12030 
12031  if RUNstatus.get() == 0: # Update if stopped
12032  UpdateFreqTrace()
12033 
12034 def BDBdiv2():
12035  global DBdivindex
12036  global DBdivlist
12037  global RUNstatus
12038 
12039  if (DBdivindex.get() < len(DBdivlist) - 1):
12040  DBdivindex.set(DBdivindex.get() + 1)
12041 
12042  if RUNstatus.get() == 0: # Update if stopped
12043  UpdateFreqTrace()
12044 #----- Bode Plot controls
12045 def BStartBP():
12046  global RUNstatus, LoopNum, PowerStatus, devx, PwrBt, bodewindow, session, AWGSync
12047  global ShowCA_VdB, ShowCB_P, ShowCB_VdB, ShowCB_P, ShowMathBP, contloop, discontloop
12048  global FBins, FStep, NSteps, FSweepMode, HScaleBP, CutDC
12049  global AWGAMode, AWGAShape, AWGBMode, AWGBShape
12050  global StartBodeEntry, StopBodeEntry, SweepStepBodeEntry, DevID, FWRevOne
12051  global AWGAFreqEntry, AWGBFreqEntry, Reset_Freq, AWGAIOMode, AWGBIOMode
12052  global Two_X_Sample, ADC_Mux_Mode, AWG_2X, ZEROstuffing, SAMPLErate
12053  global BeginIndex, EndIndex
12054 
12055  if DevID == "No Device":
12056  showwarning("WARNING","No Device Plugged In!")
12057  elif FWRevOne == 0.0:
12058  showwarning("WARNING","Out of data Firmware!")
12059  else:
12060  if PowerStatus == 0:
12061  PowerStatus = 1
12062  PwrBt.config(style="Pwr.TButton",text="PWR-On")
12063  devx.ctrl_transfer( 0x40, 0x51, 49, 0, 0, 0, 100) # turn on analog power
12064 
12065  if ShowCA_VdB.get() == 0 and ShowCB_VdB.get() == 0 and ShowMathBP.get() == 0:
12066  showwarning("WARNING","Select at least one trace first", parent=bodewindow)
12067  return()
12068  #
12069  if ZEROstuffing.get() < 3:
12070  ZEROstuffing.set(3)
12071  CutDC.set(1) # set to remove DC
12072  try:
12073  EndFreq = float(StopBodeEntry.get())
12074  except:
12075  StopBodeEntry.delete(0,"end")
12076  StopBodeEntry.insert(0,10000)
12077  EndFreq = 10000
12078  if FWRevOne > 2.16:
12079  if EndFreq >= 20000:
12080  Two_X_Sample.set(1)
12081  FBins = numpy.linspace(0, 100000, num=16384)
12082  else:
12083  Two_X_Sample.set(0)
12084  FBins = numpy.linspace(0, 50000, num=16384)
12085  ADC_Mux_Mode.set(0)
12086  SetADC_Mux()
12087  try:
12088  BeginFreq = float(StartBodeEntry.get())
12089  except:
12090  StartBodeEntry.delete(0,"end")
12091  StartBodeEntry.insert(0,100)
12092  BeginFreq = 100
12093  #
12094  if FSweepMode.get() == 1:
12095  if AWGAMode.get() == 2:
12096  AWGAMode.set(0) # Set AWG A to SVMI
12097  AWGAShape.set(18) # Set Shape to Sine
12098  if Two_X_Sample.get() == 1:
12099  AWGBIOMode.set(1)
12100  AWGBMode.set(0)
12101  else:
12102  AWGBMode.set(2) # Set AWG B to Hi-Z
12103  AWG_2X.set(0)
12104  BAWG2X()
12105  Reset_Freq = AWGAFreqEntry.get()
12106  if FSweepMode.get() == 2:
12107  if AWGBMode.get() == 2:
12108  AWGBMode.set(0) # Set AWG B to SVMI
12109  AWGBShape.set(18) # Set Shape to Sine
12110  if Two_X_Sample.get() == 1:
12111  AWGAIOMode.set(1)
12112  AWGAMode.set(0)
12113  else:
12114  AWGAMode.set(2) # Set AWG A to Hi-Z
12115  AWG_2X.set(0)
12116  BAWG2X()
12117  Reset_Freq = AWGBFreqEntry.get()
12118  if FSweepMode.get() == 3: # using external Minigen
12119  AWGAMode.set(2) # Set AWG A to Hi-Z
12120  AWGBMode.set(2) # Set AWG B to Hi-Z
12121  try:
12122  NSteps.set(float(SweepStepBodeEntry.get()))
12123  except:
12124  SweepStepBodeEntry.delete(0,"end")
12125  SweepStepBodeEntry.insert(0, NSteps.get())
12126  #
12127  if FSweepMode.get() > 0:
12128  BAWGAModeLabel() # make sure AWG screen labels reflect any changes to the modes
12129  BAWGBModeLabel()
12130  LoopNum.set(1)
12131  NyquistFreq = SAMPLErate/2
12132  BeginIndex = int((BeginFreq/NyquistFreq)*16384)
12133  EndIndex = int((EndFreq/NyquistFreq)*16384)
12134  if NSteps.get() < 5:
12135  NSteps.set(5)
12136  if HScaleBP.get() == 1:
12137  LogFStop = math.log10(EndIndex)
12138  try:
12139  LogFStart = math.log10(BeginIndex)
12140  except:
12141  LogFStart = 1.0
12142  FStep = numpy.logspace(LogFStart, LogFStop, num=NSteps.get(), base=10.0)
12143  else:
12144  FStep = numpy.linspace(BeginIndex, EndIndex, num=NSteps.get())
12145  BStart()
12146  # UpdateBodeAll() # Always Update
12147 #
12148 def BStopBP():
12149  global RUNstatus, session, AWGSync, FSweepMode, AWGAFreqEntry, AWGBFreqEntry, Reset_Freq
12150 
12151  if FSweepMode.get() == 1:
12152  AWGAFreqEntry.delete(0,"end")
12153  AWGAFreqEntry.insert(0, Reset_Freq)
12154  if FSweepMode.get() == 2:
12155  AWGBFreqEntry.delete(0,"end")
12156  AWGBFreqEntry.insert(0, Reset_Freq)
12157 #
12158  if (RUNstatus.get() == 1):
12159  RUNstatus.set(0)
12160  if AWGSync.get() == 0: # running in continuous mode
12161  session.cancel() # cancel continuous session mode while paused
12162  elif (RUNstatus.get() == 2):
12163  RUNstatus.set(3)
12164  elif (RUNstatus.get() == 3):
12165  RUNstatus.set(3)
12166  elif (RUNstatus.get() == 4):
12167  RUNstatus.set(3)
12168  UpdateBodeAll() # Always Update
12169 #
12171  global DBlevelBP
12172  global RUNstatus
12173 
12174  DBlevelBP.set(DBlevelBP.get() - 1)
12175 
12176  if RUNstatus.get() == 0: # Update if stopped
12177  UpdateBodeTrace()
12178 
12180  global DBlevelBP
12181  global RUNstatus
12182 
12183  DBlevelBP.set(DBlevelBP.get() + 1)
12184 
12185  if RUNstatus.get() == 0: # Update if stopped
12186  UpdateBodeTrace()
12187 
12189  global DBlevelBP
12190  global RUNstatus
12191 
12192  DBlevelBP.set(DBlevelBP.get() - 10)
12193 
12194  if RUNstatus.get() == 0: # Update if stopped
12195  UpdateBodeTrace()
12196 
12198  global DBlevelBP
12199  global RUNstatus
12200 
12201  DBlevelBP.set(DBlevelBP.get() + 10)
12202 
12203  if RUNstatus.get() == 0: # Update if stopped
12204  UpdateBodeTrace()
12205 
12207  global DBdivindexBP
12208  global RUNstatus
12209 
12210  if (DBdivindexBP.get() >= 1):
12211  DBdivindexBP.set(DBdivindexBP.get() - 1)
12212 
12213  if RUNstatus.get() == 0: # Update if stopped
12214  UpdateBodeTrace()
12215 
12217  global DBdivindexBP
12218  global DBdivlist
12219  global RUNstatus
12220 
12221  if (DBdivindexBP.get() < len(DBdivlist) - 1):
12222  DBdivindexBP.set(DBdivindexBP.get() + 1)
12223 
12224  if RUNstatus.get() == 0: # Update if stopped
12225  UpdateBodeTrace()
12226 #
12228  global ShowCA_VdB, ShowCA_P, ShowCB_VdB, ShowCB_P
12229  ShowCA_VdB.set(1)
12230  ShowCA_P.set(1)
12231  ShowCB_VdB.set(1)
12232  ShowCB_P.set(1)
12233 
12235  global ShowCA_VdB, ShowCA_P, ShowCB_VdB, ShowCB_P
12236  ShowCA_VdB.set(0)
12237  ShowCA_P.set(0)
12238  ShowCB_VdB.set(0)
12239  ShowCB_P.set(0)
12240 # Bode Plot refresh
12241 def UpdateBodeAll(): # Update Data, trace and screen
12242  global FFTBuffA, FFTBuffB
12243  global SMPfft
12244 
12245  # DoFFT() # Fast Fourier transformation
12246  MakeBodeTrace() # Update the traces
12247  UpdateBodeScreen() # Update the screen
12248 
12249 def UpdateBodeTrace(): # Update trace and screen
12250  MakeBodeTrace() # Update traces
12251  UpdateBodeScreen() # Update the screen
12252 
12253 def UpdateBodeScreen(): # Update screen with trace and text
12254  MakeBodeScreen() # Update the screen
12255 
12256 # ============================================ Freq Main routine ====================================================
12257 
12258 def UpdateFreqAll(): # Update Data, trace and screen
12259  global FFTBuffA, FFTBuffB
12260  global SMPfft
12261 
12262  if len(FFTBuffA) < SMPfft and len(FFTBuffB) < SMPfft:
12263  return
12264 
12265  # DoFFT() # Fast Fourier transformation
12266  MakeFreqTrace() # Update the traces
12267  UpdateFreqScreen() # Update the screen
12268 
12269 def UpdateFreqTrace(): # Update trace and screen
12270  MakeFreqTrace() # Update traces
12271  UpdateFreqScreen() # Update the screen
12272 
12273 def UpdateFreqScreen(): # Update screen with trace and text
12274  MakeFreqScreen() # Update the screen
12275 
12276 def DoFFT(): # Fast Fourier transformation
12277  global FFTBuffA, FFTBuffB, AWGAwaveform, AWGBwaveform
12278  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P, ShowAWGASA, ShowAWGBSA
12279  global FFTmemoryA, FFTresultA, FFTresultAB, PhaseAB
12280  global FFTmemoryB, FFTresultB, FFTresultAWGA, FFTresultAWGB
12281  global FSweepAdB, FSweepBdB, FSweepAPh, FSweepBPh
12282  global PhaseA, PhaseB, PhaseMemoryA, PhaseMemoryB
12283  global FFTwindowshape, FFTbandwidth
12284  global AWGSAMPLErate, StartFreqEntry, StopFreqEntry, StartBodeEntry
12285  global SMPfft, LoopNum, IA_Ext_Conf
12286  global STARTsample, STOPsample, CutDC
12287  global TRACEaverage, FreqTraceMode, FSweepMode
12288  global TRACEresetFreq, ZEROstuffing
12289  global SpectrumScreenStatus, IAScreenStatus, BodeScreenStatus
12290  global NetworkScreenStatus, NSweepSeriesR, NSweepSeriesX, NSweepSeriesMag, NSweepSeriesAng
12291 
12292  # T1 = time.time() # For time measurement of FFT routine
12293  REX = []
12294  PhaseA = []
12295  PhaseB = []
12296  # Convert list to numpy array REX for faster Numpy calculations
12297  # Take the first fft samples
12298  REX = numpy.array(FFTBuffA[0:SMPfft]) # Make a numpy arry of the list
12299 
12300  # Set Analog level display value MAX value is 5 volts for ALM1000
12301  REX = REX / 5.0
12302 
12303  # Do the FFT window function
12304  REX = REX * FFTwindowshape[0:len(REX)] # The windowing shape function only over the samples
12305 
12306  # Zero stuffing of array for better interpolation of peak level of signals
12307  ZEROstuffingvalue = int(2 ** ZEROstuffing.get())
12308  fftsamples = ZEROstuffingvalue * SMPfft # Add zero's to the arrays
12309 
12310  # Save previous trace in memory for max or average trace
12311  FFTmemoryA = FFTresultA
12312  if FreqTraceMode.get() == 3:
12313  PhaseMemoryA = PhaseA
12314 
12315  # FFT with numpy
12316  ALL = numpy.fft.fft(REX, n=fftsamples) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
12317  PhaseA = numpy.angle(ALL, deg=True) # calculate angle
12318  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
12319  ALL = ALL * ALL # Convert from Voltage to Power (P = (V*V) / R; R = 1)
12320 
12321  le = int(len(ALL) / 2) # Only half is used, other half is mirror
12322  ALL = ALL[0:le] # So take only first half of the array
12323  PhaseA = PhaseA[0:le]
12324  Totalcorr = float(ZEROstuffingvalue)/ fftsamples # For VOLTAGE!
12325  Totalcorr = Totalcorr * Totalcorr # For POWER!
12326  FFTresultA = Totalcorr * ALL
12327 #
12328  REX = []
12329  # Convert list to numpy array REX for faster Numpy calculations
12330  # Take the first fft samples
12331  REX = numpy.array(FFTBuffB[0:SMPfft]) # Make a numpy arry of the list
12332 
12333  # Set level display value MAX value is 5 volts for ALM1000
12334  REX = REX / 5.0
12335 
12336  # Do the FFT window function
12337  try:
12338  REX = REX * FFTwindowshape # The windowing shape function only over the samples
12339  except:
12340  return
12341  # Zero stuffing of array for better interpolation of peak level of signals
12342  ZEROstuffingvalue = int(2 ** ZEROstuffing.get())
12343  fftsamples = ZEROstuffingvalue * SMPfft # Add zero's to the arrays
12344 
12345  # Save previous trace in memory for max or average trace
12346  FFTmemoryB = FFTresultB
12347  if FreqTraceMode.get() == 3:
12348  PhaseMemoryB = PhaseB
12349  # FFT with numpy
12350  ALL = numpy.fft.fft(REX, n=fftsamples) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
12351  PhaseB = numpy.angle(ALL, deg=True) # calculate angle
12352  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
12353  ALL = ALL * ALL # Convert from Voltage to Power (P = (U*U) / R; R = 1)
12354 
12355  le = int(len(ALL) / 2 ) # Only half is used, other half is mirror
12356  ALL = ALL[0:le] # So take only first half of the array
12357  PhaseB = PhaseB[0:le]
12358  Totalcorr = float(ZEROstuffingvalue)/ fftsamples # For VOLTAGE!
12359  Totalcorr = Totalcorr * Totalcorr # For POWER!
12360  FFTresultB = Totalcorr * ALL
12361 #
12362  if IA_Ext_Conf.get() == 1: # calculate fft for voltage A-B for use if IA set to config 2
12363  REX = []
12364  PhaseAB = []
12365  # Convert list to numpy array REX for faster Numpy calculations
12366  # Take the first fft samples
12367  REX = numpy.array(FFTBuffA[0:SMPfft]-FFTBuffB[0:SMPfft]) # Make a numpy arry of the VA-VB list
12368 
12369  # Set level display value MAX value is 5 volts for ALM1000
12370  REX = REX / 5.0
12371 
12372  # Do the FFT window function
12373  REX = REX * FFTwindowshape # The windowing shape function only over the samples
12374 
12375  # Zero stuffing of array for better interpolation of peak level of signals
12376  ZEROstuffingvalue = int(2 ** ZEROstuffing.get())
12377  fftsamples = ZEROstuffingvalue * SMPfft # Add zero's to the arrays
12378 
12379  # Save previous trace in memory for max or average trace
12380  # FFTmemoryB = FFTresultB
12381  # if FreqTraceMode.get() == 3:
12382  # PhaseMemoryB = PhaseB
12383  # FFT with numpy
12384  ALL = numpy.fft.fft(REX, n=fftsamples) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
12385  PhaseAB = numpy.angle(ALL, deg=True) # calculate angle
12386  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
12387  ALL = ALL * ALL # Convert from Voltage to Power (P = (U*U) / R; R = 1)
12388 
12389  le = len(ALL) / 2 # Only half is used, other half is mirror
12390  ALL = ALL[:le] # So take only first half of the array
12391  PhaseAB = PhaseAB[:le]
12392  Totalcorr = float(ZEROstuffingvalue)/ fftsamples # For VOLTAGE!
12393  Totalcorr = Totalcorr * Totalcorr # For POWER!
12394  FFTresultAB = Totalcorr * ALL
12395 #
12396  if ShowAWGASA.get() > 0:
12397  FFTAWGA = AWGAwaveform
12398  DCA = 0.0
12399  if CutDC.get() == 1:
12400  DCA = numpy.average(FFTAWGA)
12401  FFTAWGA = FFTAWGA - DCA
12402  if len(AWGAwaveform) < SMPfft:
12403  Repeats = math.ceil(SMPfft/len(AWGAwaveform))
12404  i = 0
12405  while i < Repeats:
12406  FFTAWGA = numpy.concatenate((FFTAWGA, AWGAwaveform-DCA))
12407  i = i + 1
12408  REX = []
12409  # Convert list to numpy array REX for faster Numpy calculations
12410  # Take the first fft samples
12411  REX = numpy.array(FFTAWGA[0:SMPfft]) # Make a numpy arry of the list
12412 
12413  # Set level display value MAX value is 5 volts for ALM1000
12414  REX = REX / 5.0
12415 
12416  # Do the FFT window function
12417  try:
12418  REX = REX * FFTwindowshape # The windowing shape function only over the samples
12419  except:
12420  return
12421  # Zero stuffing of array for better interpolation of peak level of signals
12422  ZEROstuffingvalue = int(2 ** ZEROstuffing.get())
12423  fftsamples = ZEROstuffingvalue * SMPfft # Add zero's to the arrays
12424  # FFT with numpy
12425  ALL = numpy.fft.fft(REX, n=fftsamples) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
12426  #PhaseB = numpy.angle(ALL, deg=True) # calculate angle
12427  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
12428  ALL = ALL * ALL # Convert from Voltage to Power (P = (U*U) / R; R = 1)
12429 
12430  le = int(len(ALL) / 2 ) # Only half is used, other half is mirror
12431  ALL = ALL[0:le] # So take only first half of the array
12432  #PhaseB = PhaseB[0:le]
12433  Totalcorr = float(ZEROstuffingvalue)/ fftsamples # For VOLTAGE!
12434  Totalcorr = Totalcorr * Totalcorr # For POWER!
12435  FFTresultAWGA = Totalcorr * ALL
12436 #
12437  if ShowAWGBSA.get() > 0:
12438  FFTAWGB = AWGBwaveform
12439  DCB = 0.0
12440  if CutDC.get() == 1:
12441  DCB = numpy.average(FFTAWGB)
12442  FFTAWGB = FFTAWGB - DCB
12443  if len(AWGBwaveform) < SMPfft:
12444  Repeats = math.ceil(SMPfft/len(AWGBwaveform))
12445  i = 1
12446  while i < Repeats:
12447  FFTAWGB = numpy.concatenate((FFTAWGB, AWGBwaveform-DCB))
12448  i = i + 1
12449  REX = []
12450  # Convert list to numpy array REX for faster Numpy calculations
12451  # Take the first fft samples
12452  REX = numpy.array(FFTAWGB[0:SMPfft]) # Make a numpy arry of the list
12453 
12454  # Set level display value MAX value is 5 volts for ALM1000
12455  REX = REX / 5.0
12456 
12457  # Do the FFT window function
12458  try:
12459  REX = REX * FFTwindowshape # The windowing shape function only over the samples
12460  except:
12461  return
12462  # Zero stuffing of array for better interpolation of peak level of signals
12463  ZEROstuffingvalue = int(2 ** ZEROstuffing.get())
12464  fftsamples = ZEROstuffingvalue * SMPfft # Add zero's to the arrays
12465  # FFT with numpy
12466  ALL = numpy.fft.fft(REX, n=fftsamples) # Do FFT + zerostuffing till n=fftsamples with NUMPY ALL = Real + Imaginary part
12467  #PhaseB = numpy.angle(ALL, deg=True) # calculate angle
12468  ALL = numpy.absolute(ALL) # Make absolute SQR(REX*REX + IMX*IMX) for VOLTAGE!
12469  ALL = ALL * ALL # Convert from Voltage to Power (P = (U*U) / R; R = 1)
12470 
12471  le = int(len(ALL) / 2 ) # Only half is used, other half is mirror
12472  ALL = ALL[0:le] # So take only first half of the array
12473  #PhaseB = PhaseB[0:le]
12474  Totalcorr = float(ZEROstuffingvalue)/ fftsamples # For VOLTAGE!
12475  Totalcorr = Totalcorr * Totalcorr # For POWER!
12476  FFTresultAWGB = Totalcorr * ALL
12477 #
12478  TRACEsize = int(len(FFTresultB))
12479  Fsample = float(SAMPLErate / 2) / (TRACEsize - 1)
12480  if SpectrumScreenStatus.get() > 0:
12481  try:
12482  StartFrequency = float(StartFreqEntry.get())
12483  except:
12484  StartFreqEntry.delete(0,"end")
12485  StartFreqEntry.insert(0,100)
12486  StartFrequency = 100
12487  STARTsample = int(StartFrequency / Fsample)
12488  else:
12489  STARTsample = 0
12490  if LoopNum.get() == 1:
12491  PhaseMemoryB = PhaseB
12492  FSweepAdB = []
12493  FSweepBdB = []
12494  FSweepAPh = []
12495  FSweepBPh = []
12496  if NetworkScreenStatus.get() > 0:
12497  NSweepSeriesR = []
12498  NSweepSeriesX = []
12499  NSweepSeriesMag = [] # in ohms
12500  NSweepSeriesAng = [] # in degrees
12501  if FreqTraceMode.get() == 1: # Normal mode 1, do not change
12502  if FSweepMode.get() == 1:
12503  ptmax = numpy.argmax(FFTresultA[STARTsample:TRACEsize])
12504  if ptmax > STARTsample:
12505  STARTsample = ptmax
12506  i = 0
12507  while i < 6:
12508  PhaseMemoryB[ptmax+i] = PhaseB[ptmax]
12509  i = i + 1
12510  if FSweepMode.get() == 2:
12511  ptmax = numpy.argmax(FFTresultB[STARTsample:TRACEsize])
12512  if ptmax > STARTsample:
12513  STARTsample = ptmax
12514  i = 0
12515  while i < 6:
12516  PhaseMemoryB[ptmax+i] = PhaseB[ptmax]
12517  i = i + 1
12518 
12519  if FreqTraceMode.get() == 2 and TRACEresetFreq == False: # Peak hold mode 2, change v to peak value
12520  if FSweepMode.get() == 1:
12521  ptmax = numpy.argmax(FFTresultA[STARTsample:TRACEsize])
12522  if ptmax > STARTsample:
12523  STARTsample = ptmax
12524  i = 0
12525  while i < 6:
12526  PhaseMemoryB[ptmax+i] = PhaseB[ptmax]
12527  i = i + 1
12528  if FSweepMode.get() == 2:
12529  ptmax = numpy.argmax(FFTresultB[STARTsample:TRACEsize])
12530  if ptmax > STARTsample:
12531  STARTsample = ptmax
12532  i = 0
12533  while i < 6:
12534  PhaseMemoryB[ptmax+i] = PhaseB[ptmax]
12535  i = i + 1
12536  if len(FFTresultB) == len(FFTmemoryB):
12537  FFTresultB = numpy.maximum(FFTresultB, FFTmemoryB)#
12538  if FreqTraceMode.get() == 3 and TRACEresetFreq == False: # Average mode 3, add difference / TRACEaverage to v
12539  try:
12540  FFTresultB = FFTmemoryB + (FFTresultB - FFTmemoryB) / TRACEaverage.get()
12541  PhaseB = PhaseMemoryB +(PhaseB - PhaseMemoryB) / TRACEaverage.get()
12542  except:
12543  FFTmemoryB = FFTresultB
12544  PhaseMemoryB = PhaseB
12545 #
12546  TRACEsize = int(len(FFTresultA))
12547  Fsample = float(AWGSAMPLErate / 2) / (TRACEsize - 1)
12548  if SpectrumScreenStatus.get() > 0:
12549  STARTsample = int(StartFrequency / Fsample)
12550  else:
12551  STARTsample = 0
12552  if LoopNum.get() == 1:
12553  PhaseMemoryA = PhaseA
12554  if FreqTraceMode.get() == 1: # Normal mode 1, do not change
12555  if FSweepMode.get() == 1:
12556  ptmax = numpy.argmax(FFTresultA[STARTsample:TRACEsize])
12557  if ptmax > STARTsample:
12558  STARTsample = ptmax
12559  i = 0
12560  while i < 6:
12561  PhaseMemoryA[ptmax+i] = PhaseA[ptmax]
12562  i = i + 1
12563  if FSweepMode.get() == 2:
12564  ptmax = numpy.argmax(FFTresultB[STARTsample:TRACEsize])
12565  if ptmax > STARTsample:
12566  STARTsample = ptmax
12567  i = 0
12568  while i < 6:
12569  PhaseMemoryA[ptmax+i] = PhaseA[ptmax]
12570  i = i + 1
12571 
12572  if FreqTraceMode.get() == 2 and TRACEresetFreq == False: # Peak hold mode 2, change v to peak value
12573  if FSweepMode.get() == 1:
12574  ptmax = numpy.argmax(FFTresultA[STARTsample:TRACEsize])
12575  if ptmax > STARTsample:
12576  STARTsample = ptmax
12577  i = 0
12578  while i < 6:
12579  PhaseMemoryA[ptmax+i] = PhaseA[ptmax]
12580  i = i + 1
12581  if FSweepMode.get() == 2:
12582  ptmax = numpy.argmax(FFTresultB[STARTsample:TRACEsize])
12583  if ptmax > STARTsample:
12584  STARTsample = ptmax
12585  i = 0
12586  while i < 6:
12587  PhaseMemoryA[ptmax+i] = PhaseA[ptmax]
12588  i = i + 1
12589 #
12590  if len(FFTresultA) == len(FFTmemoryA):
12591  FFTresultA = numpy.maximum(FFTresultA, FFTmemoryA)
12592  if FreqTraceMode.get() == 3 and TRACEresetFreq == False: # Average mode 3, add difference / TRACEaverage to v
12593  try:
12594  FFTresultA = FFTmemoryA + (FFTresultA - FFTmemoryA) / TRACEaverage.get()
12595  PhaseA = PhaseMemoryA +(PhaseA - PhaseMemoryA) / TRACEaverage.get()
12596  except:
12597  FFTmemoryA = FFTresultA
12598  PhaseMemoryA = PhaseA
12599 #
12600  if FSweepMode.get() > 0 and BodeScreenStatus.get() > 0:
12601  FSweepAdB.append(numpy.amax(FFTresultA))
12602  FSweepBdB.append(numpy.amax(FFTresultB))
12603  FSweepAPh.append(PhaseA[numpy.argmax(FFTresultA)])
12604  FSweepBPh.append(PhaseB[numpy.argmax(FFTresultB)])
12605 
12606  TRACEresetFreq = False # Trace reset done
12607 
12608 def MakeFreqTrace(): # Update the grid and trace
12609  global FFTmemoryA, FFTresultA
12610  global FFTmemoryB, FFTresultB
12611  global FFTresultAWGA, FFTresultAWGB, ShowAWGASA, ShowAWGBSA
12612  global PhaseA, PhaseB, PhaseMemoryA, PhaseMemoryB
12613  global FSweepAdB, FSweepBdB, FSweepAPh, FSweepBPh, FStep
12614  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P, ShowMathSA
12615  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB
12616  global PeakxM, PeakyM, PeakMdb, PeakfreqM, PeakIndexA, PeakIndexB
12617  global PeakfreqA, PeakfreqB, Two_X_Sample
12618  global DBdivindex # Index value
12619  global DBdivlist # dB per division list
12620  global DBlevel # Reference level
12621  global GRHF,GRWF # Screenheight, Screenwidth
12622  global AWGSAMPLErate, HScale, Fsample, SAMPLErate, BaseSampleRate
12623  global StartFreqEntry, StopFreqEntry, PhCenFreqEntry, RelPhaseCenter
12624  global STARTsample, STOPsample, LoopNum, FSweepMode
12625  global FreqTraceMode
12626  global T1Fline, T2Fline, TFMline, T1Pline, T2Pline, TAFline, TBFline
12627  global Vdiv # Number of vertical divisions
12628  global X0LF, Y0TF # Left top X value, Left top Y value
12629 
12630  # Set the TRACEsize variable
12631  TRACEsize = 0
12632  try:
12633  StartFrequency = float(StartFreqEntry.get())
12634  except:
12635  StartFreqEntry.delete(0,"end")
12636  StartFreqEntry.insert(0,100)
12637  StartFrequency = 100
12638  try:
12639  StopFrequency = float(StopFreqEntry.get())
12640  except:
12641  StopFreqEntry.delete(0,"end")
12642  StopFreqEntry.insert(0,50000)
12643  StopFrequency = 50000
12644  if StartFrequency > StopFrequency :
12645  StopFreqEntry.delete(0,"end")
12646  StopFreqEntry.insert(0,50000)
12647  StopFrequency = 50000
12648  if StopFrequency < StartFrequency :
12649  StopFreqEntry.delete(0,"end")
12650  StopFreqEntry.insert(0,50000)
12651  StopFrequency = 50000
12652  try:
12653  Phasecenter = int(PhCenFreqEntry.get())
12654  RelPhaseCenter.set(Phasecenter)
12655  except:
12656  PhCenFreqEntry.delete(0,"end")
12657  PhCenFreqEntry.insert(0,0)
12658  RelPhaseCenter.set(0)
12659  Phasecenter = 0
12660  if ShowC1_VdB.get() == 1 or ShowMathSA.get() > 0:
12661  TRACEsize = len(FFTresultA) # Set the trace length
12662  elif ShowC2_VdB.get() == 1 or ShowMathSA.get() > 0:
12663  TRACEsize = len(FFTresultB)
12664  elif ShowAWGASA.get() > 0:
12665  TRACEsize = len(FFTresultAWGA)
12666  elif ShowAWGBSA.get() > 0:
12667  TRACEsize = len(FFTresultAWGB)
12668  #print(TRACEsize)
12669  if TRACEsize == 0: # If no trace, skip rest of this routine
12670  return()
12671  if FSweepMode.get() > 0 and LoopNum.get() == NSteps.get():
12672  PhaseA = PhaseMemoryA
12673  PhaseB = PhaseMemoryB
12674  # Vertical conversion factors (level dBs) and border limits
12675  Yconv = float(GRHF) / (Vdiv.get() * DBdivlist[DBdivindex.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
12676  Yc = float(Y0TF) + Yconv * (DBlevel.get()) # Yc is the 0 dBm position, can be outside the screen!
12677  Ymin = Y0TF # Minimum position of screen grid (top)
12678  Ymax = Y0TF + GRHF # Maximum position of screen grid (bottom)
12679  Yphconv = float(GRHF) / 360
12680  Yp = float(Y0TF) + Yphconv + 180
12681  # Horizontal conversion factors (frequency Hz) and border limits
12682  Fpixel = (StopFrequency - StartFrequency) / GRWF # Frequency step per screen pixel
12683  Fsample = float(SAMPLErate / 2) / (TRACEsize - 1) # Frequency step per sample
12684  LogFStop = math.log10(StopFrequency)
12685  try:
12686  LogFStart = math.log10(StartFrequency)
12687  except:
12688  LogFStart = 0.0
12689  LogFpixel = (LogFStop - LogFStart) / GRWF
12690  STARTsample = StartFrequency / Fsample # First sample in FFTresult[] that is used
12691  STARTsample = int(math.ceil(STARTsample)) # First within screen range
12692 
12693  STOPsample = StopFrequency / Fsample # Last sample in FFTresult[] that is used
12694  STOPsample = int(math.floor(STOPsample)) # Last within screen range, math.floor actually not necessary, part of int
12695 
12696  MAXsample = TRACEsize # Just an out of range check
12697  if STARTsample > (MAXsample - 1):
12698  STARTsample = MAXsample - 1
12699 
12700  if STOPsample > MAXsample:
12701  STOPsample = MAXsample
12702 
12703  T1Fline = []
12704  T2Fline = []
12705  TAFline = []
12706  TBFline = []
12707  T1Pline = []
12708  T2Pline = []
12709  TFMline = []
12710  n = STARTsample
12711  PeakIndexA = PeakIndexB = n
12712  PeakdbA = PeakdbB = PeakMdb = -200 # PeakdbB
12713  while n <= STOPsample:
12714  F = n * Fsample
12715  if HScale.get() == 1:
12716  try:
12717  LogF = math.log10(F) # convet to log Freq
12718  x = X0LF + (LogF - LogFStart)/LogFpixel
12719  except:
12720  x = X0LF
12721  else:
12722  x = X0LF + (F - StartFrequency) / Fpixel
12723  if ShowC1_VdB.get() == 1:
12724  T1Fline.append(int(x + 0.5))
12725  try:
12726  dbA = (10 * math.log10(float(FFTresultA[n])) + 17) # Convert power to DBs, except for log(0) error
12727  ya = Yc - Yconv * dbA # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
12728  except:
12729  ya = Ymax
12730  if (ya < Ymin):
12731  ya = Ymin
12732  if (ya > Ymax):
12733  ya = Ymax
12734  if dbA > PeakdbA:
12735  PeakdbA = dbA
12736  PeakyA = int(ya + 0.5)
12737  PeakxA = int(x + 0.5)
12738  PeakfreqA = F
12739  PeakIndexA = n
12740  T1Fline.append(int(ya + 0.5))
12741  if ShowC2_VdB.get() == 1:
12742  T2Fline.append(int(x + 0.5))
12743  try:
12744  dbB = (10 * math.log10(float(FFTresultB[n])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
12745  yb = Yc - Yconv * dbB
12746  except:
12747  yb = Ymax
12748  if (yb < Ymin):
12749  yb = Ymin
12750  if (yb > Ymax):
12751  yb = Ymax
12752  if dbB > PeakdbB:
12753  PeakdbB = dbB
12754  PeakyB = int(yb + 0.5)
12755  PeakxB = int(x + 0.5)
12756  PeakfreqB = F
12757  PeakIndexB = n
12758  T2Fline.append(int(yb + 0.5))
12759  if ShowAWGASA.get() > 0:
12760  TAFline.append(int(x + 0.5))
12761  try:
12762  dbA = (10 * math.log10(float(FFTresultAWGA[n])) + 17) # Convert power to DBs, except for log(0) error
12763  ya = Yc - Yconv * dbA # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
12764  except:
12765  ya = Ymax
12766  if (ya < Ymin):
12767  ya = Ymin
12768  if (ya > Ymax):
12769  ya = Ymax
12770  TAFline.append(int(ya + 0.5))
12771  if ShowAWGBSA.get() > 0:
12772  TBFline.append(int(x + 0.5))
12773  try:
12774  dbA = (10 * math.log10(float(FFTresultAWGB[n])) + 17) # Convert power to DBs, except for log(0) error
12775  ya = Yc - Yconv * dbA # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
12776  except:
12777  ya = Ymax
12778  if (ya < Ymin):
12779  ya = Ymin
12780  if (ya > Ymax):
12781  ya = Ymax
12782  TBFline.append(int(ya + 0.5))
12783  if ShowC1_P.get() == 1:
12784  T1Pline.append(int(x + 0.5))
12785  if FSweepMode.get() > 0:
12786  RelPhase = PhaseMemoryA[n]-PhaseMemoryB[n]
12787  else:
12788  RelPhase = PhaseA[n]-PhaseB[n]
12789  RelPhase = RelPhase - Phasecenter
12790  if RelPhase > 180:
12791  RelPhase = RelPhase - 360
12792  elif RelPhase < -180:
12793  RelPhase = RelPhase + 360
12794  if Two_X_Sample.get() == 0:
12795  PhErr = 0.0018 * n * Fsample # calculate pahse error due half sample period offset
12796  RelPhase = RelPhase + PhErr - 12.0
12797  else:
12798  RelPhase = RelPhase - 9.0
12799  ya = Yp - Yphconv * RelPhase
12800  T1Pline.append(int(ya + 0.5))
12801  if ShowC2_P.get() == 1:
12802  T2Pline.append(int(x + 0.5))
12803  if FSweepMode.get() > 0:
12804  RelPhase = PhaseMemoryB[n]-PhaseMemoryA[n]
12805  else:
12806  RelPhase = PhaseB[n]-PhaseA[n]
12807  RelPhase = RelPhase - Phasecenter
12808  if RelPhase > 180:
12809  RelPhase = RelPhase - 360
12810  elif RelPhase < -180:
12811  RelPhase = RelPhase + 360
12812  if Two_X_Sample.get() == 0:
12813  PhErr = 0.0018 * n * Fsample # calculate pahse error due half sample period offset
12814  RelPhase = RelPhase - PhErr - 12.0
12815  else:
12816  RelPhase = RelPhase - 9.0
12817  ya = Yp - Yphconv * RelPhase
12818  T2Pline.append(int(ya + 0.5))
12819  if ShowMathSA.get() > 0:
12820  TFMline.append(int(x + 0.5))
12821  dbA = (10 * math.log10(float(FFTresultA[n])) + 17) # Convert power to DBs, except for log(0) error
12822  dbB = (10 * math.log10(float(FFTresultB[n])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
12823  if ShowMathSA.get() == 1:
12824  MdB = dbA - dbB
12825  elif ShowMathSA.get() == 2:
12826  MdB = dbB - dbA
12827  yb = Yc - Yconv * MdB
12828  if (yb < Ymin):
12829  yb = Ymin
12830  if (yb > Ymax):
12831  yb = Ymax
12832  if MdB > PeakMdb:
12833  PeakMdb = MdB
12834  PeakyM = int(yb + 0.5)
12835  PeakxM = int(x + 0.5)
12836  PeakfreqM = F
12837  TFMline.append(int(yb + 0.5))
12838  n = n + 1
12839 # make Bode Plot Traces
12840 def MakeBodeTrace(): # Update the grid and trace
12841  global FSweepAdB, FSweepBdB, FSweepAPh, FSweepBPh, FStep, FBins
12842  global ShowCA_VdB, ShowCA_P, ShowCB_VdB, ShowCB_P, ShowMathBP
12843  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB
12844  global PeakxM, PeakyM, PeakMdb, PeakfreqM
12845  global PeakfreqA, PeakfreqB, Two_X_Sample, PhaseOffset1x, PhaseOffset2x
12846  global DBdivindexBP # Index value
12847  global DBdivlist # dB per division list
12848  global DBlevelBP # Reference level
12849  global GRHBP # Screenheight
12850  global GRWBP # Screenwidth
12851  global AWGSAMPLErate, HScaleBP, RUNstatus, SAMPLErate, BaseSampleRate
12852  global StartBodeEntry, StopBodeEntry
12853  global STARTsample, STOPsample, LoopNum, FSweepMode
12854  global FreqTraceMode, RelPhaseCenter, PhCenBodeEntry, ImCenBodeEntry, ImpedanceCenter, Impedcenter
12855  global TAFline, TBFline, TBPMline, TAPline, TBPline
12856  global Vdiv # Number of vertical divisions
12857  global X0LBP # Left top X value
12858  global Y0TBP # Left top Y value
12859  global ResScale, NetworkScreenStatus, Show_Rseries, NSweepSeriesR, Show_Xseries, NSweepSeriesX
12860  global Show_Magnitude, NSweepSeriesMag, Show_Angle, NSweepSeriesAng
12861  global TIARline, TIAXline, TIAMagline, TIAAngline, CurrentFreqX
12862 
12863  # Set the TRACEsize variable
12864  TRACEsize = 0
12865  if ShowCA_VdB.get() == 1 or ShowMathBP.get() > 0:
12866  TRACEsize = len(FStep) # Set the trace length
12867  elif ShowCB_VdB.get() == 1 or ShowMathBP.get() > 0:
12868  TRACEsize = len(FStep)
12869  if TRACEsize == 0: # If no trace, skip rest of this routine
12870  return()
12871  #
12872  try:
12873  EndFreq = float(StopBodeEntry.get())
12874  except:
12875  StopBodeEntry.delete(0,"end")
12876  StopBodeEntry.insert(0,10000)
12877  EndFreq = 10000
12878  try:
12879  BeginFreq = float(StartBodeEntry.get())
12880  except:
12881  StartBodeEntry.delete(0,"end")
12882  StartBodeEntry.insert(0,100)
12883  BeginFreq = 100
12884  try:
12885  Phasecenter = int(PhCenBodeEntry.get())
12886  RelPhaseCenter.set(Phasecenter)
12887  except:
12888  PhCenBodeEntry.delete(0,"end")
12889  PhCenBodeEntry.insert(0,0)
12890  RelPhaseCenter.set(0)
12891  Phasecenter = 0
12892  try:
12893  Impedcenter = int(ImCenBodeEntry.get())
12894  ImpedanceCenter.set(Impedcenter)
12895  except:
12896  ImCenBodeEntry.delete(0,"end")
12897  ImCenBodeEntry.insert(0,0)
12898  ImpedanceCenter.set(0)
12899  Impedcenter = 0
12900  #
12901  HalfSAMPLErate = SAMPLErate/2
12902  BeginIndex = int((BeginFreq/HalfSAMPLErate)*16384)
12903  EndIndex = int((EndFreq/HalfSAMPLErate)*16384)
12904  CurrentFreqX = X0LBP + 14
12905  if FSweepMode.get() > 0 and len(FSweepAdB) > 4:
12906  # Vertical conversion factors (level dBs) and border limits
12907  Yconv = float(GRHBP) / (Vdiv.get() * DBdivlist[DBdivindexBP.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
12908  Yc = float(Y0TBP) + Yconv * (DBlevelBP.get()) # Yc is the 0 dBm position, can be outside the screen!
12909  Ymin = Y0TBP # Minimum position of screen grid (top)
12910  Ymax = Y0TBP + GRHBP # Maximum position of screen grid (bottom)
12911  Yphconv = float(GRHBP) / 360 # degrees per pixel
12912  Yp = float(Y0TBP) + Yphconv + 180
12913  x1 = X0LBP + 14
12914  # Horizontal conversion factors (frequency Hz) and border limits
12915  Fpixel = (EndFreq - BeginFreq) / GRWBP # Frequency step per screen pixel
12916  LogFStop = math.log10(EndFreq)
12917  try:
12918  LogFStart = math.log10(BeginFreq)
12919  except:
12920  LogFStart = 0.0
12921  LogFpixel = (LogFStop - LogFStart) / GRWBP
12922  TAFline = []
12923  TBFline = []
12924  TAPline = []
12925  TBPline = []
12926  TIARline = []
12927  TIAXline = []
12928  TIAMagline = []
12929  TIAAngline = []
12930  TBPMline = []
12931  PeakdbA = -200
12932  PeakdbB = -200
12933  PeakMdb = -200
12934  n = 0
12935  for n in range(len(FSweepAdB)): # while n < len(FStep):
12936  if n < len(FStep): # check if n has gone out off bounds because user did something dumb
12937  F = FBins[int(FStep[n])] # look up frequency bin in list of bins
12938  else:
12939  F = FBins[int(FStep[0])]
12940  if F >= BeginFreq and F <= EndFreq:
12941  if HScaleBP.get() == 1:
12942  try:
12943  LogF = math.log10(F) # convet to log Freq
12944  x = x1 + (LogF - LogFStart)/LogFpixel
12945  except:
12946  x = x1
12947  else:
12948  x = x1 + (F - BeginFreq) / Fpixel
12949  CurrentFreqX = x
12950  if ShowCA_VdB.get() == 1:
12951  TAFline.append(int(x + 0.5))
12952  try:
12953  dbA = (10 * math.log10(float(FSweepAdB[n])) + 17) # Convert power to DBs, except for log(0) error
12954  ya = Yc - Yconv * dbA # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
12955  except:
12956  ya = Ymax
12957  if (ya < Ymin):
12958  ya = Ymin
12959  if (ya > Ymax):
12960  ya = Ymax
12961  if dbA > PeakdbA:
12962  PeakdbA = dbA
12963  PeakyA = int(ya + 0.5)
12964  PeakxA = int(x + 0.5)
12965  PeakfreqA = F
12966  TAFline.append(int(ya + 0.5))
12967  if ShowCB_VdB.get() == 1:
12968  TBFline.append(int(x + 0.5))
12969  try:
12970  dbB = (10 * math.log10(float(FSweepBdB[n])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
12971  yb = Yc - Yconv * dbB
12972  except:
12973  yb = Ymax
12974  if (yb < Ymin):
12975  yb = Ymin
12976  if (yb > Ymax):
12977  yb = Ymax
12978  if dbB > PeakdbB:
12979  PeakdbB = dbB
12980  PeakyB = int(yb + 0.5)
12981  PeakxB = int(x + 0.5)
12982  PeakfreqB = F
12983  TBFline.append(int(yb + 0.5))
12984  if ShowCA_P.get() == 1:
12985  TAPline.append(int(x + 0.5))
12986  RelPhase = FSweepAPh[n] - FSweepBPh[n]
12987  RelPhase = RelPhase - Phasecenter
12988  if RelPhase > 180:
12989  RelPhase = RelPhase - 360
12990  elif RelPhase < -180:
12991  RelPhase = RelPhase + 360
12992  if Two_X_Sample.get() == 0:
12993  PhErr = 0.0018 * F # calculate phase error due half sample period offset
12994  RelPhase = RelPhase + PhErr - PhaseOffset1x
12995  else:
12996  RelPhase = RelPhase - PhaseOffset2x
12997  ya = Yp - Yphconv * RelPhase
12998  TAPline.append(int(ya + 0.5))
12999  if ShowCB_P.get() == 1:
13000  TBPline.append(int(x + 0.5))
13001  RelPhase = FSweepBPh[n] - FSweepAPh[n]
13002  RelPhase = RelPhase - Phasecenter
13003  if RelPhase > 180:
13004  RelPhase = RelPhase - 360
13005  elif RelPhase < -180:
13006  RelPhase = RelPhase + 360
13007  if Two_X_Sample.get() == 0:
13008  PhErr = 0.0018 * F # calculate phase error due half sample period offset
13009  RelPhase = RelPhase - PhErr - PhaseOffset1x
13010  else:
13011  RelPhase = RelPhase - PhaseOffset2x
13012  ya = Yp - Yphconv * RelPhase
13013  TBPline.append(int(ya + 0.5))
13014  if ShowMathBP.get() > 0:
13015  TBPMline.append(int(x + 0.5))
13016  dbA = (10 * math.log10(float(FSweepAdB[n])) + 17) # Convert power to DBs, except for log(0) error
13017  dbB = (10 * math.log10(float(FSweepBdB[n])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
13018  if ShowMathBP.get() == 1:
13019  MdB = dbA - dbB
13020  elif ShowMathBP.get() == 2:
13021  MdB = dbB - dbA
13022  yb = Yc - Yconv * MdB
13023  if (yb < Ymin):
13024  yb = Ymin
13025  if (yb > Ymax):
13026  yb = Ymax
13027  if MdB > PeakMdb:
13028  PeakMdb = MdB
13029  PeakyM = int(yb + 0.5)
13030  PeakxM = int(x + 0.5)
13031  PeakfreqM = F
13032  TBPMline.append(int(yb + 0.5))
13033 # draw impedance trace if necessary
13034  if NetworkScreenStatus.get() > 0:
13035  ycenter = Y0TBP + (GRHBP/2)
13036  OhmsperPixel = float(ResScale.get())*Vdiv.get()/GRHBP
13037  n = 0
13038  for n in range(len(NSweepSeriesR)): # while n < len(FStep):
13039  if n < len(FStep): # check if n has gone out off bounds because user did something dumb
13040  F = FBins[int(FStep[n])] # look up frequency bin in list of bins
13041  else:
13042  F = FBins[int(FStep[0])]
13043  if F >= BeginFreq and F <= EndFreq:
13044  if HScaleBP.get() == 1:
13045  try:
13046  LogF = math.log10(F) # convet to log Freq
13047  x = x1 + (LogF - LogFStart)/LogFpixel
13048  except:
13049  x = x1
13050  else:
13051  x = x1 + (F - BeginFreq) / Fpixel
13052  if Show_Rseries.get() == 1:
13053  TIARline.append(int(x + 0.5))
13054  y1 = ycenter - ((NSweepSeriesR[n]-Impedcenter) / OhmsperPixel)
13055  if (y1 < Ymin):
13056  y1 = Ymin
13057  if (y1 > Ymax):
13058  y1 = Ymax
13059  TIARline.append(y1)
13060  if Show_Xseries.get() == 1:
13061  TIAXline.append(int(x + 0.5))
13062  y1 = ycenter - ((NSweepSeriesX[n]-Impedcenter) / OhmsperPixel)
13063  if (y1 < Ymin):
13064  y1 = Ymin
13065  if (y1 > Ymax):
13066  y1 = Ymax
13067  TIAXline.append(y1)
13068  if Show_Magnitude.get() == 1:
13069  TIAMagline.append(int(x + 0.5))
13070  y1 = ycenter - ((NSweepSeriesMag[n]-Impedcenter) / OhmsperPixel)
13071  if (y1 < Ymin):
13072  y1 = Ymin
13073  if (y1 > Ymax):
13074  y1 = Ymax
13075  TIAMagline.append(y1)
13076  if Show_Angle.get() == 1:
13077  TIAAngline.append(int(x + 0.5))
13078  y1 = ycenter - Yphconv * (NSweepSeriesAng[n]-Phasecenter)
13079  if (y1 < Ymin):
13080  y1 = Ymin
13081  if (y1 > Ymax):
13082  y1 = Ymax
13083  TIAAngline.append(y1)
13084 #
13085 def MakeBodeScreen(): # Update the screen with traces and text
13086  global CANVASheightBP, CANVASwidthBP, SmoothCurvesBP
13087  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB
13088  global PeakxM, PeakyM, PeakMdb, PeakfreqM
13089  global PeakfreqA, PeakfreqB, PeakfreqRA, PeakfreqRB
13090  global PeakxRA, PeakyRA, PeakxRB, PeakyRB, PeakdbRA, PeakdbRB
13091  global PeakxRM, PeakyRM, PeakRMdb, PeakfreqRM
13092  global COLORgrid # The colors
13093  global COLORsignalband, COLORtext
13094  global COLORtrace1, COLORtrace2, COLORtrace3, COLORtrace4, COLORtrace5, COLORtrace6, COLORtrace7
13095  global FSweepMode, LoopNum, MarkerFreqNum, TRACEwidth, GridWidth
13096  global DBdivindexBP # Index value
13097  global DBdivlist # dB per division list
13098  global DBlevelBP # Reference level
13099  global FFTwindow, FFTbandwidth, ZEROstuffing, FFTwindowname
13100  global X0LBP # Left top X value
13101  global Y0TBP # Left top Y value
13102  global GRWBP # Screenwidth
13103  global GRHBP # Screenheight
13104  global FontSize
13105  global RUNstatus # 0 stopped, 1 start, 2 running, 3 stop now, 4 stop and restart
13106  global AWGSAMPLErate, HScaleBP, SAMPLErate, BaseSampleRate
13107  global SMPfft # number of FFT samples
13108  global StartBodeEntry, StopBodeEntry
13109  global ShowCA_P, ShowCB_P, ShowRA_VdB, ShowRB_VdB, ShowMarkerBP
13110  global ShowCA_RdB, ShowCA_RP, ShowCB_RdB, ShowCB_RP
13111  global ShowMathBP, BodeDisp, RelPhaseCenter, PhCenBodeEntry, ImCenBodeEntry, ImpedanceCenter, Impedcenter
13112  global ShowBPCur, ShowBdBCur, BPCursor, BdBCursor
13113  global Show_Rseries, Show_Xseries, Show_Magnitude, Show_Angle, NetworkScreenStatus
13114  global Show_RseriesRef, Show_XseriesRef, Show_MagnitudeRef, Show_AngleRef
13115  global TAFline, TBFline, TAPline, TAFRline, TBFRline, TBPMline, TBPRMline
13116  global TAPRline, TBPRline
13117  global TRACEaverage # Number of traces for averageing
13118  global FreqTraceMode # 1 normal 2 max 3 average
13119  global Vdiv, ResScale # Number of vertical divisions
13120  global TIARline, TIAXline, TIAMagline, TIAAngline, CurrentFreqX
13121  global RefIARline, RefIAXline, RefIAMagline, RefIAAngline
13122 
13123  # Delete all items on the screen
13124  MarkerFreqNum = 0
13125  Bodeca.delete(ALL) # remove all items
13126 
13127  try:
13128  EndFreq = float(StopBodeEntry.get())
13129  except:
13130  StopBodeEntry.delete(0,"end")
13131  StopBodeEntry.insert(0,10000)
13132  EndFreq = 10000
13133  try:
13134  BeginFreq = float(StartBodeEntry.get())
13135  except:
13136  StartBodeEntry.delete(0,"end")
13137  StartBodeEntry.insert(0,100)
13138  BeginFreq = 100
13139  try:
13140  Phasecenter = int(PhCenBodeEntry.get())
13141  RelPhaseCenter.set(Phasecenter)
13142  except:
13143  PhCenBodeEntry.delete(0,"end")
13144  PhCenBodeEntry.insert(0,0)
13145  RelPhaseCenter.set(0)
13146  Phasecenter = 0
13147  try:
13148  Impedcenter = int(ImCenBodeEntry.get())
13149  ImpedanceCenter.set(Impedcenter)
13150  except:
13151  ImCenBodeEntry.delete(0,"end")
13152  ImCenBodeEntry.insert(0,0)
13153  ImpedanceCenter.set(0)
13154  Impedcenter = 0
13155  #
13156  # Draw horizontal grid lines
13157  i = 0
13158  x1 = X0LBP + 14
13159  x2 = x1 + GRWBP
13160  while (i <= Vdiv.get()):
13161  y = Y0TBP + i * GRHBP/Vdiv.get()
13162  Dline = [x1,y,x2,y]
13163  if i == 0 or i == Vdiv.get():
13164  Bodeca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
13165  else:
13166  Bodeca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
13167  Vaxis_value = (DBlevelBP.get() - (i * DBdivlist[DBdivindexBP.get()]))
13168  Vaxis_label = str(Vaxis_value)
13169  Bodeca.create_text(x1-3, y, text=Vaxis_label, fill=COLORtrace1, anchor="e", font=("arial", FontSize ))
13170  if ShowCA_P.get() == 1 or ShowCB_P.get() == 1 or Show_Angle.get() == 1:
13171  Vaxis_value = ( 180 - ( i * (360 / Vdiv.get()))) + Phasecenter
13172  Vaxis_label = str(Vaxis_value)
13173  Bodeca.create_text(x2+3, y, text=Vaxis_label, fill=COLORtrace3, anchor="w", font=("arial", FontSize ))
13174  if NetworkScreenStatus.get() > 0:
13175  if Show_Rseries.get() == 1 or Show_Xseries.get() == 1 or Show_Magnitude.get() == 1:
13176  RperDiv = float(ResScale.get())
13177  Vaxis_value = ( (RperDiv * Vdiv.get()/2) - (i * RperDiv) ) + Impedcenter
13178  if Vaxis_value > 500 or Vaxis_value < -500:
13179  Vaxis_value = Vaxis_value/1000.0
13180  if Vaxis_value > 5 or Vaxis_value < -5:
13181  Vaxis_label = ' {0:.0f}'.format(Vaxis_value) + 'K'
13182  else:
13183  Vaxis_label = ' {0:.1f}'.format(Vaxis_value) + 'K'
13184  else:
13185  Vaxis_label = ' {0:.0f} '.format(Vaxis_value)
13186  Bodeca.create_text(x1-23, y, text=Vaxis_label, fill=COLORtrace5, anchor="e", font=("arial", FontSize ))
13187  i = i + 1
13188  # Draw vertical grid lines
13189  i = 0
13190  y1 = Y0TBP
13191  y2 = Y0TBP + GRHBP
13192  if HScaleBP.get() == 1:
13193  F = 1.0
13194  LogFStop = math.log10(EndFreq)
13195  try:
13196  LogFStart = math.log10(BeginFreq)
13197  except:
13198  LogFStart = 0.0
13199  LogFpixel = (LogFStop - LogFStart) / GRWBP
13200  # draw left and right edges
13201  while F <= EndFreq:
13202  if F >= BeginFreq:
13203  try:
13204  LogF = math.log10(F) # convet to log Freq
13205  x = x1 + (LogF - LogFStart)/LogFpixel
13206  except:
13207  x = x1
13208  Dline = [x,y1,x,y2]
13209  if F == 1 or F == 10 or F == 100 or F == 1000 or F == 10000 or F == 100000:
13210  Bodeca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
13211  axis_label = str(F)
13212  Bodeca.create_text(x, y2+3, text=axis_label, fill=COLORgrid, anchor="n", font=("arial", FontSize ))
13213  else:
13214  Bodeca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
13215 
13216  if F < 10:
13217  F = F + 1
13218  elif F < 100:
13219  F = F + 10
13220  elif F < 1000:
13221  F = F + 100
13222  elif F < 1000:
13223  F = F + 100
13224  elif F < 10000:
13225  F = F + 1000
13226  elif F < 100000:
13227  F = F + 10000
13228  elif F < 200000:
13229  F = F + 10000
13230  else:
13231  Freqdiv = (EndFreq - BeginFreq) / 10
13232  while (i < 11):
13233  x = x1 + i * GRWBP/10
13234  Dline = [x,y1,x,y2]
13235  if i == 0 or i == 10:
13236  Bodeca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
13237  else:
13238  Bodeca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
13239  axis_value = BeginFreq + (i * Freqdiv)
13240  axis_label = str(axis_value)
13241  Bodeca.create_text(x, y2+3, text=axis_label, fill=COLORgrid, anchor="n", font=("arial", FontSize ))
13242  i = i + 1
13243  # Draw X - Y cursors if needed
13244  Fpixel = (EndFreq - BeginFreq) / GRWBP # Frequency step per screen pixel
13245  LogFStop = math.log10(EndFreq)
13246  try:
13247  LogFStart = math.log10(BeginFreq)
13248  except:
13249  LogFStart = 0.0
13250  LogFpixel = (LogFStop - LogFStart) / GRWBP
13251  if ShowBPCur.get() > 0:
13252  Dline = [BPCursor, Y0TBP, BPCursor, Y0TBP+GRHBP]
13253  Bodeca.create_line(Dline, dash=(3,4), fill=COLORtrigger, width=GridWidth.get())
13254  # Horizontal conversion factors (frequency Hz) and border limits
13255  if HScaleBP.get() == 1:
13256  xfreq = 10**(((BPCursor-x1)*LogFpixel) + LogFStart)
13257  else:
13258  xfreq = ((BPCursor-x1)*Fpixel)+BeginFreq
13259  XFString = ' {0:.2f} '.format(xfreq)
13260  V_label = XFString + " Hz"
13261  Bodeca.create_text(BPCursor, Y0TBP+GRHBP+6, text=V_label, fill=COLORtext, anchor="n", font=("arial", FontSize ))
13262  #Bodeca.create_text(BPCursor+1, BdBCursor-5, text=V_label, fill=COLORtext, anchor="w", font=("arial", FontSize ))
13263 #
13264  if ShowBdBCur.get() > 0:
13265  Dline = [x1, BdBCursor, x1+GRWBP, BdBCursor]
13266  Bodeca.create_line(Dline, dash=(3,4), fill=COLORtrigger, width=GridWidth.get())
13267  if ShowBdBCur.get() == 1:
13268  # Vertical conversion factors (level dBs) and border limits
13269  Yconv = float(GRHBP) / (Vdiv.get() * DBdivlist[DBdivindexBP.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
13270  Yc = float(Y0TBP) + Yconv * (DBlevelBP.get()) # Yc is the 0 dBm position, can be outside the screen!
13271  yvdB = ((Yc-BdBCursor)/Yconv)
13272  VdBString = ' {0:.1f} '.format(yvdB)
13273  V_label = VdBString + " dBV"
13274  else:
13275  # Vertical conversion factors (level degrees) and border limits
13276  Yconv = float(GRHBP) / 360.0 # Conversion factors, Yconv is the number of screenpoints per degree
13277  Yc = float(Y0TBP) # Yc is the 180 degree position
13278  yvdB = 180 + ((Yc-BdBCursor)/Yconv) + Phasecenter
13279  VdBString = ' {0:.1f} '.format(yvdB)
13280  V_label = VdBString + " Deg"
13281  Bodeca.create_text(x1+GRWBP+1, BdBCursor, text=V_label, fill=COLORtext, anchor="w", font=("arial", FontSize ))
13282  #Bodeca.create_text(BPCursor+1, BdBCursor+5, text=V_label, fill=COLORtext, anchor="w", font=("arial", FontSize ))
13283  #
13284  SmoothBool = SmoothCurvesBP.get()
13285  # Draw traces
13286  if len(TAFline) > 4: # Avoid writing lines with 1 coordinate
13287  # Write the trace CHA
13288  if OverRangeFlagA == 1:
13289  Bodeca.create_line(TAFline, fill=COLORsignalband, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13290  else:
13291  Bodeca.create_line(TAFline, fill=COLORtrace1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13292  if ShowMarkerBP.get() == 1:
13293  Peak_label = ' {0:.2f} '.format(PeakdbA) + ',' + ' {0:.1f} '.format(PeakfreqA)
13294  Bodeca.create_text(PeakxA, PeakyA, text=Peak_label, fill=COLORtrace1, anchor="e", font=("arial", FontSize ))
13295  if len(TBFline) > 4: # Avoid writing lines with 1 coordinate
13296  # Write the trace CHB
13297  if OverRangeFlagB == 1:
13298  Bodeca.create_line(TBFline, fill=COLORsignalband, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13299  else:
13300  Bodeca.create_line(TBFline, fill=COLORtrace2, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13301  if ShowMarkerBP.get() == 1:
13302  Peak_label = ' {0:.2f} '.format(PeakdbB) + ',' + ' {0:.1f} '.format(PeakfreqB)
13303  Bodeca.create_text(PeakxB, PeakyB, text=Peak_label, fill=COLORtrace2, anchor="w", font=("arial", FontSize ))
13304  if len(TAPline) > 4: # Avoid writing lines with 1 coordinate
13305  # Write the phase trace A-B
13306  Bodeca.create_line(TAPline, fill=COLORtrace3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13307  if len(TBPline) > 4: # Avoid writing lines with 1 coordinate
13308  # Write the phase trace A-B
13309  Bodeca.create_line(TBPline, fill=COLORtrace4, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13310  if ShowCA_RdB.get() == 1 and len(TAFRline) > 4: # Write the ref trace A if active
13311  Bodeca.create_line(TAFRline, fill=COLORtraceR1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13312  if ShowMarkerBP.get() == 1:
13313  Peak_label = ' {0:.2f} '.format(PeakdbRA) + ',' + ' {0:.1f} '.format(PeakfreqRA)
13314  Bodeca.create_text(PeakxRA, PeakyRA, text=Peak_label, fill=COLORtraceR1, anchor="e", font=("arial", FontSize ))
13315  if ShowCB_RdB.get() == 1 and len(TBFRline) > 4: # Write the ref trace B if active
13316  Bodeca.create_line(TBFRline, fill=COLORtraceR2, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13317  if ShowMarkerBP.get() == 1:
13318  Peak_label = ' {0:.2f} '.format(PeakdbRB) + ',' + ' {0:.1f} '.format(PeakfreqRB)
13319  Freqca.create_text(PeakxRB, PeakyRB, text=Peak_label, fill=COLORtraceR2, anchor="w", font=("arial", FontSize ))
13320  if ShowCA_RP.get() == 1 and len(TAPRline) > 4: # Write the ref trace A if active
13321  Bodeca.create_line(TAPRline, fill=COLORtraceR3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13322  if ShowCB_RP.get() == 1 and len(TBPRline) > 4: # Write the ref trace A if active
13323  Bodeca.create_line(TBPRline, fill=COLORtraceR4, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13324  if ShowMathBP.get() > 0 and len(TBPMline) > 4: # Write the Math trace if active
13325  Bodeca.create_line(TBPMline, fill=COLORtrace5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13326  if ShowMarkerBP.get() == 1:
13327  Peak_label = ' {0:.2f} '.format(PeakMdb) + ',' + ' {0:.1f} '.format(PeakfreqM)
13328  Bodeca.create_text(PeakxM, PeakyM, text=Peak_label, fill=COLORtrace5, anchor="w", font=("arial", FontSize ))
13329  if ShowRMathBP.get() == 1 and len(TBPRMline) > 4: # Write the ref math trace if active
13330  Bodeca.create_line(TBPRMline, fill=COLORtraceR5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13331  if ShowMarkerBP.get() == 1:
13332  Peak_label = ' {0:.2f} '.format(PeakRMdb) + ',' + ' {0:.1f} '.format(PeakfreqRM)
13333  Bodeca.create_text(PeakxRM, PeakyRM, text=Peak_label, fill=COLORtraceR5, anchor="w", font=("arial", FontSize ))
13334  if Show_Rseries.get() == 1 and len(TIARline) > 4:
13335  Bodeca.create_line(TIARline, fill=COLORtrace5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13336  if Show_Xseries.get() == 1 and len(TIAXline) > 4:
13337  Bodeca.create_line(TIAXline, fill=COLORtrace6, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13338  if Show_Magnitude.get() == 1 and len(TIAMagline) > 4:
13339  Bodeca.create_line(TIAMagline, fill=COLORtrace7, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13340  if Show_Angle.get() == 1 and len(TIAAngline) > 4:
13341  Bodeca.create_line(TIAAngline, fill=COLORtraceR3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13342  if Show_RseriesRef.get() == 1 and len(RefIARline) > 4:
13343  Bodeca.create_line(RefIARline, fill=COLORtraceR5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13344  if Show_XseriesRef.get() == 1 and len(RefIAXline) > 4:
13345  Bodeca.create_line(RefIAXline, fill=COLORtraceR6, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13346  if Show_MagnitudeRef.get() == 1 and len(RefIAMagline) > 4:
13347  Bodeca.create_line(RefIAMagline, fill=COLORtraceR7, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13348  if Show_AngleRef.get() == 1 and len(RefIAAngline) > 4:
13349  Bodeca.create_line(RefIAAngline, fill=COLORtraceR3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13350 
13351  Dline = [CurrentFreqX, Y0TBP, CurrentFreqX, Y0TBP+GRHBP]
13352  Bodeca.create_line(Dline, dash=(2,2), fill=COLORgrid, width=GridWidth.get())
13353  if HScaleBP.get() == 1:
13354  xfreq = 10**(((CurrentFreqX-x1)*LogFpixel) + LogFStart)
13355  else:
13356  xfreq = ((CurrentFreqX-x1)*Fpixel)+BeginFreq
13357  XFString = ' {0:.0f} '.format(xfreq)
13358  V_label = XFString + " Hz"
13359  Bodeca.create_text(CurrentFreqX, Y0TBP+GRHBP+1, text=V_label, fill=COLORtext, anchor="n", font=("arial", FontSize ))
13360  # General information on top of the grid
13361 
13362  txt = " Sample rate: " + str(SAMPLErate)
13363  txt = txt + " FFT samples: " + str(SMPfft)
13364 
13365  txt = txt + " " + FFTwindowname
13366 
13367  x = X0LBP
13368  y = 12
13369  idTXT = Bodeca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
13370 
13371  # Start and stop frequency and dB/div and trace mode
13372  txt = str(BeginFreq) + " to " + str(EndFreq) + " Hz"
13373  txt = txt + " " + str(DBdivlist[DBdivindexBP.get()]) + " dB/div"
13374  txt = txt + " Level: " + str(DBlevelBP.get()) + " dB "
13375  txt = txt + " FFT Bandwidth =" + ' {0:.2f} '.format(FFTbandwidth)
13376 
13377  x = X0LBP
13378  y = Y0TBP+GRHBP+23
13379  idTXT = Bodeca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
13380 
13381  if FreqTraceMode.get() == 1:
13382  txt ="Normal mode "
13383 
13384  if FreqTraceMode.get() == 2:
13385  txt = "Peak hold mode "
13386 
13387  if FreqTraceMode.get() == 3:
13388  txt = "Power average mode (" + str(TRACEaverage.get()) + ") "
13389 
13390  if ZEROstuffing.get() > 0:
13391  txt = txt + "Zero Stuffing = " + str(ZEROstuffing.get())
13392  # Runstatus and level information
13393  if (RUNstatus.get() == 0):
13394  txt = txt + " Stopped "
13395  else:
13396  if BodeDisp.get() == 1:
13397  txt = txt + " Running "
13398  else:
13399  txt = txt + " Display off "
13400  if FSweepMode.get() > 0:
13401  txt = txt + " Freq Step = " + str(LoopNum.get())
13402  x = X0LBP
13403  y = Y0TBP+GRHBP+34
13404  IDtxt = Bodeca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
13405 
13406 # Impedance analyzer routines -----
13407 def UpdateIAAll(): # Update Data, trace and screen
13408  global FFTBuffA, FFTBuffB
13409  global SMPfft
13410 
13411  if len(FFTBuffA) < SMPfft and len(FFTBuffB) < SMPfft:
13412  return
13413 
13414  MakeIATrace() # Update the traces
13415  UpdateIAScreen() # Update the screen
13416 
13417 def UpdateIATrace(): # Update trace and screen
13418  MakeIATrace() # Update traces
13419  UpdateIAScreen() # Update the screen
13420 
13421 def UpdateIAScreen(): # Update screen with trace and text
13422  MakeIAScreen() # Update the screen
13423  root.update() # Activate updated screens
13424 #
13426 
13427 # Input Variables
13428  global PeakdbA, PeakdbB, PeakRelPhase, PeakdbAB
13429  #(VZ/VA)from vector voltmeter
13430  # global VVangle # angle in degrees between VZ and VA
13431  global RsystemEntry # resistance of series resistor or power divider
13432 # Computed outputs
13433  # global VVangleCosine # cosine of vector voltmeter angle
13434  global ImpedanceMagnitude # in ohms
13435  global ImpedanceAngle # in degrees
13436  global ImpedanceRseries, ImpedanceXseries # in ohms
13437  global IA_Ext_Conf
13438 
13439  DEG2RAD = (math.pi / 180.0)
13440  SMALL = 1E-20
13441  try:
13442  ResValue = float(RsystemEntry.get())
13443  except:
13444  ResValue = 1000.0
13445 
13446  VA = math.pow(10,(PeakdbA/20))
13447  VB = math.pow(10,(PeakdbB/20))
13448  VVangleCosine = math.cos(math.radians(PeakRelPhase))
13449  if IA_Ext_Conf.get() == 1:
13450  VAB = math.pow(10,(PeakdbAB/20))
13451  VZ = VAB # VZ=VA-VB
13452  # VI = VB
13453  else:
13454  VZ = VB # VZ=VB
13455  VI = math.sqrt(VA**2 + VZ**2 - 2*VA*VZ*VVangleCosine)
13456  costheta = (VA**2 + VI**2 - VZ**2)/(2 * VA * VI)
13457  Za = ResValue * VA / VI
13458  ImpedanceRseries = Za * costheta - ResValue
13459  ImpedanceMagnitude = ResValue * VZ / VI
13460  # don't try to take square root of a negative number)
13461  ImpedanceXseries = math.sqrt(abs(ImpedanceMagnitude**2 - ImpedanceRseries**2))
13462 
13463  if(PeakRelPhase < 0.0):
13464  ImpedanceXseries = -ImpedanceXseries
13465  if IA_Ext_Conf.get() == 1:
13466  ImpedanceRseries = -ImpedanceRseries
13467  ImpedanceAngle = math.atan2(ImpedanceXseries, ImpedanceRseries) / DEG2RAD
13468 #
13469 def MakeIATrace(): # Update the grid and trace
13470  global FFTmemoryA, FFTresultA, FFTresultAB, PhaseAB
13471  global FFTmemoryB, FFTresultB
13472  global PhaseA, PhaseB, PhaseMemoryA, PhaseMemoryB
13473  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB, PeakRelPhase, PeakdbAB
13474  global PeakxM, PeakyM, PeakMdb, PeakfreqM, PeakphaseA, PeakphaseB
13475  global PeakfreqA, PeakfreqB, GainCorEntry, PhaseCorEntry, PhaseCorrection
13476  global DBdivindex # Index value
13477  global DBdivlist # dB per division list
13478  global DBlevel # Reference level
13479  global GRHIA # Screenheight
13480  global GRWIA # Screenwidth
13481  global AWGSAMPLErate, SAMPLErate, BaseSampleRate
13482  global STARTsample, STOPsample, LoopNum, FSweepMode
13483  global TRACEmode, Two_X_Sample, IA_Ext_Conf
13484  global T1Vline, T2Vline, TMline, T1Pline, T2Pline
13485  global Vdiv # Number of vertical divisions
13486  global X0LIA # Left top X value
13487  global Y0TIA # Left top Y value
13488  global ImpedanceMagnitude # in ohms
13489  global ImpedanceAngle # in degrees
13490  global ImpedanceRseries, ImpedanceXseries # in ohms
13491 
13492  # Set the TRACEsize variable
13493  TRACEsize = len(FFTresultA) # Set the trace length
13494  Fsample = float(SAMPLErate / 2) / (TRACEsize - 1)
13495  # Horizontal conversion factors (frequency Hz) and border limits
13496  STARTsample = 0 # First sample in FFTresult[] that is used
13497  STARTsample = int(math.ceil(STARTsample)) # First within screen range
13498  if Two_X_Sample.get() == 0:
13499  STOPsample = 45000 / Fsample # Last sample in FFTresult[] that is used
13500  else:
13501  STOPsample = 90000 / Fsample
13502  STOPsample = int(math.floor(STOPsample)) # Last within screen range, math.floor actually not necessary, part of int
13503 #
13504  try:
13505  GainCorrection = float(eval(GainCorEntry.get()))
13506  except:
13507  GainCorEntry.delete(0,END)
13508  GainCorEntry.insert(0, GainCorrection)
13509 
13510  try:
13511  PhaseCorrection = float(eval(PhaseCorEntry.get()))
13512  except:
13513  PhaseCorEntry.delete(0,END)
13514  PhaseCorEntry.insert(0, PhaseCorrection)
13515 
13516  MAXsample = TRACEsize # Just an out of range check
13517  if STARTsample > (MAXsample - 1):
13518  STARTsample = MAXsample - 1
13519 
13520  if STOPsample > MAXsample:
13521  STOPsample = MAXsample
13522 
13523  n = STARTsample
13524  PeakfreqA = PeakfreqB = PeakfreqM = F = n * Fsample
13525  PeakphaseA = PhaseA[n]
13526  PeakphaseB = PhaseB[n]
13527  #PeakphaseAB = PhaseAB[n]
13528  PeakSample = n
13529 
13530  PeakdbA = (10 * math.log10(float(FFTresultA[n])) + 17)
13531  PeakdbB = (10 * math.log10(float(FFTresultB[n])) + 17)
13532  PeakMdb = PeakdbA - PeakdbB
13533  if IA_Ext_Conf.get() == 1:
13534  PeakdbAB = (10 * math.log10(float(FFTresultAB[n])) + 17)
13535  while n <= STOPsample:
13536  F = n * Fsample
13537  try:
13538  dbA = (10 * math.log10(float(FFTresultA[n])) + 17) # Convert power to DBs, except for log(0) error
13539  except:
13540  dbA = -200
13541  if dbA > PeakdbA:
13542  PeakdbA = dbA
13543  PeakfreqA = F
13544  PeakphaseA = PhaseA[n]
13545  PeakSample = n
13546 
13547  try:
13548  dbB = (10 * math.log10(float(FFTresultB[n])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
13549  except:
13550  dbB = -200
13551  if dbB > PeakdbB:
13552  PeakdbB = dbB
13553  PeakfreqB = F
13554  PeakphaseB = PhaseB[n]
13555 
13556  if IA_Ext_Conf.get() == 1:
13557  try:
13558  dbAB = (10 * math.log10(float(FFTresultAB[n])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
13559  except:
13560  dbAB = -200
13561  if dbAB > PeakdbAB:
13562  PeakdbAB = dbAB
13563  PeakphaseAB = PhaseAB[n]
13564  RelPhase = PhaseA[n]-PhaseB[n]
13565  if RelPhase > 180:
13566  RelPhase = RelPhase - 360
13567  elif RelPhase < -180:
13568  RelPhase = RelPhase + 360
13569  if Two_X_Sample.get() == 0:
13570  PhErr = 0.0018 * n * Fsample # calculate pahse error due half sample period offset
13571  RelPhase = RelPhase + PhErr - 12.0
13572  else:
13573  RelPhase = RelPhase - 9.0
13574  n = n + 1
13575  if IA_Ext_Conf.get() == 1:
13576  PeakRelPhase = PeakphaseAB-PeakphaseA
13577  else:
13578  PeakRelPhase = PeakphaseB-PeakphaseA
13579 #
13580  if PeakRelPhase > 180:
13581  PeakRelPhase = PeakRelPhase - 360
13582  elif PeakRelPhase < -180:
13583  PeakRelPhase = PeakRelPhase + 360
13584  if Two_X_Sample.get() == 0:
13585  PhErr = 0.0018 * PeakSample * Fsample # calculate pahse error due half sample period offset
13586  PeakRelPhase = PeakRelPhase + PhaseCorrection - PhErr # - 12
13587  else:
13588  PeakRelPhase = PeakRelPhase + PhaseCorrection
13589  PeakdbB = PeakdbB + GainCorrection
13590  DoImpedance()
13591 
13593 def MakeIAScreen(): # Update the screen with traces and text
13594  global CANVASheightIA, CANVASwidthIA, IAca, TIAMline, TIAMRline
13595  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB
13596  global PeakxM, PeakyM, PeakMdb, PeakfreqM, Two_X_Sample
13597  global PeakfreqA, PeakfreqB, PeakfreqRA, PeakfreqRB
13598  global PeakxRA, PeakyRA, PeakxRB, PeakyRB, PeakdbRA, PeakdbRB
13599  global PeakxRM, PeakyRM, PeakRMdb, PeakfreqRM
13600  global PeakphaseA, PeakphaseB, PeakRelPhase, PhaseCalEntry
13601  global SmoothCurvesBP, TRACEwidth, GridWidth # The colors
13602  global COLORsignalband, COLORtext, COLORgrid, IASweepSaved
13603  global COLORtrace1, COLORtrace2, COLORtrace5, COLORtrace6
13604  global ResScale, DisplaySeries # Ohms per div
13605  global FFTwindow, FFTbandwidth, ZEROstuffing, FFTwindowname
13606  global X0LIA # Left top X value
13607  global Y0TIA # Left top Y value
13608  global GRWIA # Screenwidth
13609  global GRHIA # Screenheight
13610  global FontSize
13611  global RUNstatus # 0 stopped, 1 start, 2 running, 3 stop now, 4 stop and restart
13612  global AWGSAMPLErate, SAMPLErate, BaseSampleRate, OverRangeFlagA, OverRangeFlagB
13613  global SMPfft # number of FFT samples
13614  global TRACEaverage # Number of traces for averageing
13615  global FreqTraceMode # 1 normal 2 max 3 average
13616  global Vdiv # Number of vertical divisions
13617  global ImpedanceMagnitude # in ohms
13618  global ImpedanceAngle # in degrees
13619  global ImpedanceRseries, ImpedanceXseries # in ohms
13620  global LoopNum, NetworkScreenStatus, NSweepSeriesR, NSweepSeriesX, NSweepSeriesMag, NSweepSeriesAng
13621 
13622  if LoopNum.get() > 1:
13623  if NetworkScreenStatus.get() > 0:
13624  NSweepSeriesR.append(ImpedanceRseries)
13625  NSweepSeriesX.append(ImpedanceXseries)
13626  NSweepSeriesMag.append(ImpedanceMagnitude) # in ohms
13627  NSweepSeriesAng.append(ImpedanceAngle) # in degrees
13628  # Delete all items on the screen
13629  IAca.delete(ALL) # remove all items
13630  SmoothBool = SmoothCurvesBP.get()
13631  # Draw circular grid lines
13632  i = 1
13633  xcenter = GRWIA/2
13634  ycenter = GRHIA/2
13635  Radius = (GRWIA-X0LIA)/(1 + Vdiv.get()*2) # 11
13636  OhmsperPixel = float(ResScale.get())/Radius
13637  TRadius = Radius * Vdiv.get() # 5
13638  x1 = X0LIA
13639  x2 = X0LIA + GRWIA
13640  xright = 10 + xcenter + ( Vdiv.get() * Radius ) # 5
13641  while (i <= Vdiv.get()):
13642  x0 = xcenter - ( i * Radius )
13643  x1 = xcenter + ( i * Radius )
13644  y0 = ycenter - ( i * Radius )
13645  y1 = ycenter + ( i * Radius )
13646  ResTxt = '{0:.1f}'.format(float(ResScale.get()) * i)
13647  IAca.create_oval( x0, y0, x1, y1, outline=COLORgrid, width=GridWidth.get())
13648  IAca.create_line(xcenter, y0, xright, y0, fill=COLORgrid, width=GridWidth.get(), dash=(4,3))
13649  IAca.create_text(xright, y0, text=str(ResTxt), fill=COLORgrid, anchor="w", font=("arial", FontSize+2 ))
13650  #
13651  i = i + 1
13652  IAca.create_line(xcenter, y0, xcenter, y1, fill=COLORgrid, width=GridWidth.get())
13653  IAca.create_line(x0, ycenter, x1, ycenter, fill=COLORgrid, width=GridWidth.get())
13654  RAngle = math.radians(45)
13655  y = TRadius*math.sin(RAngle)
13656  x = TRadius*math.cos(RAngle)
13657  IAca.create_line(xcenter-x, ycenter-y, xcenter+x, ycenter+y, fill=COLORgrid, width=GridWidth.get())
13658  IAca.create_line(xcenter+x, ycenter-y, xcenter-x, ycenter+y, fill=COLORgrid, width=GridWidth.get())
13659  IAca.create_text(x0, ycenter, text="180", fill=COLORgrid, anchor="e", font=("arial", FontSize+2 ))
13660  IAca.create_text(x1, ycenter, text="0.0", fill=COLORgrid, anchor="w", font=("arial", FontSize+2 ))
13661  IAca.create_text(xcenter, y0, text="90", fill=COLORgrid, anchor="s", font=("arial", FontSize+2 ))
13662  IAca.create_text(xcenter, y1, text="-90", fill=COLORgrid, anchor="n", font=("arial", FontSize+2 ))
13663 # Draw traces
13664  # Add saved line if there
13665  if IASweepSaved.get() > 0:
13666  if len(TIAMRline) > 4:
13667  IAca.create_line(TIAMRline, fill=COLORtraceR5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13668 #
13669  x1 = xcenter + ( ImpedanceRseries / OhmsperPixel )
13670  if x1 > 1500:
13671  x1 = xright
13672  elif x1 < -500:
13673  x1 = xcenter - xright
13674  IAca.create_line(xcenter, ycenter, x1, ycenter, fill=COLORtrace1, arrow="last", width=TRACEwidth.get())
13675  y1 = ycenter - ( ImpedanceXseries / OhmsperPixel )
13676  if y1 > 1500:
13677  y1 = xright
13678  elif y1 < -500:
13679  y1 = ycenter - xright
13680  xmag = x1
13681  ymag = y1
13682  IAca.create_line(xcenter, ycenter, xcenter, y1, fill=COLORtrace6, arrow="last", width=TRACEwidth.get())
13683  MagRadius = ImpedanceMagnitude / OhmsperPixel
13684  y1 = ycenter - MagRadius*math.sin(math.radians(ImpedanceAngle))
13685  if y1 > 1500:
13686  y1 = xright
13687  elif y1 < -500:
13688  y1 = ycenter - xright
13689  x1 = xcenter + MagRadius*math.cos(math.radians(ImpedanceAngle))
13690  if x1 > 1500:
13691  x1 = xright
13692  elif x1 < -500:
13693  x1 = xcenter - xright
13694  IAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace2, arrow="last", width=TRACEwidth.get())
13695 #
13696  TIAMline = []
13697  if len(NSweepSeriesMag) > 2:
13698  index = 0
13699  while index < len(NSweepSeriesMag):
13700  MagRadius = NSweepSeriesMag[index] / OhmsperPixel
13701  y1 = ycenter - MagRadius*math.sin(math.radians(NSweepSeriesAng[index]))
13702  if y1 > 1500:
13703  y1 = xright
13704  elif y1 < -500:
13705  y1 = ycenter - xright
13706  x1 = xcenter + MagRadius*math.cos(math.radians(NSweepSeriesAng[index]))
13707  if x1 > 1500:
13708  x1 = xright
13709  elif x1 < -500:
13710  x1 = xcenter - xright
13711  TIAMline.append(x1)
13712  TIAMline.append(y1)
13713  index = index + 1
13714  IAca.create_line(TIAMline, fill=COLORtrace5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
13715 # display warning if input out of range
13716  if OverRangeFlagA == 1:
13717  x = X0LIA+GRWIA+10
13718  y = Y0TIA+GRHIA-40
13719  IAca.create_rectangle(x-6, y-6, x+6, y+6, fill="#ff0000")
13720  IAca.create_text (x+12, y, text="CHA Over Range", anchor=W, fill="#ff0000", font=("arial", FontSize+4 ))
13721  if OverRangeFlagB == 1:
13722  x = X0LIA+GRWIA+10
13723  y = Y0TIA+GRHIA-10
13724  IAca.create_rectangle(x-6, y-6, x+6, y+6, fill="#ff0000")
13725  IAca.create_text (x+12, y, text="CHB Over Range", anchor=W, fill="#ff0000", font=("arial", FontSize+4 ))
13726  # General information on top of the grid
13727 
13728  txt = " Sample rate: " + str(SAMPLErate)
13729  txt = txt + " FFT samples: " + str(SMPfft)
13730 
13731  txt = txt + " " + FFTwindowname
13732 
13733  x = X0LIA
13734  y = 12
13735  idTXT = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
13736  #
13737  x = X0LIA + GRWIA + 4
13738  y = 24
13739  txt = "Gain " + ' {0:.2f} '.format(PeakdbB-PeakdbA) + " dB"
13740  TXT9 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13741  y = y + 24
13742  txt = "Phase " + ' {0:.2f} '.format(PeakRelPhase) + " Degrees"
13743  TXT10 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13744  y = y + 24
13745  txt = "Freq " + ' {0:.1f} '.format(PeakfreqA) + " Hertz"
13746  TXT11 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13747  y = y + 24
13748  txt = "Impedance Magnitude"
13749  TXT1 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13750  y = y + 24
13751  txt = ' {0:.1f} '.format(ImpedanceMagnitude)
13752  TXT2 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13753  y = y + 24
13754  txt = "Impedance Angle"
13755  TXT3 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13756  y = y + 24
13757  txt = ' {0:.1f} '.format(ImpedanceAngle)
13758  TXT4 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13759  y = y + 24
13760  txt = "Impedance R series"
13761  TXT5 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13762  y = y + 24
13763  txt = ' {0:.1f} '.format(ImpedanceRseries)
13764  TXT6 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13765  y = y + 24
13766  txt = "Impedance X series"
13767  TXT7 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13768  y = y + 24
13769  txt = ' {0:.1f} '.format(ImpedanceXseries)
13770  TXT8 = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+6 ))
13771 #
13772  if ImpedanceXseries < 0: # calculate series capacitance
13773  y = y + 24
13774  try:
13775  Cseries = -1 / ( 2 * math.pi * PeakfreqA * ImpedanceXseries ) # in farads
13776  except:
13777  Cseries = 0
13778  Qseries = 1/(2*math.pi*PeakfreqA*Cseries*ImpedanceRseries)
13779  Cparallel = Cseries * (Qseries**2 / (1+Qseries**2))
13780  Cparallel = Cparallel * 1E6 # convert to micro Farads
13781  Rparallel = ImpedanceRseries * (1+Qseries**2)
13782  Cseries = Cseries * 1E6 # convert to micro Farads
13783  if DisplaySeries.get() == 0:
13784  txt = "Series Capacitance"
13785  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13786  y = y + 20
13787  if Cseries < 1:
13788  Cseries = Cseries * 1E3
13789  if Cseries < 1:
13790  Cseries = Cseries * 1E3
13791  txt = ' {0:.1f} '.format(Cseries) + "pF"
13792  else:
13793  txt = ' {0:.3f} '.format(Cseries) + "nF"
13794  else:
13795  txt = ' {0:.3f} '.format(Cseries) + "uF"
13796  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13797  else:
13798  txt = "Parallel"
13799  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13800  y = y + 20
13801  if Cparallel < 1:
13802  Cparallel = Cparallel * 1E3
13803  if Cparallel < 1:
13804  Cparallel = Cparallel * 1E3
13805  txt = "Capacitance " + ' {0:.1f} '.format(Cparallel) + "pF"
13806  else:
13807  txt = "Capacitance " + ' {0:.3f} '.format(Cparallel) + "nF"
13808  else:
13809  txt = "Capacitance " + ' {0:.3f} '.format(Cparallel) + "uF"
13810  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13811  y = y + 20
13812  txt = "Resistance" + ' {0:.1f} '.format(Rparallel) + "ohms"
13813  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13814  y = y + 20
13815  dissp = abs(ImpedanceRseries/ImpedanceXseries) * 100 # Dissipation factor is ratio of XR to XC in percent
13816  txt = 'D = {0:.2f} '.format(dissp) + " %"
13817  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13818 
13819  elif ImpedanceXseries > 0: # calculate series inductance
13820  y = y + 24
13821  try:
13822  Lseries = ImpedanceXseries / ( 2 * 3.14159 * PeakfreqA ) # in henry
13823  except:
13824  Lseries = 0
13825  Qseries = (2*math.pi*PeakfreqA*Lseries)/ImpedanceRseries
13826  if Qseries == 0.0: # Check if divide by zero
13827  Qseries = 0.00001
13828  Lparallel = Lseries * ((1+Qseries**2) / Qseries**2)
13829  Lparallel = Lparallel * 1E3 # convert to millihenry
13830  Rparallel = ImpedanceRseries * (1+Qseries**2)
13831  Lseries = Lseries * 1E3 # in millihenry
13832  if DisplaySeries.get() == 0:
13833  txt = "Series Inductance"
13834  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13835  y = y + 22
13836  if Lseries < 1:
13837  Lseries = Lseries * 1E3
13838  txt = ' {0:.2f} '.format(Lseries) + "uH"
13839  else:
13840  txt = ' {0:.2f} '.format(Lseries) + "mH"
13841  IAca.create_text(x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13842  else:
13843  txt = "Parallel"
13844  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13845  y = y + 20
13846  if Lparallel < 1:
13847  Lparallel = Lparallel * 1E3
13848  txt = "Inductance " + ' {0:.2f} '.format(Lparallel) + "uH"
13849  else:
13850  txt = "Inductance " + ' {0:.2f} '.format(Lparallel) + "mH"
13851  IAca.create_text(x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13852  y = y + 20
13853  txt = "Resistance" + ' {0:.1f} '.format(Rparallel) + "ohms"
13854  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13855  y = y + 20
13856  qf = abs(ImpedanceXseries/ImpedanceRseries) * 100 # Quality Factor is ratio of XL to XR
13857  txt = 'Q = {0:.2f} '.format(qf)
13858  IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
13859  # Start and stop frequency and trace mode
13860  if Two_X_Sample.get() == 0:
13861  txt = "0.0 to 45000 Hz"
13862  else:
13863  txt = "0.0 to 90000 Hz"
13864  txt = txt + " FFT Bandwidth =" + ' {0:.2f} '.format(FFTbandwidth)
13865 
13866  x = X0LIA
13867  y = Y0TIA+GRHIA-13
13868  idTXT = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
13869  txt = " "
13870  if FreqTraceMode.get() == 1:
13871  txt ="Normal mode "
13872 
13873  if FreqTraceMode.get() == 2:
13874  txt = "Peak hold mode "
13875 
13876  if FreqTraceMode.get() == 3:
13877  txt = "Power average mode (" + str(TRACEaverage.get()) + ") "
13878 
13879  if ZEROstuffing.get() > 0:
13880  txt = txt + "Zero Stuffing = " + str(ZEROstuffing.get())
13881  # Runstatus and level information
13882  if (RUNstatus.get() == 0):
13883  txt = txt + " Stopped "
13884  else:
13885  txt = txt + " Running "
13886  y = Y0TIA+GRHIA
13887  IDtxt = IAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
13888 #
13889 def IACaresize(event):
13890  global IAca, GRWIA, XOLIA, GRHIA, Y0TIA, CANVASwidthIA, CANVASheightIA, FontSize
13891 
13892  CANVASwidthIA = event.width - 4
13893  CANVASheightIA = event.height - 4
13894  GRWIA = CANVASwidthIA - (2 * X0LIA) - int(21.25 * FontSize) # 170 new grid width
13895  GRHIA = CANVASheightIA - Y0TIA - int(2.25 * FontSize) # 10 new grid height
13896  UpdateIAAll()
13897 #
13898 # ================ Make IA Window ==========================
13900  global iawindow, IAca, logo, IAScreenStatus, RsystemEntry, IADisp, AWGSync, IASource
13901  global COLORcanvas, CANVASwidthIA, CANVASheightIA, RevDate, AWGAMode, AWGAShape, AWGBMode
13902  global FFTwindow, CutDC, ColorMode, ResScale, GainCorEntry, PhaseCorEntry, DisplaySeries
13903  global GRWIA, X0LIA, GRHIA, Y0TIA, IA_Ext_Conf, DeBugMode, SWRev
13904  global NetworkScreenStatus, IASweepSaved
13905  global FrameRefief, BorderSize
13906 
13907  if IAScreenStatus.get() == 0:
13908  IAScreenStatus.set(1)
13909  IADisp.set(1)
13910  IACheckBox()
13911  CutDC.set(1) # set to remove DC
13912  CANVASwidthIA = 170 + GRWIA + 2 * X0LIA # The canvas width
13913  CANVASheightIA = GRHIA + Y0TIA + 10 # The canvas height
13914  AWGAMode.set(0) # Set AWG A to SVMI
13915  AWGAShape.set(1) # Set Shape to Sine
13916  AWGBMode.set(2) # Set AWG B to Hi-Z
13917  AWGSync.set(1) # Set AWGs to run sync
13918  iawindow = Toplevel()
13919  iawindow.title("Impedance Analyzer " + SWRev + RevDate)
13920  iawindow.protocol("WM_DELETE_WINDOW", DestroyIAScreen)
13921  frame2iar = Frame(iawindow, borderwidth=BorderSize, relief=FrameRefief)
13922  frame2iar.pack(side=RIGHT, expand=NO, fill=BOTH)
13923 
13924  frame2ia = Frame(iawindow, borderwidth=BorderSize, relief=FrameRefief)
13925  frame2ia.pack(side=TOP, expand=YES, fill=BOTH)
13926 
13927  IAca = Canvas(frame2ia, width=CANVASwidthIA, height=CANVASheightIA, background=COLORcanvas, cursor='cross')
13928  IAca.bind("<Configure>", IACaresize)
13929  IAca.bind("<Return>", DoNothing)
13930  IAca.bind("<space>", onCanvasSpaceBar)
13931  IAca.pack(side=TOP, expand=YES, fill=BOTH)
13932 
13933  # menu buttons
13934  # right side drop down menu buttons
13935  dropmenu = Frame( frame2iar )
13936  dropmenu.pack(side=TOP)
13937  # File menu
13938  IAFilemenu = Menubutton(dropmenu, text="File", style="W5.TButton")
13939  IAFilemenu.menu = Menu(IAFilemenu, tearoff = 0 )
13940  IAFilemenu["menu"] = IAFilemenu.menu
13941  IAFilemenu.menu.add_command(label="Save Config", command=BSaveConfigIA)
13942  IAFilemenu.menu.add_command(label="Load Config", command=BLoadConfigIA)
13943  IAFilemenu.menu.add_command(label="Save V Cal", command=BSaveCal)
13944  IAFilemenu.menu.add_command(label="Load V Cal", command=BLoadCal)
13945  IAFilemenu.menu.add_command(label="Save Data", command=BSaveDataIA)
13946  IAFilemenu.menu.add_command(label="Save Screen", command=BSaveScreenIA)
13947  IAFilemenu.menu.add_command(label="Help", command=BHelp)
13948  IAFilemenu.pack(side=LEFT, anchor=W)
13949  #
13950  IAOptionmenu = Menubutton(dropmenu, text="Options", style="W8.TButton")
13951  IAOptionmenu.menu = Menu(IAOptionmenu, tearoff = 0 )
13952  IAOptionmenu["menu"] = IAOptionmenu.menu
13953  IAOptionmenu.menu.add_command(label='Change Settings', command=MakeSettingsMenu)
13954  IAOptionmenu.menu.add_command(label='Set Sample Rate', command=MakeSampleRateMenu) # SetSampleRate)
13955  IAOptionmenu.menu.add_checkbutton(label='Cut-DC', variable=CutDC)
13956  IAOptionmenu.menu.add_checkbutton(label='Sweep-on', variable=NetworkScreenStatus)
13957  IAOptionmenu.menu.add_checkbutton(label='Save Sweep', variable=IASweepSaved, command=BSaveIASweep)
13958  if DeBugMode == 1:
13959  IAOptionmenu.menu.add_command(label="-Ext Config-", command=donothing)
13960  IAOptionmenu.menu.add_radiobutton(label='1', variable=IA_Ext_Conf, value=0)
13961  IAOptionmenu.menu.add_radiobutton(label='2', variable=IA_Ext_Conf, value=1)
13962  IAOptionmenu.menu.add_command(label="-Meas As-", command=donothing)
13963  IAOptionmenu.menu.add_radiobutton(label='Series', variable=DisplaySeries, value=0)
13964  IAOptionmenu.menu.add_radiobutton(label='Parallel', variable=DisplaySeries, value=1)
13965  IAOptionmenu.menu.add_command(label="-Background-", command=donothing)
13966  IAOptionmenu.menu.add_radiobutton(label='Black', variable=ColorMode, value=0, command=BgColor)
13967  IAOptionmenu.menu.add_radiobutton(label='White', variable=ColorMode, value=1, command=BgColor)
13968  IAOptionmenu.pack(side=LEFT, anchor=W)
13969  #
13970  rsemenu = Frame( frame2iar )
13971  rsemenu.pack(side=TOP)
13972  rseb2 = Button(rsemenu, text="Stop", style="Stop.TButton", command=BStop)
13973  rseb2.pack(side=RIGHT)
13974  rseb3 = Button(rsemenu, text="Run", style="Run.TButton", command=BStartIA)
13975  rseb3.pack(side=RIGHT)
13976  #
13977  IAFFTwindmenu = Menubutton(frame2iar, text="FFTwindow", style="W11.TButton")
13978  IAFFTwindmenu.menu = Menu(IAFFTwindmenu, tearoff = 0 )
13979  IAFFTwindmenu["menu"] = IAFFTwindmenu.menu
13980  IAFFTwindmenu.menu.add_radiobutton(label='Rectangular window (B=1)', variable=FFTwindow, value=0)
13981  IAFFTwindmenu.menu.add_radiobutton(label='Cosine window (B=1.24)', variable=FFTwindow, value=1)
13982  IAFFTwindmenu.menu.add_radiobutton(label='Triangular window (B=1.33)', variable=FFTwindow, value=2)
13983  IAFFTwindmenu.menu.add_radiobutton(label='Hann window (B=1.5)', variable=FFTwindow, value=3)
13984  IAFFTwindmenu.menu.add_radiobutton(label='Blackman window (B=1.73)', variable=FFTwindow, value=4)
13985  IAFFTwindmenu.menu.add_radiobutton(label='Nuttall window (B=2.02)', variable=FFTwindow, value=5)
13986  IAFFTwindmenu.menu.add_radiobutton(label='Flat top window (B=3.77)', variable=FFTwindow, value=6)
13987  IAFFTwindmenu.pack(side=TOP)
13988  #
13989  smpmenu = Frame( frame2iar )
13990  smpmenu.pack(side=TOP)
13991  smpb1 = Button(smpmenu, text="-Samples", style="W8.TButton", command=Bsamples1)
13992  smpb1.pack(side=LEFT)
13993  smpb2 = Button(smpmenu, text="+Samples", style="W8.TButton", command=Bsamples2)
13994  smpb2.pack(side=LEFT)
13995  # Temp set source resistance to 1000
13996  rsystem = Frame( frame2iar )
13997  rsystem.pack(side=TOP)
13998  rsystemlab = Label(rsystem, text="Ext Res")
13999  rsystemlab.pack(side=LEFT, anchor=W)
14000  RsystemEntry = Entry(rsystem, width=7, cursor='double_arrow')
14001  RsystemEntry.bind('<Return>', onTextKey)
14002  RsystemEntry.bind('<MouseWheel>', onTextScroll)
14003  RsystemEntry.bind("<Button-4>", onTextScroll)# with Linux OS
14004  RsystemEntry.bind("<Button-5>", onTextScroll)
14005  RsystemEntry.bind('<Key>', onTextKey)
14006  RsystemEntry.pack(side=LEFT, anchor=W)
14007  RsystemEntry.delete(0,"end")
14008  RsystemEntry.insert(4,1000)
14009  # Res Scale Spinbox
14010  ressb = Frame( frame2iar )
14011  ressb.pack(side=TOP)
14012  reslab = Label(ressb, text="Ohms/div ")
14013  reslab.pack(side=LEFT)
14014  ResScale = Spinbox(ressb, width=7, cursor='double_arrow', values=ResScalediv)
14015  ResScale.bind('<MouseWheel>', onSpinBoxScroll)
14016  ResScale.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
14017  ResScale.bind("<Button-5>", onSpinBoxScroll)
14018  ResScale.pack(side=LEFT)
14019  ResScale.delete(0,"end")
14020  ResScale.insert(0,500)
14021  #
14022  GainCor = Frame( frame2iar )
14023  GainCor.pack(side=TOP)
14024  GainCorlab = Label(GainCor, text="Gain Cor dB")
14025  GainCorlab.pack(side=LEFT, anchor=W)
14026  GainCorEntry = Entry(GainCor, width=7, cursor='double_arrow')
14027  GainCorEntry.bind('<Return>', onTextKey)
14028  GainCorEntry.bind('<MouseWheel>', onTextScroll)
14029  GainCorEntry.bind("<Button-4>", onTextScroll)# with Linux OS
14030  GainCorEntry.bind("<Button-5>", onTextScroll)
14031  GainCorEntry.bind('<Key>', onTextKey)
14032  GainCorEntry.pack(side=LEFT, anchor=W)
14033  GainCorEntry.delete(0,"end")
14034  GainCorEntry.insert(4,0.0)
14035  #
14036  PhaseCor = Frame( frame2iar )
14037  PhaseCor.pack(side=TOP)
14038  PhaseCorlab = Label(PhaseCor, text="Phase Cor")
14039  PhaseCorlab.pack(side=LEFT, anchor=W)
14040  PhaseCorEntry = Entry(PhaseCor, width=7, cursor='double_arrow')
14041  PhaseCorEntry.bind('<Return>', onTextKey)
14042  PhaseCorEntry.bind('<MouseWheel>', onTextScroll)
14043  PhaseCorEntry.bind("<Button-4>", onTextScroll)# with Linux OS
14044  PhaseCorEntry.bind("<Button-5>", onTextScroll)
14045  PhaseCorEntry.bind('<Key>', onTextKey)
14046  PhaseCorEntry.pack(side=LEFT, anchor=W)
14047  PhaseCorEntry.delete(0,"end")
14048  PhaseCorEntry.insert(4,0.0)
14049  #
14050  srclab = Label(frame2iar, text="Source")
14051  srclab.pack(side=TOP)
14052  extsrc1 = Radiobutton(frame2iar, text="Internal", variable=IASource, value=0, command=IASourceSet)
14053  extsrc1.pack(side=TOP)
14054  extsrc2 = Radiobutton(frame2iar, text="External", variable=IASource, value=1, command=IASourceSet)
14055  extsrc2.pack(side=TOP)
14056 
14057  dismiss1button = Button(frame2iar, text="Dismiss", style="W8.TButton", command=DestroyIAScreen)
14058  dismiss1button.pack(side=TOP)
14059  # add ADI logo
14060  ADI1 = Label(frame2iar, image=logo, anchor= "sw", compound="top") # height=49, width=116,
14061  ADI1.pack(side=TOP)
14062 #
14064  global iawindow, IAScreenStatus, IAca, IADisp
14065 
14066  IAScreenStatus.set(0)
14067  IADisp.set(0)
14068  IACheckBox()
14069  iawindow.destroy()
14070 #
14072  global TIAMline, TIAMRline, IASweepSaved
14073 
14074  if IASweepSaved.get() > 0:
14075  TIAMRline = TIAMline
14076 #
14078  global nqpwindow, NqPca, logo, NqPScreenStatus, NqPDisp
14079  global COLORcanvas, CANVASwidthNqP, CANVASheightNqP, RevDate
14080  global GRWNqP, X0LNqP, GRHNqP, Y0TNqP, DeBugMode, SWRev
14081  global NetworkScreenStatus, NqPSweepSaved
14082  global FrameRefief, BorderSize
14083 
14084  if NqPScreenStatus.get() == 0:
14085  NqPScreenStatus.set(1)
14086  NqPDisp.set(1)
14087  CANVASwidthNqP = GRWNqP + (2 * X0LNqP) # The canvas width
14088  CANVASheightNqP = GRHNqP + Y0TNqP + 10 # The canvas height
14089  nqpwindow = Toplevel()
14090  nqpwindow.title("Nyquist Plot " + SWRev + RevDate)
14091  nqpwindow.protocol("WM_DELETE_WINDOW", DestroyNqPScreen)
14092 
14093  frame2nqp = Frame(nqpwindow, borderwidth=BorderSize, relief=FrameRefief)
14094  frame2nqp.pack(side=TOP, expand=YES, fill=BOTH)
14095 
14096  NqPca = Canvas(frame2nqp, width=CANVASwidthNqP, height=CANVASheightNqP, background=COLORcanvas, cursor='cross')
14097  NqPca.bind("<Configure>", NqPCaresize)
14098  NqPca.bind("<Return>", DoNothing)
14099  NqPca.bind("<space>", onCanvasSpaceBar)
14100  NqPca.pack(side=TOP, expand=YES, fill=BOTH)
14101 #
14103  global nqpwindow, NqPScreenStatus, NqPca, NqPDisp
14104 
14105  NqPScreenStatus.set(0)
14106  NqPDisp.set(0)
14107  nqpwindow.destroy()
14108 #
14109 def NqPCaresize(event):
14110  global NqPca, GRWNqP, XOLNqP, GRHNqP, Y0TNqP, CANVASwidthNqP, CANVASheightNqP, FontSize
14111 
14112  CANVASwidthNqP = event.width - 4
14113  CANVASheightNqP = event.height - 4
14114  GRWNqP = CANVASwidthNqP - (2 * X0LNqP) # new grid width
14115  GRHNqP = CANVASheightNqP - Y0TNqP - int(1.25 * FontSize) # 10 new grid height
14116  UpdateNqPAll()
14117 
14120  global NqPca, GRWNqP, XOLNqP, GRHNqP, Y0TNqP, CANVASwidthNqP, CANVASheightNqP, COLORtrace1
14121  global COLORgrid, GridWidth, SmoothCurvesBP, SmoothBool, DBlevelBP, DBdivlist, DBdivindexBP
14122  global FSweepAdB, FSweepBdB, FSweepBPh, FSweepAPh, ShowMathBP, NqPline, Two_X_Sample, TRACEwidth
14123  global Vdiv, FBins, FStep
14124  global FontSize
14125 
14126  # Delete all items on the canvas
14127  NqPca.delete(ALL) # remove all items
14128  SmoothBool = SmoothCurvesBP.get()
14129  # Draw circular grid lines
14130  i = 1
14131  xcenter = GRWNqP/2
14132  ycenter = GRHNqP/2
14133  Radius = (GRWNqP-X0LNqP)/(1 + Vdiv.get() * 2) # 11
14134  dBperPixel = float(DBdivlist[DBdivindexBP.get()])/Radius
14135  TRadius = Radius * Vdiv.get() # 5
14136  x1 = X0LNqP
14137  x2 = X0LNqP + GRWNqP
14138  xright = 10 + xcenter + ( Vdiv.get() * Radius ) # 5
14139  while (i <= Vdiv.get()):
14140  x0 = xcenter - ( i * Radius )
14141  x1 = xcenter + ( i * Radius )
14142  y0 = ycenter - ( i * Radius )
14143  y1 = ycenter + ( i * Radius )
14144  dBaxis_value = (DBlevelBP.get() - (i * DBdivlist[DBdivindexBP.get()]))
14145  NqPca.create_oval( x0, y0, x1, y1, outline=COLORgrid, width=GridWidth.get())
14146  NqPca.create_line(xcenter, y0, xright, y0, fill=COLORgrid, width=GridWidth.get(), dash=(4,3))
14147  NqPca.create_text(xright, y0, text=str(dBaxis_value), fill=COLORgrid, anchor="w", font=("arial", FontSize+2 ))
14148  #
14149  i = i + 1
14150  NqPca.create_line(xcenter, y0, xcenter, y1, fill=COLORgrid, width=GridWidth.get())
14151  NqPca.create_line(x0, ycenter, x1, ycenter, fill=COLORgrid, width=GridWidth.get())
14152  RAngle = math.radians(45)
14153  y = TRadius*math.sin(RAngle)
14154  x = TRadius*math.cos(RAngle)
14155  NqPca.create_line(xcenter-x, ycenter-y, xcenter+x, ycenter+y, fill=COLORgrid, width=GridWidth.get())
14156  NqPca.create_line(xcenter+x, ycenter-y, xcenter-x, ycenter+y, fill=COLORgrid, width=GridWidth.get())
14157  NqPca.create_text(x0, ycenter, text="180", fill=COLORgrid, anchor="e", font=("arial", FontSize+2 ))
14158  NqPca.create_text(x1, ycenter, text="0.0", fill=COLORgrid, anchor="w", font=("arial", FontSize+2 ))
14159  NqPca.create_text(xcenter, y0, text="90", fill=COLORgrid, anchor="s", font=("arial", FontSize+2 ))
14160  NqPca.create_text(xcenter, y1, text="-90", fill=COLORgrid, anchor="n", font=("arial", FontSize+2 ))
14161  # xcenter = xcenter + (DBlevelBP.get()/dBperPixel)
14162 # Draw traces
14163  NqPline = []
14164  if len(FSweepAdB) > 4:
14165  for index in range(len(FSweepAdB)): # while n < len(FStep):
14166  if index < len(FStep): # check if n has gone out off bounds because user did something dumb
14167  F = FBins[int(FStep[index])] # look up frequency bin in list of bins
14168  else:
14169  F = FBins[int(FStep[0])]
14170  # Mag value
14171  dbA = (10 * math.log10(float(FSweepAdB[index])) + 17) # Convert power to DBs, except for log(0) error
14172  dbB = (10 * math.log10(float(FSweepBdB[index])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
14173  if ShowMathBP.get() == 1:
14174  MdB = dbA - dbB
14175  elif ShowMathBP.get() == 2:
14176  MdB = dbB - dbA
14177  MagRadius = (-MdB / dBperPixel) + (DBlevelBP.get()/dBperPixel)
14178  # Phase Value
14179  RelPhase = FSweepBPh[index] - FSweepAPh[index]
14180  if RelPhase > 180:
14181  RelPhase = RelPhase - 360
14182  elif RelPhase < -180:
14183  RelPhase = RelPhase + 360
14184  if Two_X_Sample.get() == 0:
14185  PhErr = 0.0018 * F # calculate phase error due half sample period offset
14186  RelPhase = RelPhase - PhErr # - PhaseOffset1x # - 12.0
14187  else:
14188  RelPhase = RelPhase # - PhaseOffset2x # - 9.0
14189  y1 = ycenter - MagRadius*math.sin(math.radians(RelPhase))
14190  if y1 > 1500:
14191  y1 = xright
14192  elif y1 < -500:
14193  y1 = ycenter - xright
14194  x1 = xcenter + MagRadius*math.cos(math.radians(RelPhase ))
14195  if x1 > 1500:
14196  x1 = xright
14197  elif x1 < -500:
14198  x1 = xcenter - xright
14199  NqPline.append(x1)
14200  NqPline.append(y1)
14201  NqPca.create_line(NqPline, fill=COLORtrace1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
14202 #
14204  global NiCScreenStatus, NiCDisp
14205  global nicwindow, NiCca, logo, SWRev
14206  global COLORcanvas, CANVASwidthNic, CANVASheightNic, RevDate
14207  global GRWNiC, X0LNiC, GRHNiC, Y0TNiC, DeBugMode
14208  global NetworkScreenStatus, NiCSweepSaved
14209  global FrameRefief, BorderSize
14210 
14211  if NiCScreenStatus.get() == 0:
14212  NiCScreenStatus.set(1)
14213  NiCDisp.set(1)
14214  CANVASwidthNic = GRWNiC + 18 + X0LNiC # The canvas width
14215  CANVASheightNic = GRHNiC + 60 # The canvas height
14216  nicwindow = Toplevel()
14217  nicwindow.title("Nichols Plot " + SWRev + RevDate)
14218  nicwindow.protocol("WM_DELETE_WINDOW", DestroyNiCScreen)
14219 
14220  frame2nic = Frame(nicwindow, borderwidth=BorderSize, relief=FrameRefief)
14221  frame2nic.pack(side=TOP, expand=YES, fill=BOTH)
14222 
14223  NiCca = Canvas(frame2nic, width=CANVASwidthNic, height=CANVASheightNic, background=COLORcanvas, cursor='cross')
14224  NiCca.bind("<Configure>", NiCCaresize)
14225  NiCca.bind("<Return>", DoNothing)
14226  NiCca.bind("<space>", onCanvasSpaceBar)
14227  NiCca.pack(side=TOP, expand=YES, fill=BOTH)
14228 #
14230  global nicwindow, NiCScreenStatus, NiCca, NiCDisp
14231 
14232  NiCScreenStatus.set(0)
14233  NiCDisp.set(0)
14234  nicwindow.destroy()
14235 #
14236 def NiCCaresize(event):
14237  global NiCca, GRWNiC, XOLNiC, GRHNiC, Y0TNiC, CANVASwidthNic, CANVASheightNic, FontSize
14238 
14239  CANVASwidthNic = event.width - 4
14240  CANVASheightNic = event.height - 4
14241  GRWNiC = CANVASwidthNic - int(2.25 * FontSize) - X0LNiC # 18 new grid width
14242  GRHNiC = CANVASheightNic - int(7.5 * FontSize) # 60 new grid height
14243  UpdateNiCAll()
14244 
14247  global NiCline, NiCca, CANVASwidthNic, CANVASheightNic, X0LNiC, GRWNiC, Y0TNiC, GRHNiC, X0TNiC
14248  global COLORzeroline, GridWidth, COLORgrid, FSweepAdB, FSweepBdB, Two_X_Sample, ShowMathBP
14249  global FSweepBPh, FSweepAPh, SmoothCurvesBP, SmoothBool, DBlevelBP, DBdivlist, DBdivindexBP
14250  global Vdiv, FBins, FStep, PhCenBodeEntry, RelPhaseCenter
14251  global FontSize
14252 
14253  Ymin = Y0TNiC # Minimum position of XY grid (top)
14254  Ymax = Y0TNiC + GRHNiC # Maximum position of XY grid (bottom)
14255  Xmin = X0LNiC # Minimum position of XY grid (left)
14256  Xmax = X0LNiC + GRWNiC # Maximum position of XY grid (right)
14257  try:
14258  Phasecenter = int(PhCenBodeEntry.get())
14259  RelPhaseCenter.set(Phasecenter)
14260  except:
14261  PhCenBodeEntry.delete(0,"end")
14262  PhCenBodeEntry.insert(0,0)
14263  RelPhaseCenter.set(0)
14264  Phasecenter = 0
14265  # Delete all items on the screen
14266  MarkerNum = 0
14267  SmoothBool = SmoothCurvesBP.get()
14268  NiCca.delete(ALL) # remove all items
14269  # Draw horizontal grid lines Rel Gain Magnitude
14270  i = 0
14271  x1 = X0LNiC
14272  x2 = X0TNiC = X0LNiC + GRWNiC
14273  mg_siz = GRWNiC/10.0
14274  mg_inc = mg_siz/5.0
14275  DegPerDiv = 360 / 10
14276  while (i < Vdiv.get()+1):
14277  dBaxis_value = (DBlevelBP.get() - (i * DBdivlist[DBdivindexBP.get()]))
14278  y = Y0TNiC + i * GRHNiC/Vdiv.get()
14279  Dline = [x1,y,x2,y]
14280  if dBaxis_value == 0:
14281  NiCca.create_line(Dline, fill=COLORzeroline, width=GridWidth.get()) # Blue line at center of grid
14282  k = 0
14283  while (k < 10):
14284  l = 1
14285  while (l < 5): # add tick marks
14286  Dline = [x1+k*mg_siz+l*mg_inc,y-5,x1+k*mg_siz+l*mg_inc,y+5]
14287  NiCca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
14288  l = l + 1
14289  k = k + 1
14290  else:
14291  NiCca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
14292  dBaxis_label = str(dBaxis_value)
14293  NiCca.create_text(x1-3, y, text=dBaxis_label, fill=COLORtrace1, anchor="e", font=("arial", FontSize ))
14294 
14295  i = i + 1
14296  # Draw vertical grid lines (phase -180 to 180 10 div)
14297  i = 0
14298  y1 = Y0TNiC
14299  y2 = Y0TNiC + GRHNiC
14300  mg_siz = GRHNiC/10.0
14301  mg_inc = mg_siz/5.0
14302  #
14303  while (i < 11):
14304  x = X0LNiC + i * GRWNiC/10.0
14305  Dline = [x,y1,x,y2]
14306  axis_value = Phasecenter - 180 + (i * DegPerDiv)
14307  axis_label = str(axis_value)
14308  if ( axis_value == 0):
14309  NiCca.create_line(Dline, fill=COLORzeroline, width=GridWidth.get()) # Blue vertical line at center of grid
14310  k = 0
14311  while (k < 10):
14312  l = 1
14313  while (l < 5): # add tick marks
14314  Dline = [x-5,y1+k*mg_siz+l*mg_inc,x+5,y1+k*mg_siz+l*mg_inc]
14315  NiCca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
14316  l = l + 1
14317  k = k + 1
14318  else:
14319  NiCca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
14320  NiCca.create_text(x, y2+3, text=axis_label, fill=COLORtrace3, anchor="n", font=("arial", FontSize ))
14321  i = i + 1
14322  # Draw traces
14323  # Vertical conversion factors (level dBs) and border limits
14324  Yconv = float(GRHNiC) / (Vdiv.get() * DBdivlist[DBdivindexBP.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
14325  Yc = float(Y0TNiC) + Yconv * (DBlevelBP.get()) # Yc is the 0 dBm position, can be outside the screen!
14326  Xphconv = float(GRWNiC / 360.0) # degrees per pixel
14327  Xp = float(X0LNiC) + Xphconv * 180.0
14328  x1 = X0LNiC + 14
14329  # Horizontal conversion factors (phase deg) and border limits
14330  NiCline = []
14331  if len(FSweepAdB) > 4:
14332  index = 0
14333  for index in range(len(FSweepAdB)): # while n < len(FStep):
14334  if index < len(FStep): # check if n has gone out off bounds because user did something dumb
14335  F = FBins[int(FStep[index])] # look up frequency bin in list of bins
14336  else:
14337  F = FBins[int(FStep[0])]
14338  # Mag value
14339  dbA = (10 * math.log10(float(FSweepAdB[index])) + 17) # Convert power to DBs, except for log(0) error
14340  dbB = (10 * math.log10(float(FSweepBdB[index])) + 17) # Add 17 dB for max value of +10 dB ALSO in CSV file routine!
14341  if ShowMathBP.get() == 1:
14342  MdB = dbA - dbB
14343  elif ShowMathBP.get() == 2:
14344  MdB = dbB - dbA
14345  yb = Yc - Yconv * MdB
14346  if (yb < Ymin):
14347  yb = Ymin
14348  if (yb > Ymax):
14349  yb = Ymax
14350  # Phase Value
14351  RelPhase = FSweepBPh[index] - FSweepAPh[index]
14352  RelPhase = RelPhase - Phasecenter
14353  if RelPhase > 180:
14354  RelPhase = RelPhase - 360
14355  elif RelPhase < -180:
14356  RelPhase = RelPhase + 360
14357  if Two_X_Sample.get() == 0:
14358  PhErr = 0.0018 * F # calculate phase error due half sample period offset
14359  RelPhase = RelPhase - PhErr # - PhaseOffset1x # - 12.0
14360  else:
14361  RelPhase = RelPhase # - PhaseOffset2x
14362  xa = Xp + Xphconv * RelPhase
14363  if (xa < Xmin):
14364  xa = Ymin
14365  if (xa > Xmax):
14366  xa = Xmax
14367  NiCline.append(int(xa + 0.5))
14368  NiCline.append(int(yb + 0.5))
14369  NiCca.create_line(NiCline, fill=COLORtrace1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
14370 #
14371 def UpdateNqPAll(): # Update Data, trace and screen
14372  global FFTBuffA, FFTBuffB
14373  global SMPfft
14374 
14375  if len(FFTBuffA) < SMPfft and len(FFTBuffB) < SMPfft:
14376  return
14377  #MakeNqPTrace() # Update the traces
14378  UpdateNqPScreen() # Update the screen
14379 
14380 def UpdateNqPTrace(): # Update trace and screen
14381 
14382  #MakeNqPTrace() # Update traces
14383  UpdateNqPScreen() # Update the screen
14384 
14385 def UpdateNqPScreen(): # Update screen with trace and text
14386 
14387  MakeNqPScreen() # Update the screen
14388  root.update() # Activate updated screens
14389 #
14390 def UpdateNiCAll(): # Update Data, trace and screen
14391  global FFTBuffA, FFTBuffB
14392  global SMPfft
14393 
14394  if len(FFTBuffA) < SMPfft and len(FFTBuffB) < SMPfft:
14395  return
14396  #MakeNiCTrace() # Update the traces
14397  UpdateNiCScreen() # Update the screen
14398 
14399 def UpdateNiCTrace(): # Update trace and screen
14400 
14401  #MakeNiCTrace() # Update traces
14402  UpdateNiCScreen() # Update the screen
14403 
14404 def UpdateNiCScreen(): # Update screen with trace and text
14405 
14406  MakeNiCScreen() # Update the screen
14407  root.update() # Activate updated screens
14408 #
14409 #
14410 def VAtoggle():
14411  global vat_btn
14412 
14413  if vat_btn.config('text')[-1] == 'ON':
14414  vat_btn.config(text='OFF', style="Stop.TButton")
14415  else:
14416  vat_btn.config(text='ON', style="Run.TButton")
14417 #
14419  global vabt_btn
14420 
14421  if vabt_btn.config('text')[-1] == 'ON':
14422  vabt_btn.config(text='OFF', style="Stop.TButton")
14423  else:
14424  vabt_btn.config(text='ON', style="Run.TButton")
14425 #
14426 def VBtoggle():
14427  global vbt_btn
14428 
14429  if vbt_btn.config('text')[-1] == 'ON':
14430  vbt_btn.config(text='OFF', style="Stop.TButton")
14431  else:
14432  vbt_btn.config(text='ON', style="Run.TButton")
14433 #
14434 def IAtoggle():
14435  global iat_btn
14436 
14437  if iat_btn.config('text')[-1] == 'ON':
14438  iat_btn.config(text='OFF', style="Stop.TButton")
14439  else:
14440  iat_btn.config(text='ON', style="Run.TButton")
14441 #
14442 def IBtoggle():
14443  global ibt_btn
14444 
14445  if ibt_btn.config('text')[-1] == 'ON':
14446  ibt_btn.config(text='OFF', style="Stop.TButton")
14447  else:
14448  ibt_btn.config(text='ON', style="Run.TButton")
14449 #
14450 # ================ Make Phase Ana Window ==========================
14452  global phawindow, PhAca, logo, PhAScreenStatus, PhADisp, AWGSync
14453  global COLORcanvas, CANVASwidthPhA, CANVASheightPhA, RevDate, AWGAMode, AWGAShape, AWGBMode
14454  global FFTwindow, CutDC, ColorMode, RefPhase, CHvpdiv, CHipdiv
14455  global GRWPhA, X0LPhA, GRHPhA, Y0TPhA, DeBugMode, SWRev, PhAPlotMode
14456  global VScale, IScale, RefphEntry, MuxScreenStatus, AppendPhAData
14457  global vat_btn, vbt_btn, iat_btn, ibt_btn, vabt_btn
14458  global ShowPB_A, ShowPB_B, ShowPB_C, ShowPB_D
14459  global FrameRefief, BorderSize
14460 
14461  if PhAScreenStatus.get() == 0:
14462  PhAScreenStatus.set(1)
14463  PhADisp.set(1)
14464  PhACheckBox()
14465  CutDC.set(1) # set to remove DC
14466  CANVASwidthPhA = 170 + GRWPhA + 2 * X0LPhA # The canvas width
14467  CANVASheightPhA = GRHPhA + Y0TPhA + 10 # The canvas height
14468  phawindow = Toplevel()
14469  phawindow.title("Phase Analyzer " + SWRev + RevDate)
14470  phawindow.protocol("WM_DELETE_WINDOW", DestroyPhAScreen)
14471  frame2phar = Frame(phawindow, borderwidth=BorderSize, relief=FrameRefief)
14472  frame2phar.pack(side=RIGHT, expand=NO, fill=BOTH)
14473 
14474  frame2pha = Frame(phawindow, borderwidth=BorderSize, relief=FrameRefief)
14475  frame2pha.pack(side=TOP, expand=YES, fill=BOTH)
14476 
14477  PhAca = Canvas(frame2pha, width=CANVASwidthPhA, height=CANVASheightPhA, background=COLORcanvas, cursor='cross')
14478  PhAca.bind("<Configure>", PhACaresize)
14479  PhAca.bind("<Return>", DoNothing)
14480  PhAca.bind("<space>", onCanvasSpaceBar)
14481  PhAca.pack(side=TOP, expand=YES, fill=BOTH)
14482 
14483  # menu buttons
14484  # right side drop down menu buttons
14485  dropmenu = Frame( frame2phar )
14486  dropmenu.pack(side=TOP)
14487  # File menu
14488  PhAFilemenu = Menubutton(dropmenu, text="File", style="W5.TButton")
14489  PhAFilemenu.menu = Menu(PhAFilemenu, tearoff = 0 )
14490  PhAFilemenu["menu"] = PhAFilemenu.menu
14491  PhAFilemenu.menu.add_command(label="Save Config", command=BSaveConfigIA)
14492  PhAFilemenu.menu.add_command(label="Load Config", command=BLoadConfigIA)
14493  PhAFilemenu.menu.add_command(label="Save Data", command=BSavePhAData)
14494  PhAFilemenu.menu.add_checkbutton(label=' - Append', variable=AppendPhAData)
14495  PhAFilemenu.menu.add_command(label="Plot From File", command=PlotPhAFromFile)
14496  PhAFilemenu.menu.add_radiobutton(label=' - Vectors', variable=PhAPlotMode, value=0)
14497  PhAFilemenu.menu.add_radiobutton(label=' - Outline', variable=PhAPlotMode, value=1)
14498  PhAFilemenu.menu.add_command(label="Help", command=BHelp)
14499  PhAFilemenu.pack(side=LEFT, anchor=W)
14500  #
14501  PhAOptionmenu = Menubutton(dropmenu, text="Options", style="W8.TButton")
14502  PhAOptionmenu.menu = Menu(PhAOptionmenu, tearoff = 0 )
14503  PhAOptionmenu["menu"] = PhAOptionmenu.menu
14504  PhAOptionmenu.menu.add_command(label='Change Settings', command=MakeSettingsMenu)
14505  PhAOptionmenu.menu.add_command(label='Set Sample Rate', command=MakeSampleRateMenu) # SetSampleRate)
14506  PhAOptionmenu.menu.add_checkbutton(label='Cut-DC', variable=CutDC)
14507 
14508  PhAOptionmenu.menu.add_command(label="-Background-", command=donothing)
14509  PhAOptionmenu.menu.add_radiobutton(label='Black', variable=ColorMode, value=0, command=BgColor)
14510  PhAOptionmenu.menu.add_radiobutton(label='White', variable=ColorMode, value=1, command=BgColor)
14511  PhAOptionmenu.pack(side=LEFT, anchor=W)
14512  #
14513  rsphmenu = Frame( frame2phar )
14514  rsphmenu.pack(side=TOP)
14515  rsphb2 = Button(rsphmenu, text="Stop", style="Stop.TButton", command=BStop)
14516  rsphb2.pack(side=RIGHT)
14517  rsphb3 = Button(rsphmenu, text="Run", style="Run.TButton", command=BStart)
14518  rsphb3.pack(side=RIGHT)
14519  #
14520  PhAFFTwindmenu = Menubutton(frame2phar, text="FFTwindow", style="W11.TButton")
14521  PhAFFTwindmenu.menu = Menu(PhAFFTwindmenu, tearoff = 0 )
14522  PhAFFTwindmenu["menu"] = PhAFFTwindmenu.menu
14523  PhAFFTwindmenu.menu.add_radiobutton(label='Rectangular window (B=1)', variable=FFTwindow, value=0)
14524  PhAFFTwindmenu.menu.add_radiobutton(label='Cosine window (B=1.24)', variable=FFTwindow, value=1)
14525  PhAFFTwindmenu.menu.add_radiobutton(label='Triangular window (B=1.33)', variable=FFTwindow, value=2)
14526  PhAFFTwindmenu.menu.add_radiobutton(label='Hann window (B=1.5)', variable=FFTwindow, value=3)
14527  PhAFFTwindmenu.menu.add_radiobutton(label='Blackman window (B=1.73)', variable=FFTwindow, value=4)
14528  PhAFFTwindmenu.menu.add_radiobutton(label='Nuttall window (B=2.02)', variable=FFTwindow, value=5)
14529  PhAFFTwindmenu.menu.add_radiobutton(label='Flat top window (B=3.77)', variable=FFTwindow, value=6)
14530  PhAFFTwindmenu.pack(side=TOP)
14531  #
14532  FFTwindow.set(6) # default to Flat top window (6)
14533  #
14534  smphmenu = Frame( frame2phar )
14535  smphmenu.pack(side=TOP)
14536  smphb1 = Button(smphmenu, text="-Samples", style="W8.TButton", command=Bsamples1)
14537  smphb1.pack(side=LEFT)
14538  smphb2 = Button(smphmenu, text="+Samples", style="W8.TButton", command=Bsamples2)
14539  smphb2.pack(side=LEFT)
14540  #
14541  refph = Frame( frame2phar )
14542  refph.pack(side=TOP)
14543  refphlab = Label(refph, text="Ref Phase")
14544  refphlab.pack(side=LEFT, anchor=W)
14545  RefphEntry = Spinbox(refph, width=5, cursor='double_arrow', values=RefPhase)
14546  RefphEntry.bind('<MouseWheel>', onSpinBoxScroll)
14547  RefphEntry.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
14548  RefphEntry.bind("<Button-5>", onSpinBoxScroll)
14549  RefphEntry.pack(side=LEFT, anchor=W)
14550  RefphEntry.delete(0,"end")
14551  RefphEntry.insert(0,"CA-V")
14552  vatb = Frame( frame2phar )
14553  vatb.pack(side=TOP)
14554  vatblab = Label(vatb, text="CA-V ")
14555  vatblab.pack(side=LEFT)
14556  vat_btn = Button(vatb, text="OFF", style="Stop.TButton", width=4, command=VAtoggle)
14557  vat_btn.pack(side=LEFT)
14558  vbtb = Frame( frame2phar )
14559  vbtb.pack(side=TOP)
14560  if MuxScreenStatus.get() == 0:
14561  vbtblab = Label(vbtb, text="CB-V ")
14562  vbtblab.pack(side=LEFT)
14563  vbt_btn = Button(vbtb, text="OFF", style="Stop.TButton", width=4, command=VBtoggle)
14564  vbt_btn.pack(side=LEFT)
14565  vabtb = Frame( frame2phar )
14566  vabtb.pack(side=TOP)
14567  vabtblab = Label(vabtb, text="CA-B V ")
14568  vabtblab.pack(side=LEFT)
14569  vabt_btn = Button(vabtb, text="OFF", style="Stop.TButton", width=4, command=VABtoggle)
14570  vabt_btn.pack(side=LEFT)
14571  else:
14572  RefphEntry.configure(state=DISABLED)
14573  amuxlab = Label(frame2phar, text="Analog Mux In")
14574  amuxlab.pack(side=TOP)
14575  phbt1 = Checkbutton(frame2phar, text='CB-A ', style="Strace2.TCheckbutton", variable=ShowPB_A)
14576  phbt1.pack(side=TOP)
14577  phbt2 = Checkbutton(frame2phar, text='CB-B ', style="Strace6.TCheckbutton", variable=ShowPB_B) #, command=TraceSelectADC_Mux)
14578  phbt2.pack(side=TOP)
14579  phbt3 = Checkbutton(frame2phar, text='CB-C ', style="Strace7.TCheckbutton", variable=ShowPB_C) #, command=TraceSelectADC_Mux)
14580  phbt3.pack(side=TOP)
14581  phbt4 = Checkbutton(frame2phar, text='CB-D ', style="Strace4.TCheckbutton", variable=ShowPB_D) #, command=TraceSelectADC_Mux)
14582  phbt4.pack(side=TOP)
14583 #
14584  # Voltage Scale Spinbox
14585  vssb = Frame( frame2phar )
14586  vssb.pack(side=TOP)
14587  vslab = Label(vssb, text="Volts/div ")
14588  vslab.pack(side=LEFT)
14589  VScale = Spinbox(vssb, width=7, cursor='double_arrow', values=CHvpdiv)
14590  VScale.bind('<MouseWheel>', onSpinBoxScroll)
14591  VScale.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
14592  VScale.bind("<Button-5>", onSpinBoxScroll)
14593  VScale.pack(side=LEFT)
14594  VScale.delete(0,"end")
14595  VScale.insert(0,0.5)
14596  #
14597  iatb = Frame( frame2phar )
14598  iatb.pack(side=TOP)
14599  iatblab = Label(iatb, text="CA-I ")
14600  iatblab.pack(side=LEFT)
14601  iat_btn = Button(iatb, text="OFF", style="Stop.TButton", width=4, command=IAtoggle)
14602  iat_btn.pack(side=LEFT)
14603  ibtb = Frame( frame2phar )
14604  ibtb.pack(side=TOP)
14605  ibtblab = Label(ibtb, text="CB-I ")
14606  ibtblab.pack(side=LEFT)
14607  ibt_btn = Button(ibtb, text="OFF", style="Stop.TButton", width=4, command=IBtoggle)
14608  ibt_btn.pack(side=LEFT)
14609  # Current Scale Spinbox
14610  issb = Frame( frame2phar )
14611  issb.pack(side=TOP)
14612  islab = Label(issb, text="mA/div ")
14613  islab.pack(side=LEFT)
14614  IScale = Spinbox(issb, width=7, cursor='double_arrow', values=CHipdiv)
14615  IScale.bind('<MouseWheel>', onSpinBoxScroll)
14616  IScale.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
14617  IScale.bind("<Button-5>", onSpinBoxScroll)
14618  IScale.pack(side=LEFT)
14619  IScale.delete(0,"end")
14620  IScale.insert(0,10.0)
14621 
14622  dismiss1button = Button(frame2phar, text="Dismiss", style="W8.TButton", command=DestroyPhAScreen)
14623  dismiss1button.pack(side=TOP)
14624  # add ADI logo
14625  ADI1 = Label(frame2phar, image=logo, anchor= "sw", compound="top") # height=49, width=116,
14626  ADI1.pack(side=TOP)
14627 #
14628 # Destroy Phase Analizer window
14630  global phawindow, PhAScreenStatus, PhAca, PhADisp
14631 
14632  PhAScreenStatus.set(0)
14633  PhADisp.set(0)
14634  PhACheckBox()
14635  phawindow.destroy()
14636 #
14637 # Resize Phase Analizer window
14638 def PhACaresize(event):
14639  global PhAca, GRWPhA, XOLPhA, GRHPhA, Y0TPhA, CANVASwidthPhA, CANVASheightPhA, FontSize
14640 
14641  CANVASwidthPhA = event.width - 4
14642  CANVASheightPhA = event.height - 4
14643  GRWPhA = CANVASwidthPhA - (2 * X0LPhA) - int(21.25 * FontSize) # 170 new grid width
14644  GRHPhA = CANVASheightPhA - Y0TPhA - int(2.25 * FontSize) # 10 new grid height
14645  UpdatePhAAll()
14646 #
14647 def UpdatePhAAll(): # Update Data, trace and screen
14648 
14649  MakePhATrace() # Update the traces
14650  UpdatePhAScreen() # Update the screen
14651 
14652 def UpdatePhATrace(): # Update trace and screen
14653  MakePhATrace() # Update traces
14654  UpdatePhAScreen() # Update the screen
14655 
14656 def UpdatePhAScreen(): # Update screen with trace and text
14657  MakePhAScreen() # Update the screen
14658  root.update() # Activate updated screens
14659 #
14660 # Place holder
14661 def MakePhATrace(): # Update the grid and trace
14662  global VAresult, VBresult, IAresult, IBresult, VABresult, PhaseIA, PhaseIB, PhaseVA, PhaseVB, PhaseVAB
14663  global VMAresult, VMBresult, VMCresult, VMDresult, PhaseVMD, PhaseVMA, PhaseVMB, PhaseVMC
14664  global PeakVA, PeakVB, PeakIA, PeakIB, PeakVAB
14665  global PeakVMA, PeakVMB, PeakVMC, PeakVMD
14666  global PeakfreqVA, PeakfreqVB, PeakfreqIA, PeakfreqIB
14667  global PeakphaseVA, PeakphaseVB, PeakphaseIA, PeakphaseIB, PeakphaseVAB
14668  global PeakphaseVMA, PeakphaseVMB, PeakphaseVMC, PeakphaseVMD
14669  global GRHPhA # Screenheight
14670  global GRWPhA # Screenwidth
14671  global AWGSAMPLErate, SAMPLErate, BaseSampleRate
14672  global STARTsample, STOPsample, LoopNum, FSweepMode
14673  global TRACEmode, Two_X_Sample, MuxScreenStatus, MuxChan
14674  global Vdiv # Number of vertical divisions
14675  global X0LPhA # Left top X value
14676  global Y0TPhA # Left top Y value
14677 
14678  # Set the TRACEsize variable
14679  if len(VAresult) < 32:
14680  return
14681  TRACEsize = len(VAresult) # Set the trace length
14682  Fsample = float(SAMPLErate / 2) / (TRACEsize - 1)
14683  # Horizontal conversion factors (frequency Hz) and border limits
14684  STARTsample = 0 # First sample in FFTresult[] that is used
14685  STARTsample = int(math.ceil(STARTsample)) # First within screen range
14686  if Two_X_Sample.get() == 0:
14687  STOPsample = 45000 / Fsample # Last sample in FFTresult that is used
14688  else:
14689  STOPsample = 90000 / Fsample
14690  STOPsample = int(math.floor(STOPsample)) # Last within screen range, math.floor actually not necessary, part of int
14691 #
14692 
14693  MAXsample = TRACEsize # Just an out of range check
14694  if STARTsample > (MAXsample - 1):
14695  STARTsample = MAXsample - 1
14696 
14697  if STOPsample > MAXsample:
14698  STOPsample = MAXsample
14699 
14700  n = STARTsample +1
14701  PeakVA = PeakVB = PeakIA = PeakIB = PeakVAB = 0.0
14702  PeakfreqVA = PeakfreqVB = PeakfreqIA = PeakfreqIB = F = n * Fsample
14703  PeakphaseVA = PhaseVA[n]
14704  if MuxScreenStatus.get() == 0:
14705  PeakphaseVB = PhaseVB[n]
14706  PeakphaseIA = PhaseIA[n]
14707  PeakphaseIB = PhaseIB[n]
14708  PeakSampleVB = PeakSampleVA = PeakSampleIA = PeakSampleIB = n
14709  if MuxChan == 0: #
14710  PeakVMA = 0
14711  PeakphaseVMA = PhaseVMA[n]
14712  PeakSampleVMA = 0
14713  PeakfreqVMA = PeakfreqVA
14714  if MuxChan == 1: #
14715  PeakVMB = 0
14716  PeakphaseVMB = PhaseVMB[n]
14717  PeakSampleVMB = 0
14718  PeakfreqVMB = PeakfreqVA
14719  if MuxChan == 2: #
14720  PeakVMC = 0
14721  PeakphaseVMC = PhaseVMC[n]
14722  PeakSampleVMC = 0
14723  PeakfreqVMC = PeakfreqVA
14724  if MuxChan == 3: #
14725  PeakVMD = 0
14726  PeakphaseVMD = PhaseVMD[n]
14727  PeakSampleVMD = 0
14728  PeakfreqVMD = PeakfreqVA
14729 
14730  while n <= STOPsample: # search for peaks
14731  F = n * Fsample
14732  try:
14733  VA = float(VAresult[n]) #
14734  except:
14735  VA = 0.0
14736  if VA > PeakVA:
14737  PeakVA = VA
14738  PeakfreqVA = F
14739  PeakphaseVA = PhaseVA[n]
14740  PeakSampleVA = n
14741 
14742  if MuxScreenStatus.get() == 0:
14743  try:
14744  VAB = float(VABresult[n]) #
14745  except:
14746  VAB = 0.0
14747  if VAB > PeakVAB:
14748  PeakVAB = VAB
14749  PeakfreqVAB = F
14750  PeakphaseVAB = PhaseVAB[n]
14751  PeakSampleVAB = n
14752 
14753  try:
14754  VB = float(VBresult[n]) #
14755  except:
14756  VB = 0.0
14757  if VB > PeakVB:
14758  PeakVB = VB
14759  PeakfreqVB = F
14760  PeakphaseVB = PhaseVB[n]
14761  PeakSampleVB = n
14762  else:
14763  if MuxChan == 0: #
14764  try:
14765  VMA = float(VMAresult[n]) #
14766  except:
14767  VMA = 0.0
14768  if VMA > PeakVMA:
14769  PeakVMA = VMA
14770  PeakfreqVMA = F
14771  PeakphaseVMA = PhaseVMA[n]
14772  PeakSampleVMA = n
14773  if MuxChan == 1: #
14774  try:
14775  VMB = float(VMBresult[n]) #
14776  except:
14777  VMB = 0.0
14778  if VMB > PeakVMB:
14779  PeakVMB = VMB
14780  PeakfreqVMB = F
14781  PeakphaseVMB = PhaseVMB[n]
14782  PeakSampleVMB = n
14783  if MuxChan == 2: #
14784  try:
14785  VMC = float(VMCresult[n]) #
14786  except:
14787  VMC = 0.0
14788  if VMC > PeakVMC:
14789  PeakVMC = VMC
14790  PeakfreqVMC = F
14791  PeakphaseVMC = PhaseVMC[n]
14792  PeakSampleVMC = n
14793  if MuxChan == 3: #
14794  try:
14795  VMD = float(VMDresult[n]) #
14796  except:
14797  VMD = 0.0
14798  if VMD > PeakVMD:
14799  PeakVMD = VMD
14800  PeakfreqVMD = F
14801  PeakphaseVMD = PhaseVMD[n]
14802  PeakSampleVMD = n
14803  try:
14804  IA = float(IAresult[n]) #
14805  except:
14806  IA = 0.0
14807  if IA > PeakIA:
14808  PeakIA = IA
14809  PeakfreqIA = F
14810  PeakphaseIA = PhaseIA[n]
14811  PeakSampleIA = n
14812 
14813  try:
14814  IB = float(IBresult[n]) #
14815  except:
14816  IB = 0.0
14817  if IB > PeakIB:
14818  PeakIB = IB
14819  PeakfreqIB = F
14820  PeakphaseIB = PhaseIB[n]
14821  PeakSampleIB = n
14822 
14823  n = n + 1
14824  # Check to see that V and I peaks are in same frequency bin?
14825  if PeakSampleVA != PeakSampleIA:
14826  PeakphaseIA = PhaseIA[PeakSampleVA]
14827  PeakIA = IAresult[PeakSampleVA]
14828  if PeakSampleVB != PeakSampleIB:
14829  PeakphaseIB = PhaseIB[PeakSampleVB]
14830  PeakIB = IBresult[PeakSampleVB]
14831 #
14832 # Draw the Phase Analyzer screen
14833 def MakePhAScreen(): # Update the screen with traces and text
14834  global PeakVA, PeakVB, PeakIA, PeakIB
14835  global PeakfreqVA, PeakfreqVB, PeakfreqIA, PeakfreqIB
14836  global PeakphaseVA, PeakphaseVB, PeakphaseIA, PeakphaseIB
14837  global PeakVMA, PeakVMB, PeakVMC, PeakVMD
14838  global PeakphaseVMA, PeakphaseVMB, PeakphaseVMC, PeakphaseVMD
14839  global CAVphase, CBVphase, CAIphase, CBIphase, CABVphase
14840  global CMAphase, CMBphase, CMCphase, CMDphase
14841  global CANVASheightPhA, CANVASwidthPhA, PhAca, TRACEwidth, GridWidth
14842  global COLORsignalband, COLORtext, COLORgrid # The colors
14843  global COLORtrace1, COLORtrace2, COLORtrace3, COLORtrace4, COLORtrace5, COLORtrace6, COLORtrace7
14844  global FFTwindow, FFTbandwidth, ZEROstuffing, FFTwindowname
14845  global X0LPhA # Left top X value
14846  global Y0TPhA # Left top Y value
14847  global GRWPhA # Screenwidth
14848  global GRHPhA # Screenheight
14849  global FontSize, MuxScreenStatus, MuxChan, Mulx
14850  global RUNstatus # 0 stopped, 1 start, 2 running, 3 stop now, 4 stop and restart
14851  global AWGSAMPLErate, SAMPLErate, BaseSampleRate, OverRangeFlagA, OverRangeFlagB
14852  global SMPfft # number of FFT samples
14853  global TRACEaverage # Number of traces for averageing
14854  global FreqTraceMode # 1 normal 2 max 3 average
14855  global Vdiv, VScale, IScale # Number of vertical divisions
14856  global vat_btn, vbt_btn, iat_btn, ibt_btn, vabt_btn
14857  global AWGBMode, AWGBIOMode, ShowPB_A, ShowPB_B, ShowPB_C, ShowPB_D
14858  global ShowC1_V, ShowC2_V, ShowC1_I, ShowC2_I, CHA_RC_HP, CHB_RC_HP
14859  global DCV1, DCV2, MinV1, MaxV1, MinV2, MaxV2, CHAHW, CHALW, CHADCy, CHAperiod, CHAfreq
14860  global DCI1, DCI2, MinI1, MaxI1, MinI2, MaxI2, CHBHW, CHBLW, CHBDCy, CHBperiod, CHBfreq
14861  global InOffA, InGainA, InOffB, InGainB
14862  global CurOffA, CurOffB, CurGainA, CurGainB
14863  # Analog Mux channel measurement variables
14864  global DCVMuxA, MinVMuxA, MaxVMuxA, MidVMuxA, PPVMuxA, SVMuxA
14865  global DCVMuxB, MinVMuxB, MaxVMuxB, MidVMuxB, PPVMuxB, SVMuxB
14866  global DCVMuxC, MinVMuxC, MaxVMuxC, MidVMuxC, PPVMuxC, SVMuxC
14867  global DCVMuxD, MinVMuxD, MaxVMuxD, MidVMuxD, PPVMuxD, SVMuxD
14868  global SV1, SI1, SV2, SI2, CHABphase, SVA_B
14869  global MeasDCV1, MeasMinV1, MeasMaxV1, MeasMidV1, MeasPPV1
14870  global MeasDCI1, MeasMinI1, MeasMaxI1, MeasMidI1, MeasPPI1
14871  global MeasDCV2, MeasMinV2, MeasMaxV2, MeasMidV2, MeasPPV2
14872  global MeasDCI2, MeasMinI2, MeasMaxI2, MeasMidI2, MeasPPI2
14873  global MeasRMSV1, MeasRMSI1, MeasRMSV2, MeasRMSI2, MeasPhase, MeasRMSVA_B
14874  global MeasAHW, MeasALW, MeasADCy, MeasAPER, MeasAFREQ
14875  global MeasBHW, MeasBLW, MeasBDCy, MeasBPER, MeasBFREQ
14876 
14877  # Delete all items on the screen
14878  PhAca.delete(ALL) # remove all items
14879  # SmoothBool = SmoothCurvesBP.get()
14880  # Draw circular grid lines
14881  i = 1
14882  xcenter = GRWPhA/2
14883  ycenter = (GRHPhA/2) + 14
14884  Radius = (GRWPhA-X0LPhA)/(1 + Vdiv.get()*2) # 11
14885  VoltsperPixel = float(VScale.get())/Radius
14886  mAperPixel = float(IScale.get())/Radius
14887  TRadius = Radius * Vdiv.get() # 5
14888  x1 = X0LPhA
14889  x2 = X0LPhA + GRWPhA
14890  xright = 10 + xcenter + ( Vdiv.get() * Radius ) # 5
14891  while (i <= Vdiv.get()):
14892  x0 = xcenter - ( i * Radius )
14893  x1 = xcenter + ( i * Radius )
14894  y0 = ycenter - ( i * Radius )
14895  y1 = ycenter + ( i * Radius )
14896  VTxt = '{0:.2f}'.format(float(VScale.get()) * i)
14897  ITxt = '{0:.2f}'.format(float(IScale.get()) * i)
14898  TOffset = xright+(4*FontSize)
14899  PhAca.create_oval( x0, y0, x1, y1, outline=COLORgrid, width=GridWidth.get())
14900  PhAca.create_line(xcenter, y0, xright, y0, fill=COLORgrid, width=GridWidth.get(), dash=(4,3))
14901  PhAca.create_text(xright, y0, text=str(VTxt), fill=COLORtrace1, anchor="w", font=("arial", FontSize+2 ))
14902  if iat_btn.config('text')[-1] == 'ON' or ibt_btn.config('text')[-1] == 'ON':
14903  PhAca.create_text(TOffset, y0, text=str(ITxt), fill=COLORtrace3, anchor="w", font=("arial", FontSize+2 ))
14904  #
14905  i = i + 1
14906  PhAca.create_line(xcenter, y0, xcenter, y1, fill=COLORgrid, width=GridWidth.get())
14907  PhAca.create_line(x0, ycenter, x1, ycenter, fill=COLORgrid, width=GridWidth.get())
14908  RAngle = math.radians(45)
14909  y = TRadius*math.sin(RAngle)
14910  x = TRadius*math.cos(RAngle)
14911  PhAca.create_line(xcenter-x, ycenter-y, xcenter+x, ycenter+y, fill=COLORgrid, width=GridWidth.get())
14912  PhAca.create_line(xcenter+x, ycenter-y, xcenter-x, ycenter+y, fill=COLORgrid, width=GridWidth.get())
14913  PhAca.create_text(x0, ycenter, text="180", fill=COLORgrid, anchor="e", font=("arial", FontSize+2 ))
14914  PhAca.create_text(x1, ycenter, text="0.0", fill=COLORgrid, anchor="w", font=("arial", FontSize+2 ))
14915  PhAca.create_text(xcenter, y0, text="90", fill=COLORgrid, anchor="s", font=("arial", FontSize+2 ))
14916  PhAca.create_text(xcenter, y1, text="-90", fill=COLORgrid, anchor="n", font=("arial", FontSize+2 ))
14917  YBot = y1
14918  # calculate phase error due half sample period offset 0.0018
14919  if Two_X_Sample.get() == 0:
14920  if AWGBMode.get() == 2 or AWGBIOMode.get() > 0:
14921  PhErr = 0.001675 * PeakfreqVA
14922  else:
14923  PhErr = 0.0
14924  else:
14925  PhErr = 0.0
14926 # Draw traces
14927 #
14928  if RefphEntry.get() == "CA-V":
14929  CAVphase = 0.0
14930  CBVphase = PeakphaseVA - PeakphaseVB + PhErr
14931  CAIphase = PeakphaseVA - PeakphaseIA
14932  CBIphase = PeakphaseVA - PeakphaseIB + PhErr
14933  CABVphase = PeakphaseVA - PeakphaseVAB
14934  elif RefphEntry.get() == "CB-V":
14935  CBVphase = 0.0
14936  CAVphase = PeakphaseVB - PeakphaseVA - PhErr
14937  CAIphase = PeakphaseVB - PeakphaseIA - PhErr
14938  CBIphase = PeakphaseVB - PeakphaseIB
14939  CABVphase = PeakphaseVB - PeakphaseVAB
14940  elif RefphEntry.get() == "CA-I":
14941  CAIphase = 0.0
14942  CAVphase = PeakphaseIA - PeakphaseVA
14943  CBVphase = PeakphaseIA - PeakphaseVB + PhErr
14944  CBIphase = PeakphaseIA - PeakphaseIB + PhErr
14945  CABVphase = PeakphaseIA - PeakphaseVAB
14946  elif RefphEntry.get() == "CB-I":
14947  CBIphase = 0.0
14948  CAVphase = PeakphaseIB - PeakphaseVA - PhErr
14949  CBVphase = PeakphaseIB - PeakphaseVB
14950  CAIphase = PeakphaseIB - PeakphaseIA - PhErr
14951  CABVphase = PeakphaseIB - PeakphaseVAB
14952  #
14953  if CAVphase > 180:
14954  CAVphase = CAVphase - 360
14955  elif CAVphase < -180:
14956  CAVphase = CAVphase + 360
14957  if CBVphase > 180:
14958  CBVphase = CBVphase - 360
14959  elif CBVphase < -180:
14960  CBVphase = CBVphase + 360
14961  if CAIphase > 180:
14962  CAIphase = CAIphase - 360
14963  elif CAIphase < -180:
14964  CAIphase = CAIphase + 360
14965  if CBIphase > 180:
14966  CBIphase = CBIphase - 360
14967  elif CBIphase < -180:
14968  CBIphase = CBIphase + 360
14969  #
14970  if vat_btn.config('text')[-1] == 'ON':
14971  MagRadius = PeakVA / VoltsperPixel
14972 
14973  y1 = ycenter - MagRadius*math.sin(math.radians(CAVphase))
14974  if y1 > 1500:
14975  y1 = xright
14976  elif y1 < -500:
14977  y1 = ycenter - xright
14978  x1 = xcenter + MagRadius*math.cos(math.radians(CAVphase))
14979  if x1 > 1500:
14980  x1 = xright
14981  elif x1 < -500:
14982  x1 = xcenter - xright
14983  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace1, arrow="last", width=TRACEwidth.get())
14984  if MuxScreenStatus.get() == 0:
14985  if vbt_btn.config('text')[-1] == 'ON':
14986  MagRadius = PeakVB / VoltsperPixel
14987  y1 = ycenter - MagRadius*math.sin(math.radians(CBVphase))
14988  if y1 > 1500:
14989  y1 = xright
14990  elif y1 < -500:
14991  y1 = ycenter - xright
14992  x1 = xcenter + MagRadius*math.cos(math.radians(CBVphase))
14993  if x1 > 1500:
14994  x1 = xright
14995  elif x1 < -500:
14996  x1 = xcenter - xright
14997  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace2, arrow="last", width=TRACEwidth.get())
14998  else:
14999  if ShowPB_A.get() > 0:
15000  CMAphase = PeakphaseVA - PeakphaseVMA + PhErr
15001  if CMAphase > 180:
15002  CMAphase = CMAphase - 360
15003  elif CMAphase < -180:
15004  CMAphase = CMAphase + 360
15005  MagRadius = PeakVMA / VoltsperPixel
15006  y1 = ycenter - MagRadius*math.sin(math.radians(CMAphase))
15007  if y1 > 1500:
15008  y1 = xright
15009  elif y1 < -500:
15010  y1 = ycenter - xright
15011  x1 = xcenter + MagRadius*math.cos(math.radians(CMAphase))
15012  if x1 > 1500:
15013  x1 = xright
15014  elif x1 < -500:
15015  x1 = xcenter - xright
15016  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace2, arrow="last", width=TRACEwidth.get())#
15017  if ShowPB_B.get() > 0:
15018  CMBphase = PeakphaseVA - PeakphaseVMB + PhErr
15019  if CMBphase > 180:
15020  CMBphase = CMBphase - 360
15021  elif CMBphase < -180:
15022  CMBphase = CMBphase + 360
15023  MagRadius = PeakVMB / VoltsperPixel
15024  y1 = ycenter - MagRadius*math.sin(math.radians(CMBphase))
15025  if y1 > 1500:
15026  y1 = xright
15027  elif y1 < -500:
15028  y1 = ycenter - xright
15029  x1 = xcenter + MagRadius*math.cos(math.radians(CMBphase))
15030  if x1 > 1500:
15031  x1 = xright
15032  elif x1 < -500:
15033  x1 = xcenter - xright
15034  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace6, arrow="last", width=TRACEwidth.get())#
15035  if ShowPB_C.get() > 0:
15036  CMCphase = PeakphaseVA - PeakphaseVMC + PhErr
15037  if CMCphase > 180:
15038  CMCphase = CMCphase - 360
15039  elif CMCphase < -180:
15040  CMCphase = CMCphase + 360
15041  MagRadius = PeakVMC / VoltsperPixel
15042  y1 = ycenter - MagRadius*math.sin(math.radians(CMCphase))
15043  if y1 > 1500:
15044  y1 = xright
15045  elif y1 < -500:
15046  y1 = ycenter - xright
15047  x1 = xcenter + MagRadius*math.cos(math.radians(CMCphase))
15048  if x1 > 1500:
15049  x1 = xright
15050  elif x1 < -500:
15051  x1 = xcenter - xright
15052  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace7, arrow="last", width=TRACEwidth.get())#
15053  if ShowPB_D.get() > 0:
15054  CMDphase = PeakphaseVA - PeakphaseVMD + PhErr
15055  if CMDphase > 180:
15056  CMDphase = CMDphase - 360
15057  elif CMDphase < -180:
15058  CMDphase = CMDphase + 360
15059  MagRadius = PeakVMD / VoltsperPixel
15060  y1 = ycenter - MagRadius*math.sin(math.radians(CMDphase))
15061  if y1 > 1500:
15062  y1 = xright
15063  elif y1 < -500:
15064  y1 = ycenter - xright
15065  x1 = xcenter + MagRadius*math.cos(math.radians(CMDphase))
15066  if x1 > 1500:
15067  x1 = xright
15068  elif x1 < -500:
15069  x1 = xcenter - xright
15070  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace4, arrow="last", width=TRACEwidth.get())#
15071  if iat_btn.config('text')[-1] == 'ON':
15072  MagRadius = PeakIA / mAperPixel
15073  y1 = ycenter - MagRadius*math.sin(math.radians(CAIphase))
15074  if y1 > 1500:
15075  y1 = xright
15076  elif y1 < -500:
15077  y1 = ycenter - xright
15078  x1 = xcenter + MagRadius*math.cos(math.radians(CAIphase))
15079  if x1 > 1500:
15080  x1 = xright
15081  elif x1 < -500:
15082  x1 = xcenter - xright
15083  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace3, arrow="last", width=TRACEwidth.get())
15084  if ibt_btn.config('text')[-1] == 'ON':
15085  MagRadius = PeakIB / mAperPixel
15086  y1 = ycenter - MagRadius*math.sin(math.radians(CBIphase))
15087  if y1 > 1500:
15088  y1 = xright
15089  elif y1 < -500:
15090  y1 = ycenter - xright
15091  x1 = xcenter + MagRadius*math.cos(math.radians(CBIphase))
15092  if x1 > 1500:
15093  x1 = xright
15094  elif x1 < -500:
15095  x1 = xcenter - xright
15096  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace4, arrow="last", width=TRACEwidth.get())
15097  if MuxScreenStatus.get() == 0:
15098  if vabt_btn.config('text')[-1] == 'ON':
15099  MagRadius = PeakVAB / VoltsperPixel
15100 
15101  y1 = ycenter - MagRadius*math.sin(math.radians(CABVphase))
15102  if y1 > 1500:
15103  y1 = xright
15104  elif y1 < -500:
15105  y1 = ycenter - xright
15106  x1 = xcenter + MagRadius*math.cos(math.radians(CABVphase))
15107  if x1 > 1500:
15108  x1 = xright
15109  elif x1 < -500:
15110  x1 = xcenter - xright
15111  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace5, arrow="last", width=TRACEwidth.get())
15112 # display warning if input out of range
15113  if OverRangeFlagA == 1:
15114  x = X0LPhA+GRWPhA+10
15115  y = Y0TPhA+GRHPhA-40
15116  PhAca.create_rectangle(x-6, y-6, x+6, y+6, fill="#ff0000")
15117  PhAca.create_text (x+12, y, text="CHA Over Range", anchor=W, fill="#ff0000", font=("arial", FontSize+4 ))
15118  if OverRangeFlagB == 1:
15119  x = X0LPhA+GRWPhA+10
15120  y = Y0TPhA+GRHPhA-10
15121  PhAca.create_rectangle(x-6, y-6, x+6, y+6, fill="#ff0000")
15122  PhAca.create_text (x+12, y, text="CHB Over Range", anchor=W, fill="#ff0000", font=("arial", FontSize+4 ))
15123 # General information on top of the grid
15124  txt = " Sample rate: " + str(SAMPLErate)
15125  txt = txt + " FFT samples: " + str(SMPfft)
15126  txt = txt + " " + FFTwindowname
15127 
15128  x = X0LPhA
15129  y = 12
15130  idTXT = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
15131  #
15132  x = X0LPhA + GRWPhA + 4
15133  y = 24
15134  txt = "CA " + ' {0:.3f} '.format(PeakVA) + " RMS V"
15135  TXT9 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace1, font=("arial", FontSize+4 ))
15136  y = y + 24
15137  if MuxScreenStatus.get() == 0:
15138  txt = "CB " + ' {0:.3f} '.format(PeakVB) + " RMS V"
15139  TXT10 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace2, font=("arial", FontSize+4 ))
15140  y = y + 24
15141  else:
15142  if ShowPB_A.get() > 0:
15143  txt = "Mux A " + ' {0:.3f} '.format(PeakVMA) + " RMS V"
15144  TXT10 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace2, font=("arial", FontSize+4 ))
15145  y = y + 24
15146  if ShowPB_B.get() > 0:
15147  txt = "Mux B " + ' {0:.3f} '.format(PeakVMB) + " RMS V"
15148  TXT10 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace6, font=("arial", FontSize+4 ))
15149  y = y + 24
15150  if ShowPB_C.get() > 0:
15151  txt = "Mux C " + ' {0:.3f} '.format(PeakVMC) + " RMS V"
15152  TXT10 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace7, font=("arial", FontSize+4 ))
15153  y = y + 24
15154  if ShowPB_D.get() > 0:
15155  txt = "Mux D " + ' {0:.3f} '.format(PeakVMD) + " RMS V"
15156  TXT10 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace4, font=("arial", FontSize+4 ))
15157  y = y + 24
15158  if iat_btn.config('text')[-1] == 'ON':
15159  txt = "CA " + ' {0:.2f} '.format(PeakIA) + " RMS mA"
15160  TXT11 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace3, font=("arial", FontSize+4 ))
15161  y = y + 24
15162  if ibt_btn.config('text')[-1] == 'ON':
15163  txt = "CB " + ' {0:.2f} '.format(PeakIB) + " RMS mA"
15164  TXT12 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace4, font=("arial", FontSize+4 ))
15165  y = y + 24
15166  txt = "CA V Phase " + ' {0:.1f} '.format(CAVphase) + " Degrees"
15167  TXT13 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace1, font=("arial", FontSize+4 ))
15168  y = y + 24
15169  if MuxScreenStatus.get() == 0:
15170  txt = "CB V Phase " + ' {0:.1f} '.format(CBVphase) + " Degrees"
15171  TXT14 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace2, font=("arial", FontSize+4 ))
15172  y = y + 24
15173  else:
15174  if ShowPB_A.get() > 0:
15175  txt = "Mux A Phase " + ' {0:.1f} '.format(CMAphase) + " Degrees"
15176  TXT14 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace2, font=("arial", FontSize+4 ))
15177  y = y + 24
15178  if ShowPB_B.get() > 0:
15179  txt = "Mux B Phase " + ' {0:.1f} '.format(CMBphase) + " Degrees"
15180  TXT14 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace6, font=("arial", FontSize+4 ))
15181  y = y + 24
15182  if ShowPB_C.get() > 0:
15183  txt = "Mux C Phase " + ' {0:.1f} '.format(CMCphase) + " Degrees"
15184  TXT14 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace7, font=("arial", FontSize+4 ))
15185  y = y + 24
15186  if ShowPB_D.get() > 0:
15187  txt = "Mux D Phase " + ' {0:.1f} '.format(CMDphase) + " Degrees"
15188  TXT14 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace4, font=("arial", FontSize+4 ))
15189  y = y + 24
15190  if iat_btn.config('text')[-1] == 'ON':
15191  txt = "CA I Phase " + ' {0:.1f} '.format(CAIphase) + " Degrees"
15192  TXT15 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace3, font=("arial", FontSize+4 ))
15193  y = y + 24
15194  if ibt_btn.config('text')[-1] == 'ON':
15195  txt = "CB I Phase " + ' {0:.1f} '.format(CBIphase) + " Degrees"
15196  TXT16 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtrace4, font=("arial", FontSize+4 ))
15197  y = y + 24
15198  #
15199  txt = "CA-V Freq " + ' {0:.1f} '.format(PeakfreqVA) + " Hertz"
15200  TXT17 = PhAca.create_text (x, y, text=txt, anchor=W, fill=COLORtext, font=("arial", FontSize+4 ))
15201  y = y + 24
15202 #
15203  txt = " "
15204 # print time domin measured period and frequency of displayed channels
15205  if ShowC1_V.get() == 1 or ShowC2_V.get() == 1:
15206  if ETSDisp.get() > 0:
15207  FindRisingEdge(VBuffA[:int(DISsamples)],VBuffB[:int(DISsamples)])
15208  else:
15209  FindRisingEdge(VBuffA,VBuffB)
15210  if ShowC1_V.get() == 1:
15211  if MeasAHW.get() == 1:
15212  txt = txt + " CA Hi Width = " + ' {0:.3f} '.format(CHAHW/Mulx) + " mS "
15213  if MeasALW.get() == 1:
15214  txt = txt + " CA Lo Width = " + ' {0:.3f} '.format(CHALW/Mulx) + " mS "
15215  if MeasADCy.get() == 1:
15216  txt = txt + " CA DutyCycle = " + ' {0:.1f} '.format(CHADCy) + " % "
15217  if MeasAPER.get() == 1:
15218  txt = txt + " CA Period = " + ' {0:.3f} '.format(CHAperiod/Mulx) + " mS "
15219  if MeasAFREQ.get() == 1:
15220  txt = txt + " CA Freq = "
15221  ChaF = float(CHAfreq*Mulx)
15222  if ChaF < 1000:
15223  V1String = ' {0:.2f} '.format(ChaF)
15224  txt = txt + str(V1String) + " Hz "
15225  if ChaF > 1000 and ChaF < 1000000:
15226  V1String = ' {0:.2f} '.format(ChaF/1000)
15227  txt = txt + str(V1String) + " KHz "
15228  if ChaF > 1000000:
15229  V1String = ' {0:.2f} '.format(ChaF/1000000)
15230  txt = txt + str(V1String) + " MHz "
15231  #txt = txt + " CA Freq = " + ' {0:.1f} '.format(CHAfreq) + " Hz "
15232  if ShowC2_V.get() == 1:
15233  if MeasBHW.get() == 1:
15234  txt = txt + " CB Hi Width = " + ' {0:.3f} '.format(CHBHW/Mulx) + " mS "
15235  if MeasBLW.get() == 1:
15236  txt = txt + " CB Lo Width = " + ' {0:.3f} '.format(CHBLW/Mulx) + " mS "
15237  if MeasBDCy.get() == 1:
15238  txt = txt + " CB DutyCycle = " + ' {0:.1f} '.format(CHBDCy) + " % "
15239  if MeasBPER.get() == 1:
15240  txt = txt + " CB Period = " + ' {0:.3f} '.format(CHBperiod/Mulx) + " mS "
15241  if MeasBFREQ.get() == 1:
15242  txt = txt + " CB Freq = "
15243  ChaF = float(CHBfreq*Mulx)
15244  if ChaF < 1000:
15245  V1String = ' {0:.2f} '.format(ChaF)
15246  txt = txt + str(V1String) + " Hz "
15247  if ChaF > 1000 and ChaF < 1000000:
15248  V1String = ' {0:.2f} '.format(ChaF/1000)
15249  txt = txt + str(V1String) + " KHz "
15250  if ChaF > 1000000:
15251  V1String = ' {0:.2f} '.format(ChaF/1000000)
15252  txt = txt + str(V1String) + " MHz "
15253  #txt = txt + " CB Freq = " + ' {0:.1f} '.format(CHBfreq) + " Hz "
15254  if MuxScreenStatus.get() == 0:
15255  if MeasPhase.get() == 1:
15256  txt = txt + " CA-B Phase = " + ' {0:.1f} '.format(CHABphase) + " deg "
15257  if MeasDelay.get() == 1:
15258  txt = txt + " CB-A Delay = " + ' {0:.3f} '.format(CHBADelayR1) + " mS "
15259 
15260  x = X0LPhA
15261  y = YBot + int(2.5 *FontSize) #
15262  TXT18 = PhAca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
15263  txt = " "
15264  if ShowC1_V.get() == 1:
15265  # Channel A information
15266  if CHA_RC_HP.get() == 1:
15267  txt = "CHA: HP "
15268  else:
15269  txt = "CHA: "
15270  if MeasDCV1.get() == 1:
15271  txt = txt + " AvgV = " + ' {0:.4f} '.format(DCV1)
15272  if MeasMaxV1.get() == 1:
15273  txt = txt + " MaxV = " + ' {0:.4f} '.format(MaxV1)
15274  if MeasTopV1.get() == 1:
15275  txt = txt + " Top = " + ' {0:.4f} '.format(VATop)
15276  if MeasMinV1.get() == 1:
15277  txt = txt + " MinV = " + ' {0:.4f} '.format(MinV1)
15278  if MeasBaseV1.get() == 1:
15279  txt = txt + " Base = " + ' {0:.4f} '.format(VABase)
15280  if MeasMidV1.get() == 1:
15281  MidV1 = (MaxV1+MinV1)/2.0
15282  txt = txt + " MidV = " + ' {0:.4f} '.format(MidV1)
15283  if MeasPPV1.get() == 1:
15284  PPV1 = MaxV1-MinV1
15285  txt = txt + " P-PV = " + ' {0:.4f} '.format(PPV1)
15286  if MeasRMSV1.get() == 1:
15287  txt = txt + " RMS = " + ' {0:.4f} '.format(SV1)
15288  if MeasRMSVA_B.get() == 1:
15289  txt = txt + " A-B RMS = " + ' {0:.4f} '.format(SVA_B)
15290  if MeasDiffAB.get() == 1:
15291  txt = txt + " CA-CB = " + ' {0:.4f} '.format(DCV1-DCV2)
15292  if MeasUserA.get() == 1:
15293  try:
15294  TempValue = eval(UserAString)
15295  V1String = ' {0:.4f} '.format(TempValue)
15296  except:
15297  V1String = "####"
15298  txt = txt + UserALabel + " = " + V1String
15299  if (ShowC1_I.get() == 1 and ShowC1_V.get() == 0):
15300  txt = "CHA: "
15301  elif (ShowC1_I.get() == 1 and ShowC1_V.get() == 1):
15302  txt = txt + "CHA: "
15303 
15304  if ShowC1_I.get() == 1:
15305  if MeasDCI1.get() == 1:
15306  V1String = ' {0:.2f} '.format(DCI1)
15307  txt = txt + " AvgI = " + V1String
15308  if AWGAShape.get() == 0: # if this is a DC measurement calc resistance
15309  try:
15310  Resvalue = (DCV1/DCI1)*1000
15311  txt = txt + " Res = " + ' {0:.1f} '.format(Resvalue)
15312  except:
15313  txt = txt + " Res = OverRange"
15314  if MeasMaxI1.get() == 1:
15315  txt = txt + " MaxI = " + ' {0:.2f} '.format(MaxI1)
15316  if MeasMinI1.get() == 1:
15317  txt = txt + " MinI = " + ' {0:.2f} '.format(MinI1)
15318  if MeasMidI1.get() == 1:
15319  MidI1 = (MaxI1+MinI1)/2.0
15320  txt = txt + " MidV = " + ' {0:.2f} '.format(MidI1)
15321  if MeasPPI1.get() == 1:
15322  PPI1 = MaxI1-MinI1
15323  txt = txt + " P-PI = " + ' {0:.2f} '.format(PPI1)
15324  if MeasRMSI1.get() == 1:
15325  txt = txt + " RMS = " + ' {0:.4f} '.format(SI1)
15326 
15327  x = X0LPhA
15328  y = YBot + int(4*FontSize) #
15329  TXT19 = PhAca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
15330  txt= " "
15331  # Channel B information
15332  if MuxScreenStatus.get() == 1:
15333  txt = "CHB-Mux: "
15334  if Show_CBA.get() > 0:
15335  FindRisingEdge(VBuffA,VBuffMA)
15336  elif Show_CBB.get() > 0:
15337  FindRisingEdge(VBuffA,VBuffMB)
15338  elif Show_CBC.get() > 0:
15339  FindRisingEdge(VBuffA,VBuffMC)
15340  elif Show_CBD.get() > 0:
15341  FindRisingEdge(VBuffA,VBuffMD)
15342  if MeasPhase.get() == 1:
15343  txt = txt + " CA-Mux Phase = " + ' {0:.1f} '.format(CHABphase) + " deg "
15344  if MeasDelay.get() == 1:
15345  txt = txt + " Mux-CA Delay = " + ' {0:.3f} '.format(CHBADelayR1) + " mS "
15346  if MeasUserB.get() == 1:
15347  try:
15348  TempValue = eval(UserBString)
15349  V1String = ' {0:.4f} '.format(TempValue)
15350  except:
15351  V1String = "####"
15352  txt = txt + UserBLabel + " = " + V1String
15353  if ShowC2_V.get() == 1:
15354  if CHB_RC_HP.get() == 1:
15355  txt = "CHB: HP "
15356  else:
15357  txt = "CHB: "
15358  if MeasDCV2.get() == 1:
15359  txt = txt + " AvgV = " + ' {0:.4f} '.format(DCV2)
15360  if MeasMaxV2.get() == 1:
15361  txt = txt + " MaxV = " + ' {0:.4f} '.format(MaxV2)
15362  if MeasTopV2.get() == 1:
15363  txt = txt + " Top = " + ' {0:.4f} '.format(VBTop)
15364  if MeasMinV2.get() == 1:
15365  txt = txt + " MinV = " + ' {0:.4f} '.format(MinV2)
15366  if MeasBaseV2.get() == 1:
15367  txt = txt + " Base = " + ' {0:.4f} '.format(VBBase)
15368  if MeasMidV2.get() == 1:
15369  MidV2 = (MaxV2+MinV2)/2.0
15370  txt = txt + " MidV = " + ' {0:.4f} '.format(MidV2)
15371  if MeasPPV2.get() == 1:
15372  PPV2 = MaxV2-MinV2
15373  txt = txt + " P-PV = " + ' {0:.4f} '.format(PPV2)
15374  if MeasRMSV2.get() == 1:
15375  txt = txt + " RMS = " + ' {0:.4f} '.format(SV2)
15376  if MeasDiffBA.get() == 1:
15377  txt = txt + " CB-CA = " + ' {0:.4f} '.format(DCV2-DCV1)
15378  if MeasUserB.get() == 1:
15379  try:
15380  TempValue = eval(UserBString)
15381  V1String = ' {0:.4f} '.format(TempValue)
15382  except:
15383  V1String = "####"
15384  txt = txt + UserBLabel + " = " + V1String
15385  if (ShowC2_I.get() == 1 and ShowC2_V.get() == 0):
15386  txt = "CHB: "
15387  elif (ShowC2_I.get() == 1 and ShowC2_V.get() == 1):
15388  txt = txt + "CHB: "
15389  if ShowC2_I.get() == 1:
15390  if MeasDCI2.get() == 1:
15391  V1String = ' {0:.2f} '.format(DCI2)
15392  txt = txt + " AvgI = " + V1String
15393  if AWGBShape.get() == 0: # if this is a DC measurement calc resistance
15394  try:
15395  Resvalue = (DCV2/DCI2)*1000
15396  R1String = ' {0:.1f} '.format(Resvalue)
15397  txt = txt + " Res = " + R1String
15398  except:
15399  txt = txt + " Res = OverRange"
15400  if MeasMaxI2.get() == 1:
15401  txt = txt + " MaxI = " + ' {0:.2f} '.format(MaxI2)
15402  if MeasMinI2.get() == 1:
15403  txt = txt + " MinI = " + ' {0:.2f} '.format(MinI2)
15404  if MeasMidI2.get() == 1:
15405  MidI2 = (MaxI2+MinI2)/2.0
15406  txt = txt + " MidV = " + ' {0:.2f} '.format(MidI2)
15407  if MeasPPI2.get() == 1:
15408  PPI2 = MaxI2-MinI2
15409  txt = txt + " P-PI = " + ' {0:.2f} '.format(PPI2)
15410  if MeasRMSI2.get() == 1:
15411  txt = txt + " RMS = " + ' {0:.4f} '.format(SI2)
15412 
15413  x = X0LPhA
15414  y = YBot + int(5.5 *FontSize) #
15415  TXT20 = PhAca.create_text(x, y, text=txt, anchor=W, fill=COLORtext)
15416 #
15418  global PeakVA, PeakVB, PeakIA, PeakIB
15419  global PeakfreqVA, PeakfreqVB, PeakfreqIA, PeakfreqIB
15420  global PeakVMA, PeakVMB, PeakVMC, PeakVMD
15421  global CAVphase, CBVphase, CAIphase, CBIphase, CABVphase
15422  global CMAphase, CMBphase, CMCphase, CMDphase
15423  global MuxScreenStatus, AppendPhAData, PhADatafilename
15424  global vat_btn, vbt_btn, iat_btn, ibt_btn, vabt_btn
15425  global ShowPB_A, ShowPB_B, ShowPB_C, ShowPB_D
15426 
15427  # open file to save data
15428  if AppendPhAData.get() == 0:
15429  PhADatafilename = asksaveasfilename(defaultextension = ".csv", filetypes=[("Comma Separated Values", "*.csv")])
15430  DataFile = open(PhADatafilename, 'a')
15431  DataFile.write( 'Amplitude, Phase, @ ' + str(PeakfreqVA) + ' Hertz\n')
15432 
15433  if vat_btn.config('text')[-1] == 'ON':
15434  DataFile.write( str(PeakVA) + ', ' + str(CAVphase) + ', CA-V\n')
15435  if MuxScreenStatus.get() == 0:
15436  if vbt_btn.config('text')[-1] == 'ON':
15437  DataFile.write( str(PeakVB) + ', ' + str(CBVphase) + ', CB-V\n')
15438  else:
15439  if ShowPB_A.get() > 0:
15440  DataFile.write( str(PeakVMA) + ', ' + str(CMAphase) + ', Mux A\n')
15441  if ShowPB_B.get() > 0:
15442  DataFile.write( str(PeakVMB) + ', ' + str(CMBphase) + ', Mux B\n')
15443  if ShowPB_C.get() > 0:
15444  DataFile.write( str(PeakVMC) + ', ' + str(CMCphase) + ', Mux C\n')
15445  if ShowPB_D.get() > 0:
15446  DataFile.write( str(PeakVMD) + ', ' + str(CMDphase) + ', Mux D\n')
15447  if iat_btn.config('text')[-1] == 'ON':
15448  DataFile.write( str(PeakIA) + ', ' + str(CAIphase) + ', CA-I\n')
15449  if ibt_btn.config('text')[-1] == 'ON':
15450  DataFile.write( str(PeakIB) + ', ' + str(CBIphase) + ', CB-I\n')
15451  DataFile.close()
15452 #
15454  global CANVASheightPhA, CANVASwidthPhA, PhAca, TRACEwidth, GridWidth, PhAPlotMode
15455  global COLORsignalband, COLORtext, COLORgrid, SmoothCurves # The colors
15456  global COLORtrace1, COLORtrace2, COLORtrace3, COLORtrace4, COLORtrace5, COLORtrace6, COLORtrace7
15457  global GRWPhA, GRHPhA, X0LPhA, Vdiv, VScale, IScale
15458 # open file to read data from
15459  filename = askopenfilename(defaultextension = ".csv", filetypes=[("Comma Separated Values", "*.csv")])
15460  i = 1
15461  xcenter = GRWPhA/2
15462  ycenter = (GRHPhA/2) + 14
15463  Radius = (GRWPhA-X0LPhA)/(1 + Vdiv.get()*2) # 11
15464  VoltsperPixel = float(VScale.get())/Radius
15465  mAperPixel = float(IScale.get())/Radius
15466  TRadius = Radius * Vdiv.get() # 5
15467  x1 = X0LPhA
15468  x2 = X0LPhA + GRWPhA
15469  PhATrace = []
15470 # Read values from CVS file
15471  try:
15472  CSVFile = open(filename)
15473  dialect = csv.Sniffer().sniff(CSVFile.read(2048))
15474  CSVFile.seek(0)
15475  csv_f = csv.reader(CSVFile, dialect)
15476  for row in csv_f:
15477  try:
15478  PeakMag = float(row[0])
15479  PeakPhase = float(row[1])
15480  if row[2] == "CA-I" or row[2] == "CB-I":
15481  MagRadius = PeakMag / mAperPixel
15482  else:
15483  MagRadius = PeakMag / VoltsperPixel
15484 
15485  y1 = ycenter - MagRadius*math.sin(math.radians(PeakPhase))
15486  if y1 > 1500:
15487  y1 = xright
15488  elif y1 < -500:
15489  y1 = ycenter - xright
15490  x1 = xcenter + MagRadius*math.cos(math.radians(PeakPhase))
15491  if x1 > 1500:
15492  x1 = xright
15493  elif x1 < -500:
15494  x1 = xcenter - xright
15495  if PhAPlotMode.get() == 0:
15496  PhAca.create_line(xcenter, ycenter, x1, y1, fill=COLORtrace5, arrow="last", width=TRACEwidth.get())
15497  else:
15498  PhATrace.append(x1)
15499  PhATrace.append(y1)
15500  except:
15501  print( 'skipping non-numeric row')
15502  if PhAPlotMode.get() == 1:
15503  PhAca.create_line(PhATrace, fill=COLORtrace5, smooth=SmoothCurves.get(), splinestep=5, width=TRACEwidth.get())
15504  CSVFile.close()
15505  except:
15506  showwarning("WARNING","No such file found or wrong format!")
15507 #
15508 #
15509 def STOREcsvfile(): # Store the trace as CSV file [frequency, magnitude or dB value]
15510  global FFTmemoryA, FFTresultA
15511  global FFTmemoryB, FFTresultB
15512  global PhaseA, PhaseB, freqwindow
15513  global AWGSAMPLErate, SAMPLErate, BaseSampleRate, ShowC1_VdB, ShowC2_VdB
15514 
15515  # Set the TRACEsize variable
15516  if ShowC1_VdB.get() == 1:
15517  TRACEsize = len(FFTresultA) # Set the trace length
15518  elif ShowC2_VdB.get() == 1:
15519  TRACEsize = len(FFTresultB)
15520  if TRACEsize == 0: # If no trace, skip rest of this routine
15521  return()
15522 # ask if save as magnitude or dB
15523  dB = askyesno("Mag or dB: ","Save amplidude data as dB (Yes) or Mag (No):\n", parent=freqwindow)
15524  # Make the file name and open it
15525  tme = strftime("%Y%b%d-%H%M%S", gmtime()) # The time
15526  filename = "Spectrum-" + tme
15527  filename = filename + ".csv"
15528  # open file to save data
15529  filename = asksaveasfilename(initialfile = filename, defaultextension = ".csv",
15530  filetypes=[("Comma Separated Values", "*.csv")], parent=freqwindow)
15531  DataFile = open(filename,'a') # Open output file
15532  HeaderString = 'Frequency-#, '
15533  if ShowC1_VdB.get() == 1:
15534  if dB == 1:
15535  HeaderString = HeaderString + 'CA-dB, '
15536  if dB == 0:
15537  HeaderString = HeaderString + 'CA-Mag, '
15538  if ShowC2_VdB.get() == 1:
15539  if dB == 1:
15540  HeaderString = HeaderString + 'CB-dB, '
15541  if dB == 0:
15542  HeaderString = HeaderString + 'CB-Mag, '
15543  if ShowC1_P.get() == 1:
15544  HeaderString = HeaderString + 'Phase A-B, '
15545  if ShowC2_P.get() == 1:
15546  HeaderString = HeaderString + 'Phase B-A, '
15547  HeaderString = HeaderString + '\n'
15548  DataFile.write( HeaderString )
15549 
15550  Fsample = float(SAMPLErate / 2) / (TRACEsize - 1) # Frequency step per sample
15551 
15552  n = 0
15553  while n < TRACEsize:
15554  F = n * Fsample
15555  txt = str(F)
15556  if ShowC1_VdB.get() == 1:
15557  V = 10 * math.log10(float(FFTresultA[n])) + 17 # Add 17 dB for max value of +10 dB
15558  if dB == 0:
15559  V = 10.0**(V/20.0)
15560  txt = txt + "," + str(V)
15561  if ShowC2_VdB.get() == 1:
15562  V = 10 * math.log10(float(FFTresultB[n])) + 17 # Add 17 dB for max value of +10 dB
15563  if dB == 0:
15564  V = 10.0**(V/20.0)
15565  txt = txt + "," + str(V)
15566  if ShowC1_P.get() == 1:
15567  RelPhase = PhaseA[n]-PhaseB[n]
15568  if RelPhase > 180:
15569  RelPhase = RelPhase - 360
15570  elif RelPhase < -180:
15571  RelPhase = RelPhase + 360
15572  txt = txt + "," + str(RelPhase)
15573  if ShowC2_P.get() == 1:
15574  RelPhase = PhaseB[n]-PhaseA[n]
15575  if RelPhase > 180:
15576  RelPhase = RelPhase - 360
15577  elif RelPhase < -180:
15578  RelPhase = RelPhase + 360
15579  txt = txt + "," + str(RelPhase)
15580  txt = txt + "\n"
15581  DataFile.write(txt)
15582  n = n + 1
15583 
15584  DataFile.close() # Close the file
15585 
15587 def MakeFreqScreen(): # Update the screen with traces and text
15588  global CANVASheightF, CANVASwidthF, SmoothCurvesSA
15589  global PeakxA, PeakyA, PeakxB, PeakyB, PeakdbA, PeakdbB
15590  global PeakxM, PeakyM, PeakMdb, PeakfreqM
15591  global PeakfreqA, PeakfreqB, PeakfreqRA, PeakfreqRB
15592  global PeakxRA, PeakyRA, PeakxRB, PeakyRB, PeakdbRA, PeakdbRB
15593  global PeakxRM, PeakyRM, PeakRMdb, PeakfreqRM, PeakIndexA, PeakIndexB, Fsample
15594  global COLORgrid # The colors
15595  global COLORsignalband, COLORtext
15596  global COLORtrace1, COLORtrace2
15597  global FSweepMode, LoopNum, MarkerFreqNum, TRACEwidth, GridWidth
15598  global DBdivindex # Index value
15599  global DBdivlist # dB per division list
15600  global DBlevel # Reference level
15601  global FFTwindow, FFTbandwidth, ZEROstuffing, FFTwindowname
15602  global X0LF # Left top X value
15603  global Y0TF # Left top Y value
15604  global GRWF # Screenwidth
15605  global GRHF # Screenheight
15606  global FontSize
15607  global RUNstatus # 0 stopped, 1 start, 2 running, 3 stop now, 4 stop and restart
15608  global AWGSAMPLErate, SAMPLErate, BaseSampleRate, SingleShotSA, HScale, HarmonicMarkers
15609  global SMPfft # number of FFT samples
15610  global StartFreqEntry, StopFreqEntry, PhCenFreqEntry, RelPhaseCenter
15611  global ShowC1_P, ShowC2_P, ShowRA_VdB, ShowRB_VdB, ShowMarker
15612  global ShowRA_P, ShowRB_P, ShowMathSA, FreqDisp, ShowAWGASA, ShowAWGBSA
15613  global ShowFCur, ShowdBCur, FCursor, dBCursor
15614  global T1Fline, T2Fline, T1Pline, T1FRline, T2FRline, TFMline, TFRMline
15615  global T1PRline, T2PRline, TAFline, TBFline
15616  global TRACEaverage # Number of traces for averageing
15617  global FreqTraceMode # 1 normal 2 max 3 average
15618  global Vdiv # Number of vertical divisions
15619 
15620  # Delete all items on the screen
15621  MarkerFreqNum = 0
15622  Freqca.delete(ALL) # remove all items
15623  try:
15624  StartFrequency = float(StartFreqEntry.get())
15625  except:
15626  StartFreqEntry.delete(0,"end")
15627  StartFreqEntry.insert(0,100)
15628  StartFrequency = 100
15629  try:
15630  StopFrequency = float(StopFreqEntry.get())
15631  except:
15632  StopFreqEntry.delete(0,"end")
15633  StopFreqEntry.insert(0,10000)
15634  StopFrequency = 10000
15635  try:
15636  Phasecenter = int(PhCenFreqEntry.get())
15637  RelPhaseCenter.set(Phasecenter)
15638  except:
15639  PhCenFreqEntry.delete(0,"end")
15640  PhCenFreqEntry.insert(0,0)
15641  RelPhaseCenter.set(0)
15642  Phasecenter = 0
15643  # Draw horizontal grid lines
15644  i = 0
15645  x1 = X0LF
15646  x2 = X0LF + GRWF
15647  while (i <= Vdiv.get()):
15648  y = Y0TF + i * GRHF/Vdiv.get()
15649  Dline = [x1,y,x2,y]
15650  if i == 0 or i == Vdiv.get():
15651  Freqca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
15652  else:
15653  Freqca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
15654  Vaxis_value = (DBlevel.get() - (i * DBdivlist[DBdivindex.get()]))
15655  Vaxis_label = str(Vaxis_value)
15656  Freqca.create_text(x1-3, y, text=Vaxis_label, fill=COLORtrace1, anchor="e", font=("arial", FontSize ))
15657  if ShowC1_P.get() == 1 or ShowC2_P.get() == 1:
15658  Vaxis_value = ( 180 - ( i * (360 / Vdiv.get())))
15659  Vaxis_value = Vaxis_value + Phasecenter
15660  Vaxis_label = str(Vaxis_value)
15661  Freqca.create_text(x2+3, y, text=Vaxis_label, fill=COLORtrace3, anchor="w", font=("arial", FontSize ))
15662  i = i + 1
15663  # Draw vertical grid lines
15664  i = 0
15665  y1 = Y0TF
15666  y2 = Y0TF + GRHF
15667  if HScale.get() == 1:
15668  F = 1.0
15669  LogFStop = math.log10(StopFrequency)
15670  try:
15671  LogFStart = math.log10(StartFrequency)
15672  except:
15673  LogFStart = 0.0
15674  LogFpixel = (LogFStop - LogFStart) / GRWF
15675  # draw left and right edges
15676  while F <= StopFrequency:
15677  if F >= StartFrequency:
15678  try:
15679  LogF = math.log10(F) # convet to log Freq
15680  x = X0LF + (LogF - LogFStart)/LogFpixel
15681  except:
15682  x = X0LF
15683  Dline = [x,y1,x,y2]
15684  if F == 1 or F == 10 or F == 100 or F == 1000 or F == 10000 or F == 100000:
15685  Freqca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
15686  axis_label = str(F)
15687  Freqca.create_text(x, y2+3, text=axis_label, fill=COLORgrid, anchor="n", font=("arial", FontSize ))
15688  else:
15689  Freqca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
15690 
15691  if F < 10:
15692  F = F + 1
15693  elif F < 100:
15694  F = F + 10
15695  elif F < 1000:
15696  F = F + 100
15697  elif F < 1000:
15698  F = F + 100
15699  elif F < 10000:
15700  F = F + 1000
15701  elif F < 100000:
15702  F = F + 10000
15703  elif F < 200000:
15704  F = F + 10000
15705  else:
15706  Freqdiv = (StopFrequency - StartFrequency) / 10
15707  while (i < 11):
15708  x = X0LF + i * GRWF/10.0
15709  Dline = [x,y1,x,y2]
15710  if i == 0 or i == 10:
15711  Freqca.create_line(Dline, fill=COLORgrid, width=GridWidth.get())
15712  else:
15713  Freqca.create_line(Dline, dash=(4,3), fill=COLORgrid, width=GridWidth.get())
15714  axis_value = (StartFrequency + (i * Freqdiv))
15715  axis_label = str(axis_value)
15716  Freqca.create_text(x, y2+3, text=axis_label, fill=COLORgrid, anchor="n", font=("arial", FontSize ))
15717  i = i + 1
15718  # Draw X - Y cursors if needed
15719  Yconv = float(GRHF) / (Vdiv.get() * DBdivlist[DBdivindex.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
15720  Yc = float(Y0TF) + Yconv * (DBlevel.get()) # Yc is the 0 dBm position, can be outside the screen!
15721  Fpixel = (StopFrequency - StartFrequency) / GRWF # Frequency step per screen pixel
15722  if ShowFCur.get() > 0:
15723  Dline = [FCursor, Y0TF, FCursor, Y0TF+GRHF]
15724  Freqca.create_line(Dline, dash=(3,4), fill=COLORtrigger, width=GridWidth.get())
15725  # Horizontal conversion factors (frequency Hz) and border limits
15726  if HScale.get() == 1:
15727  LogFStop = math.log10(StopFrequency)
15728  try:
15729  LogFStart = math.log10(StartFrequency)
15730  except:
15731  LogFStart = 0.0
15732  LogFpixel = (LogFStop - LogFStart) / GRWF
15733  xfreq = 10**(((FCursor-X0LF)*LogFpixel) + LogFStart)
15734  else:
15735  Fpixel = (StopFrequency - StartFrequency) / GRWF # Frequency step per screen pixel
15736  xfreq = ((FCursor-X0LF)*Fpixel)+StartFrequency
15737  XFString = ' {0:.2f} '.format(xfreq)
15738  V_label = XFString + " Hz"
15739  Freqca.create_text(FCursor+1, Y0TF+GRHF+6, text=V_label, fill=COLORtext, anchor="n", font=("arial", FontSize ))
15740  #Freqca.create_text(FCursor+1, dBCursor-5, text=V_label, fill=COLORtext, anchor="w", font=("arial", FontSize ))
15741 #
15742  if ShowdBCur.get() > 0:
15743  Dline = [X0LF, dBCursor, X0LF+GRWF, dBCursor]
15744  Freqca.create_line(Dline, dash=(3,4), fill=COLORtrigger, width=GridWidth.get())
15745  # Vertical conversion factors (level dBs) and border limits
15746  Yconv = float(GRHF) / (Vdiv.get() * DBdivlist[DBdivindex.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
15747  Yc = float(Y0TF) + Yconv * (DBlevel.get()) # Yc is the 0 dBm position, can be outside the screen!
15748  yvdB = ((Yc-dBCursor)/Yconv)
15749  VdBString = ' {0:.1f} '.format(yvdB)
15750  V_label = VdBString + " dBV"
15751  Freqca.create_text(X0LF+GRWF+2, dBCursor+5, text=V_label, fill=COLORtext, anchor="w", font=("arial", FontSize ))
15752  #Freqca.create_text(FCursor+1, dBCursor+5, text=V_label, fill=COLORtext, anchor="w", font=("arial", FontSize ))
15753  #
15754  SmoothBool = SmoothCurvesSA.get()
15755  # Draw traces
15756  if len(T1Fline) > 4: # Avoid writing lines with 1 coordinate
15757  # Write the trace CHA
15758  if OverRangeFlagA == 1:
15759  Freqca.create_line(T1Fline, fill=COLORsignalband, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15760  else:
15761  Freqca.create_line(T1Fline, fill=COLORtrace1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15762  if ShowMarker.get() > 0:
15763  k = 1
15764  while k <= HarmonicMarkers.get():
15765  try:
15766  dbA = (10 * math.log10(float(FFTresultA[PeakIndexA*k])) + 17)
15767  FreqA = k*PeakIndexA*Fsample
15768  if ShowMarker.get() == 2 and k > 1:
15769  Peak_label = ' {0:.2f} '.format(dbA - PeakdbA) + ',' + ' {0:.1f} '.format(FreqA - PeakfreqA)
15770  else:
15771  Peak_label = ' {0:.2f} '.format(dbA) + ',' + ' {0:.1f} '.format(FreqA)
15772  if HScale.get() == 1:
15773  try:
15774  LogF = math.log10(FreqA) # convet to log Freq
15775  xA = X0LF + int((LogF - LogFStart)/LogFpixel)
15776  except:
15777  xA = X0LF
15778  else:
15779  xA = X0LF+int((FreqA - StartFrequency)/Fpixel)# +StartFrequency
15780  yA = Yc - Yconv * dbA
15781  Freqca.create_text(xA, yA, text=Peak_label, fill=COLORtrace1, anchor="s", font=("arial", FontSize ))
15782  k = k + 1
15783  except:
15784  k = k + 1
15785  if len(T2Fline) > 4: # Avoid writing lines with 1 coordinate
15786  # Write the trace CHB
15787  if OverRangeFlagB == 1:
15788  Freqca.create_line(T2Fline, fill=COLORsignalband, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15789  else:
15790  Freqca.create_line(T2Fline, fill=COLORtrace2, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15791  if ShowMarker.get() > 0:
15792  k = 1
15793  while k <= HarmonicMarkers.get():
15794  try:
15795  dbB = (10 * math.log10(float(FFTresultB[PeakIndexB*k])) + 17)
15796  FreqB = k*PeakIndexB*Fsample
15797  if ShowMarker.get() == 2 and k > 1:
15798  Peak_label = ' {0:.2f} '.format(dbB - PeakdbB) + ',' + ' {0:.1f} '.format(FreqB - PeakfreqB)
15799  else:
15800  Peak_label = ' {0:.2f} '.format(dbB) + ',' + ' {0:.1f} '.format(FreqB)
15801  if HScale.get() == 1:
15802  try:
15803  LogF = math.log10(FreqB) # convet to log Freq
15804  xB = X0LF + int((LogF - LogFStart)/LogFpixel)
15805  except:
15806  xB = X0LF
15807  else:
15808  xB = X0LF+int((FreqB - StartFrequency)/Fpixel)# +StartFrequency
15809  yB = Yc - Yconv * dbB
15810  Freqca.create_text(xB, yB, text=Peak_label, fill=COLORtrace2, anchor="s", font=("arial", FontSize ))
15811  k = k + 1
15812  except:
15813  k = k + 1
15814  if len(T1Pline) > 4: # Avoid writing lines with 1 coordinate
15815  # Write the phase trace A-B
15816  Freqca.create_line(T1Pline, fill=COLORtrace3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15817  if len(T2Pline) > 4: # Avoid writing lines with 1 coordinate
15818  # Write the phase trace A-B
15819  Freqca.create_line(T2Pline, fill=COLORtrace4, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15820  if ShowAWGASA.get() > 0 and len(TAFline) > 4: # Write the AWG trace A if active
15821  Freqca.create_line(TAFline, fill=COLORtrace5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15822  if ShowAWGBSA.get() > 0 and len(TBFline) > 4: # Write the AWG trace B if active
15823  Freqca.create_line(TBFline, fill=COLORtrace7, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15824  if ShowRA_VdB.get() == 1 and len(T1FRline) > 4: # Write the ref trace A if active
15825  Freqca.create_line(T1FRline, fill=COLORtraceR1, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15826  if ShowMarker.get() == 1:
15827  Peak_label = ' {0:.2f} '.format(PeakdbRA) + ',' + ' {0:.1f} '.format(PeakfreqRA)
15828  Freqca.create_text(PeakxRA, PeakyRA, text=Peak_label, fill=COLORtraceR1, anchor="s", font=("arial", FontSize ))
15829  if ShowRB_VdB.get() == 1 and len(T2FRline) > 4: # Write the ref trace B if active
15830  Freqca.create_line(T2FRline, fill=COLORtraceR2, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15831  if ShowMarker.get() == 1:
15832  Peak_label = ' {0:.2f} '.format(PeakdbRB) + ',' + ' {0:.1f} '.format(PeakfreqRB)
15833  Freqca.create_text(PeakxRB, PeakyRB, text=Peak_label, fill=COLORtraceR2, anchor="s", font=("arial", FontSize ))
15834  if ShowRA_P.get() == 1 and len(T1PRline) > 4: # Write the ref trace A if active
15835  Freqca.create_line(T1PRline, fill=COLORtraceR3, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15836  if ShowRB_P.get() == 1 and len(T2PRline) > 4: # Write the ref trace A if active
15837  Freqca.create_line(T2PRline, fill=COLORtraceR4, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15838  if ShowMathSA.get() > 0 and len(TFMline) > 4: # Write the Math trace if active
15839  Freqca.create_line(TFMline, fill=COLORtrace5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15840  if ShowMarker.get() ==1:
15841  Peak_label = ' {0:.2f} '.format(PeakMdb) + ',' + ' {0:.1f} '.format(PeakfreqM)
15842  Freqca.create_text(PeakxM, PeakyM, text=Peak_label, fill=COLORtrace5, anchor="s", font=("arial", FontSize ))
15843  if ShowRMath.get() == 1 and len(TFRMline) > 4: # Write the ref math trace if active
15844  Freqca.create_line(TFRMline, fill=COLORtraceR5, smooth=SmoothBool, splinestep=5, width=TRACEwidth.get())
15845  if ShowMarker.get() ==1:
15846  Peak_label = ' {0:.2f} '.format(PeakRMdb) + ',' + ' {0:.1f} '.format(PeakfreqRM)
15847  Freqca.create_text(PeakxRM, PeakyRM, text=Peak_label, fill=COLORtraceR5, anchor="s", font=("arial", FontSize ))
15848  # General information on top of the grid
15849 
15850  txt = " Sample rate: " + str(SAMPLErate)
15851  txt = txt + " FFT samples: " + str(SMPfft)
15852 
15853  txt = txt + " " + FFTwindowname
15854 
15855  x = X0LF
15856  y = 12
15857  idTXT = Freqca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
15858 
15859  # Start and stop frequency and dB/div and trace mode
15860  txt = str(StartFrequency) + " to " + str(StopFrequency) + " Hz"
15861  txt = txt + " " + str(DBdivlist[DBdivindex.get()]) + " dB/div"
15862  txt = txt + " Level: " + str(DBlevel.get()) + " dB "
15863  if FFTwindow.get() < 7:
15864  txt = txt + " FFT Bandwidth =" + ' {0:.2f} '.format(FFTbandwidth)
15865  else:
15866  txt = txt + " FFT Bandwidth = ???"
15867 
15868  x = X0LF
15869  y = Y0TF+GRHF+23
15870  idTXT = Freqca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
15871 
15872  if FreqTraceMode.get() == 1:
15873  txt ="Normal mode "
15874 
15875  if FreqTraceMode.get() == 2:
15876  txt = "Peak hold mode "
15877 
15878  if FreqTraceMode.get() == 3:
15879  txt = "Power average mode (" + str(TRACEaverage.get()) + ") "
15880 
15881  if ZEROstuffing.get() > 0:
15882  txt = txt + "Zero Stuffing = " + str(ZEROstuffing.get())
15883  # Runstatus and level information
15884  if (RUNstatus.get() == 0) and (SingleShotSA.get() == 0):
15885  txt = txt + " Stopped "
15886  elif SingleShotSA.get() == 1:
15887  txt = txt + " Single Shot Trace "
15888  else:
15889  if FreqDisp.get() == 1:
15890  txt = txt + " Running "
15891  else:
15892  txt = txt + " Display off "
15893  x = X0LF
15894  y = Y0TF+GRHF+34
15895  IDtxt = Freqca.create_text (x, y, text=txt, anchor=W, fill=COLORtext)
15896 
15898  global SMPfft, FFTwindow
15899  global SMPfftpwrTwo, BodeDisp
15900  global TRACEresetFreq, FreqTraceMode, LoopNum, FSweepMode, FSweepCont
15901 
15902  # First some subroutines to set specific variables
15903  if BodeDisp.get() == 0:
15904  if FFTwindow.get() != 8:
15905  SMPfft = 2 ** int(SMPfftpwrTwo.get()) # Calculate the number of FFT samples from SMPfftpwrtwo
15906 
15908  if FreqTraceMode.get() == 1 and TRACEresetFreq == False:
15909  TRACEresetFreq = True # Clear the memory for averaging or peak
15910  if FreqTraceMode.get() == 2 and LoopNum.get() == 1 and FSweepMode.get() > 0 and FSweepCont.get() == 0 and BodeDisp.get() >0:
15911  TRACEresetFreq = True # Clear the memory for peak hold when using sweep generator
15912 
15913 def CALCFFTwindowshape(): # Make the FFTwindowshape for the windowing function
15914  global FFTbandwidth # The FFT bandwidth
15915  global FFTwindow # Which FFT window number is selected
15916  global FFTwindowname # The name of the FFT window function
15917  global FFTwindowshape # The window shape
15918  global AWGSAMPLErate, SAMPLErate, BaseSampleRate # The sample rate
15919  global SMPfft # Number of FFT samples
15920  global LastWindow, LastSMPfft
15921 
15922  if LastWindow == FFTwindow.get() and LastSMPfft == SMPfft:
15923  # recalculate window only if something changed
15924  return
15925  # FFTname and FFTbandwidth in milliHz
15926  FFTwindowname = "No such window"
15927  FFTbw = 0
15928 
15929  if FFTwindow.get() == 0:
15930  FFTwindowname = " Rectangular (no) window (B=1) "
15931  FFTbw = 1.0
15932 
15933  if FFTwindow.get() == 1:
15934  FFTwindowname = " Cosine window (B=1.24) "
15935  FFTbw = 1.24
15936 
15937  if FFTwindow.get() == 2:
15938  FFTwindowname = " Triangular window (B=1.33) "
15939  FFTbw = 1.33
15940 
15941  if FFTwindow.get() == 3:
15942  FFTwindowname = " Hann window (B=1.5) "
15943  FFTbw = 1.5
15944 
15945  if FFTwindow.get() == 4:
15946  FFTwindowname = " Blackman window (B=1.73) "
15947  FFTbw = 1.73
15948 
15949  if FFTwindow.get() == 5:
15950  FFTwindowname = " Nuttall window (B=2.02) "
15951  FFTbw = 2.02
15952 
15953  if FFTwindow.get() == 6:
15954  FFTwindowname = " Flat top window (B=3.77) "
15955  FFTbw = 3.77
15956 
15957  if FFTwindow.get() == 7:
15958  FFTwindowname = FFTUserWindowString
15959  FFTbw = 0.0
15960  try:
15961  FFTwindowshape = eval(FFTUserWindowString)
15962  except:
15963  FFTwindowshape = numpy.ones(SMPfft) # Initialize with ones
15964  print( "Filling FFT window with Ones")
15965  elif FFTwindow.get() == 8: # window shape array read from csv file
15966  FFTwindowname = "Window Shape From file"
15967  FFTbw = 0.0
15968  else:
15969  FFTbandwidth = int(FFTbw * SAMPLErate / float(SMPfft))
15970  # Calculate the shape
15971  FFTwindowshape = numpy.ones(SMPfft) # Initialize with ones
15972  n = 0
15973  while n < SMPfft:
15974  # Cosine window function - medium-dynamic range B=1.24
15975  if FFTwindow.get() == 1:
15976  w = math.sin(math.pi * n / (SMPfft - 1))
15977  FFTwindowshape[n] = w * 1.571
15978  # Triangular non-zero endpoints - medium-dynamic range B=1.33
15979  if FFTwindow.get() == 2:
15980  w = (2.0 / SMPfft) * ((SMPfft/ 2.0) - abs(n - (SMPfft - 1) / 2.0))
15981  FFTwindowshape[n] = w * 2.0
15982  # Hann window function - medium-dynamic range B=1.5
15983  if FFTwindow.get() == 3:
15984  w = 0.5 - 0.5 * math.cos(2 * math.pi * n / (SMPfft - 1))
15985  FFTwindowshape[n] = w * 2.000
15986  # Blackman window, continuous first derivate function - medium-dynamic range B=1.73
15987  if FFTwindow.get() == 4:
15988  w = 0.42 - 0.5 * math.cos(2 * math.pi * n / (SMPfft - 1)) + 0.08 * math.cos(4 * math.pi * n / (SMPfft - 1))
15989  FFTwindowshape[n] = w * 2.381
15990  # Nuttall window, continuous first derivate function - high-dynamic range B=2.02
15991  if FFTwindow.get() == 5:
15992  w = 0.355768 - 0.487396 * math.cos(2 * math.pi * n / (SMPfft - 1)) + 0.144232 * math.cos(4 * math.pi * n / (SMPfft - 1))- 0.012604 * math.cos(6 * math.pi * n / (SMPfft - 1))
15993  FFTwindowshape[n] = w * 2.811
15994  # Flat top window, medium-dynamic range, extra wide bandwidth B=3.77
15995  if FFTwindow.get() == 6:
15996  w = 1.0 - 1.93 * math.cos(2 * math.pi * n / (SMPfft - 1)) + 1.29 * math.cos(4 * math.pi * n / (SMPfft - 1))- 0.388 * math.cos(6 * math.pi * n / (SMPfft - 1)) + 0.032 * math.cos(8 * math.pi * n / (SMPfft - 1))
15997  FFTwindowshape[n] = w * 1.000
15998  n = n + 1
15999  LastWindow = FFTwindow.get()
16000  LastSMPfft = SMPfft
16001 
16003  global FFTUserWindowString, freqwindow
16004 
16005  TempString = FFTUserWindowString
16006  FFTUserWindowString = askstring("User FFT Window", "Current User Window: " + FFTUserWindowString + "\n\nNew Window:\n", initialvalue=FFTUserWindowString, parent=freqwindow)
16007  if (FFTUserWindowString == None): # If Cancel pressed, then None
16008  FFTUserWindowString = TempString
16009 
16011  global FFTwindowshape, SMPfft, LastSMPfft, FFTwindow, LastWindow
16012 
16013  # Read values from CVS file
16014  filename = askopenfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent=freqwindow)
16015  try:
16016  CSVFile = open(filename)
16017  csv_f = csv.reader(CSVFile)
16018  FFTwindowshape = []
16019  for row in csv_f:
16020  try:
16021  FFTwindowshape.append(float(row[0]))
16022  except:
16023  print( 'skipping non-numeric row')
16024  FFTwindowshape = numpy.array(FFTwindowshape)
16025  CSVFile.close()
16026  SMPfft = len(FFTwindowshape)
16027  LastSMPfft = SMPfft
16028  LastWindow = FFTwindow.get()
16029  print( SMPfft)
16030  except:
16031  showwarning("WARNING","No such file found or wrong format!")
16032 #
16034  global ShowFCur, ShowdBCur, FCursor, dBCursor, RUNstatus, Freqca
16035 
16036  FCursor = event.x
16037  dBCursor = event.y
16038  if RUNstatus.get() == 0:
16040  Freqca.bind('<MouseWheel>', onCanvasFreqClickScroll)
16041  Freqca.bind("<Button-4>", onCanvasFreqClickScroll)# with Linux OS
16042  Freqca.bind("<Button-5>", onCanvasFreqClickScroll)
16043 #
16045  global ShowFCur, ShowdBCur, FCursor, dBCursor, RUNstatus, Freqca
16046  if event.widget == Freqca:
16047  ShiftKeyDwn = event.state & 1
16048  if ShowFCur.get() > 0 and ShiftKeyDwn == 0:
16049  # respond to Linux or Windows wheel event
16050  if event.num == 5 or event.delta == -120:
16051  FCursor -= 1
16052  if event.num == 4 or event.delta == 120:
16053  FCursor += 1
16054  elif ShowdBCur.get() > 0 or ShiftKeyDwn == 1:
16055  # respond to Linux or Windows wheel event
16056  if event.num == 5 or event.delta == -120:
16057  dBCursor += 1
16058  if event.num == 4 or event.delta == 120:
16059  dBCursor -= 1
16060  if RUNstatus.get() == 0:
16062 #
16064  global X0LF # Left top X value
16065  global Y0TF # Left top Y value
16066  global GRWF # Screenwidth
16067  global GRHF # Screenheight
16068  global FontSize
16069  global Freqca, MarkerLoc, SAMPLErate, BaseSampleRate
16070  global COLORgrid, COLORtext, HScale, ShowC1_VdB, ShowC2_VdB
16071  global COLORtrace1, COLORtrace2, StartFreqEntry, StopFreqEntry
16072  global AWGSAMPLErate, RUNstatus, COLORtext, MarkerFreqNum, PrevdBV, PrevF
16073 
16074  if (RUNstatus.get() == 0):
16075  MarkerFreqNum = MarkerFreqNum + 1
16076  COLORmarker = COLORgrid
16077  if ShowC1_VdB.get() == 1:
16078  COLORmarker = COLORtrace1
16079  elif ShowC2_VdB.get() == 1:
16080  COLORmarker = COLORtrace2
16081  try:
16082  StartFrequency = float(StartFreqEntry.get())
16083  except:
16084  StartFreqEntry.delete(0,"end")
16085  StartFreqEntry.insert(0,100)
16086  StartFrequency = 100
16087  try:
16088  StopFrequency = float(StopFreqEntry.get())
16089  except:
16090  StopFreqEntry.delete(0,"end")
16091  StopFreqEntry.insert(0,100)
16092  StopFrequency = 100
16093  # draw X at marker point and number
16094  Freqca.create_line(event.x-4, event.y-4,event.x+4, event.y+5, fill=COLORmarker)
16095  Freqca.create_line(event.x+4, event.y-4,event.x-4, event.y+5, fill=COLORmarker)
16096  Freqca.create_text(event.x+4, event.y, text=str(MarkerFreqNum), fill=COLORmarker, anchor="w", font=("arial", FontSize ))
16097  # Vertical conversion factors (level dBs) and border limits
16098  Yconv = float(GRHF) / (Vdiv.get() * DBdivlist[DBdivindex.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
16099  Yc = float(Y0TF) + Yconv * (DBlevel.get()) # Yc is the 0 dBm position, can be outside the screen!
16100  Yphconv = float(GRHF) / 360
16101  Yp = float(Y0TF) + Yphconv + 180
16102  # Horizontal conversion factors (frequency Hz) and border limits
16103  if HScale.get() == 1:
16104  LogFStop = math.log10(StopFrequency)
16105  try:
16106  LogFStart = math.log10(StartFrequency)
16107  except:
16108  LogFStart = 0.0
16109  LogFpixel = (LogFStop - LogFStart) / GRWF
16110  xfreq = 10**(((event.x-X0LF)*LogFpixel) + LogFStart)
16111  else:
16112  Fpixel = (StopFrequency - StartFrequency) / GRWF # Frequency step per screen pixel
16113  xfreq = ((event.x-X0LF)*Fpixel)+StartFrequency
16114 
16115  yvdB = ((Yc-event.y)/Yconv)
16116  VdBString = ' {0:.1f} '.format(yvdB)
16117  XFString = ' {0:.2f} '.format(xfreq)
16118  V_label = str(MarkerFreqNum) + " " + XFString + " Hz, " + VdBString + " dBV"
16119  if MarkerFreqNum > 1:
16120  DeltaV = ' {0:.3f} '.format(yvdB-PrevdBV)
16121  DeltaF = ' {0:.2f} '.format(xfreq-PrevF)
16122  V_label = V_label + " Delta " + DeltaF + " Hz, " + DeltaV + " dBV"
16123  x = X0LF + 5
16124  y = Y0TF + 3 + (MarkerFreqNum*10)
16125  Justify = 'w'
16126  if MarkerLoc == 'UR' or MarkerLoc == 'ur':
16127  x = X0LF + GRWF - 5
16128  y = Y0TF + 3 + (MarkerFreqNum*10)
16129  Justify = 'e'
16130  if MarkerLoc == 'LL' or MarkerLoc == 'll':
16131  x = X0LF + 5
16132  y = Y0TF + GRHF + 3 - (MarkerFreqNum*10)
16133  Justify = 'w'
16134  if MarkerLoc == 'LR' or MarkerLoc == 'lr':
16135  x = X0LF + GRWF - 5
16136  y = Y0TF + GRHF + 3 - (MarkerFreqNum*10)
16137  Justify = 'e'
16138  Freqca.create_text(x, y, text=V_label, fill=COLORmarker, anchor=Justify, font=("arial", FontSize ))
16139  PrevdBV = yvdB
16140  PrevF = xfreq
16141 #
16142 def onCanvasSAOne(event):
16143  global ShowC1_VdB
16144  if ShowC1_VdB.get() == 0:
16145  ShowC1_VdB.set(1)
16146  else:
16147  ShowC1_VdB.set(0)
16148 #
16149 def onCanvasSATwo(event):
16150  global ShowC2_VdB
16151  if ShowC2_VdB.get() == 0:
16152  ShowC2_VdB.set(1)
16153  else:
16154  ShowC2_VdB.set(0)
16155 #
16156 def onCanvasSAThree(event):
16157  global ShowC1_P
16158  if ShowC1_P.get() == 0:
16159  ShowC1_P.set(1)
16160  else:
16161  ShowC1_P.set(0)
16162 #
16163 def onCanvasSAFour(event):
16164  global ShowC2_P
16165  if ShowC2_P.get() == 0:
16166  ShowC2_P.set(1)
16167  else:
16168  ShowC2_P.set(0)
16169 #
16170 def onCanvasSAFive(event):
16171  global ShowMarker
16172  if ShowMarker.get() == 0:
16173  ShowMarker.set(1)
16174  else:
16175  ShowMarker.set(0)
16176 #
16177 def onCanvasSASix(event):
16178  global ShowRA_VdB
16179  if ShowRA_VdB.get() == 0:
16180  ShowRA_VdB.set(1)
16181  else:
16182  ShowRA_VdB.set(0)
16183 #
16184 def onCanvasSASeven(event):
16185  global ShowRB_VdB
16186  if ShowRB_VdB.get() == 0:
16187  ShowRB_VdB.set(1)
16188  else:
16189  ShowRB_VdB.set(0)
16190 #
16191 def onCanvasSAEight(event):
16192  global ShowMathSA
16193  ShowMathSA.set(2)
16194 #
16195 def onCanvasSANine(event):
16196  global ShowMathSA
16197  ShowMathSA.set(1)
16198 #
16199 def onCanvasSAZero(event):
16200  global ShowMathSA
16201  ShowMathSA.set(0)
16202 #
16203 def onCanvasSASnap(event):
16204  BSTOREtraceSA()
16205 #
16206 def onCanvasSANormal(event):
16207  BNormalmode()
16208 #
16209 def onCanvasSAPeak(event):
16210  BPeakholdmode()
16211 
16212 def onCanvasSAReset(event):
16213  BResetFreqAvg()
16214 #
16216  BAveragemode()
16217 #
16218 def onCanvasShowFcur(event):
16219  global ShowFCur
16220  if ShowFCur.get() == 0:
16221  ShowFCur.set(1)
16222  else:
16223  ShowFCur.set(0)
16224 #
16226  global ShowdBCur
16227  if ShowdBCur.get() == 1:
16228  ShowdBCur.set(0)
16229  else:
16230  ShowdBCur.set(1)
16231 #
16232 def onCanvasShowPcur(event):
16233  global ShowdBCur
16234  if ShowdBCur.get() == 2:
16235  ShowdBCur.set(0)
16236  else:
16237  ShowdBCur.set(2)
16238 #
16240  global ShowBPCur, ShowBdBCur, BPCursor, BdBCursor, RUNstatus, Bodeca
16241 
16242  BPCursor = event.x
16243  BdBCursor = event.y
16244  if RUNstatus.get() == 0:
16246  #Bodeca.bind_all('<MouseWheel>', onCanvasBodeClickScroll)
16247  Bodeca.bind('<MouseWheel>', onCanvasBodeClickScroll)
16248  Bodeca.bind("<Button-4>", onCanvasBodeClickScroll)# with Linux OS
16249  Bodeca.bind("<Button-5>", onCanvasBodeClickScroll)
16250 #
16252  global ShowBPCur, ShowBdBCur, BPCursor, BdBCursor, RUNstatus
16253 
16254  # print event.state
16255  shift_key = event.state & 1
16256  if ShowBPCur.get() > 0 and shift_key == 0:
16257  # respond to Linux or Windows wheel event
16258  if event.num == 5 or event.delta == -120:
16259  BPCursor -= 1
16260  if event.num == 4 or event.delta == 120:
16261  BPCursor += 1
16262  elif ShowBdBCur.get() > 0 or shift_key == 1:
16263  # respond to Linux or Windows wheel event
16264  if event.num == 5 or event.delta == -120:
16265  BdBCursor += 1
16266  if event.num == 4 or event.delta == 120:
16267  BdBCursor -= 1
16268  if RUNstatus.get() == 0:
16270 #
16272  global X0LBP # Left top X value
16273  global Y0TBP # Left top Y value
16274  global GRWBP # Screenwidth
16275  global GRHBP # Screenheight
16276  global FontSize
16277  global Bodeca, MarkerLoc, SAMPLErate
16278  global COLORgrid, COLORtext, HScaleBP, ShowCA_VdB, ShowCB_VdB, DBdivindexBP
16279  global COLORtrace1, COLORtrace2, COLORtrace6, StartBodeEntry, StopBodeEntry, DBlevelBP
16280  global AWGSAMPLErate, RUNstatus, COLORtext, MarkerFreqNum, PrevdBV, PrevF, Vdiv
16281 
16282  if (RUNstatus.get() == 0):
16283  MarkerFreqNum = MarkerFreqNum + 1
16284  COLORmarker = COLORtrace6 # COLORgrid
16285  if ShowCA_VdB.get() == 1:
16286  COLORmarker = COLORtrace1
16287  elif ShowCB_VdB.get() == 1:
16288  COLORmarker = COLORtrace2
16289  try:
16290  EndFreq = float(StopBodeEntry.get())
16291  except:
16292  StopBodeEntry.delete(0,"end")
16293  StopBodeEntry.insert(0,10000)
16294  EndFreq = 10000
16295  try:
16296  BeginFreq = float(StartBodeEntry.get())
16297  except:
16298  StartBodeEntry.delete(0,"end")
16299  StartBodeEntry.insert(0,100)
16300  BeginFreq = 100
16301  # draw X at marker point and number
16302  Bodeca.create_line(event.x-4, event.y-4,event.x+4, event.y+5, fill=COLORmarker)
16303  Bodeca.create_line(event.x+4, event.y-4,event.x-4, event.y+5, fill=COLORmarker)
16304  Bodeca.create_text(event.x+4, event.y, text=str(MarkerFreqNum), fill=COLORmarker, anchor="w", font=("arial", FontSize ))
16305  # Vertical conversion factors (level dBs) and border limits
16306  Yconv = float(GRHBP) / (Vdiv.get() * DBdivlist[DBdivindexBP.get()]) # Conversion factors, Yconv is the number of screenpoints per dB
16307  Yc = float(Y0TBP) + Yconv * (DBlevelBP.get()) # Yc is the 0 dBm position, can be outside the screen!
16308  Yphconv = float(GRHBP) / 360
16309  Yp = float(Y0TBP) + Yphconv + 180
16310  x1 = X0LBP + 14
16311  x2 = x1 + GRWBP
16312  # Horizontal conversion factors (frequency Hz) and border limits
16313  if HScaleBP.get() == 1:
16314  LogFStop = math.log10(EndFreq)
16315  try:
16316  LogFStart = math.log10(BeginFreq)
16317  except:
16318  LogFStart = 0.0
16319  LogFpixel = (LogFStop - LogFStart) / GRWBP
16320  xfreq = 10**(((event.x-x1)*LogFpixel) + LogFStart)
16321  else:
16322  Fpixel = (EndFreq - BeginFreq) / GRWBP # Frequency step per screen pixel
16323  xfreq = ((event.x-x1)*Fpixel)+BeginFreq
16324 
16325  yvdB = ((Yc-event.y)/Yconv)
16326  VdBString = ' {0:.1f} '.format(yvdB)
16327  XFString = ' {0:.2f} '.format(xfreq)
16328  V_label = str(MarkerFreqNum) + " " + XFString + " Hz, " + VdBString + " dBV"
16329  if MarkerFreqNum > 1:
16330  DeltaV = ' {0:.3f} '.format(yvdB-PrevdBV)
16331  DeltaF = ' {0:.2f} '.format(xfreq-PrevF)
16332  V_label = V_label + " Delta " + DeltaF + " Hz, " + DeltaV + " dBV"
16333  x = x1 + 5
16334  y = Y0TBP + 3 + (MarkerFreqNum*10)
16335  Justify = 'w'
16336  if MarkerLoc == 'UR' or MarkerLoc == 'ur':
16337  x = x2 - 5
16338  y = Y0TBP + 3 + (MarkerFreqNum*10)
16339  Justify = 'e'
16340  if MarkerLoc == 'LL' or MarkerLoc == 'll':
16341  x = x1 + 5
16342  y = Y0TBP + GRHBP + 3 - (MarkerFreqNum*10)
16343  Justify = 'w'
16344  if MarkerLoc == 'LR' or MarkerLoc == 'lr':
16345  x = x2 - 5
16346  y = Y0TBP + GRHBP + 3 - (MarkerFreqNum*10)
16347  Justify = 'e'
16348  Bodeca.create_text(x, y, text=V_label, fill=COLORmarker, anchor=Justify, font=("arial", FontSize ))
16349  PrevdBV = yvdB
16350  PrevF = xfreq
16351 #
16352 def onCanvasBdOne(event):
16353  global ShowCA_VdB
16354  if ShowCA_VdB.get() == 0:
16355  ShowCA_VdB.set(1)
16356  else:
16357  ShowCA_VdB.set(0)
16358 #
16359 def onCanvasBdTwo(event):
16360  global ShowCB_VdB
16361  if ShowCB_VdB.get() == 0:
16362  ShowCB_VdB.set(1)
16363  else:
16364  ShowCB_VdB.set(0)
16365 #
16366 def onCanvasBdThree(event):
16367  global ShowCA_P
16368  if ShowCA_P.get() == 0:
16369  ShowCA_P.set(1)
16370  else:
16371  ShowCA_P.set(0)
16372 #
16373 def onCanvasBdFour(event):
16374  global ShowCB_P
16375  if ShowCB_P.get() == 0:
16376  ShowCB_P.set(1)
16377  else:
16378  ShowCB_P.set(0)
16379 #
16380 def onCanvasBdFive(event):
16381  global ShowMarkerBP
16382  if ShowMarkerBP.get() == 0:
16383  ShowMarkerBP.set(1)
16384  else:
16385  ShowMarkerBP.set(0)
16386 #
16387 def onCanvasBdSix(event):
16388  global ShowRA_VdB
16389  if ShowRA_VdB.get() == 0:
16390  ShowRA_VdB.set(1)
16391  else:
16392  ShowRA_VdB.set(0)
16393 #
16394 def onCanvasBdSeven(event):
16395  global ShowRB_VdB
16396  if ShowRB_VdB.get() == 0:
16397  ShowRB_VdB.set(1)
16398  else:
16399  ShowRB_VdB.set(0)
16400 #
16401 def onCanvasBdEight(event):
16402  global ShowMathBP
16403  ShowMathBP.set(2)
16404 #
16405 def onCanvasBdNine(event):
16406  global ShowMathBP
16407  ShowMathBP.set(1)
16408 #
16409 def onCanvasBdZero(event):
16410  global ShowMathBP
16411  ShowMathBP.set(0)
16412 #
16413 def onCanvasBdSnap(event):
16414  BSTOREtraceBP()
16415 #
16417  global ShowBPCur
16418  if ShowBPCur.get() == 0:
16419  ShowBPCur.set(1)
16420  else:
16421  ShowBPCur.set(0)
16422 #
16424  global ShowBdBCur
16425  if ShowBdBCur.get() == 1:
16426  ShowBdBCur.set(0)
16427  else:
16428  ShowBdBCur.set(1)
16429 #
16431  global ShowBdBCur
16432  if ShowBdBCur.get() == 2:
16433  ShowBdBCur.set(0)
16434  else:
16435  ShowBdBCur.set(2)
16436 #
16437 def onAWGAscroll(event):
16438  global AWGAShape
16439 
16440  onTextScroll(event)
16441  time.sleep(0.05)
16442  ReMakeAWGwaves()
16443  time.sleep(0.05)
16444 #
16445 def onAWGBscroll(event):
16446  global AWGBShape
16447 
16448  onTextScroll(event)
16449  time.sleep(0.05)
16450  ReMakeAWGwaves()
16451  time.sleep(0.05)
16452 #
16453 def onTextScroll(event): # Use mouse wheel to scroll entry values, august 7
16454  button = event.widget
16455  cursor_position = button.index(INSERT) # get current cursor position
16456  Pos = cursor_position
16457  OldVal = button.get() # get current entry string
16458  OldValfl = float(OldVal) # and its value
16459  NewVal = OldValfl
16460  Len = len(OldVal)
16461  Dot = OldVal.find (".") # find decimal point position
16462  Decimals = Len - Dot - 1
16463  if Dot == -1 : # no point
16464  Decimals = 0
16465  Step = 10**(Len - Pos)
16466  elif Pos <= Dot : # no point left of position
16467  Step = 10**(Dot - Pos)
16468  else:
16469  Step = 10**(Dot - Pos + 1)
16470  # respond to Linux or Windows wheel event
16471  if event.num == 5 or event.delta == -120:
16472  NewVal = OldValfl - Step
16473  if event.num == 4 or event.delta == 120:
16474  NewVal = OldValfl + Step
16475  FormatStr = "{0:." + str(Decimals) + "f}"
16476  NewStr = FormatStr.format(NewVal)
16477  NewDot = NewStr.find (".")
16478  NewPos = Pos + NewDot - Dot
16479  if Decimals == 0 :
16480  NewLen = len(NewStr)
16481  NewPos = Pos + NewLen - Len
16482  button.delete(0, END) # remove old entry
16483  button.insert(0, NewStr) # insert new entry
16484  button.icursor(NewPos) # resets the insertion cursor
16485 #
16486 def onAWGAkey(event):
16487  global AWGAShape
16488 
16489  onTextKey(event)
16490  ReMakeAWGwaves()
16491 #
16492 def onAWGBkey(event):
16493  global AWGBShape
16494 
16495  onTextKey(event)
16496  ReMakeAWGwaves()
16497 #
16498 def onTextKeyAWG(event):
16499  onTextKey(event)
16500  ReMakeAWGwaves()
16501 #
16502 # Use Arriw keys to inc dec entry values
16503 def onTextKey(event):
16504  button = event.widget
16505  cursor_position = button.index(INSERT) # get current cursor position
16506  Pos = cursor_position
16507  OldVal = button.get() # get current entry string
16508  OldValfl = float(OldVal) # and its value
16509  Len = len(OldVal)
16510  Dot = OldVal.find (".") # find decimal point position
16511  Decimals = Len - Dot - 1
16512  if Dot == -1 : # no point
16513  Decimals = 0
16514  Step = 10**(Len - Pos)
16515  elif Pos <= Dot : # no point left of position
16516  Step = 10**(Dot - Pos)
16517  else:
16518  Step = 10**(Dot - Pos + 1)
16519  if platform.system() == "Windows":
16520  if event.keycode == 38: # increment digit for up arrow key
16521  NewVal = OldValfl + Step
16522  elif event.keycode == 40: # decrement digit for down arrow
16523  NewVal = OldValfl - Step
16524  else:
16525  return
16526  elif platform.system() == "Linux":
16527  if event.keycode == 111: # increment digit for up arrow key
16528  NewVal = OldValfl + Step
16529  elif event.keycode == 116: # decrement digit for down arrow
16530  NewVal = OldValfl - Step
16531  else:
16532  return
16533  elif platform.system() == "Darwin":
16534  if event.keycode == 0x7D: # increment digit for up arrow key
16535  NewVal = OldValfl + Step
16536  elif event.keycode == 0x7E: # decrement digit for down arrow
16537  NewVal = OldValfl - Step
16538  else:
16539  return
16540  else:
16541  return
16542 #
16543  FormatStr = "{0:." + str(Decimals) + "f}"
16544  NewStr = FormatStr.format(NewVal)
16545  NewDot = NewStr.find (".")
16546  NewPos = Pos + NewDot - Dot
16547  if Decimals == 0 :
16548  NewLen = len(NewStr)
16549  NewPos = Pos + NewLen - Len
16550  button.delete(0, END) # remove old entry
16551  button.insert(0, NewStr) # insert new entry
16552  button.icursor(NewPos) # resets the insertion cursor
16553 #
16554 #
16555 def onSpinBoxScroll(event):
16556  spbox = event.widget
16557  if sys.version_info[0] == 3 and sys.version_info[1] > 6: # Spin Boxes do this automatically in Python > 3.6 apparently
16558  return
16559  if event.num == 4 or event.delta > 0: # if event.delta > 0: # increment digit
16560  spbox.invoke('buttonup')
16561  if event.num == 5 or event.delta < 0:
16562  spbox.invoke('buttondown')
16563 #
16564 # ================ Make awg sub window ==========================
16566  global AWGAMode, AWGATerm, AWGAShape, AWGSync, awgwindow, AWGAPhaseDelay, AWGBPhaseDelay
16567  global AWGBMode, AWGBTerm, AWGBShape, AWGScreenStatus, AWGARepeatFlag, AWGBRepeatFlag
16568  global AWGABurstFlag, AWGBBurstFlag, AWGAShapeLabel, AWGBShapeLabel, AWGShowAdvanced
16569  global AWGAAmplEntry, AWGAOffsetEntry, AWGAFreqEntry, AWGAPhaseEntry, AWGADutyCycleEntry
16570  global AWGBAmplEntry, AWGBOffsetEntry, AWGBFreqEntry, AWGBPhaseEntry, AWGBDutyCycleEntry
16571  global AWGALength, AWGBLength, RevDate, phasealab, phaseblab, AWGAModeLabel, AWGBModeLabel
16572  global AWGAIOMode, AWGBIOMode, duty1lab, duty2lab, awgaph, awgadel, awgbph, awgbdel
16573  global AwgLayout, AWG_Amp_Mode, awgsync, SWRev # 0 = Min/Max mode, 1 = Amp/Offset
16574  global amp1lab, amp2lab, off1lab, off2lab, Reset_Freq, AWG_2X, BisCompA, FWRevOne
16575  global ModeAMenu, ShapeAMenu, amp1lab, off1lab, freq1lab, awgaph, awgadel, ModeBMenu, ShapeBMenu
16576  global amp2lab, off2lab, freq2lab, awgbph, awgbdel, bcompa, awgsync
16577 
16578  if AWGScreenStatus.get() == 0:
16579  AWGScreenStatus.set(1)
16580 
16581  awgwindow = Toplevel()
16582  awgwindow.title("AWG Controls " + SWRev + RevDate)
16583  awgwindow.resizable(FALSE,FALSE)
16584  awgwindow.geometry('+0+100')
16585  awgwindow.protocol("WM_DELETE_WINDOW", DestroyAWGScreen)
16586  #
16587  frame2 = LabelFrame(awgwindow, text="AWG CH A", style="A10R1.TLabelframe")
16588  frame3 = LabelFrame(awgwindow, text="AWG CH B", style="A10R2.TLabelframe")
16589  #
16590  if AwgLayout == "Horz":
16591  frame2.pack(side=LEFT, expand=1, fill=X)
16592  frame3.pack(side=LEFT, expand=1, fill=X)
16593  else:
16594  frame2.pack(side=TOP, expand=1, fill=Y)
16595  frame3.pack(side=TOP, expand=1, fill=Y)
16596  # now AWG A
16597  # AWG enable sub frame
16598  awg1eb = Frame( frame2 )
16599  awg1eb.pack(side=TOP)
16600  ModeAMenu = Menubutton(awg1eb, text="Mode", style="W5.TButton")
16601  ModeAMenu.menu = Menu(ModeAMenu, tearoff = 0 )
16602  ModeAMenu["menu"] = ModeAMenu.menu
16603  ModeAMenu.menu.add_command(label="-Mode-", foreground="blue", command=donothing)
16604  ModeAMenu.menu.add_radiobutton(label="SVMI", variable=AWGAMode, value=0, command=BAWGAModeLabel)
16605  ModeAMenu.menu.add_radiobutton(label="SIMV", variable=AWGAMode, value=1, command=BAWGAModeLabel)
16606  ModeAMenu.menu.add_radiobutton(label="Hi-Z", variable=AWGAMode, value=2, command=BAWGAModeLabel)
16607  ModeAMenu.menu.add_checkbutton(label="Split I/O", variable=AWGAIOMode, command=BAWGAModeLabel)
16608  ModeAMenu.menu.add_separator()
16609  ModeAMenu.menu.add_command(label="-Term-", foreground="blue", command=donothing)
16610  ModeAMenu.menu.add_radiobutton(label="Open", variable=AWGATerm, value=0, command=UpdateAwgCont)
16611  ModeAMenu.menu.add_radiobutton(label="To GND", variable=AWGATerm, value=1, command=UpdateAwgCont)
16612  ModeAMenu.menu.add_radiobutton(label="To 2.5V", variable=AWGATerm, value=2, command=UpdateAwgCont)
16613  ModeAMenu.pack(side=LEFT, anchor=W)
16614  ShapeAMenu = Menubutton(awg1eb, text="Shape", style="W6.TButton")
16615  ShapeAMenu.menu = Menu(ShapeAMenu, tearoff = 0 )
16616  ShapeAMenu["menu"] = ShapeAMenu.menu
16617  ShapeAMenu.menu.add_command(label="-Basic-", foreground="blue", command=donothing)
16618  ShapeAMenu.menu.add_radiobutton(label="DC", variable=AWGAShape, value=0, command=ReMakeAWGwaves)
16619  ShapeAMenu.menu.add_radiobutton(label="Sine", variable=AWGAShape, value=18, command=ReMakeAWGwaves)
16620  ShapeAMenu.menu.add_radiobutton(label="Triangle", variable=AWGAShape, value=2, command=ReMakeAWGwaves)
16621  ShapeAMenu.menu.add_radiobutton(label="Sawtooth", variable=AWGAShape, value=3, command=ReMakeAWGwaves)
16622  ShapeAMenu.menu.add_radiobutton(label="Square", variable=AWGAShape, value=4, command=ReMakeAWGwaves)
16623  ShapeAMenu.menu.add_radiobutton(label="StairStep", variable=AWGAShape, value=5, command=ReMakeAWGwaves)
16624  if AWGShowAdvanced.get() > 0:
16625  ShapeAMenu.menu.add_command(label="-Advanced-", foreground="blue", command=donothing)
16626  ShapeAMenu.menu.add_radiobutton(label="Impulse", variable=AWGAShape, value=9, command=ReMakeAWGwaves)
16627  ShapeAMenu.menu.add_radiobutton(label="Trapezoid", variable=AWGAShape, value=11, command=ReMakeAWGwaves)
16628  ShapeAMenu.menu.add_radiobutton(label="Pulse", variable=AWGAShape, value=20, command=ReMakeAWGwaves)
16629  ShapeAMenu.menu.add_radiobutton(label="Ramp", variable=AWGAShape, value=16, command=ReMakeAWGwaves)
16630  ShapeAMenu.menu.add_radiobutton(label="SSQ Pulse", variable=AWGAShape, value=15, command=ReMakeAWGwaves)
16631  ShapeAMenu.menu.add_radiobutton(label="U-D Ramp", variable=AWGAShape, value=12, command=ReMakeAWGwaves)
16632  ShapeAMenu.menu.add_radiobutton(label="Fourier Series", variable=AWGAShape, value=14, command=AWGAMakeFourier)
16633  ShapeAMenu.menu.add_radiobutton(label="Sin X/X", variable=AWGAShape, value=19, command=ReMakeAWGwaves)
16634  ShapeAMenu.menu.add_radiobutton(label="PWM Sine", variable=AWGAShape, value=17, command=ReMakeAWGwaves)
16635  ShapeAMenu.menu.add_radiobutton(label="FM Sine", variable=AWGAShape, value=21, command=AWGAMakeFMSine)
16636  ShapeAMenu.menu.add_radiobutton(label="AM Sine", variable=AWGAShape, value=22, command=AWGAMakeAMSine)
16637  ShapeAMenu.menu.add_radiobutton(label="UU Noise", variable=AWGAShape, value=7, command=ReMakeAWGwaves)
16638  ShapeAMenu.menu.add_radiobutton(label="UG Noise", variable=AWGAShape, value=8, command=ReMakeAWGwaves)
16639  else:
16640  ShapeAMenu.menu.add_separator()
16641  ShapeAMenu.menu.add_radiobutton(label="Math", variable=AWGAShape, value=10, command=AWGAMakeMath)
16642  ShapeAMenu.menu.add_radiobutton(label="Read CSV File", variable=AWGAShape, value=6, command=AWGAReadFile)
16643  ShapeAMenu.menu.add_radiobutton(label="Read WAV File", variable=AWGAShape, value=13, command=AWGAReadWAV)
16644  ShapeAMenu.menu.add_command(label="Save CSV File", command=AWGAWriteFile)
16645  ShapeAMenu.menu.add_checkbutton(label='Burst', variable=AWGABurstFlag, command=AWGANumCycles)
16646  ShapeAMenu.menu.add_checkbutton(label='Repeat', variable=AWGARepeatFlag)
16647  ShapeAMenu.pack(side=LEFT, anchor=W)
16648  #
16649  AWGAModeLabel = Label(frame2, text="AWG A Mode")
16650  AWGAModeLabel.pack(side=TOP)
16651  AWGAShapeLabel = Label(frame2, text="AWG A Shape")
16652  AWGAShapeLabel.pack(side=TOP)
16653  #
16654  awg1ampl = Frame( frame2 )
16655  awg1ampl.pack(side=TOP)
16656  AWGAAmplEntry = Entry(awg1ampl, width=5, cursor='double_arrow')
16657  AWGAAmplEntry.bind("<Return>", UpdateAwgContRet)
16658  AWGAAmplEntry.bind('<MouseWheel>', onAWGAscroll)
16659  AWGAAmplEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
16660  AWGAAmplEntry.bind("<Button-5>", onAWGAscroll)
16661  AWGAAmplEntry.bind('<Key>', onTextKeyAWG)
16662  AWGAAmplEntry.pack(side=LEFT, anchor=W)
16663  AWGAAmplEntry.delete(0,"end")
16664  AWGAAmplEntry.insert(0,0.0)
16665  amp1lab = Label(awg1ampl) #, text="Min Ch A")
16666  amp1lab.pack(side=LEFT, anchor=W)
16667  #
16668  awg1off = Frame( frame2 )
16669  awg1off.pack(side=TOP)
16670  AWGAOffsetEntry = Entry(awg1off, width=5, cursor='double_arrow')
16671  AWGAOffsetEntry.bind("<Return>", UpdateAwgContRet)
16672  AWGAOffsetEntry.bind('<MouseWheel>', onAWGAscroll)
16673  AWGAOffsetEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
16674  AWGAOffsetEntry.bind("<Button-5>", onAWGAscroll)
16675  AWGAOffsetEntry.bind('<Key>', onTextKeyAWG)
16676  AWGAOffsetEntry.pack(side=LEFT, anchor=W)
16677  AWGAOffsetEntry.delete(0,"end")
16678  AWGAOffsetEntry.insert(0,0.0)
16679  off1lab = Label(awg1off) #, text="Max Ch A")
16680  off1lab.pack(side=LEFT, anchor=W)
16681  if AWG_Amp_Mode.get() == 0:
16682  amp1lab.config(text = "Min Ch A" ) # change displayed value
16683  off1lab.config(text = "Max Ch A" ) # change displayed value
16684  else:
16685  amp1lab.config(text = "Amp Ch A" )
16686  off1lab.config(text = "Off Ch A" )
16687  # AWG Frequency sub frame
16688  awg1freq = Frame( frame2 )
16689  awg1freq.pack(side=TOP)
16690  AWGAFreqEntry = Entry(awg1freq, width=7, cursor='double_arrow')
16691  AWGAFreqEntry.bind("<Return>", UpdateAwgContRet)
16692  AWGAFreqEntry.bind('<MouseWheel>', onAWGAscroll)
16693  AWGAFreqEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
16694  AWGAFreqEntry.bind("<Button-5>", onAWGAscroll)
16695  AWGAFreqEntry.bind('<Key>', onTextKeyAWG)
16696  AWGAFreqEntry.pack(side=LEFT, anchor=W)
16697  AWGAFreqEntry.delete(0,"end")
16698  AWGAFreqEntry.insert(0,100.0)
16699  freq1lab = Label(awg1freq, text="Freq Ch A")
16700  freq1lab.pack(side=LEFT, anchor=W)
16701  # AWG Phase or delay select sub frame
16702  awgadelay = Frame( frame2 )
16703  awgadelay.pack(side=TOP)
16704  awgaph = Radiobutton(awgadelay, text="Phase", style="WPhase.TRadiobutton", variable=AWGAPhaseDelay, value=0, command=BAWGAPhaseDelay)
16705  awgaph.pack(side=LEFT, anchor=W)
16706  awgadel = Radiobutton(awgadelay, text="Delay", style="GPhase.TRadiobutton", variable=AWGAPhaseDelay, value=1, command=BAWGAPhaseDelay)
16707  awgadel.pack(side=LEFT, anchor=W)
16708  # AWG Phase entry sub frame
16709  awg1phase = Frame( frame2 )
16710  awg1phase.pack(side=TOP)
16711  AWGAPhaseEntry = Entry(awg1phase, width=5, cursor='double_arrow')
16712  AWGAPhaseEntry.bind("<Return>", UpdateAwgContRet)
16713  AWGAPhaseEntry.bind('<MouseWheel>', onAWGAscroll)
16714  AWGAPhaseEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
16715  AWGAPhaseEntry.bind("<Button-5>", onAWGAscroll)
16716  AWGAPhaseEntry.bind('<Key>', onTextKeyAWG)
16717  AWGAPhaseEntry.pack(side=LEFT, anchor=W)
16718  AWGAPhaseEntry.delete(0,"end")
16719  AWGAPhaseEntry.insert(0,0)
16720  phasealab = Label(awg1phase, text="Deg")
16721  phasealab.pack(side=LEFT, anchor=W)
16722  # AWG duty cycle frame
16723  awg1dc = Frame( frame2 )
16724  awg1dc.pack(side=TOP)
16725  AWGADutyCycleEntry = Entry(awg1dc, width=5, cursor='double_arrow')
16726  AWGADutyCycleEntry.bind("<Return>", UpdateAwgContRet)
16727  AWGADutyCycleEntry.bind('<MouseWheel>', onAWGAscroll)
16728  AWGADutyCycleEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
16729  AWGADutyCycleEntry.bind("<Button-5>", onAWGAscroll)
16730  AWGADutyCycleEntry.bind('<Key>', onTextKeyAWG)
16731  AWGADutyCycleEntry.pack(side=LEFT, anchor=W)
16732  AWGADutyCycleEntry.delete(0,"end")
16733  AWGADutyCycleEntry.insert(0,50)
16734  duty1lab = Label(awg1dc, text="%")
16735  duty1lab.pack(side=LEFT, anchor=W)
16736  #
16737  AWGALength = Label(frame2, text="Length")
16738  AWGALength.pack(side=TOP)
16739  #
16740  if FWRevOne > 2.16:
16741  awg2x1 = Radiobutton(frame2, text="Both CH 1X", variable=AWG_2X, value=0, command=BAWG2X)
16742  awg2x1.pack(side=TOP)
16743  awg2x2 = Radiobutton(frame2, text="CH A 2X", variable=AWG_2X, value=1, command=BAWG2X)
16744  awg2x2.pack(side=TOP)
16745  awg2x3 = Radiobutton(frame2, text="CH B 2X", variable=AWG_2X, value=2, command=BAWG2X)
16746  awg2x3.pack(side=TOP)
16747  else:
16748  awgsync = Checkbutton(frame2, text="Sync AWG", variable=AWGSync, command=BAWGSync)
16749  awgsync.pack(side=TOP)
16750  # now AWG B
16751  # AWG enable sub frame
16752  awg2eb = Frame( frame3 )
16753  awg2eb.pack(side=TOP)
16754  ModeBMenu = Menubutton(awg2eb, text="Mode", style="W5.TButton")
16755  ModeBMenu.menu = Menu(ModeBMenu, tearoff = 0 )
16756  ModeBMenu["menu"] = ModeBMenu.menu
16757  ModeBMenu.menu.add_command(label="-Mode-", foreground="blue", command=donothing)
16758  ModeBMenu.menu.add_radiobutton(label="SVMI", variable=AWGBMode, value=0, command=BAWGBModeLabel)
16759  ModeBMenu.menu.add_radiobutton(label="SIMV", variable=AWGBMode, value=1, command=BAWGBModeLabel)
16760  ModeBMenu.menu.add_radiobutton(label="Hi-Z", variable=AWGBMode, value=2, command=BAWGBModeLabel)
16761  ModeBMenu.menu.add_checkbutton(label="Split I/O", variable=AWGBIOMode, command=BAWGBModeLabel)
16762  ModeBMenu.menu.add_separator()
16763  ModeBMenu.menu.add_command(label="-Term-", foreground="blue", command=donothing)
16764  ModeBMenu.menu.add_radiobutton(label="Open", variable=AWGBTerm, value=0, command=UpdateAwgCont)
16765  ModeBMenu.menu.add_radiobutton(label="To GND", variable=AWGBTerm, value=1, command=UpdateAwgCont)
16766  ModeBMenu.menu.add_radiobutton(label="To 2.5V", variable=AWGBTerm, value=2, command=UpdateAwgCont)
16767  ModeBMenu.pack(side=LEFT, anchor=W)
16768  ShapeBMenu = Menubutton(awg2eb, text="Shape", style="W6.TButton")
16769  ShapeBMenu.menu = Menu(ShapeBMenu, tearoff = 0 )
16770  ShapeBMenu["menu"] = ShapeBMenu.menu
16771  ShapeBMenu.menu.add_command(label="-Basic-", foreground="blue", command=donothing)
16772  ShapeBMenu.menu.add_radiobutton(label="DC", variable=AWGBShape, value=0, command=ReMakeAWGwaves)
16773  ShapeBMenu.menu.add_radiobutton(label="Sine", variable=AWGBShape, value=18, command=ReMakeAWGwaves)
16774  ShapeBMenu.menu.add_radiobutton(label="Triangle", variable=AWGBShape, value=2, command=ReMakeAWGwaves)
16775  ShapeBMenu.menu.add_radiobutton(label="Sawtooth", variable=AWGBShape, value=3, command=ReMakeAWGwaves)
16776  ShapeBMenu.menu.add_radiobutton(label="Square", variable=AWGBShape, value=4, command=ReMakeAWGwaves)
16777  ShapeBMenu.menu.add_radiobutton(label="StairStep", variable=AWGBShape, value=5, command=ReMakeAWGwaves)
16778  if AWGShowAdvanced.get() > 0:
16779  ShapeBMenu.menu.add_command(label="-Advanced-", foreground="blue", command=donothing)
16780  ShapeBMenu.menu.add_radiobutton(label="Impulse", variable=AWGBShape, value=9, command=ReMakeAWGwaves)
16781  ShapeBMenu.menu.add_radiobutton(label="Trapezoid", variable=AWGBShape, value=11, command=ReMakeAWGwaves)
16782  ShapeBMenu.menu.add_radiobutton(label="Pulse", variable=AWGBShape, value=20, command=ReMakeAWGwaves)
16783  ShapeBMenu.menu.add_radiobutton(label="Ramp", variable=AWGBShape, value=16, command=ReMakeAWGwaves)
16784  ShapeBMenu.menu.add_radiobutton(label="SSQ Pulse", variable=AWGBShape, value=15, command=ReMakeAWGwaves)
16785  ShapeBMenu.menu.add_radiobutton(label="U-D Ramp", variable=AWGBShape, value=12, command=ReMakeAWGwaves)
16786  ShapeBMenu.menu.add_radiobutton(label="Fourier Series", variable=AWGBShape, value=14, command=AWGBMakeFourier)
16787  ShapeBMenu.menu.add_radiobutton(label="Sin X/X", variable=AWGBShape, value=19, command=ReMakeAWGwaves)
16788  ShapeBMenu.menu.add_radiobutton(label="PWM Sine", variable=AWGBShape, value=17, command=ReMakeAWGwaves)
16789  ShapeBMenu.menu.add_radiobutton(label="UU Noise", variable=AWGBShape, value=7, command=ReMakeAWGwaves)
16790  ShapeBMenu.menu.add_radiobutton(label="UG Noise", variable=AWGBShape, value=8, command=ReMakeAWGwaves)
16791  else:
16792  ShapeBMenu.menu.add_separator()
16793  ShapeBMenu.menu.add_radiobutton(label="Math", variable=AWGBShape, value=10, command=AWGBMakeMath)
16794  ShapeBMenu.menu.add_radiobutton(label="Read CSV File", variable=AWGBShape, value=6, command=AWGBReadFile)
16795  ShapeBMenu.menu.add_radiobutton(label="Read WAV File", variable=AWGBShape, value=13, command=AWGBReadWAV)
16796  ShapeBMenu.menu.add_command(label="Save CSV File", command=AWGBWriteFile)
16797  ShapeBMenu.menu.add_checkbutton(label='Burst', variable=AWGBBurstFlag, command=AWGBNumCycles)
16798  ShapeBMenu.menu.add_checkbutton(label='Repeat', variable=AWGBRepeatFlag)
16799  ShapeBMenu.pack(side=LEFT, anchor=W)
16800  #
16801  AWGBModeLabel = Label(frame3, text="AWG B Mode")
16802  AWGBModeLabel.pack(side=TOP)
16803  AWGBShapeLabel = Label(frame3, text="AWG B Shape")
16804  AWGBShapeLabel.pack(side=TOP)
16805  #
16806  awg2ampl = Frame( frame3 )
16807  awg2ampl.pack(side=TOP)
16808  AWGBAmplEntry = Entry(awg2ampl, width=5, cursor='double_arrow')
16809  AWGBAmplEntry.bind("<Return>", UpdateAwgContRet)
16810  AWGBAmplEntry.bind('<MouseWheel>', onAWGBscroll)
16811  AWGBAmplEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
16812  AWGBAmplEntry.bind("<Button-5>", onAWGBscroll)
16813  AWGBAmplEntry.bind('<Key>', onTextKeyAWG)
16814  AWGBAmplEntry.pack(side=LEFT, anchor=W)
16815  AWGBAmplEntry.delete(0,"end")
16816  AWGBAmplEntry.insert(0,0.0)
16817  amp2lab = Label(awg2ampl) #, text="Min Ch B")
16818  amp2lab.pack(side=LEFT, anchor=W)
16819  #
16820  awg2off = Frame( frame3 )
16821  awg2off.pack(side=TOP)
16822  AWGBOffsetEntry = Entry(awg2off, width=5, cursor='double_arrow')
16823  AWGBOffsetEntry.bind("<Return>", UpdateAwgContRet)
16824  AWGBOffsetEntry.bind('<MouseWheel>', onAWGBscroll)
16825  AWGBOffsetEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
16826  AWGBOffsetEntry.bind("<Button-5>", onAWGBscroll)
16827  AWGBOffsetEntry.bind('<Key>', onTextKeyAWG)
16828  AWGBOffsetEntry.pack(side=LEFT, anchor=W)
16829  AWGBOffsetEntry.delete(0,"end")
16830  AWGBOffsetEntry.insert(0,0.0)
16831  off2lab = Label(awg2off) #, text="Max Ch B")
16832  off2lab.pack(side=LEFT, anchor=W)
16833  if AWG_Amp_Mode.get() == 0:
16834  amp2lab.config(text = "Min Ch B" ) # change displayed value
16835  off2lab.config(text = "Max Ch B" ) # change displayed value
16836  else:
16837  amp2lab.config(text = "Amp Ch B" )
16838  off2lab.config(text = "Off Ch B" )
16839  # AWG Frequency sub frame
16840  awg2freq = Frame( frame3 )
16841  awg2freq.pack(side=TOP)
16842  AWGBFreqEntry = Entry(awg2freq, width=7, cursor='double_arrow')
16843  AWGBFreqEntry.bind("<Return>", UpdateAwgContRet)
16844  AWGBFreqEntry.bind('<MouseWheel>', onAWGBscroll)
16845  AWGBFreqEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
16846  AWGBFreqEntry.bind("<Button-5>", onAWGBscroll)
16847  AWGBFreqEntry.bind('<Key>', onTextKeyAWG)
16848  AWGBFreqEntry.pack(side=LEFT, anchor=W)
16849  AWGBFreqEntry.delete(0,"end")
16850  AWGBFreqEntry.insert(0,100.0)
16851  freq2lab = Label(awg2freq, text="Freq Ch B")
16852  freq2lab.pack(side=LEFT, anchor=W)
16853  # AWG Phase or delay select sub frame
16854  awgbdelay = Frame( frame3 )
16855  awgbdelay.pack(side=TOP)
16856  awgbph = Radiobutton(awgbdelay, text="Phase", style="WPhase.TRadiobutton", variable=AWGBPhaseDelay, value=0, command=BAWGBPhaseDelay)
16857  awgbph.pack(side=LEFT, anchor=W)
16858  awgbdel = Radiobutton(awgbdelay, text="Delay", style="GPhase.TRadiobutton", variable=AWGBPhaseDelay, value=1, command=BAWGBPhaseDelay)
16859  awgbdel.pack(side=LEFT, anchor=W)
16860  # AWG Phase sub frame
16861  awg2phase = Frame( frame3 )
16862  awg2phase.pack(side=TOP)
16863  AWGBPhaseEntry = Entry(awg2phase, width=5, cursor='double_arrow')
16864  AWGBPhaseEntry.bind("<Return>", UpdateAwgContRet)
16865  AWGBPhaseEntry.bind('<MouseWheel>', onAWGBscroll)
16866  AWGBPhaseEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
16867  AWGBPhaseEntry.bind("<Button-5>", onAWGBscroll)
16868  AWGBPhaseEntry.bind('<Key>', onTextKeyAWG)
16869  AWGBPhaseEntry.pack(side=LEFT, anchor=W)
16870  AWGBPhaseEntry.delete(0,"end")
16871  AWGBPhaseEntry.insert(0,0)
16872  phaseblab = Label(awg2phase, text="Deg")
16873  phaseblab.pack(side=LEFT, anchor=W)
16874  # AWG duty cycle frame
16875  awg2dc = Frame( frame3 )
16876  awg2dc.pack(side=TOP)
16877  AWGBDutyCycleEntry = Entry(awg2dc, width=5, cursor='double_arrow')
16878  AWGBDutyCycleEntry.bind("<Return>", UpdateAwgContRet)
16879  AWGBDutyCycleEntry.bind('<MouseWheel>', onAWGBscroll)
16880  AWGBDutyCycleEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
16881  AWGBDutyCycleEntry.bind("<Button-5>", onAWGBscroll)
16882  AWGBDutyCycleEntry.bind('<Key>', onTextKeyAWG)
16883  AWGBDutyCycleEntry.pack(side=LEFT, anchor=W)
16884  AWGBDutyCycleEntry.delete(0,"end")
16885  AWGBDutyCycleEntry.insert(0,50)
16886  duty2lab = Label(awg2dc, text="%")
16887  duty2lab.pack(side=LEFT, anchor=W)
16888  #
16889  AWGBLength = Label(frame3, text="Length")
16890  AWGBLength.pack(side=TOP)
16891  #
16892  bcompa = Checkbutton(frame3, text="B = Comp A", variable=BisCompA, command=ReMakeAWGwaves)#SetBCompA)
16893  bcompa.pack(side=TOP)
16894  if FWRevOne > 2.16:
16895  awgsync = Checkbutton(frame3, text="Sync AWG", variable=AWGSync, command=BAWGSync)
16896  awgsync.pack(side=TOP)
16897  #
16898  dismissbutton = Button(frame3, text="Minimize", style="W8.TButton", command=DestroyAWGScreen)
16899  dismissbutton.pack(side=TOP)
16900  else:
16901  awgwindow.deiconify()
16902 #
16903 def BAWG2X():
16904  global AWG_2X, devx, AWGAIOMode, AWGBIOMode, BisCompA
16905 
16906  ReMakeAWGwaves()
16907  if AWG_2X.get() == 0: # configure board for both AWG channels at 1X sampling
16908  devx.ctrl_transfer(0x40, 0x24, 0x0, 0, 0, 0, 100) # set to addr DAC A
16909  devx.ctrl_transfer(0x40, 0x25, 0x1, 0, 0, 0, 100) # set to addr DAC B
16910  elif AWG_2X.get() == 1: # configure board for single AWG channel A at 2X sampling
16911  devx.ctrl_transfer(0x40, 0x24, 0x0, 0, 0, 0, 100) # set to addr DAC A
16912  devx.ctrl_transfer(0x40, 0x25, 0x0, 0, 0, 0, 100) # set t0 addr DAC A
16913  if AWGBIOMode.get() == 0: # if channel b is not in split I/O mode turn off output
16914  devx.ctrl_transfer(0x40, 0x51, 40, 0, 0, 0, 100) # set IN3 switch to open
16915  devx.ctrl_transfer(0x40, 0x51, 52, 0, 0, 0, 100) # set IN3 switch to open
16916  BisCompA.set(0)
16917  elif AWG_2X.get() == 2: # configure board for single AWG channel B at 2X sampling
16918  devx.ctrl_transfer(0x40, 0x24, 0x1, 0, 0, 0, 100) # set to addr DAC B
16919  devx.ctrl_transfer(0x40, 0x25, 0x1, 0, 0, 0, 100) # set to addr DAC B
16920  if AWGAIOMode.get() == 0: # if channel a is not in split I/O mode turn off output
16921  devx.ctrl_transfer(0x40, 0x51, 35, 0, 0, 0, 100) # set IN3 switch to open
16922  devx.ctrl_transfer(0x40, 0x51, 51, 0, 0, 0, 100) # set IN3 switch to open
16923  BisCompA.set(0)
16924 #
16926  global awgwindow, AWGScreenStatus
16927 
16928  # AWGScreenStatus.set(0)
16929  awgwindow.iconify()
16930 #
16931 # ===== Channel B Mux Mode sub Window =======
16933  global MuxScreenStatus, muxwindow, RevDate, DacScreenStatus, DigScreenStatus
16934  global CHB_Asb, CHB_APosEntry, CHB_Bsb, CHB_BPosEntry
16935  global CHB_Csb, CHB_CPosEntry, CHB_Dsb, CHB_DPosEntry, SyncButton
16936  global CHB_Alab, CHB_Blab, CHB_Clab, CHB_Dlab, CHBlab, CHBofflab
16937  global CHB_Cofflab, CHB_Dofflab, awgsync, SWRev, BorderSize
16938  global Show_CBA, Show_CBB, Show_CBC, Show_CBD, MuxEnb, MuxSync, hipulseimg, lowpulseimg, DualMuxMode
16939 
16940  if MuxScreenStatus.get() == 0 and DacScreenStatus.get() == 0 and DigScreenStatus.get() == 0:
16941  MuxScreenStatus.set(1)
16942  #
16943  BAWGEnab() # update AWG settings
16944  #
16945  muxwindow = Toplevel()
16946  muxwindow.title("CH-B Mux " + SWRev + RevDate)
16947  muxwindow.resizable(FALSE,FALSE)
16948  muxwindow.protocol("WM_DELETE_WINDOW", DestroyMuxScreen)
16949  #
16950  frameM = LabelFrame(muxwindow, text="CH B Mux", style="A10B.TLabel") #, font="Arial 10 bold", borderwidth=5, relief=RIDGE)
16951  frameM.pack(side=LEFT, expand=1, fill=Y)
16952  #
16953  # Voltage channel CHB-A
16954  frameA = Frame(frameM)
16955  frameA.pack(side=TOP)
16956  cba = Checkbutton(frameA, text='CB-A', variable=Show_CBA, command=UpdateTimeTrace)
16957  cba.pack(side=LEFT, anchor=W)
16958  CHB_Asb = Spinbox(frameA, width=4, cursor='double_arrow', values=CHvpdiv, command=UpdateTimeTrace)
16959  CHB_Asb.bind('<MouseWheel>', onSpinBoxScroll)
16960  CHB_Asb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
16961  CHB_Asb.bind("<Button-5>", onSpinBoxScroll)
16962  CHB_Asb.pack(side=LEFT)
16963  CHB_Asb.delete(0,"end")
16964  CHB_Asb.insert(0,0.5)
16965  #
16966  CHB_Alab = Button(frameA, text="CB-A V/Div", style="Rtrace2.TButton", command=SetScaleMuxA)
16967  CHB_Alab.pack(side=LEFT)
16968  CHB_APosEntry = Entry(frameA, width=5, cursor='double_arrow')
16969  CHB_APosEntry.bind('<Return>', onTextKey)
16970  CHB_APosEntry.bind('<MouseWheel>', onTextScroll)
16971  CHB_APosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
16972  CHB_APosEntry.bind("<Button-5>", onTextScroll)
16973  CHB_APosEntry.bind('<Key>', onTextKey)
16974  CHB_APosEntry.pack(side=LEFT)
16975  CHB_APosEntry.delete(0,"end")
16976  CHB_APosEntry.insert(0,2.5)
16977  CHB_Aofflab = Button(frameA, text="CB-A Pos", style="Rtrace2.TButton", command=SetMuxAPoss)
16978  CHB_Aofflab.pack(side=LEFT)
16979  # Voltage channel CHB-B
16980  frameB = Frame(frameM)
16981  frameB.pack(side=TOP)
16982  cbb = Checkbutton(frameB, text='CB-B', variable=Show_CBB, command=UpdateTimeTrace)
16983  cbb.pack(side=LEFT, anchor=W)
16984  CHB_Bsb = Spinbox(frameB, width=4, cursor='double_arrow', values=CHvpdiv, command=UpdateTimeTrace)
16985  CHB_Bsb.bind('<MouseWheel>', onSpinBoxScroll)
16986  CHB_Bsb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
16987  CHB_Bsb.bind("<Button-5>", onSpinBoxScroll)
16988  CHB_Bsb.pack(side=LEFT)
16989  CHB_Bsb.delete(0,"end")
16990  CHB_Bsb.insert(0,0.5)
16991  CHB_Blab = Button(frameB, text="CB-B V/Div", style="Rtrace6.TButton", command=SetScaleMuxB)
16992  CHB_Blab.pack(side=LEFT)
16993  CHB_BPosEntry = Entry(frameB, width=5, cursor='double_arrow')
16994  CHB_BPosEntry.bind('<Return>', onTextKey)
16995  CHB_BPosEntry.bind('<MouseWheel>', onTextScroll)
16996  CHB_BPosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
16997  CHB_BPosEntry.bind("<Button-5>", onTextScroll)
16998  CHB_BPosEntry.bind('<Key>', onTextKey)
16999  CHB_BPosEntry.pack(side=LEFT)
17000  CHB_BPosEntry.delete(0,"end")
17001  CHB_BPosEntry.insert(0,2.5)
17002  CHB_Bofflab = Button(frameB, text="CB-B Pos", style="Rtrace6.TButton", command=SetMuxBPoss)
17003  CHB_Bofflab.pack(side=LEFT)
17004  # Voltage channel B-C
17005  frameC = Frame(frameM)
17006  frameC.pack(side=TOP)
17007  cbc = Checkbutton(frameC, text='CB-C', variable=Show_CBC, command=UpdateTimeTrace)
17008  cbc.pack(side=LEFT, anchor=W)
17009  CHB_Csb = Spinbox(frameC, width=4, cursor='double_arrow', values=CHvpdiv, command=UpdateTimeTrace)
17010  CHB_Csb.bind('<MouseWheel>', onSpinBoxScroll)
17011  CHB_Csb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
17012  CHB_Csb.bind("<Button-5>", onSpinBoxScroll)
17013  CHB_Csb.pack(side=LEFT)
17014  CHB_Csb.delete(0,"end")
17015  CHB_Csb.insert(0,0.5)
17016  #
17017  CHB_Clab = Button(frameC, text="CB-C V/Div", style="Rtrace7.TButton", command=SetScaleMuxC)
17018  CHB_Clab.pack(side=LEFT)
17019  CHB_CPosEntry = Entry(frameC, width=5, cursor='double_arrow')
17020  CHB_CPosEntry.bind('<Return>', onTextKey)
17021  CHB_CPosEntry.bind('<MouseWheel>', onTextScroll)
17022  CHB_CPosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17023  CHB_CPosEntry.bind("<Button-5>", onTextScroll)
17024  CHB_CPosEntry.bind('<Key>', onTextKey)
17025  CHB_CPosEntry.pack(side=LEFT)
17026  CHB_CPosEntry.delete(0,"end")
17027  CHB_CPosEntry.insert(0,2.5)
17028  CHB_Cofflab = Button(frameC, text="CB-C Pos", style="Rtrace7.TButton", command=SetMuxCPoss)
17029  CHB_Cofflab.pack(side=LEFT)
17030  # Voltage channel B-D
17031  frameD = Frame(frameM)
17032  frameD.pack(side=TOP)
17033  cbd = Checkbutton(frameD, text='CB-D', variable=Show_CBD, command=UpdateTimeTrace)
17034  cbd.pack(side=LEFT, anchor=W)
17035  CHB_Dsb = Spinbox(frameD, width=4, cursor='double_arrow', values=CHvpdiv, command=UpdateTimeTrace)
17036  CHB_Dsb.bind('<MouseWheel>', onSpinBoxScroll)
17037  CHB_Dsb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
17038  CHB_Dsb.bind("<Button-5>", onSpinBoxScroll)
17039  CHB_Dsb.pack(side=LEFT)
17040  CHB_Dsb.delete(0,"end")
17041  CHB_Dsb.insert(0,0.5)
17042  CHB_Dlab = Button(frameD, text="CB-D V/Div", style="Rtrace4.TButton", command=SetScaleMuxD)
17043  CHB_Dlab.pack(side=LEFT)
17044  CHB_DPosEntry = Entry(frameD, width=5, cursor='double_arrow')
17045  CHB_DPosEntry.bind('<Return>', onTextKey)
17046  CHB_DPosEntry.bind('<MouseWheel>', onTextScroll)
17047  CHB_DPosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17048  CHB_DPosEntry.bind("<Button-5>", onTextScroll)
17049  CHB_DPosEntry.bind('<Key>', onTextKey)
17050  CHB_DPosEntry.pack(side=LEFT)
17051  CHB_DPosEntry.delete(0,"end")
17052  CHB_DPosEntry.insert(0,2.5)
17053  CHB_Dofflab = Button(frameD, text="CB-D Pos", style="Rtrace4.TButton", command=SetMuxDPoss)
17054  CHB_Dofflab.pack(side=LEFT)
17055  frameE = Frame(frameM)
17056  frameE.pack(side=TOP)
17057  MuxEnb = IntVar(0)
17058  MuxSync = IntVar(0)
17059  muxenab = Checkbutton(frameE, text="Mux-Enb", variable=MuxEnb)
17060  muxenab.pack(side=LEFT)
17061  SyncButton = Checkbutton(frameE, compound=TOP, image=hipulseimg, variable=MuxSync, command=SyncImage)
17062  SyncButton.pack(side=LEFT)
17063  dismissbutton = Button(frameE, text="Dismiss", style="W8.TButton", command=DestroyMuxScreen)
17064  dismissbutton.pack(side=LEFT)
17065  frameF = Frame(frameM)
17066  frameF.pack(side=TOP)
17067  dmx = Checkbutton(frameF, text='Dual Mux Split I/O mode', variable=DualMuxMode, command=SetDualMuxMode)
17068  dmx.pack(side=LEFT)
17069  # Gray out main Channel B controls
17070  CHBlab.config(style="SGray.TButton")
17071  CHBofflab.config(style="SGray.TButton")
17072 #
17074  global AWGAIOMode, AWGBIOMode, ShowC1_V, DualMuxMode, CHAlab, CHAofflab
17075  global CHB_Clab, CHB_Dlab, CHB_Cofflab, CHB_Dofflab
17076 
17077  if DualMuxMode.get() == 1:
17078  AWGAIOMode.set(1) # force awg A split I/O mode
17079  AWGBIOMode.set(1) # force awg A split I/O mode
17080  ShowC1_V.set(0) # force A voltage trace off
17081  CHB_Clab.config(text="CA-C V/Div")
17082  CHB_Dlab.config(text="CA-D V/Div")
17083  CHB_Cofflab.config(text="CA-C Pos")
17084  CHB_Dofflab.config(text="CA-D Pos")
17085  BAWGEnab() # update AWG settings
17086  # Gray out main Channel A controls
17087  CHAlab.config(style="SGray.TButton")
17088  CHAofflab.config(style="SGray.TButton")
17089  else:
17090  ShowC1_V.set(1) # force A voltage trace on
17091  CHB_Clab.config(text="CB-C V/Div")
17092  CHB_Dlab.config(text="CB-D V/Div")
17093  CHB_Cofflab.config(text="CB-C Pos")
17094  CHB_Dofflab.config(text="CB-D Pos")
17095  # Reset main Channel A control colors
17096  CHAlab.config(style="Rtrace1.TButton")
17097  CHAofflab.config(style="Rtrace1.TButton")
17098 #
17100  global MuxSync, hipulseimg, lowpulseimg, SyncButton
17101 
17102  if MuxSync.get() == 0:
17103  SyncButton.config(image=hipulseimg)
17104  else:
17105  SyncButton.config(image=lowpulseimg)
17106 
17108  global muxwindow, awgsync, MuxScreenStatus, CHAlab, CHAofflab, CHBlab, CHBofflab
17109 
17110  MuxScreenStatus.set(0)
17111  awgsync.config(state=NORMAL)
17112  # Reset main Channel B control colors
17113  CHBlab.config(style="Rtrace2.TButton")
17114  CHBofflab.config(style="Rtrace2.TButton")
17115  CHAlab.config(style="Rtrace1.TButton")
17116  CHAofflab.config(style="Rtrace1.TButton")
17117  muxwindow.destroy()
17118 #
17119 def BodeCaresize(event):
17120  global Bodeca, GRWBP, XOLBP, GRHBP, Y0TBP, CANVASwidthBP, CANVASheightBP, FontSize
17121 
17122  CANVASwidthBP = event.width - 4
17123  CANVASheightBP = event.height - 4
17124  GRWBP = CANVASwidthBP - (2 * X0LBP) # new grid width
17125  GRHBP = CANVASheightBP - int(10 * FontSize) # new grid height
17126  UpdateBodeAll()
17127 #
17129  global FStepSync, DevOne
17130 
17131  if FStepSync.get() == 0:
17132  Tval = devx.ctrl_transfer( 0xc0, 0x91, 0, 0, 0, 1, 100) # set PIO-0 to Z
17133  elif FStepSync.get() == 1:
17134  devx.ctrl_transfer( 0x40, 0x50, 0, 0, 0, 0, 100) # set PIO-0 to 0
17135  elif FStepSync.get() == 2:
17136  devx.ctrl_transfer( 0x40, 0x51, 0, 0, 0, 0, 100) # set PIO-0 to 1
17137 #
17139  global FSweepSync, DevOne
17140 
17141  if FSweepSync.get() == 0:
17142  Tval = devx.ctrl_transfer( 0xc0, 0x91, 1, 0, 0, 1, 100) # set PIO-1 to Z
17143  elif FSweepSync.get() == 1:
17144  devx.ctrl_transfer( 0x40, 0x50, 1, 0, 0, 0, 100) # set PIO-1 to 0
17145  elif FSweepSync.get() == 2:
17146  devx.ctrl_transfer( 0x40, 0x51, 1, 0, 0, 0, 100) # set PIO-1 to 1
17147 #
17149  global BDSweepFile, FileSweepFreq, FileSweepAmpl
17150 
17151  if BDSweepFile.get() > 0:
17152  # Read values from CVS file
17153  filename = askopenfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent = bodewindow)
17154  try:
17155  CSVFile = open(filename)
17156  csv_f = csv.reader(CSVFile)
17157  FileSweepFreq = []
17158  FileSweepAmpl = []
17159  for row in csv_f:
17160  try:
17161  FileSweepFreq.append(float(row[0]))
17162  FileSweepAmpl.append(float(row[1]))
17163  except:
17164  print( 'skipping non-numeric row')
17165  FileSweepFreq = numpy.array(FileSweepFreq)
17166  FileSweepAmpl = numpy.array(FileSweepAmpl)
17167  MaxAmpl = numpy.amax(FileSweepAmpl)
17168  NormAmpl = MaxAmpl
17169  s = askstring("Normalize Max Amplitude", "Max Amplitude = " + str(MaxAmpl) + "\n\n Enter New Max value:\n in dB", parent = bodewindow)
17170  if (s == None): # If Cancel pressed, then None
17171  return()
17172  try: # Error if for example no numeric characters or OK pressed without input (s = "")
17173  v = int(s)
17174  except:
17175  s = "error"
17176 
17177  if s != "error":
17178  NormAmpl = MaxAmpl - v
17179  else:
17180  NormAmpl = MaxAmpl
17181  FileSweepAmpl = FileSweepAmpl - NormAmpl # normalize max amplitude to requested dBV
17182  CSVFile.close()
17183  StopBodeEntry.delete(0,"end")
17184  StopBodeEntry.insert(0,FileSweepFreq[len(FileSweepFreq)-1])
17185  StartBodeEntry.delete(0,"end")
17186  StartBodeEntry.insert(0,FileSweepFreq[0])
17187  SweepStepBodeEntry.delete(0,"end")
17188  SweepStepBodeEntry.insert(0,len(FileSweepFreq))
17189  except:
17190  showwarning("WARNING","No such file found or wrong format!", parent = bodewindow)
17191 #
17192 # ========== Make Bode Plot Window =============
17194  global logo, SmoothCurvesBP, CutDC, bodewindow, SWRev
17195  global CANVASwidthBP, CANVASheightBP, FFTwindow, CutDC, AWGAMode, AWGAShape, AWGBMode
17196  global ShowCA_VdB, ShowCA_P, ShowCB_VdB, ShowCB_P, ShowMarkerBP, BodeDisp, RelPhaseCenter
17197  global ShowCA_RdB, ShowCA_RP, ShowCB_RdB, ShowCB_RP, ShowMathBP, ShowRMathBP, PhCenBodeEntry
17198  global BPSweepMode, BPSweepCont, Bodeca, BodeScreenStatus, RevDate, SweepStepBodeEntry
17199  global HScaleBP, StopBodeEntry, StartBodeEntry, ShowBPCur, ShowBdBCur, BPCursor, BdBCursor
17200  global GRWBP, GRHBP, X0LBP, FStepSync, FSweepSync, BDSweepFile, MinigenScreenStatus
17201  global Show_Rseries, Show_Xseries, Show_Magnitude, Show_Angle, ImpedanceCenter, ImCenBodeEntry
17202  global Show_RseriesRef, Show_XseriesRef, Show_MagnitudeRef, Show_AngleRef
17203  global FrameRefief, BorderSize, LocalLanguage
17204  global sbode_tip, rbode_tip, bd3_tip, bd4_tip, bd5_tip, bd6_tip, bd7_tip, bd8_tip, bodismiss1button_tip
17205  global bstopfreqlab, bstartfreqlab, ImCenlab, BPhCenlab
17206 
17207  if BodeScreenStatus.get() == 0:
17208  BodeScreenStatus.set(1)
17209  BodeDisp.set(1)
17210  BodeCheckBox()
17211  CANVASwidthBP = GRWBP + 2 * X0LBP # The Bode canvas width
17212  CANVASheightBP = GRHBP + 80 # The ode canvas height
17213  CutDC.set(1) # set to remove DC
17214  AWGAMode.set(0) # Set AWG A to SVMI
17215  AWGAShape.set(1) # Set Shape to Sine
17216  AWGBMode.set(2) # Set AWG B to Hi-Z
17217  bodewindow = Toplevel()
17218  bodewindow.title("Bode Plotter " + SWRev + RevDate)
17219  bodewindow.protocol("WM_DELETE_WINDOW", DestroyBodeScreen)
17220  frame2bp = Frame(bodewindow, borderwidth=BorderSize, relief=FrameRefief)
17221  frame2bp.pack(side=RIGHT, expand=NO, fill=BOTH)
17222 
17223  frame2b = Frame(bodewindow, borderwidth=BorderSize, relief=FrameRefief)
17224  frame2b.pack(side=TOP, expand=YES, fill=BOTH)
17225 
17226  Bodeca = Canvas(frame2b, width=CANVASwidthBP, height=CANVASheightBP, background=COLORcanvas, cursor='cross')
17227  Bodeca.bind('<Configure>', BodeCaresize)
17228  Bodeca.bind('<1>', onCanvasBodeLeftClick)
17229  Bodeca.bind('<3>', onCanvasBodeRightClick)
17230  Bodeca.bind("<Up>", onCanvasUpArrow)
17231  Bodeca.bind("<Down>", onCanvasDownArrow)
17232  Bodeca.bind("<Left>", onCanvasLeftArrow)
17233  Bodeca.bind("<Right>", onCanvasRightArrow)
17234  Bodeca.bind("<space>", onCanvasSpaceBar)
17235  Bodeca.bind("1", onCanvasBdOne)
17236  Bodeca.bind("2", onCanvasBdTwo)
17237  Bodeca.bind("3", onCanvasBdThree)
17238  Bodeca.bind("4", onCanvasBdFour)
17239  Bodeca.bind("5", onCanvasBdFive)
17240  Bodeca.bind("6", onCanvasBdSix)
17241  Bodeca.bind("7", onCanvasBdSeven)
17242  Bodeca.bind("8", onCanvasBdEight)
17243  Bodeca.bind("9", onCanvasBdNine)
17244  Bodeca.bind("0", onCanvasBdZero)
17245  Bodeca.bind("f", onCanvasShowBPcur)
17246  Bodeca.bind("d", onCanvasShowBdBcur)
17247  Bodeca.bind("h", onCanvasShowPdBcur)
17248  Bodeca.bind("s", onCanvasBdSnap)
17249  Bodeca.pack(side=TOP, expand=YES, fill=BOTH)
17250 
17251  # right side drop down menu buttons
17252  dropmenu = Frame( frame2bp )
17253  dropmenu.pack(side=TOP)
17254  # File menu
17255  BodeFilemenu = Menubutton(dropmenu, text="File", style="W5.TButton")
17256  BodeFilemenu.menu = Menu(BodeFilemenu, tearoff = 0 )
17257  BodeFilemenu["menu"] = BodeFilemenu.menu
17258  BodeFilemenu.menu.add_command(label="Save Config", command=BSaveConfigBP)
17259  BodeFilemenu.menu.add_command(label="Load Config", command=BLoadConfigBP)
17260  BodeFilemenu.menu.add_command(label="Save Screen", command=BSaveScreenBP)
17261  BodeFilemenu.menu.add_command(label="Save Data", command=BCSVfile)
17262  BodeFilemenu.pack(side=LEFT, anchor=W)
17263  #
17264  BodeOptionmenu = Menubutton(dropmenu, text="Options", style="W8.TButton")
17265  BodeOptionmenu.menu = Menu(BodeOptionmenu, tearoff = 0 )
17266  BodeOptionmenu["menu"] = BodeOptionmenu.menu
17267  BodeOptionmenu.menu.add_command(label='Change Settings', command=MakeSettingsMenu)
17268  BodeOptionmenu.menu.add_checkbutton(label='Smooth', variable=SmoothCurvesBP)
17269  BodeOptionmenu.menu.add_checkbutton(label='Cut-DC', variable=CutDC)
17270  BodeOptionmenu.menu.add_command(label="Store trace (s)", command=BSTOREtraceBP)
17271  BodeOptionmenu.menu.add_radiobutton(label='Black BG', variable=ColorMode, value=0, command=BgColor)
17272  BodeOptionmenu.menu.add_radiobutton(label='White BG', variable=ColorMode, value=1, command=BgColor)
17273  BodeOptionmenu.menu.add_command(label="-Step Sync Pulse-", command=donothing)
17274  BodeOptionmenu.menu.add_radiobutton(label='None', variable=FStepSync, value=0, command=BStepSync)
17275  BodeOptionmenu.menu.add_radiobutton(label='Rising', variable=FStepSync, value=1, command=BStepSync)
17276  BodeOptionmenu.menu.add_radiobutton(label='Falling', variable=FStepSync, value=2, command=BStepSync)
17277  BodeOptionmenu.menu.add_command(label="-Sweep Sync Pulse-", command=donothing)
17278  BodeOptionmenu.menu.add_radiobutton(label='None', variable=FSweepSync, value=0, command=BSweepSync)
17279  BodeOptionmenu.menu.add_radiobutton(label='Rising', variable=FSweepSync, value=1, command=BSweepSync)
17280  BodeOptionmenu.menu.add_radiobutton(label='Falling', variable=FSweepSync, value=2, command=BSweepSync)
17281  BodeOptionmenu.pack(side=LEFT, anchor=W)
17282  #
17283  RUNframe = Frame( frame2bp )
17284  RUNframe.pack(side=TOP)
17285  rbode = Button(RUNframe, text="Run", style="Run.TButton", command=BStartBP)
17286  rbode.pack(side=LEFT)
17287  sbode = Button(RUNframe, text="Stop", style="Stop.TButton", command=BStopBP)
17288  sbode.pack(side=LEFT)
17289  #
17290  BodeFFTwindmenu = Menubutton(frame2bp, text="FFTwindow", style="W11.TButton")
17291  BodeFFTwindmenu.menu = Menu(BodeFFTwindmenu, tearoff = 0 )
17292  BodeFFTwindmenu["menu"] = BodeFFTwindmenu.menu
17293  BodeFFTwindmenu.menu.add_radiobutton(label='Rectangular window (B=1)', variable=FFTwindow, value=0)
17294  BodeFFTwindmenu.menu.add_radiobutton(label='Cosine window (B=1.24)', variable=FFTwindow, value=1)
17295  BodeFFTwindmenu.menu.add_radiobutton(label='Triangular window (B=1.33)', variable=FFTwindow, value=2)
17296  BodeFFTwindmenu.menu.add_radiobutton(label='Hann window (B=1.5)', variable=FFTwindow, value=3)
17297  BodeFFTwindmenu.menu.add_radiobutton(label='Blackman window (B=1.73)', variable=FFTwindow, value=4)
17298  BodeFFTwindmenu.menu.add_radiobutton(label='Nuttall window (B=2.02)', variable=FFTwindow, value=5)
17299  BodeFFTwindmenu.menu.add_radiobutton(label='Flat top window (B=3.77)', variable=FFTwindow, value=6)
17300  BodeFFTwindmenu.menu.add_radiobutton(label='User Defined window', variable=FFTwindow, value=7)
17301  BodeFFTwindmenu.menu.add_command(label="Enter User function", command=BUserFFTwindow)
17302  BodeFFTwindmenu.menu.add_radiobutton(label='FFT Window from file', variable=FFTwindow, value=8, command=BFileFFTwindow)
17303  BodeFFTwindmenu.pack(side=TOP)
17304  #
17305  tracemenu = Frame( frame2bp )
17306  tracemenu.pack(side=TOP)
17307  # Curves menu
17308  # Show channels menu
17309  BodeShowmenu = Menubutton(tracemenu, text="Curves", style="W7.TButton")
17310  BodeShowmenu.menu = Menu(BodeShowmenu, tearoff = 0 )
17311  BodeShowmenu["menu"] = BodeShowmenu.menu
17312  BodeShowmenu.menu.add_command(label="-Show-", command=donothing)
17313  BodeShowmenu.menu.add_command(label="All", command=BShowCurvesAllBP)
17314  BodeShowmenu.menu.add_command(label="None", command=BShowCurvesNoneBP)
17315  BodeShowmenu.menu.add_checkbutton(label='CA-dBV (1)', variable=ShowCA_VdB, command=UpdateBodeAll)
17316  BodeShowmenu.menu.add_checkbutton(label='CB-dBV (2)', variable=ShowCB_VdB, command=UpdateBodeAll)
17317  BodeShowmenu.menu.add_checkbutton(label='Phase A-B (3)', variable=ShowCA_P, command=UpdateBodeAll)
17318  BodeShowmenu.menu.add_checkbutton(label='Phase B-A (4)', variable=ShowCB_P, command=UpdateBodeAll)
17319  BodeShowmenu.menu.add_command(label="-Math-", command=donothing)
17320  BodeShowmenu.menu.add_radiobutton(label='None (0)', variable=ShowMathBP, value=0, command=UpdateBodeAll)
17321  BodeShowmenu.menu.add_radiobutton(label='CA-dB - CB-dB (9)', variable=ShowMathBP, value=1, command=UpdateBodeAll)
17322  BodeShowmenu.menu.add_radiobutton(label='CB-dB - CA-dB (8)', variable=ShowMathBP, value=2, command=UpdateBodeAll)
17323  BodeShowmenu.menu.add_command(label="-Impedance-", command=donothing)
17324  BodeShowmenu.menu.add_checkbutton(label='Series R', variable=Show_Rseries, command=UpdateBodeAll)
17325  BodeShowmenu.menu.add_checkbutton(label='Series X', variable=Show_Xseries, command=UpdateBodeAll)
17326  BodeShowmenu.menu.add_checkbutton(label='Series Mag', variable= Show_Magnitude, command=UpdateBodeAll)
17327  BodeShowmenu.menu.add_checkbutton(label='Series Ang', variable=Show_Angle, command=UpdateBodeAll)
17328  BodeShowmenu.menu.add_separator()
17329  BodeShowmenu.menu.add_checkbutton(label='RA-dBV (6)', variable=ShowCA_RdB, command=UpdateBodeAll)
17330  BodeShowmenu.menu.add_checkbutton(label='RB-dBV (7)', variable=ShowCB_RdB, command=UpdateBodeAll)
17331  BodeShowmenu.menu.add_checkbutton(label='RPhase A-B', variable=ShowCA_RP, command=UpdateBodeAll)
17332  BodeShowmenu.menu.add_checkbutton(label='RPhase B-A', variable=ShowCB_RP, command=UpdateBodeAll)
17333  BodeShowmenu.menu.add_checkbutton(label='Math', variable=ShowRMathBP, command=UpdateBodeAll)
17334  BodeShowmenu.menu.add_checkbutton(label='Ref Series R', variable=Show_RseriesRef, command=UpdateBodeAll)
17335  BodeShowmenu.menu.add_checkbutton(label='Ref Series X', variable=Show_XseriesRef, command=UpdateBodeAll)
17336  BodeShowmenu.menu.add_checkbutton(label='Ref Series Mag', variable=Show_MagnitudeRef, command=UpdateBodeAll)
17337  BodeShowmenu.menu.add_checkbutton(label='Ref Series Ang', variable=Show_AngleRef, command=UpdateBodeAll)
17338  BodeShowmenu.pack(side=LEFT, anchor=W)
17339  #
17340  BodeMarkmenu = Menubutton(tracemenu, text="Cursors", style="W7.TButton")
17341  BodeMarkmenu.menu = Menu(BodeMarkmenu, tearoff = 0 )
17342  BodeMarkmenu["menu"] = BodeMarkmenu.menu
17343  BodeMarkmenu.menu.add_command(label="-Cursors&Markers-", command=donothing)
17344  BodeMarkmenu.menu.add_checkbutton(label='Marker (5)', variable=ShowMarkerBP, command=UpdateBodeAll)
17345  BodeMarkmenu.menu.add_checkbutton(label='Freq Cursor', variable=ShowBPCur)
17346  BodeMarkmenu.menu.add_checkbutton(label='dB Cursor', variable=ShowBdBCur)
17347  BodeMarkmenu.menu.add_radiobutton(label='Cursor Off', variable=ShowBdBCur, value=0)
17348  BodeMarkmenu.menu.add_radiobutton(label='dB Cursor (d)', variable=ShowBdBCur, value=1)
17349  BodeMarkmenu.menu.add_radiobutton(label='Phase Cursor (h)', variable=ShowBdBCur, value=2)
17350  BodeMarkmenu.menu.add_checkbutton(label='Freq Cursor (f)', variable=ShowBPCur)
17351  BodeMarkmenu.pack(side=LEFT, anchor=W)
17352  #
17353  # Horz Scale
17354  HzScale = Frame( frame2bp )
17355  HzScale.pack(side=TOP)
17356  brb1 = Radiobutton(HzScale, text="Lin F", variable=HScaleBP, value=0, command=UpdateBodeTrace )
17357  brb1.pack(side=LEFT)
17358  brb2 = Radiobutton(HzScale, text="Log F", variable=HScaleBP, value=1, command=UpdateBodeTrace )
17359  brb2.pack(side=LEFT)
17360 
17361  DBrange = Frame( frame2bp )
17362  DBrange.pack(side=TOP)
17363  bd3 = Button(DBrange, text="+dB/div", style="W8.TButton", command=BDBdiv2BP)
17364  bd3.pack(side=LEFT)
17365  bd4 = Button(DBrange, text="-dB/div", style="W8.TButton", command=BDBdiv1BP)
17366  bd4.pack(side=LEFT)
17367 
17368  LVBrange = Frame( frame2bp )
17369  LVBrange.pack(side=TOP)
17370  bd5 = Button(LVBrange, text="LVL+10", style="W8.TButton", command=Blevel4BP)
17371  bd5.pack(side=LEFT)
17372  bd6 = Button(LVBrange, text="LVL-10", style="W8.TButton", command=Blevel3BP)
17373  bd6.pack(side=LEFT)
17374 
17375  LVSrange = Frame( frame2bp )
17376  LVSrange.pack(side=TOP)
17377  bd7 = Button(LVSrange, text="LVL+1", style="W8.TButton", command=Blevel2BP)
17378  bd7.pack(side=LEFT)
17379  bd8 = Button(LVSrange, text="LVL-1", style="W8.TButton", command=Blevel1BP)
17380  bd8.pack(side=LEFT)
17381 
17382  PhaseCenter = Frame( frame2bp )
17383  PhaseCenter.pack(side=TOP)
17384  BPhCenlab = Label(PhaseCenter, text="Center Phase on")
17385  BPhCenlab.pack(side=LEFT)
17386  PhCenBodeEntry = Entry(PhaseCenter, width=5, cursor='double_arrow')
17387  PhCenBodeEntry.bind('<Return>', onTextKey)
17388  PhCenBodeEntry.bind('<MouseWheel>', onTextScroll)
17389  PhCenBodeEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17390  PhCenBodeEntry.bind("<Button-5>", onTextScroll)
17391  PhCenBodeEntry.bind('<Key>', onTextKey)
17392  PhCenBodeEntry.pack(side=LEFT)
17393  PhCenBodeEntry.delete(0,"end")
17394  PhCenBodeEntry.insert(0,RelPhaseCenter.get())
17395  #
17396  ImpedCenter = Frame( frame2bp )
17397  ImpedCenter.pack(side=TOP)
17398  ImCenlab = Label(ImpedCenter, text="Center Imped on")
17399  ImCenlab.pack(side=LEFT)
17400  ImCenBodeEntry = Entry(ImpedCenter, width=5, cursor='double_arrow')
17401  ImCenBodeEntry.bind('<Return>', onTextKey)
17402  ImCenBodeEntry.bind('<MouseWheel>', onTextScroll)
17403  ImCenBodeEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17404  ImCenBodeEntry.bind("<Button-5>", onTextScroll)
17405  ImCenBodeEntry.bind('<Key>', onTextKey)
17406  ImCenBodeEntry.pack(side=LEFT)
17407  ImCenBodeEntry.delete(0,"end")
17408  ImCenBodeEntry.insert(0,ImpedanceCenter.get())
17409  # sweep generator mode menu buttons
17410  FSweepmenu = Label(frame2bp, text="-Sweep Gen-", style="A10B.TLabel")
17411  FSweepmenu.pack(side=TOP)
17412 
17413  Frange1 = Frame( frame2bp )
17414  Frange1.pack(side=TOP)
17415  bstartfreqlab = Label(Frange1, text="Start Freq")
17416  bstartfreqlab.pack(side=LEFT)
17417  StartBodeEntry = Entry(Frange1, width=5, cursor='double_arrow')
17418  StartBodeEntry.bind('<Return>', onTextKey)
17419  StartBodeEntry.bind('<MouseWheel>', onTextScroll)
17420  StartBodeEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17421  StartBodeEntry.bind("<Button-5>", onTextScroll)
17422  StartBodeEntry.bind('<Key>', onTextKey)
17423  StartBodeEntry.pack(side=LEFT)
17424  StartBodeEntry.delete(0,"end")
17425  StartBodeEntry.insert(0,10)
17426 
17427  Frange2 = Frame( frame2bp )
17428  Frange2.pack(side=TOP)
17429  bstopfreqlab = Label(Frange2, text="Stop Freq")
17430  bstopfreqlab.pack(side=LEFT)
17431  StopBodeEntry = Entry(Frange2, width=5, cursor='double_arrow')
17432  StopBodeEntry.bind('<Return>', onTextKey)
17433  StopBodeEntry.bind('<MouseWheel>', onStopBodeScroll)
17434  StopBodeEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17435  StopBodeEntry.bind("<Button-5>", onTextScroll)
17436  StopBodeEntry.bind('<Key>', onTextKey)
17437  StopBodeEntry.pack(side=LEFT)
17438  StopBodeEntry.delete(0,"end")
17439  StopBodeEntry.insert(0,10000)
17440 
17441  sgrb1 = Radiobutton(frame2bp, text='None', variable=FSweepMode, value=0)
17442  sgrb1.pack(side=TOP)
17443  Frange4 = Frame( frame2bp )
17444  Frange4.pack(side=TOP)
17445  sgrb2 = Radiobutton(Frange4, text='CH-A', variable=FSweepMode, value=1)
17446  sgrb2.pack(side=LEFT)
17447  sgrb3 = Radiobutton(Frange4, text='CH-B', variable=FSweepMode, value=2)
17448  sgrb3.pack(side=LEFT)
17449  if MinigenScreenStatus.get() > 0:
17450  sgrb1 = Radiobutton(frame2bp, text='MinGen', variable=FSweepMode, value=3)
17451  sgrb1.pack(side=TOP)
17452  ffcb = Checkbutton(frame2bp, text='Sweep From File', variable=BDSweepFile, command=BDSweepFromFile)
17453  ffcb.pack(side=TOP)
17454  Frange3 = Frame( frame2bp )
17455  Frange3.pack(side=TOP)
17456  sweepsteplab = Label(Frange3, text="Sweep Steps")
17457  sweepsteplab.pack(side=LEFT)
17458  SweepStepBodeEntry = Entry(Frange3, width=5, cursor='double_arrow')
17459  SweepStepBodeEntry.bind('<Return>', onTextKey)
17460  SweepStepBodeEntry.bind('<MouseWheel>', onTextScroll)
17461  SweepStepBodeEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17462  SweepStepBodeEntry.bind("<Button-5>", onTextScroll)
17463  SweepStepBodeEntry.bind('<Key>', onTextKey)
17464  SweepStepBodeEntry.pack(side=LEFT)
17465  SweepStepBodeEntry.delete(0,"end")
17466  SweepStepBodeEntry.insert(0,100)
17467 
17468  sgrb5 = Radiobutton(frame2bp, text='Single', variable=FSweepCont, value=0)
17469  sgrb5.pack(side=TOP)
17470  sgrb6 = Radiobutton(frame2bp, text='Continuous', variable=FSweepCont, value=1)
17471  sgrb6.pack(side=TOP)
17472  Plotsframe = Frame( frame2bp )
17473  Plotsframe.pack(side=TOP)
17474  nyquistplotbutton = Button(Plotsframe, text="Polar Plot", style="W9.TButton", command=MakeNyquistPlot)
17475  nyquistplotbutton.pack(side=LEFT)
17476  nicholsplotbutton = Button(Plotsframe, text="Rect Plot", style="W8.TButton", command=MakeNicPlot)
17477  nicholsplotbutton.pack(side=LEFT)
17478  bodismiss1button = Button(frame2bp, text="Dismiss", style="W8.TButton", command=DestroyBodeScreen)
17479  bodismiss1button.pack(side=TOP)
17480 
17481  ADI2 = Label(frame2bp, image=logo, anchor= "sw", compound="top") #, height=49, width=116
17482  ADI2.pack(side=TOP)
17483  if ShowBallonHelp > 0:
17484  sbode_tip = CreateToolTip(sbode, 'Stop acquiring data')
17485  rbode_tip = CreateToolTip(rbode, 'Start acquiring data')
17486  bd3_tip = CreateToolTip(bd3, 'Increase number of dB/Div')
17487  bd4_tip = CreateToolTip(bd4, 'Decrease number of dB/Div')
17488  bd5_tip = CreateToolTip(bd5, 'Increase Ref Level by 10 dB')
17489  bd6_tip = CreateToolTip(bd6, 'Decrease Ref Level by 10 dB')
17490  bd7_tip = CreateToolTip(bd7, 'Increase Ref Level by 1 dB')
17491  bd8_tip = CreateToolTip(bd8, 'Decrease Ref Level by 1 dB')
17492  bodismiss1button_tip = CreateToolTip(bodismiss1button, 'Dismiss Bode Plot window')
17493  if LocalLanguage != "English":
17494  BLoadConfig(LocalLanguage) # load local language configuration
17495 #
17497  global bodewindow, BodeScreenStatus, ca, FSweepMode
17498 
17499  BodeScreenStatus.set(0)
17500  FSweepMode.set(0)
17501  BodeDisp.set(0)
17502  BodeCheckBox()
17503  bodewindow.destroy()
17504  ca.bind_all('<MouseWheel>', onCanvasClickScroll)
17505 #
17506 def FreqCaresize(event):
17507  global Freqca, GRWF, XOLF, GRHF, Y0TF, CANVASwidthF, CANVASheightF, FontSize
17508 
17509  CANVASwidthF = event.width - 4
17510  CANVASheightF = event.height - 4
17511  GRWF = CANVASwidthF - (2 * X0LF) # new grid width
17512  GRHF = CANVASheightF - int(10 * FontSize) # new grid height
17513  UpdateFreqAll()
17514 #
17515 # ================ Make spectrum sub window ==========================
17517  global logo, SmoothCurvesSA, CutDC, SingleShotSA, FFTwindow, freqwindow, SmoothCurvesSA
17518  global ShowC1_VdB, ShowC1_P, ShowC2_VdB, ShowC2_P, ShowMarker, FreqDisp, ShowAWGASA
17519  global ShowRA_VdB, ShowRA_P, ShowRB_VdB, ShowRB_P, ShowMathSA, SWRev, SingleShotSA, ShowAWGBSA
17520  global ShowRMath, FSweepMode, FSweepCont, Freqca, SpectrumScreenStatus, RevDate, AWGShowAdvanced
17521  global HScale, StopFreqEntry, StartFreqEntry, ShowFCur, ShowdBCur, FCursor, dBCursor
17522  global CANVASwidthF, GRWF, X0LF, CANVASheightF, GRHF, FontSize, PhCenFreqEntry, RelPhaseCenter
17523  global FrameRefief, BorderSize, LocalLanguage
17524  global sb_tip, rb_tip, bless_tip, bmore_tip, b3_tip, b4_tip, b5_tip, b6_tip, b7_tip, b8_tip, sadismiss1button_tip
17525 
17526  if SpectrumScreenStatus.get() == 0:
17527  SpectrumScreenStatus.set(1)
17528  FreqDisp.set(1)
17529  FreqCheckBox()
17530  CANVASwidthF = GRWF + 2 * X0LF # The spectrum canvas width
17531  CANVASheightF = GRHF + int(10 * FontSize) # 80 The spectrum canvas height
17532  freqwindow = Toplevel()
17533  freqwindow.title("Spectrum Analyzer " + SWRev + RevDate)
17534  freqwindow.protocol("WM_DELETE_WINDOW", DestroySpectrumScreen)
17535  frame2fr = Frame(freqwindow, borderwidth=BorderSize, relief=FrameRefief)
17536  frame2fr.pack(side=RIGHT, expand=NO, fill=BOTH)
17537 
17538  frame2f = Frame(freqwindow, borderwidth=BorderSize, relief=FrameRefief)
17539  frame2f.pack(side=TOP, expand=YES, fill=BOTH)
17540 
17541  Freqca = Canvas(frame2f, width=CANVASwidthF, height=CANVASheightF, background=COLORcanvas, cursor='cross')
17542  Freqca.bind('<Configure>', FreqCaresize)
17543  Freqca.bind('<1>', onCanvasFreqLeftClick)
17544  Freqca.bind('<3>', onCanvasFreqRightClick)
17545  Freqca.bind("<Up>", onCanvasUpArrow)
17546  Freqca.bind("<Down>", onCanvasDownArrow)
17547  Freqca.bind("<Left>", onCanvasLeftArrow)
17548  Freqca.bind("<Right>", onCanvasRightArrow)
17549  Freqca.bind("<space>", onCanvasSpaceBar)
17550  Freqca.bind("1", onCanvasSAOne)
17551  Freqca.bind("2", onCanvasSATwo)
17552  Freqca.bind("3", onCanvasSAThree)
17553  Freqca.bind("4", onCanvasSAFour)
17554  Freqca.bind("5", onCanvasSAFive)
17555  Freqca.bind("6", onCanvasSASix)
17556  Freqca.bind("7", onCanvasSASeven)
17557  Freqca.bind("8", onCanvasSAEight)
17558  Freqca.bind("9", onCanvasSANine)
17559  Freqca.bind("0", onCanvasSAZero)
17560  Freqca.bind("a", onCanvasSAAverage)
17561  Freqca.bind("n", onCanvasSANormal)
17562  Freqca.bind("p", onCanvasSAPeak)
17563  Freqca.bind("r", onCanvasSAReset)
17564  Freqca.bind("f", onCanvasShowFcur)
17565  Freqca.bind("d", onCanvasShowdBcur)
17566  Freqca.bind("h", onCanvasShowPcur)
17567  Freqca.bind("s", onCanvasSASnap)
17568  Freqca.pack(side=TOP, expand=YES, fill=BOTH)
17569  # right side drop down menu buttons
17570  dropmenu = Frame( frame2fr )
17571  dropmenu.pack(side=TOP)
17572  # File menu
17573  SAFilemenu = Menubutton(dropmenu, text="File", style="W5.TButton")
17574  SAFilemenu.menu = Menu(SAFilemenu, tearoff = 0 )
17575  SAFilemenu["menu"] = SAFilemenu.menu
17576  SAFilemenu.menu.add_command(label="Save Config", command=BSaveConfigSA)
17577  SAFilemenu.menu.add_command(label="Load Config", command=BLoadConfigSA)
17578  SAFilemenu.menu.add_command(label="Save Screen", command=BSaveScreenSA)
17579  SAFilemenu.menu.add_command(label="Save Data", command=STOREcsvfile)
17580  SAFilemenu.pack(side=LEFT, anchor=W)
17581  #
17582  SAOptionmenu = Menubutton(dropmenu, text="Options", style="W8.TButton")
17583  SAOptionmenu.menu = Menu(SAOptionmenu, tearoff = 0 )
17584  SAOptionmenu["menu"] = SAOptionmenu.menu
17585  SAOptionmenu.menu.add_command(label='Change Settings', command=MakeSettingsMenu)
17586  SAOptionmenu.menu.add_command(label='Set Sample Rate', command=MakeSampleRateMenu) # SetSampleRate)
17587  SAOptionmenu.menu.add_checkbutton(label='Smooth', variable=SmoothCurvesSA)
17588  SAOptionmenu.menu.add_checkbutton(label='Cut-DC', variable=CutDC)
17589  SAOptionmenu.menu.add_command(label="Store trace [s]", command=BSTOREtraceSA)
17590  SAOptionmenu.menu.add_radiobutton(label='Black BG', variable=ColorMode, value=0, command=BgColor)
17591  SAOptionmenu.menu.add_radiobutton(label='White BG', variable=ColorMode, value=1, command=BgColor)
17592  SAOptionmenu.pack(side=LEFT, anchor=W)
17593  #
17594  RUNframe = Frame( frame2fr )
17595  RUNframe.pack(side=TOP)
17596  sarb = Button(RUNframe, text="Run", style="Run.TButton", command=BStartSA)
17597  sarb.pack(side=LEFT)
17598  sasb = Button(RUNframe, text="Stop", style="Stop.TButton", command=BStopSA)
17599  sasb.pack(side=LEFT)
17600  #
17601  Modeframe = Frame( frame2fr )
17602  Modeframe.pack(side=TOP)
17603  Modemenu = Menubutton(Modeframe, text="Mode", style="W5.TButton")
17604  Modemenu.menu = Menu(Modemenu, tearoff = 0 )
17605  Modemenu["menu"] = Modemenu.menu
17606  Modemenu.menu.add_command(label="Normal mode [n]", command=BNormalmode)
17607  Modemenu.menu.add_command(label="Peak hold [p]", command=BPeakholdmode)
17608  Modemenu.menu.add_command(label="Average [a]", command=BAveragemode)
17609  Modemenu.menu.add_command(label="Reset Average [r]", command=BResetFreqAvg)
17610  Modemenu.menu.add_checkbutton(label='SingleShot', variable=SingleShotSA)
17611  Modemenu.pack(side=LEFT)
17612  #
17613  SAFFTwindmenu = Menubutton(Modeframe, text="FFTwindow", style="W11.TButton")
17614  SAFFTwindmenu.menu = Menu(SAFFTwindmenu, tearoff = 0 )
17615  SAFFTwindmenu["menu"] = SAFFTwindmenu.menu
17616  SAFFTwindmenu.menu.add_radiobutton(label='Rectangular window (B=1)', variable=FFTwindow, value=0)
17617  SAFFTwindmenu.menu.add_radiobutton(label='Cosine window (B=1.24)', variable=FFTwindow, value=1)
17618  SAFFTwindmenu.menu.add_radiobutton(label='Triangular window (B=1.33)', variable=FFTwindow, value=2)
17619  SAFFTwindmenu.menu.add_radiobutton(label='Hann window (B=1.5)', variable=FFTwindow, value=3)
17620  SAFFTwindmenu.menu.add_radiobutton(label='Blackman window (B=1.73)', variable=FFTwindow, value=4)
17621  SAFFTwindmenu.menu.add_radiobutton(label='Nuttall window (B=2.02)', variable=FFTwindow, value=5)
17622  SAFFTwindmenu.menu.add_radiobutton(label='Flat top window (B=3.77)', variable=FFTwindow, value=6)
17623  SAFFTwindmenu.menu.add_radiobutton(label='User Defined window', variable=FFTwindow, value=7)
17624  SAFFTwindmenu.menu.add_command(label="Enter User function", command=BUserFFTwindow)
17625  SAFFTwindmenu.menu.add_radiobutton(label='FFT Window from file', variable=FFTwindow, value=8, command=BFileFFTwindow)
17626  SAFFTwindmenu.pack(side=LEFT)
17627  #
17628  SamplesMenu = Frame( frame2fr )
17629  SamplesMenu.pack(side=TOP)
17630  bless = Button(SamplesMenu, text="-Samples", style="W8.TButton", command=Bsamples1)
17631  bless.pack(side=LEFT)
17632  bmore = Button(SamplesMenu, text="+Samples", style="W8.TButton", command=Bsamples2)
17633  bmore.pack(side=LEFT)
17634  #
17635  # Show channels menu
17636  #
17637  MarkersMenu = Frame( frame2fr )
17638  MarkersMenu.pack(side=TOP)
17639  SAShowmenu = Menubutton(MarkersMenu, text="Curves", style="W7.TButton")
17640  SAShowmenu.menu = Menu(SAShowmenu, tearoff = 0 )
17641  SAShowmenu["menu"] = SAShowmenu.menu
17642  SAShowmenu.menu.add_command(label="-Show-", command=donothing)
17643  SAShowmenu.menu.add_command(label="All", command=BShowCurvesAllSA)
17644  SAShowmenu.menu.add_command(label="None", command=BShowCurvesNoneSA)
17645  SAShowmenu.menu.add_checkbutton(label='CA-dBV [1]', variable=ShowC1_VdB, command=UpdateFreqAll)
17646  SAShowmenu.menu.add_checkbutton(label='CB-dBV [2]', variable=ShowC2_VdB, command=UpdateFreqAll)
17647  SAShowmenu.menu.add_checkbutton(label='Phase A-B [3]', variable=ShowC1_P, command=UpdateFreqAll)
17648  SAShowmenu.menu.add_checkbutton(label='Phase B-A [4]', variable=ShowC2_P, command=UpdateFreqAll)
17649  SAShowmenu.menu.add_command(label="-Math-", command=donothing)
17650  SAShowmenu.menu.add_radiobutton(label='None [0]', variable=ShowMathSA, value=0, command=UpdateFreqAll)
17651  SAShowmenu.menu.add_radiobutton(label='CA-dB - CB-dB [9]', variable=ShowMathSA, value=1, command=UpdateFreqAll)
17652  SAShowmenu.menu.add_radiobutton(label='CB-dB - CA-dB [8]', variable=ShowMathSA, value=2, command=UpdateFreqAll)
17653  if AWGShowAdvanced.get() > 0:
17654  SAShowmenu.menu.add_command(label="-AWG-", command=donothing)
17655  SAShowmenu.menu.add_checkbutton(label='AWG A', variable=ShowAWGASA, command=UpdateFreqAll)
17656  SAShowmenu.menu.add_checkbutton(label='AWG B', variable=ShowAWGBSA, command=UpdateFreqAll)
17657  SAShowmenu.menu.add_command(label="-Ref Trace-", command=donothing)
17658  SAShowmenu.menu.add_checkbutton(label='RA-dBV [6]', variable=ShowRA_VdB, command=UpdateFreqAll)
17659  SAShowmenu.menu.add_checkbutton(label='RB-dBV [7]', variable=ShowRB_VdB, command=UpdateFreqAll)
17660  SAShowmenu.menu.add_checkbutton(label='RPhase A-B', variable=ShowRA_P, command=UpdateFreqAll)
17661  SAShowmenu.menu.add_checkbutton(label='RPhase B-A', variable=ShowRB_P, command=UpdateFreqAll)
17662  SAShowmenu.menu.add_checkbutton(label='Ref Math', variable=ShowRMath, command=UpdateFreqAll)
17663  SAShowmenu.pack(side=LEFT)
17664  SACursormenu = Menubutton(MarkersMenu, text="Cursors", style="W7.TButton")
17665  SACursormenu.menu = Menu(SACursormenu, tearoff = 0 )
17666  SACursormenu["menu"] = SACursormenu.menu
17667  SACursormenu.menu.add_command(label="-Marker-", command=donothing)
17668  SACursormenu.menu.add_radiobutton(label='Markers Off', variable=ShowMarker, value=0, command=UpdateFreqAll)
17669  SACursormenu.menu.add_radiobutton(label='Markers [5]', variable=ShowMarker, value=1, command=UpdateFreqAll)
17670  SACursormenu.menu.add_radiobutton(label='Delta Markers', variable=ShowMarker, value=2, command=UpdateFreqAll)
17671  SACursormenu.menu.add_command(label="-Cursors-", command=donothing)
17672  SACursormenu.menu.add_radiobutton(label='Cursor Off', variable=ShowdBCur, value=0)
17673  SACursormenu.menu.add_radiobutton(label='dB Cursor [d]', variable=ShowdBCur, value=1)
17674  #SACursormenu.menu.add_radiobutton(label='Phase Cursor [h]', variable=ShowdBCur, value=2)
17675  SACursormenu.menu.add_checkbutton(label='Freq Cursor [f]', variable=ShowFCur)
17676  SACursormenu.pack(side=LEFT)
17677  # HScale
17678  Frange1 = Frame( frame2fr )
17679  Frange1.pack(side=TOP)
17680  startfreqlab = Label(Frange1, text="Startfreq")
17681  startfreqlab.pack(side=LEFT)
17682  StartFreqEntry = Entry(Frange1, width=5, cursor='double_arrow')
17683  StartFreqEntry.bind('<Return>', onTextKey)
17684  StartFreqEntry.bind('<MouseWheel>', onTextScroll)
17685  StartFreqEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17686  StartFreqEntry.bind("<Button-5>", onTextScroll)
17687  StartFreqEntry.bind('<Key>', onTextKey)
17688  StartFreqEntry.pack(side=LEFT)
17689  StartFreqEntry.delete(0,"end")
17690  StartFreqEntry.insert(0,10)
17691 
17692  Frange2 = Frame( frame2fr )
17693  Frange2.pack(side=TOP)
17694  stopfreqlab = Label(Frange2, text="Stopfreq")
17695  stopfreqlab.pack(side=LEFT)
17696  StopFreqEntry = Entry(Frange2, width=7, cursor='double_arrow')
17697  StopFreqEntry.bind('<Return>', onTextKey)
17698  StopFreqEntry.bind('<MouseWheel>', onStopfreqScroll)
17699  StopFreqEntry.bind("<Button-4>", onStopfreqScroll)# with Linux OS
17700  StopFreqEntry.bind("<Button-5>", onStopfreqScroll)
17701  StopFreqEntry.bind('<Key>', onTextKey)
17702  StopFreqEntry.pack(side=LEFT)
17703  StopFreqEntry.delete(0,"end")
17704  StopFreqEntry.insert(0,10000)
17705 
17706  HScale = IntVar(0)
17707  HzScale = Frame( frame2fr )
17708  HzScale.pack(side=TOP)
17709  sarb1 = Radiobutton(HzScale, text="Lin F", variable=HScale, value=0, command=UpdateFreqTrace )
17710  sarb1.pack(side=LEFT)
17711  sarb2 = Radiobutton(HzScale, text="Log F", variable=HScale, value=1, command=UpdateFreqTrace )
17712  sarb2.pack(side=LEFT)
17713  #
17714  PhaseCenter = Frame( frame2fr )
17715  PhaseCenter.pack(side=TOP)
17716  PhCenlab = Label(PhaseCenter, text="Center Phase on")
17717  PhCenlab.pack(side=LEFT)
17718  PhCenFreqEntry = Entry(PhaseCenter, width=5, cursor='double_arrow')
17719  PhCenFreqEntry.bind('<Return>', onTextKey)
17720  PhCenFreqEntry.bind('<MouseWheel>', onTextScroll)
17721  PhCenFreqEntry.bind("<Button-4>", onTextScroll)# with Linux OS
17722  PhCenFreqEntry.bind("<Button-5>", onTextScroll)
17723  PhCenFreqEntry.bind('<Key>', onTextKey)
17724  PhCenFreqEntry.pack(side=LEFT)
17725  PhCenFreqEntry.delete(0,"end")
17726  PhCenFreqEntry.insert(0,RelPhaseCenter.get())
17727  #
17728  DBrange = Frame( frame2fr )
17729  DBrange.pack(side=TOP)
17730  sab3 = Button(DBrange, text="+dB/div", style="W8.TButton", command=BDBdiv2)
17731  sab3.pack(side=LEFT)
17732  sab4 = Button(DBrange, text="-dB/div", style="W8.TButton", command=BDBdiv1)
17733  sab4.pack(side=LEFT)
17734 
17735  LVBrange = Frame( frame2fr )
17736  LVBrange.pack(side=TOP)
17737  sab5 = Button(LVBrange, text="LVL+10", style="W8.TButton", command=Blevel4)
17738  sab5.pack(side=LEFT)
17739  sab6 = Button(LVBrange, text="LVL-10", style="W8.TButton", command=Blevel3)
17740  sab6.pack(side=LEFT)
17741 
17742  LVSrange = Frame( frame2fr )
17743  LVSrange.pack(side=TOP)
17744  sab7 = Button(LVSrange, text="LVL+1", style="W8.TButton", command=Blevel2)
17745  sab7.pack(side=LEFT)
17746  sab8 = Button(LVSrange, text="LVL-1", style="W8.TButton", command=Blevel1)
17747  sab8.pack(side=LEFT)
17748 
17749  sadismiss1button = Button(frame2fr, text="Dismiss", style="W8.TButton", command=DestroySpectrumScreen)
17750  sadismiss1button.pack(side=TOP)
17751 
17752  ADI2 = Label(frame2fr, image=logo, anchor= "sw", compound="top") #, height=49, width=116
17753  ADI2.pack(side=TOP)
17754  if ShowBallonHelp > 0:
17755  sb_tip = CreateToolTip(sasb, 'Stop acquiring data')
17756  rb_tip = CreateToolTip(sarb, 'Start acquiring data')
17757  bless_tip = CreateToolTip(bless, 'Decrease FFT samples')
17758  bmore_tip = CreateToolTip(bmore, 'Increase FFT samples')
17759  b3_tip = CreateToolTip(sab3, 'Increase number of dB/Div')
17760  b4_tip = CreateToolTip(sab4, 'Decrease number of dB/Div')
17761  b5_tip = CreateToolTip(sab5, 'Increase Ref Level by 10 dB')
17762  b6_tip = CreateToolTip(sab6, 'Decrease Ref Level by 10 dB')
17763  b7_tip = CreateToolTip(sab7, 'Increase Ref Level by 1 dB')
17764  b8_tip = CreateToolTip(sab8, 'Decrease Ref Level by 1 dB')
17765  sadismiss1button_tip = CreateToolTip(sadismiss1button, 'Dismiss Spectrum Analyzer window')
17766  if LocalLanguage != "English":
17767  BLoadConfig(LocalLanguage) # load local language configuration
17768 
17770  global freqwindow, SpectrumScreenStatus, ca
17771 
17772  SpectrumScreenStatus.set(0)
17773  FreqDisp.set(0)
17774  FreqCheckBox()
17775  freqwindow.destroy()
17776  ca.bind_all('<MouseWheel>', onCanvasClickScroll)
17777 #
17778 def XYcaresize(event):
17779  global XYca, GRWXY, XOLXY, GRHXY, Y0TXY, CANVASwidthXY, CANVASheightXY, FontSize
17780  global YminXY, YmaxXY, XminXY, XmaxXY
17781 
17782  CANVASwidthXY = event.width - 4
17783  CANVASheightXY = event.height - 4
17784  GRWXY = CANVASwidthXY - int(2.25 * FontSize) - X0LXY # 18 new grid width
17785  GRHXY = CANVASheightXY - int(10 * FontSize) # new grid height
17786  YminXY = Y0TXY # Minimum position of time grid (top)
17787  YmaxXY = Y0TXY + GRHXY # Maximum position of time grid (bottom)
17788  XminXY = X0LXY # Minimum position of time grid (left)
17789  XmaxXY = X0LXY + GRWXY # Maximum position of time grid (right)
17790  UpdateXYAll()
17791 #
17792 # ================ Make XY Plot sub window ==========================
17794  global logo, CANVASwidthXY, CANVASheightXY, Xsignal, Ysignal, ShowRXY
17795  global XYScreenStatus, MarkerXYScale, XYca, xywindow, RevDate, SWRev, XYDisp
17796  global CHAsbxy, CHBsbxy, CHAxylab, CHBxylab, CHAVPosEntryxy, CHBVPosEntryxy
17797  global CHAIsbxy, CHBIsbxy, CHAIPosEntryxy, CHBIPosEntryxy, ScreenXYrefresh
17798  global YminXY, Y0TXY, YmaxXY, GRHXY, XminXY, X0LXY, XmaxXY, X0LXY, GRWXY, CANVASwidthXY, CANVASheightXY
17799  global FrameRefief, BorderSize, LocalLanguage
17800  global math_tip, bsxy_tip, brxy_tip, snapbutton_tip, savebutton_tip, dismissxybutton_tip, CHAxylab_tip
17801  global CHBxylab_tip, CHAxyofflab_tip, CHBxyofflab_tip, CHAIxyofflab_tip, CHBIxyofflab_tip
17802 
17803  if XYScreenStatus.get() == 0:
17804  XYScreenStatus.set(1)
17805  XYDisp.set(1)
17806  XYCheckBox()
17807  YminXY = Y0TXY # Minimum position of XY grid (top)
17808  YmaxXY = Y0TXY + GRHXY # Maximum position of XY grid (bottom)
17809  XminXY = X0LXY # Minimum position of XY grid (left)
17810  XmaxXY = X0LXY + GRWXY # Maximum position of XY grid (right)
17811  CANVASwidthXY = GRWXY + 18 + X0LXY # The XY canvas width
17812  CANVASheightXY = GRHXY + 80 # The XY canvas height
17813  xywindow = Toplevel()
17814  xywindow.title("X-Y Plot " + SWRev + RevDate)
17815  xywindow.protocol("WM_DELETE_WINDOW", DestroyXYScreen)
17816  frame2xyr = Frame(xywindow, borderwidth=BorderSize, relief=FrameRefief)
17817  frame2xyr.pack(side=RIGHT, expand=NO, fill=BOTH)
17818 
17819  frame2xy = Frame(xywindow, borderwidth=BorderSize, relief=FrameRefief)
17820  frame2xy.pack(side=TOP, expand=YES, fill=BOTH)
17821 
17822  frame3xy = Frame(xywindow, borderwidth=BorderSize, relief=FrameRefief)
17823  frame3xy.pack(side=TOP, expand=NO, fill=BOTH)
17824 
17825  frame4xy = Frame(xywindow, borderwidth=BorderSize, relief=FrameRefief)
17826  frame4xy.pack(side=TOP, expand=NO, fill=BOTH)
17827 
17828  XYca = Canvas(frame2xy, width=CANVASwidthXY, height=CANVASheightXY, background=COLORcanvas, cursor='cross')
17829  XYca.bind('<Configure>', XYcaresize)
17830  XYca.bind('<1>', onCanvasXYLeftClick)
17831  XYca.bind('<3>', onCanvasXYRightClick)
17832  XYca.bind("<Motion>",onCanvasMouse_xy)
17833  XYca.bind('<MouseWheel>', onCanvasXYScrollClick)
17834  XYca.bind("<Button-4>", onCanvasXYScrollClick)# with Linux OS
17835  XYca.bind("<Button-5>", onCanvasXYScrollClick)
17836  XYca.bind("<Up>", onCanvasUpArrow)
17837  XYca.bind("<Down>", onCanvasDownArrow)
17838  XYca.bind("<Left>", onCanvasLeftArrow)
17839  XYca.bind("<Right>", onCanvasRightArrow)
17840  XYca.bind("<space>", onCanvasSpaceBar)
17841  XYca.bind("a", onCanvasAverage)
17842  XYca.pack(side=TOP, fill=BOTH, expand=YES)
17843  #
17844  RUNframe = Frame( frame2xyr )
17845  RUNframe.pack(side=TOP)
17846  rbxy = Button(RUNframe, text="Run", style="Run.TButton", command=BStart)
17847  rbxy.pack(side=LEFT)
17848  sbxy = Button(RUNframe, text="Stop", style="Stop.TButton", command=BStop)
17849  sbxy.pack(side=LEFT)
17850  # Open Math trace menu
17851  mathbt = Button(frame2xyr, text="Math", style="W5.TButton", command = NewEnterMathControls)
17852  mathbt.pack(side=TOP) #, anchor=W)
17853  # Disply mode menu
17854  # X - Y mode signal select
17855  AxisLabX = Label(frame2xyr, text ="-X Axis-", style="A10R1.TLabelframe.Label")
17856  AxisLabX.pack(side=TOP)
17857  chaxmenu = Frame( frame2xyr )
17858  chaxmenu.pack(side=TOP)
17859  rbx2 = Radiobutton(chaxmenu, text='CA-V', variable=Xsignal, value=1, command=UpdateXYTrace)
17860  rbx2.pack(side=LEFT, anchor=W)
17861  rbx3 = Radiobutton(chaxmenu, text='CA-I', variable=Xsignal, value=2, command=UpdateXYTrace)
17862  rbx3.pack(side=LEFT, anchor=W)
17863  chbxmenu = Frame( frame2xyr )
17864  chbxmenu.pack(side=TOP)
17865  rbx4 = Radiobutton(chbxmenu, text='CB-V', variable=Xsignal, value=3, command=UpdateXYTrace)
17866  rbx4.pack(side=LEFT, anchor=W)
17867  rbx5 = Radiobutton(chbxmenu, text='CB-I', variable=Xsignal, value=4, command=UpdateXYTrace)
17868  rbx5.pack(side=LEFT, anchor=W)
17869  rbx7 = Radiobutton(frame2xyr, text='Histogram CA-V', variable=Xsignal, value=6, command=BHistAsPercent)
17870  rbx7.pack(side=TOP)
17871  rbx8 = Radiobutton(frame2xyr, text='Histogram CB-V', variable=Xsignal, value=7, command=BHistAsPercent)
17872  rbx8.pack(side=TOP)
17873  rbx6 = Radiobutton(frame2xyr, text='Math', variable=Xsignal, value=5, command=UpdateXYTrace)
17874  rbx6.pack(side=TOP)
17875  #
17876  AxisLabY = Label(frame2xyr, text ="-Y Axis-", style="A10R2.TLabelframe.Label")
17877  AxisLabY.pack(side=TOP)
17878  chaymenu = Frame( frame2xyr )
17879  chaymenu.pack(side=TOP)
17880  rby2 = Radiobutton(chaymenu, text='CA-V', variable=Ysignal, value=1, command=UpdateXYTrace)
17881  rby2.pack(side=LEFT, anchor=W)
17882  rby3 = Radiobutton(chaymenu, text='CA-I', variable=Ysignal, value=2, command=UpdateXYTrace)
17883  rby3.pack(side=LEFT, anchor=W)
17884  chbymenu = Frame( frame2xyr )
17885  chbymenu.pack(side=TOP)
17886  rby4 = Radiobutton(chbymenu, text='CB-V', variable=Ysignal, value=3, command=UpdateXYTrace)
17887  rby4.pack(side=LEFT, anchor=W)
17888  rby5 = Radiobutton(chbymenu, text='CB-I', variable=Ysignal, value=4, command=UpdateXYTrace)
17889  rby5.pack(side=LEFT, anchor=W)
17890  rby6 = Radiobutton(frame2xyr, text='Math', variable=Ysignal, value=5, command=UpdateXYTrace)
17891  rby6.pack(side=TOP)
17892  # show cursor menu buttons
17893  cursormenu = Frame( frame2xyr )
17894  cursormenu.pack(side=TOP)
17895  cb1 = Checkbutton(cursormenu, text='X-Cur', variable=ShowXCur)
17896  cb1.pack(side=LEFT, anchor=W)
17897  cb2 = Checkbutton(cursormenu, text='Y-Cur', variable=ShowYCur)
17898  cb2.pack(side=LEFT, anchor=W)
17899  cb3 = Checkbutton(frame2xyr, text='RX-Y', variable=ShowRXY, command=UpdateXYTrace)
17900  cb3.pack(side=TOP)
17901  cb4 = Checkbutton(frame2xyr, text='Persistance', variable=ScreenXYrefresh, command=UpdateXYTrace)
17902  cb4.pack(side=TOP)
17903  #
17904  snapbutton = Button(frame2xyr, style="W11.TButton", text="SnapShot", command=BSnapShot)
17905  snapbutton.pack(side=TOP)
17906  savebutton = Button(frame2xyr, style="W11.TButton", text="Save Screen", command=BSaveScreenXY)
17907  savebutton.pack(side=TOP)
17908  dismissxybutton = Button(frame2xyr, style="W7.TButton", text="Dismiss", command=DestroyXYScreen)
17909  dismissxybutton.pack(side=TOP)
17910  ADI1xy = Label(frame2xyr, image=logo, anchor= "sw", compound="top") # , height=49, width=116
17911  ADI1xy.pack(side=TOP)
17912 
17913  # Bottom Buttons
17914  MarkerXYScale = IntVar(0)
17915  MarkerXYScale.set(1)
17916  # Voltage channel A
17917  CHAsbxy = Spinbox(frame3xy, width=4, cursor='double_arrow', values=CHvpdiv)
17918  CHAsbxy.bind('<MouseWheel>', onSpinBoxScroll)
17919  CHAsbxy.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
17920  CHAsbxy.bind("<Button-5>", onSpinBoxScroll)
17921  CHAsbxy.pack(side=LEFT)
17922  CHAsbxy.delete(0,"end")
17923  CHAsbxy.insert(0,0.5)
17924  CHAxylab = Button(frame3xy, text="CA V/Div", style="Rtrace1.TButton", command=SetXYScaleA)
17925  CHAxylab.pack(side=LEFT)
17926 
17927  CHAVPosEntryxy = Entry(frame3xy, width=5, cursor='double_arrow')
17928  CHAVPosEntryxy.bind('<Return>', onTextKey)
17929  CHAVPosEntryxy.bind('<MouseWheel>', onTextScroll)
17930  CHAVPosEntryxy.bind("<Button-4>", onTextScroll)# with Linux OS
17931  CHAVPosEntryxy.bind("<Button-5>", onTextScroll)
17932  CHAVPosEntryxy.bind('<Key>', onTextKey)
17933  CHAVPosEntryxy.pack(side=LEFT)
17934  CHAVPosEntryxy.delete(0,"end")
17935  CHAVPosEntryxy.insert(0,2.5)
17936  CHAofflabxy = Button(frame3xy, text="CA V Pos", style="Rtrace1.TButton", command=SetXYVAPoss)
17937  CHAofflabxy.pack(side=LEFT)
17938  # Current channel A
17939  CHAIsbxy = Spinbox(frame3xy, width=4, cursor='double_arrow', values=CHipdiv)
17940  CHAIsbxy.bind('<MouseWheel>', onSpinBoxScroll)
17941  CHAIsbxy.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
17942  CHAIsbxy.bind("<Button-5>", onSpinBoxScroll)
17943  CHAIsbxy.pack(side=LEFT)
17944  CHAIsbxy.delete(0,"end")
17945  CHAIsbxy.insert(0,50.0)
17946  CHAIlabxy = Label(frame3xy, text="CA mA/Div", style="Strace3.TButton")
17947  CHAIlabxy.pack(side=LEFT)
17948 
17949  CHAIPosEntryxy = Entry(frame3xy, width=5, cursor='double_arrow')
17950  CHAIPosEntryxy.bind('<Return>', onTextKey)
17951  CHAIPosEntryxy.bind('<MouseWheel>', onTextScroll)
17952  CHAIPosEntryxy.bind("<Button-4>", onTextScroll)# with Linux OS
17953  CHAIPosEntryxy.bind("<Button-5>", onTextScroll)
17954  CHAIPosEntryxy.bind('<Key>', onTextKey)
17955  CHAIPosEntryxy.pack(side=LEFT)
17956  CHAIPosEntryxy.delete(0,"end")
17957  CHAIPosEntryxy.insert(0,0.0)
17958  CHAIofflabxy = Button(frame3xy, text="CA I Pos", style="Rtrace3.TButton", command=SetXYIAPoss)
17959  CHAIofflabxy.pack(side=LEFT)
17960  # Voltage channel B
17961  CHBsbxy = Spinbox(frame4xy, width=4, cursor='double_arrow', values=CHvpdiv)
17962  CHBsbxy.bind('<MouseWheel>', onSpinBoxScroll)
17963  CHBsbxy.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
17964  CHBsbxy.bind("<Button-5>", onSpinBoxScroll)
17965  CHBsbxy.pack(side=LEFT)
17966  CHBsbxy.delete(0,"end")
17967  CHBsbxy.insert(0,0.5)
17968  #
17969  CHBxylab = Button(frame4xy, text="CB V/Div", style="Strace2.TButton", command=SetXYScaleB)
17970  CHBxylab.pack(side=LEFT)
17971 
17972  CHBVPosEntryxy = Entry(frame4xy, width=5, cursor='double_arrow')
17973  CHBVPosEntryxy.bind('<Return>', onTextKey)
17974  CHBVPosEntryxy.bind('<MouseWheel>', onTextScroll)
17975  CHBVPosEntryxy.bind("<Button-4>", onTextScroll)# with Linux OS
17976  CHBVPosEntryxy.bind("<Button-5>", onTextScroll)
17977  CHBVPosEntryxy.bind('<Key>', onTextKey)
17978  CHBVPosEntryxy.pack(side=LEFT)
17979  CHBVPosEntryxy.delete(0,"end")
17980  CHBVPosEntryxy.insert(0,2.5)
17981  CHBofflabxy = Button(frame4xy, text="CB V Pos", style="Rtrace2.TButton", command=SetXYVBPoss)
17982  CHBofflabxy.pack(side=LEFT)
17983  # Current channel B
17984  CHBIsbxy = Spinbox(frame4xy, width=4, cursor='double_arrow', values=CHipdiv) #
17985  CHBIsbxy.bind('<MouseWheel>', onSpinBoxScroll)
17986  CHBIsbxy.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
17987  CHBIsbxy.bind("<Button-5>", onSpinBoxScroll)
17988  CHBIsbxy.pack(side=LEFT)
17989  CHBIsbxy.delete(0,"end")
17990  CHBIsbxy.insert(0,50.0)
17991  CHBIlabxy = Label(frame4xy, text="CB mA/Div", style="Strace4.TButton")
17992  CHBIlabxy.pack(side=LEFT)
17993 
17994  CHBIPosEntryxy = Entry(frame4xy, width=5, cursor='double_arrow')
17995  CHBIPosEntryxy.bind('<Return>', onTextKey)
17996  CHBIPosEntryxy.bind('<MouseWheel>', onTextScroll)
17997  CHBIPosEntryxy.bind("<Button-4>", onTextScroll)# with Linux OS
17998  CHBIPosEntryxy.bind("<Button-5>", onTextScroll)
17999  CHBIPosEntryxy.bind('<Key>', onTextKey)
18000  CHBIPosEntryxy.pack(side=LEFT)
18001  CHBIPosEntryxy.delete(0,"end")
18002  CHBIPosEntryxy.insert(0,0.0)
18003  CHBIofflabxy = Button(frame4xy, text="CB I Pos", style="Rtrace4.TButton", command=SetXYIBPoss)
18004  CHBIofflabxy.pack(side=LEFT)
18005  #
18006  if ShowBallonHelp > 0:
18007  #xb1_tip = CreateToolTip(xb1, 'Enter formula for X axis Math trace')
18008  #xb2_tip = CreateToolTip(xb2, 'Enter which axis controls to use for X axis Math trace')
18009  #yb1_tip = CreateToolTip(yb1, 'Enter formula for Y axis Math trace')
18010  #yb2_tip = CreateToolTip(yb2, 'Enter which axis controls to use for Y axis Math trace')
18011  math_tip = CreateToolTip(mathbt, 'Open Math window')
18012  bsxy_tip = CreateToolTip(sbxy, 'Stop acquiring data')
18013  brxy_tip = CreateToolTip(rbxy, 'Start acquiring data')
18014  snapbutton_tip = CreateToolTip(snapbutton, 'Take snap shot of current trace')
18015  savebutton_tip = CreateToolTip(savebutton, 'Save current trace to EPS file')
18016  dismissxybutton_tip = CreateToolTip(dismissxybutton, 'Diamiss X-Y plot window')
18017  CHAxylab_tip = CreateToolTip(CHAxylab, 'Select CHA-V vertical range/position axis to be used for markers and drawn color')
18018  CHBxylab_tip = CreateToolTip(CHBxylab, 'Select CHB-V vertical range/position axis to be used for markers and drawn color')
18019  CHAxyofflab_tip = CreateToolTip(CHAofflabxy, 'Set CHA-V position to DC average of signal')
18020  CHBxyofflab_tip = CreateToolTip(CHBofflabxy, 'Set CHB-V position to DC average of signal')
18021  CHAIxyofflab_tip = CreateToolTip(CHAIofflabxy, 'Set CHA-I position to DC average of signal')
18022  CHBIxyofflab_tip = CreateToolTip(CHBIofflabxy, 'Set CHB-I position to DC average of signal')
18023  if LocalLanguage != "English":
18024  BLoadConfig(LocalLanguage)
18025 
18027  global xywindow, XYScreenStatus, ca, XYDisp
18028 
18029  XYScreenStatus.set(0)
18030  XYDisp.set(0)
18031  XYCheckBox()
18032  xywindow.destroy()
18033  ca.bind_all('<MouseWheel>', onCanvasClickScroll)
18034 #
18035 # Optional Calibration procedure routine
18036 #
18038  global DevID, devx, CHA, CHB, RevDate, OnBoardRes, AD584act, FWRevOne
18039  global discontloop, contloop, session, AWGSync, SWRev
18040  # global OnBoardResAgnd, OnBoardResA25, OnBoardResBgnd, OnBoardResB25
18041  # setup cal results window
18042  if FWRevOne < 2.06: # Check firmware revision level > 2.06
18043  showwarning("WARNING","Out of date Firmware Revision!")
18044  return
18045  calwindow = Toplevel()
18046  calwindow.title("ALM1000 Calibration tool " + SWRev + RevDate)
18047  # display wigets
18048  SCallab = Label(calwindow, text="Channel Gain / Offset calibration")
18049  SCallab.grid(row=0, column=0, columnspan=2, sticky=W)
18050  labelA0 = Label(calwindow, style="A12B.TLabel")
18051  labelA0.grid(row=1, column=0, columnspan=2, sticky=W)
18052  labelA0.config(text = "CA gnd Volts")
18053  labelAMax = Label(calwindow, style="A12B.TLabel")
18054  labelAMax.grid(row=2, column=0, columnspan=2, sticky=W)
18055  labelAMax.config(text = "CA 584 Volts")
18056  labelAMin = Label(calwindow, style="A12B.TLabel")
18057  labelAMin.grid(row=3, column=0, columnspan=2, sticky=W)
18058  labelAMin.config(text = "CA 5V Src I ")
18059  labelB0 = Label(calwindow, style="A12B.TLabel")
18060  labelB0.grid(row=4, column=0, columnspan=2, sticky=W)
18061  labelB0.config(text = "CA gnd Volts")
18062  labelBMax = Label(calwindow, style="A12B.TLabel")
18063  labelBMax.grid(row=5, column=0, columnspan=2, sticky=W)
18064  labelBMax.config(text = "CB 584 Volts")
18065  labelBMin = Label(calwindow, style="A12B.TLabel")
18066  labelBMin.grid(row=6, column=0, columnspan=2, sticky=W)
18067  labelBMin.config(text = "CB 5V Src I ")
18068  labelAB = Label(calwindow, style="A12B.TLabel")
18069  labelAB.grid(row=7, column=0, columnspan=2, sticky=W)
18070  labelAB.config(text = "CA 0V Src I")
18071  labelBA = Label(calwindow, style="A12B.TLabel")
18072  labelBA.grid(row=8, column=0, columnspan=2, sticky=W)
18073  labelBA.config(text = "CA 0V Src I")
18074  labelSIA0 = Label(calwindow, style="A12B.TLabel")
18075  labelSIA0.grid(row=9, column=0, columnspan=2, sticky=W)
18076  labelSIA0.config(text = "CA 2.5 Src 0 I")
18077  labelSIA = Label(calwindow, style="A12B.TLabel")
18078  labelSIA.grid(row=10, column=0, columnspan=2, sticky=W)
18079  labelSIA.config(text = "CA 50 Src 100 ")
18080  labelSIAN = Label(calwindow, style="A12B.TLabel")
18081  labelSIAN.grid(row=11, column=0, columnspan=2, sticky=W)
18082  labelSIAN.config(text = "CA 50 Src -45")
18083  labelSIB0 = Label(calwindow, style="A12B.TLabel")
18084  labelSIB0.grid(row=12, column=0, columnspan=2, sticky=W)
18085  labelSIB0.config(text = "CB 2.5 Src 0 I")
18086  labelSIB = Label(calwindow, style="A12B.TLabel")
18087  labelSIB.grid(row=13, column=0, columnspan=2, sticky=W)
18088  labelSIB.config(text = "CB 50 Src 100 ")
18089  labelSIBN = Label(calwindow, style="A12B.TLabel")
18090  labelSIBN.grid(row=14, column=0, columnspan=2, sticky=W)
18091  labelSIBN.config(text = "CB 50 Src -45")
18092  # set to default mux and dac settings
18093  devx.ctrl_transfer(0x40, 0x24, 0x0, 0, 0, 0, 100) # set to addr DAC A
18094  devx.ctrl_transfer(0x40, 0x25, 0x1, 0, 0, 0, 100) # set to addr DAC B
18095  AWGSync.set(1)
18096  BAWGSync()
18097  if session.continuous:
18098  print( "ending session")
18099  session.end()
18100  # Setup ADALM1000
18101  if askyesno("Reset Calibration", "Do You Need To Reset Default Calibration?", parent=calwindow):
18102  #print(devx.calibration)
18103  try:
18104  devx.write_calibration("calib_default.txt")
18105  #print "wrote calib_default.txt"
18106  except:
18107  filename = askopenfilename(defaultextension = ".txt", filetypes=[("Default Cal File", "*.txt")], parent=calwindow)
18108  devx.write_calibration(filename)
18109  #print(devx.calibration)
18110  #
18111  devidstr = DevID[17:31]
18112  filename = "calib" + devidstr + ".txt"
18113  if os.path.isfile(filename):
18114  if askyesno("Calibration exists", "A previous Calibration file exists. /n Do you want to load that?", parent=calwindow):
18115  devx.write_calibration(filename)
18116  #print "wrote old ", filename
18117  calwindow.destroy()
18118  return
18119  else:
18120  if askyesno("Continue?", "Continure with self calibration?", parent=calwindow):
18121  donothing()
18122  else:
18123  calwindow.destroy()
18124  return
18125  #
18126  CalFile = open(filename, "w")
18127  #
18128  CHA.mode = Mode.HI_Z # Put CHA in Hi Z mode
18129  CHB.mode = Mode.HI_Z # Put CHB in Hi Z mode
18130  devx.ctrl_transfer( 0x40, 0x50, 34, 0, 0, 0, 100) # close voltage sense loop just in case
18131  devx.ctrl_transfer( 0x40, 0x50, 39, 0, 0, 0, 100) # close voltage sense loop just in case
18132  ADsignal1 = [] # Ain signal array channel
18133  ADsignal1 = devx.get_samples(1010)
18134  # Pause whie user connects external voltage reference AD584
18135  BadData = 1
18136  devx.ctrl_transfer(0x40, 0x51, 32, 0, 0, 0, 100) # set 2.5 V switch to open
18137  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set GND switch to open
18138  devx.ctrl_transfer(0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
18139  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18140  RequestVRef = askstring("External Reference", "Enter External Reference Voltage", initialvalue=AD584act, parent=root)
18141  try:
18142  AD584act = float(RequestVRef)*1.0
18143  except:
18144  AD584act = 3.3
18145  showinfo("CONNECT","Connect External Voltage to both CHA and CHB inputs.", parent=calwindow)
18146  while (BadData): # loop till good reading
18147  # Get A and B AD584 data
18148  CHA.mode = Mode.HI_Z # Put CHA in Hi Z mode
18149  CHB.mode = Mode.HI_Z # Put CHB in Hi Z mode
18150  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18151  CHA584Raw = CHB584Raw = 0.0 # initalize measurment variable
18152  # get_samples returns a list of values for voltage [0] and current [1]
18153  for index in range(1000): # calculate average
18154  CHA584Raw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18155  CHB584Raw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18156 
18157  CHA584Raw = CHA584Raw / 1000.0 # calculate average
18158  CHB584Raw = CHB584Raw / 1000.0 # calculate average
18159  VString = "Extern A Volts " + ' {0:.4f} '.format(CHA584Raw) # format with 4 decimal places
18160  labelAMax.config(text = VString) # change displayed value
18161  VString = "Extern B Volts " + ' {0:.4f} '.format(CHB584Raw) # format with 4 decimal places
18162  labelBMax.config(text = VString) # change displayed value
18163  Lower = AD584act - 0.3
18164  Upper = AD584act + 0.3
18165  if CHA584Raw < Lower or CHA584Raw > Upper or CHB584Raw < Lower or CHB584Raw > Upper:
18166  if askyesno("CONNECT","Did not get good data from Ref V check connections!\n Abort(Y) or Try again(N)", parent=calwindow):
18167  CHA.mode = Mode.HI_Z # Put CHA in Hi Z mode
18168  CHB.mode = Mode.HI_Z # Put CHB in Hi Z mode
18169  contloop = 0
18170  discontloop = 1
18171  calwindow.destroy()
18172  return
18173  else:
18174  BadData = 0
18175  #
18176  showinfo("DISCONNECT","Disconnect everything from CHA and CHB pins.", parent=calwindow)
18177  CHAGndRaw = CHBGndRaw = CHAI0gRaw = CHBI0gRaw = 0.0 # initalize measurment variable
18178  # Get A GND and B GND data
18179  devx.ctrl_transfer(0x40, 0x51, 32, 0, 0, 0, 100) # set 2.5 V switch to open
18180  devx.ctrl_transfer(0x40, 0x50, 33, 0, 0, 0, 100) # set GND switch to closed
18181  devx.ctrl_transfer(0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
18182  devx.ctrl_transfer(0x40, 0x50, 38, 0, 0, 0, 100) # set CHB GND switch to closed
18183  CHA.mode = Mode.HI_Z # Put CHA in Hi Z mode
18184  CHB.mode = Mode.HI_Z # Put CHB in Hi Z mode
18185  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18186  # get_samples returns a list of values for voltage [0] and current [1]
18187  for index in range(1000): # calculate average
18188  CHAGndRaw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18189  CHBGndRaw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18190  CHAI0gRaw += ADsignal1[index+10][0][1] # Sum for average CA current
18191  CHBI0gRaw += ADsignal1[index+10][1][1] # Sum for average CB current
18192 
18193  CHAGndRaw = CHAGndRaw / 1000.0 # calculate average
18194  CHAI0gRaw = CHAI0gRaw / 1000.0
18195  CHBGndRaw = CHBGndRaw / 1000.0 # calculate average
18196  CHBI0gRaw = CHBI0gRaw / 1000.0
18197  VString = "CA gnd Volts " + ' {0:.4f} '.format(CHAGndRaw) # format with 4 decimal places
18198  labelA0.config(text = VString) # change displayed value
18199  VString = "CB gnd Volts " + ' {0:.4f} '.format(CHBGndRaw) # format with 4 decimal places
18200  labelB0.config(text = VString) # change displayed value
18201  CHA2p5Raw = CHB2p5Raw = CHAI02p5Raw = CHBI02p5Raw = 0.0 # initalize measurment variable
18202  # Get A and B data for internal 2.5 rail
18203  CHA.mode = Mode.HI_Z # Put CHA in Hi Z mode
18204  CHB.mode = Mode.HI_Z # Put CHB in Hi Z mode
18205  devx.ctrl_transfer(0x40, 0x50, 32, 0, 0, 0, 100) # set 2.5 V switch to closed
18206  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set GND switch to open
18207  devx.ctrl_transfer(0x40, 0x50, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to closed
18208  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18209  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18210  # get_samples returns a list of values for voltage [0] and current [1]
18211  for index in range(1000): # calculate average
18212  CHA2p5Raw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18213  CHB2p5Raw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18214  CHAI02p5Raw += ADsignal1[index+10][0][1] # Sum for average CA current
18215  CHBI02p5Raw += ADsignal1[index+10][1][1] # Sum for average CB current
18216 
18217  CHA2p5Raw = CHA2p5Raw / 1000.0 # calculate average
18218  CHAI02p5Raw = CHAI02p5Raw / 1000.0
18219  CHB2p5Raw = CHB2p5Raw / 1000.0 # calculate average
18220  CHBI02p5Raw = CHBI02p5Raw / 1000.0
18221  # Get A force 0V and B force 0V data
18222  devx.ctrl_transfer(0x40, 0x51, 32, 0, 0, 0, 100) # set 2.5 V switch to open
18223  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set GND switch to open
18224  devx.ctrl_transfer(0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
18225  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18226  CHA.mode = Mode.SVMI
18227  CHA.constant(0.0)
18228  CHB.mode = Mode.SVMI
18229  CHB.constant(0.0)
18230  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18231  CHAF0vRaw = CHBF0vRaw = CHAI0F0Raw = CHBI0F0Raw = 0.0 # initalize measurment variable
18232  # get_samples returns a list of values for voltage [0] and current [1]
18233  for index in range(1000): # calculate average
18234  CHAF0vRaw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18235  CHBF0vRaw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18236  CHAI0F0Raw += ADsignal1[index+10][0][1] # Sum for average CA current
18237  CHBI0F0Raw += ADsignal1[index+10][1][1] # Sum for average CB current
18238 
18239  CHAF0vRaw = CHAF0vRaw / 1000.0 # calculate average
18240  CHAI0F0Raw = CHAI0F0Raw / 1000.0
18241  CHBF0vRaw = CHBF0vRaw / 1000.0 # calculate average
18242  CHBI0F0Raw = CHBI0F0Raw / 1000.0
18243  # Get A force 2.5V and B force 2.5V data
18244  CHA.mode = Mode.SVMI
18245  CHA.constant(4.5)
18246  CHB.mode = Mode.SVMI
18247  CHB.constant(4.5)
18248  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18249  CHAF25vRaw = CHAI0F25Raw = CHBF25vRaw = CHBI0F25Raw = 0.0 # initalize measurment variable
18250  # get_samples returns a list of values for voltage [0] and current [1]
18251  for index in range(1000): # calculate average
18252  CHAF25vRaw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18253  CHBF25vRaw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18254  CHAI0F25Raw += ADsignal1[index+10][0][1] # Sum for average CA current
18255  CHBI0F25Raw += ADsignal1[index+10][1][1] # Sum for average CB current
18256 
18257  CHAF25vRaw = CHAF25vRaw / 1000.0 # calculate average
18258  CHAI0F25Raw = CHAI0F25Raw / 1000.0
18259  CHBF25vRaw = CHBF25vRaw / 1000.0 # calculate average
18260  CHBI0F25Raw = CHBI0F25Raw / 1000.0
18261  #
18262  # Get A and B measure current data for int 50 res to gnd at 5V
18263  devx.ctrl_transfer(0x40, 0x51, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to open
18264  devx.ctrl_transfer(0x40, 0x50, 33, 0, 0, 0, 100) # set CHA GND switch to closed
18265  devx.ctrl_transfer(0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
18266  devx.ctrl_transfer(0x40, 0x50, 38, 0, 0, 0, 100) # set CHB GND switch to closed
18267  CHA.mode = Mode.SVMI
18268  CHA.constant(5.0)
18269  CHB.mode = Mode.SVMI
18270  CHB.constant(5.0)
18271  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18272  CHASr5vRaw = CHAISr5vRaw = CHBSr5vRaw = CHBISr5vRaw = 0.0 # initalize measurment variable
18273  for index in range(1000): # calculate average
18274  CHASr5vRaw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18275  CHBSr5vRaw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18276  CHAISr5vRaw += ADsignal1[index+10][0][1] # Sum for average CA current
18277  CHBISr5vRaw += ADsignal1[index+10][1][1] # Sum for average CB current
18278 
18279  CHASr5vRaw = CHASr5vRaw / 1000.0 # calculate average
18280  CHAISr5vRaw = CHAISr5vRaw / 1000.0
18281  CHBSr5vRaw = CHBSr5vRaw / 1000.0 # calculate average
18282  CHBISr5vRaw = CHBISr5vRaw / 1000.0
18283  VString = "CA 5V Src I " + ' {0:.4f} '.format(CHAISr5vRaw) # format with 4 decimal places
18284  labelAMin.config(text = VString) # change displayed value
18285  VString = "CB 5V Src I " + ' {0:.4f} '.format(CHBISr5vRaw) # format with 4 decimal places
18286  labelBMin.config(text = VString) # change displayed value
18287  # Get A and B measure current data for int 50 res to 2.5 V at 0V
18288  devx.ctrl_transfer(0x40, 0x50, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to closed
18289  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
18290  devx.ctrl_transfer(0x40, 0x50, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to closed
18291  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18292  CHA.mode = Mode.SVMI
18293  CHA.constant(0.001)
18294  CHB.mode = Mode.SVMI
18295  CHB.constant(0.001)
18296  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18297  CHASr0vRaw = CHAISr0vRaw = CHBSr0vRaw = CHBISr0vRaw = 0.0 # initalize measurment variable
18298  for index in range(1000): # calculate average
18299  CHASr0vRaw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18300  CHBSr0vRaw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18301  CHAISr0vRaw += ADsignal1[index+10][0][1] # Sum for average CA current
18302  CHBISr0vRaw += ADsignal1[index+10][1][1] # Sum for average CB current
18303 
18304  CHASr0vRaw = CHASr0vRaw / 1000.0 # calculate average
18305  CHAISr0vRaw = CHAISr0vRaw / 1000.0
18306  CHBSr0vRaw = CHBSr0vRaw / 1000.0 # calculate average
18307  CHBISr0vRaw = CHBISr0vRaw / 1000.0
18308  VString = "CA 0V Src I " + ' {0:.4f} '.format(CHAISr0vRaw) # format with 4 decimal places
18309  labelAB.config(text = VString) # change displayed value
18310  VString = "CB 0V Src I " + ' {0:.4f} '.format(CHBISr0vRaw) # format with 4 decimal places
18311  labelBA.config(text = VString) # change displayed value
18312 
18313  # Get A and B force 0.0 current data for int 50 res to 2.5 rail
18314  devx.ctrl_transfer(0x40, 0x50, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to closed
18315  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
18316  devx.ctrl_transfer(0x40, 0x50, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to closed
18317  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18318  CHA.mode = Mode.SIMV
18319  CHA.constant(0.0)
18320  CHB.mode = Mode.SIMV
18321  CHB.constant(0.0)
18322  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18323  CHAVSr0iRaw = CHAISr0iRaw = CHBVSr0iRaw = CHBISr0iRaw = 0.0 # initalize measurment variable
18324  for index in range(1000): # calculate average
18325  CHAVSr0iRaw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18326  CHBVSr0iRaw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18327  CHAISr0iRaw += ADsignal1[index+10][0][1] # Sum for average CA current
18328  CHBISr0iRaw += ADsignal1[index+10][1][1] # Sum for average CB current
18329 
18330  CHAVSr0iRaw = CHAVSr0iRaw / 1000.0 # calculate average
18331  CHAISr0iRaw = CHAISr0iRaw / 1000.0
18332  CHBVSr0iRaw = CHBVSr0iRaw / 1000.0 # calculate average
18333  CHBISr0iRaw = CHBISr0iRaw / 1000.0
18334  VString = "CA 2.5 Src 0 I" + ' {0:.4f} '.format(CHAISr0iRaw) # format with 4 decimal places
18335  labelSIA0.config(text = VString) # change displayed value
18336  VString = "CB 2.5 Src 0 I" + ' {0:.4f} '.format(CHBISr0iRaw) # format with 4 decimal places
18337  labelSIB0.config(text = VString) # change displayed value
18338  #
18339  # Get A and B force +0.45 current data for int 50 res to 2.5 V rail
18340  devx.ctrl_transfer(0x40, 0x50, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to closed
18341  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
18342  devx.ctrl_transfer(0x40, 0x50, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to closed
18343  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18344  CHA.mode = Mode.SIMV
18345  CHA.constant(0.045)
18346  CHB.mode = Mode.SIMV
18347  CHB.constant(0.045)
18348  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18349  CHAVSr100Raw = CHAISr100Raw = CHBVSr100Raw = CHBISr100Raw = 0.0 # initalize measurment variable
18350  for index in range(1000): # calculate average
18351  CHAVSr100Raw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18352  CHBVSr100Raw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18353  CHAISr100Raw += ADsignal1[index+10][0][1] # Sum for average CA current
18354  CHBISr100Raw += ADsignal1[index+10][1][1] # Sum for average CB current
18355 
18356  CHAVSr100Raw = CHAVSr100Raw / 1000.0 # calculate average
18357  CHAISr100Raw = CHAISr100Raw / 1000.0
18358  CHBVSr100Raw = CHBVSr100Raw / 1000.0 # calculate average
18359  CHBISr100Raw = CHBISr100Raw / 1000.0
18360  VString = "CA 50 Src +45 " + ' {0:.4f} '.format(CHAVSr100Raw) # format with 4 decimal places
18361  labelSIA.config(text = VString) # change displayed value
18362  VString = "CB 50 Src +45 " + ' {0:.4f} '.format(CHBVSr100Raw) # format with 4 decimal places
18363  labelSIB.config(text = VString) # change displayed value
18364  #
18365  # Get A and B force -0.045 current data for int 50 res to 2.5 V rail
18366  devx.ctrl_transfer(0x40, 0x50, 32, 0, 0, 0, 100) # set CHA 2.5 V switch to closed
18367  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set CHA GND switch to open
18368  devx.ctrl_transfer(0x40, 0x50, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to closed
18369  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18370  CHA.mode = Mode.SIMV
18371  CHA.constant(-0.045)
18372  CHB.mode = Mode.SIMV
18373  CHB.constant(-0.045)
18374  ADsignal1 = devx.get_samples(1010) # get samples for dev channel A0 and B0
18375  CHAVSrN45Raw = CHAISrN45Raw = CHBVSrN45Raw = CHBISrN45Raw = 0.0 # initalize measurment variable
18376  for index in range(1000): # calculate average
18377  CHAVSrN45Raw += ADsignal1[index+10][0][0] # Sum for average CA voltage
18378  CHBVSrN45Raw += ADsignal1[index+10][1][0] # Sum for average CB voltage
18379  CHAISrN45Raw += ADsignal1[index+10][0][1] # Sum for average CA current
18380  CHBISrN45Raw += ADsignal1[index+10][1][1] # Sum for average CB current
18381 
18382  CHAVSrN45Raw = CHAVSrN45Raw / 1000.0 # calculate average
18383  CHAISrN45Raw = CHAISrN45Raw / 1000.0
18384  CHBVSrN45Raw = CHBVSrN45Raw / 1000.0 # calculate average
18385  CHBISrN45Raw = CHBISrN45Raw / 1000.0
18386  VString = "CA 50 Src -45 " + ' {0:.4f} '.format(CHAVSrN45Raw) # format with 4 decimal places
18387  labelSIAN.config(text = VString) # change displayed value
18388  VString = "CB 50 Src -45 " + ' {0:.4f} '.format(CHBVSrN45Raw) # format with 4 decimal places
18389  labelSIBN.config(text = VString) # change displayed value
18390  # return all switches to open
18391  devx.ctrl_transfer(0x40, 0x51, 32, 0, 0, 0, 100) # set 2.5 V switch to open
18392  devx.ctrl_transfer(0x40, 0x51, 33, 0, 0, 0, 100) # set GND switch to open
18393  devx.ctrl_transfer(0x40, 0x51, 37, 0, 0, 0, 100) # set CHB 2.5 V switch to open
18394  devx.ctrl_transfer(0x40, 0x51, 38, 0, 0, 0, 100) # set CHB GND switch to open
18395  # Caculate voltage gain errors
18396  #
18397  CHAF25V = CHAF25vRaw * ( AD584act / CHA584Raw )
18398  CHBF25V = CHBF25vRaw * ( AD584act / CHB584Raw )
18399  #
18400  CHASr5v = CHASr5vRaw * ( AD584act / CHA584Raw ) # calculate actual voltage
18401  CHBSr5v = CHBSr5vRaw * ( AD584act / CHB584Raw ) # calculate actual voltage
18402  #
18403  CHA2p5 = CHA2p5Raw * ( AD584act / CHA584Raw )
18404  # print "calculated fixed 2.5 from CHA ", CHA2p5
18405  CHB2p5 = CHB2p5Raw * ( AD584act / CHB584Raw )
18406  # print "calculated fixed 2.5 from CHB ", CHB2p5
18407  #
18408  CHAActSrI = CHASr5v / OnBoardRes # adjust resistor value to include switch ron
18409  CHBActSrI = CHBSr5v / OnBoardRes # adjust resistor value to include switch ron
18410  #
18411  CHAActSnkI = CHASr0vRaw - CHA2p5 / OnBoardRes # adjust resistor value to include switch ron
18412  CHBActSnkI = CHBSr0vRaw - CHB2p5 / OnBoardRes # adjust resistor value to include switch ron
18413  #
18414  CHASr0i = CHAVSr0iRaw * ( AD584act / CHA584Raw )
18415  CHASr0iAct = CHASr0i / OnBoardRes # adjust resistor value to include switch ron
18416  CHASr100 = CHAVSr100Raw * ( AD584act / CHA584Raw )
18417  CHASrI100Act = (CHASr100 - CHA2p5) / OnBoardRes # adjust resistor value to include switch ron
18418  CHASrN45 = CHAVSrN45Raw * ( AD584act / CHA584Raw )
18419  CHASrIN45Act = (CHASrN45 - CHA2p5) / OnBoardRes # adjust resistor value to include switch ron
18420  #
18421  CHBSr0i = CHBVSr0iRaw * ( AD584act / CHB584Raw )
18422  CHBSr0iAct = CHBSr0i / OnBoardRes # adjust resistor value to include switch ron
18423  CHBSr100 = CHBVSr100Raw * ( AD584act / CHB584Raw )
18424  CHBSrI100Act = (CHBSr100 - CHB2p5) / OnBoardRes # adjust resistor value to include switch ron
18425  CHBSrN45 = CHBVSrN45Raw * ( AD584act / CHB584Raw )
18426  CHBSrIN45Act = (CHBSrN45 - CHB2p5) / OnBoardRes # adjust resistor value to include switch ron
18427  # Write cal factors to file
18428  #
18429  CalFile.write('# Channel A, measure V\n')
18430  CalFile.write('</>\n')
18431  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHAGndRaw) + '>\n')
18432  CalFile.write('<' + '{0:.4f}'.format(AD584act) + ', ' + '{0:.4f}'.format(CHA584Raw) + '>\n')
18433  CalFile.write('<>\n')
18434  CalFile.write('\n')
18435  #
18436  CalFile.write('# Channel A, measure I\n')
18437  CalFile.write('</>\n')
18438  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHAI02p5Raw) + '>\n')
18439  CalFile.write('<' + '{0:.4f}'.format(CHAActSrI) + ', ' + '{0:.4f}'.format(CHAISr5vRaw) + '>\n')
18440  # CalFile.write('<' + '{0:.4f}'.format(CHAISr0vRaw) + ', ' + '{0:.4f}'.format(CHAActSnkI) + '>\n')
18441  CalFile.write('<' + '{0:.4f}'.format(-CHAActSrI) + ', ' + '{0:.4f}'.format(-CHAISr5vRaw) + '>\n')
18442  CalFile.write('<>\n')
18443  CalFile.write('\n')
18444  #
18445  CalFile.write('# Channel A, source V\n')
18446  CalFile.write('</>\n')
18447  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHAF0vRaw) + '>\n')
18448  CalFile.write('<4.5000, ' + '{0:.4f}'.format(CHAF25V) + '>\n')
18449  CalFile.write('<>\n')
18450  CalFile.write('\n')
18451  #
18452  CalFile.write('# Channel A, source I\n')
18453  CalFile.write('</>\n')
18454  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHAISr0iRaw) + '>\n')
18455  CalFile.write('<0.045, ' + '{0:.4f}'.format(CHASrI100Act) + '>\n')
18456  CalFile.write('<-0.0450, ' + '{0:.4f}'.format(CHASrIN45Act) + '>\n')
18457  CalFile.write('<>\n')
18458  CalFile.write('\n')
18459  #
18460  CalFile.write('# Channel B, measure V\n')
18461  CalFile.write('</>\n')
18462  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHBGndRaw) + '>\n')
18463  CalFile.write('<' + '{0:.4f}'.format(AD584act) + ', ' + '{0:.4f}'.format(CHB584Raw) + '>\n')
18464  CalFile.write('<>\n')
18465  CalFile.write('\n')
18466  #
18467  CalFile.write('# Channel B, measure I\n')
18468  CalFile.write('</>\n')
18469  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHBI02p5Raw) + '>\n')
18470  CalFile.write('<' + '{0:.4f}'.format(CHBActSrI) + ', ' + '{0:.4f}'.format(CHBISr5vRaw) + '>\n')
18471  # CalFile.write('<' + '{0:.4f}'.format(CHBISr0vRaw) + ', ' + '{0:.4f}'.format(CHBActSnkI) + '>\n')
18472  CalFile.write('<' + '{0:.4f}'.format(-CHBActSrI) + ', ' + '{0:.4f}'.format(-CHBISr5vRaw) + '>\n')
18473  CalFile.write('<>\n')
18474  CalFile.write('\n')
18475  #
18476  CalFile.write('# Channel B, source V\n')
18477  CalFile.write('</>\n')
18478  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHBF0vRaw) + '>\n')
18479  CalFile.write('<4.5000, ' + '{0:.4f}'.format(CHAF25V) + '>\n')
18480  CalFile.write('<>\n')
18481  CalFile.write('\n')
18482  #
18483  CalFile.write('# Channel B source I\n')
18484  CalFile.write('</>\n')
18485  CalFile.write('<0.0000, ' + '{0:.4f}'.format(CHBISr0iRaw) + '>\n')
18486  CalFile.write('<0.045, ' + '{0:.4f}'.format(CHBSrI100Act) + '>\n')
18487  CalFile.write('<-0.0450, ' + '{0:.4f}'.format(CHBSrIN45Act) + '>\n')
18488  CalFile.write('<>\n')
18489  #
18490  CalFile.close()
18491  showinfo("Finish","Successfully measured cal factors!", parent=calwindow)
18492  if askyesno("Write cal", "Write Cal Data to Board?", parent=calwindow):
18493  devx.write_calibration(filename)
18494  #print "wrote new " , filename
18495  #
18496  # session.end()
18497  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z split mode
18498  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z split mode
18499  contloop = 0
18500  discontloop = 1
18501  # session.cancel()
18502  calwindow.destroy()
18503 #
18505  global cal, DevID, devx
18506 
18507  devidstr = DevID[17:31]
18508  filename = "calib" + devidstr + "test.txt"
18509  if os.path.isfile(filename):
18510  if askyesno("Calibration exists", "A previous Calibration file exists. /n Do you want to load that?"): #, parent=calwindow):
18511  return
18512  else:
18513  if askyesno("Continue?", "Continure with save calibration file?"): #, parent=calwindow):
18514  donothing()
18515  else:
18516  calwindow.destroy()
18517  return
18518  #
18519  CalFile = open(filename, "w")
18520  #
18521  # Write cal factors to file
18522  # [0]
18523  CalFile.write('# Channel A, measure V\n')
18524  CalFile.write('</>\n')
18525  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[0][0]) + '>\n')
18526  CHAgp = (5.0/cal[0][1])+cal[0][0]
18527  CalFile.write('<5.0000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18528  CalFile.write('<>\n')
18529  CalFile.write('\n')
18530  # [1]
18531  CalFile.write('# Channel A, measure I\n')
18532  CalFile.write('</>\n')
18533  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[1][0]) + '>\n')
18534  CHAgp = (0.1/cal[0][1])+cal[1][0]
18535  CalFile.write('<0.1000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18536  CHAgn = (-0.1/cal[0][2])+cal[1][0]
18537  CalFile.write('<-0.1000' + '{0:.5f}'.format(CHAgn) + '>\n')
18538  CalFile.write('<>\n')
18539  CalFile.write('\n')
18540  # [2]
18541  CalFile.write('# Channel A, source V\n')
18542  CalFile.write('</>\n')
18543  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[2][0]) + '>\n')
18544  CHAgp = (5.0/cal[2][1])+cal[2][0]
18545  CalFile.write('<5.0000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18546  CalFile.write('<>\n')
18547  CalFile.write('\n')
18548  # [3]
18549  CalFile.write('# Channel A, source I\n')
18550  CalFile.write('</>\n')
18551  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[3][0]) + '>\n')
18552  CHAgp = (0.1/cal[3][1])+cal[3][0]
18553  CalFile.write('<0.1000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18554  CHAgn = (-0.1/cal[3][2])+cal[3][0]
18555  CalFile.write('<-0.1000, ' + '{0:.5f}'.format(CHAgn) + '>\n')
18556  CalFile.write('<>\n')
18557  CalFile.write('\n')
18558  # [4]
18559  CalFile.write('# Channel B, measure V\n')
18560  CalFile.write('</>\n')
18561  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[4][0]) + '>\n')
18562  CHAgp = (5.0/cal[4][1])+cal[4][0]
18563  CalFile.write('<5.0000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18564  CalFile.write('<>\n')
18565  CalFile.write('\n')
18566  # [5]
18567  CalFile.write('# Channel B, measure I\n')
18568  CalFile.write('</>\n')
18569  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[5][0]) + '>\n')
18570  CHAgp = (0.1/cal[5][1])+cal[5][0]
18571  CalFile.write('<0.1000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18572  CHAgn = (-0.1/cal[5][2])+cal[5][0]
18573  CalFile.write('<-0.1000, ' + '{0:.5f}'.format(CHAgn) + '>\n')
18574  CalFile.write('<>\n')
18575  CalFile.write('\n')
18576  # [6]
18577  CalFile.write('# Channel B, source V\n')
18578  CalFile.write('</>\n')
18579  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[6][0]) + '>\n')
18580  CHAgp = (5.0/cal[6][1])+cal[6][0]
18581  CalFile.write('<5.0000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18582  CalFile.write('<>\n')
18583  CalFile.write('\n')
18584  # [7]
18585  CalFile.write('# Channel B source I\n')
18586  CalFile.write('</>\n')
18587  CalFile.write('<0.0000, ' + '{0:.5f}'.format(cal[7][0]) + '>\n')
18588  CHAgp = (0.1/cal[7][1])+cal[7][0]
18589  CalFile.write('<0.1000, ' + '{0:.5f}'.format(CHAgp) + '>\n')
18590  CHAgn = (-0.1/cal[7][2])+cal[7][0]
18591  CalFile.write('<-0.1000, ' + '{0:.5f}'.format(CHAgn) + '>\n')
18592  CalFile.write('<>\n')
18593  #
18594  CalFile.close()
18595 
18597 def SPIShiftOut(DValue):
18598  global devx, PIO_0, PIO_1, PIO_2, PIO_3, SCLKPort, SDATAPort, SLATCHPort
18599 
18600  binstr = bin(DValue)
18601  binlen = len(binstr)
18602  datastr = binstr[2:binlen]
18603  datalen = len(datastr)
18604  if datalen < 16:
18605  datastr = str.rjust(datastr , 16 , '0')
18606  datalen = len(datastr)
18607  i = 1
18608  devx.ctrl_transfer(0x40, 0x50, SLATCHPort.get(), 0, 0, 0, 100) # fsync to 0
18609  while i < datalen+1:
18610  # sending 0x50 = set to 0, 0x51 = set to 1
18611  D1code = 0x50 + int(datastr[i-1])
18612  devx.ctrl_transfer(0x40, D1code, SDATAPort.get(), 0, 0, 0, 100) # data bit
18613  devx.ctrl_transfer(0x40, 0x51, SCLKPort.get(), 0, 0, 0, 100) # sclk to 1
18614  devx.ctrl_transfer(0x40, 0x50, SCLKPort.get(), 0, 0, 0, 100) # sclk to 0
18615  devx.ctrl_transfer(0x40, 0x51, SCLKPort.get(), 0, 0, 0, 100) # sclk to 1
18616  i = i + 1
18617  devx.ctrl_transfer(0x40, 0x51, SLATCHPort.get(), 0, 0, 0, 100) # fsync to 1
18618 #
18619 def SetAD9833(temp):
18620  global FminEntry, HtMulEntry, MinigenFout, MinigenMode, etssrlab, EnableMinigenMode # , Fclk, Fout
18621  global Two28, mclk, EnableHSsampling, MinigenScreenStatus, ETSts, Two_X_Sample
18622 
18623  #
18624  if MinigenScreenStatus.get() == 0:
18625  #SRstring = "ET Sample Rate = " + str(SAMPLErate*MulX)
18626  #etssrlab.config(text=SRstring)
18627  return
18628  #
18629  if EnableMinigenMode == 2:
18630  MinigenMode.set(40)
18631  #
18632  try:
18633  FminE = float(eval(FminEntry.get()))*1000
18634  except:
18635  if EnableHSsampling > 0:
18636  FminEntry.delete(0,END)
18637  FminEntry.insert(0, FminE/1000)
18638  if MulX == 1:
18639  Fmin = FminE
18640  else:
18641  Fmin = FminE - (FminE/MulX)
18642  #
18643  MinigenFout.delete(0,"end")
18644  MinigenFout.insert(0,Fmin)
18645  #
18646  BSendMG()
18647 
18649 def BSendMG():
18650  global MinigenFclk, MinigenFout, MinigenMode
18651  global Two28, SCLKPort, SDATAPort, SLATCHPort
18652 
18653  DValue = 8192 + MinigenMode.get()
18654  SPIShiftOut(DValue)
18655  try:
18656  fout = float(eval(MinigenFout.get()))
18657  except:
18658  MinigenFout.delete(0,"end")
18659  MinigenFout.insert(0,100)
18660  try:
18661  mclk = float(eval(MinigenFclk.get()))*1000000 # convert from MHz to Hz
18662  except:
18663  MingenFclk.delete(0,"end")
18664  MinigenFclk.insert(0,16)
18665  Freg = int((fout*Two28)/mclk)
18666  Foutstr = bin(Freg)
18667  Foutlen = len(Foutstr)
18668  datastr = Foutstr[2:Foutlen]
18669  datalen = len(datastr)
18670  if datalen < 28:
18671  datastr = str.rjust(datastr , 28 , '0')
18672  datalen = len(datastr)
18673  Fmsb = '0b01' + datastr[0:14]
18674  Flsb = '0b01' + datastr[14:]
18675  FValue = int(eval(Flsb))
18676  SPIShiftOut(FValue)
18677  FValue = int(eval(Fmsb))
18678  SPIShiftOut(FValue)
18679 
18682  global RevDate, minigenwindow, MinigenMode, MinigenScreenStatus, MinigenFclk, MinigenFout, SWRev
18683  global SCLKPort, SDATAPort, SLATCHPort
18684  global GenericSerialStatus
18685  global PIO_0, PIO_1, PIO_2, PIO_3
18686 
18687  if GenericSerialStatus.get() == 1:
18688  GenericSerialStatus.set(0)
18690  if MinigenScreenStatus.get() == 0:
18691  MinigenScreenStatus.set(1)
18692  minigenwindow = Toplevel()
18693  minigenwindow.title("-AD983x DDS- " + SWRev + RevDate)
18694  minigenwindow.resizable(FALSE,FALSE)
18695  minigenwindow.protocol("WM_DELETE_WINDOW", DestroyMinigenScreen)
18696  #
18697  MinigenMode = IntVar(0)
18698  mgb1 = Radiobutton(minigenwindow, text="Sine", variable=MinigenMode, value=0, command=BSendMG )
18699  mgb1.grid(row=1, column=0, sticky=W)
18700  mgb2 = Radiobutton(minigenwindow, text="Triangle", variable=MinigenMode, value=2, command=BSendMG )
18701  mgb2.grid(row=1, column=1, columnspan=2, sticky=W)
18702  mgb3 = Radiobutton(minigenwindow, text="Square", variable=MinigenMode, value=40, command=BSendMG )
18703  mgb3.grid(row=2, column=0, sticky=W)
18704  mgb4 = Radiobutton(minigenwindow, text="Square/2", variable=MinigenMode, value=32, command=BSendMG )
18705  mgb4.grid(row=2, column=1, columnspan=2, sticky=W)
18706  f0lab = Label(minigenwindow, text="Mclk in MHz")
18707  f0lab.grid(row=3, column=0, columnspan=2, sticky=W)
18708  MinigenFclk = Entry(minigenwindow, width=5)
18709  MinigenFclk.grid(row=3, column=1, columnspan=2, sticky=W, padx=6)
18710  MinigenFclk.delete(0,"end")
18711  MinigenFclk.insert(0,16)
18712  f1lab = Label(minigenwindow, text="Output Freq")
18713  f1lab.grid(row=4, column=0, columnspan=2, sticky=W)
18714  MinigenFout = Entry(minigenwindow, width=8, cursor='double_arrow')
18715  MinigenFout.bind('<MouseWheel>', onMiniGenScroll)
18716  MinigenFout.bind("<Button-4>", onMiniGenScroll)# with Linux OS
18717  MinigenFout.bind("<Button-5>", onMiniGenScroll)
18718  MinigenFout.grid(row=4, column=1, columnspan=2, sticky=W)
18719  MinigenFout.delete(0,"end")
18720  MinigenFout.insert(0,100)
18721  bsn1 = Button(minigenwindow, text='UpDate', style="W7.TButton", command=BSendMG)
18722  bsn1.grid(row=5, column=0, sticky=W, pady=4)
18723  dismissmgbutton = Button(minigenwindow, text="Dismiss", style="W8.TButton", command=DestroyMinigenScreen)
18724  dismissmgbutton.grid(row=5, column=1, columnspan=2, sticky=W, pady=4)
18725  #
18726  label3 = Label(minigenwindow,text="SCLK PI/O Port ")
18727  label3.grid(row=6, column=0, sticky=W)
18728  sclk1 = Radiobutton(minigenwindow, text="0", variable=SCLKPort, value=PIO_0)
18729  sclk1.grid(row=6, column=1, sticky=W)
18730  sclk2 = Radiobutton(minigenwindow, text="1", variable=SCLKPort, value=PIO_1)
18731  sclk2.grid(row=6, column=2, sticky=W)
18732  sclk3 = Radiobutton(minigenwindow, text="2", variable=SCLKPort, value=PIO_2)
18733  sclk3.grid(row=6, column=3, sticky=W)
18734  sclk4 = Radiobutton(minigenwindow, text="3", variable=SCLKPort, value=PIO_3)
18735  sclk4.grid(row=6, column=4, sticky=W)
18736  #
18737  label4 = Label(minigenwindow,text="SData PI/O Port ")
18738  label4.grid(row=7, column=0, sticky=W)
18739  sdat1 = Radiobutton(minigenwindow, text="0", variable=SDATAPort, value=PIO_0)
18740  sdat1.grid(row=7, column=1, sticky=W)
18741  sdat2 = Radiobutton(minigenwindow, text="1", variable=SDATAPort, value=PIO_1)
18742  sdat2.grid(row=7, column=2, sticky=W)
18743  sdat3 = Radiobutton(minigenwindow, text="2", variable=SDATAPort, value=PIO_2)
18744  sdat3.grid(row=7, column=3, sticky=W)
18745  sdat4 = Radiobutton(minigenwindow, text="3", variable=SDATAPort, value=PIO_3)
18746  sdat4.grid(row=7, column=4, sticky=W)
18747  #
18748  label5 = Label(minigenwindow,text="FSync PI/O Port ")
18749  label5.grid(row=8, column=0, sticky=W)
18750  slth1 = Radiobutton(minigenwindow, text="0", variable=SLATCHPort, value=PIO_0)
18751  slth1.grid(row=8, column=1, sticky=W)
18752  slth2 = Radiobutton(minigenwindow, text="1", variable=SLATCHPort, value=PIO_1)
18753  slth2.grid(row=8, column=2, sticky=W)
18754  slth3 = Radiobutton(minigenwindow, text="2", variable=SLATCHPort, value=PIO_2)
18755  slth3.grid(row=8, column=3, sticky=W)
18756  slth4 = Radiobutton(minigenwindow, text="3", variable=SLATCHPort, value=PIO_3)
18757  slth4.grid(row=8, column=4, sticky=W)
18758  #
18759 
18762  global minigenwindow, MinigenScreenStatus
18763 
18764  MinigenScreenStatus.set(0)
18765  minigenwindow.destroy()
18766 #
18767 def onMiniGenScroll(event):
18768  global ETSStatus, ETSDisp
18769 
18770  onTextScroll(event)
18771  BSendMG()
18772 
18774 def DA1ShiftOut(D1Value, D2Value):
18775  global devx
18776  global PIO_0, PIO_1, PIO_2, PIO_3
18777 
18778  binstr = bin(D1Value)
18779  binlen = len(binstr)
18780  data1str = binstr[2:binlen]
18781  datalen = len(data1str)
18782  if datalen < 16:
18783  data1str = str.rjust(data1str , 16 , '0')
18784  datalen = len(data1str)
18785  #
18786  binstr = bin(D2Value)
18787  binlen = len(binstr)
18788  data2str = binstr[2:binlen]
18789  datalen = len(data2str)
18790  if datalen < 16:
18791  data2str = str.rjust(data2str , 16 , '0')
18792  datalen = len(data2str)
18793  # sync --> PIO 0
18794  # D0 --> PIO 1
18795  # D1 --> PIO 2
18796  # SCLK --> PIO 3
18797  i = 1
18798 #
18799  devx.ctrl_transfer(0x40, 0x50, 0, 0, 0, 0, 100) # sync to 0
18800  while i < datalen+1:
18801  # sending 0x50 = set to 0, 0x51 = set to 1
18802  D1code = 0x50 + int(data1str[i-1])
18803  D2code = 0x50 + int(data2str[i-1])
18804  devx.ctrl_transfer(0x40, D1code, PIO_1, 0, 0, 0, 100) # data 0 bit
18805  devx.ctrl_transfer(0x40, D2code, PIO_2, 0, 0, 0, 100) # data 1 bit
18806  devx.ctrl_transfer(0x40, 0x51, PIO_3, 0, 0, 0, 100) # sclk to 1
18807  devx.ctrl_transfer(0x40, 0x50, PIO_3, 0, 0, 0, 100) # sclk to 0
18808  devx.ctrl_transfer(0x40, 0x51, PIO_3, 0, 0, 0, 100) # sclk to 1
18809  i = i + 1
18810  devx.ctrl_transfer(0x40, 0x51, PIO_0, 0, 0, 0, 100) # sync to 1
18811  #
18812 def BSendDA1():
18813  global DAC1Entry, DAC2Entry, DAC3Entry, DAC4Entry, REFEntry
18814 
18815  try:
18816  RefValue = float(eval(REFEntry.get()))
18817  except:
18818  RefValue = 3.3
18819  try:
18820  D1Value = float(eval(DAC1Entry.get()))
18821  except:
18822  D1Value = 0.0129
18823  D1Code = int((D1Value/RefValue)*255)
18824  if D1Code > 255:
18825  D1Code = 255
18826  D1Code = D1Code + 0x2000
18827  try:
18828  D2Value = float(eval(DAC2Entry.get()))
18829  except:
18830  D2Value = 0.0129
18831  D2Code = int((D2Value/RefValue)*255)
18832  if D2Code > 255:
18833  D2Code = 255
18834  D2Code = D2Code + 0x2400
18835  try:
18836  D3Value = float(eval(DAC3Entry.get()))
18837  except:
18838  D3Value = 0.0129
18839  D3Code = int((D3Value/RefValue)*255)
18840  if D3Code > 255:
18841  D3Code = 255
18842  D3Code = D3Code + 0x2000
18843  try:
18844  D4Value = float(eval(DAC4Entry.get()))
18845  except:
18846  D4Value = 0.0129
18847  D4Code = int((D4Value/RefValue)*255)
18848  if D4Code > 255:
18849  D4Code = 255
18850  D4Code = D4Code + 0x2400
18851  #
18852  DA1ShiftOut(D1Code, D3Code)
18853  DA1ShiftOut(D2Code, D4Code)
18854 
18857  global da1window, DA1ScreenStatus, DAC1Entry, DAC2Entry, DAC3Entry, DAC4Entry
18858  global REFEntry, RevDate, SWRev
18859 
18860  if DA1ScreenStatus.get() == 0:
18861  DA1ScreenStatus.set(1)
18862  da1window = Toplevel()
18863  da1window.title("-DA1 PMOD- " + SWRev + RevDate)
18864  da1window.resizable(FALSE,FALSE)
18865  da1window.protocol("WM_DELETE_WINDOW", DestroyDA1Screen)
18866 #
18867  d1lab = Label(da1window, text="DAC A1 output")
18868  d1lab.grid(row=0, column=0, columnspan=1, sticky=W)
18869  DAC1Entry = Entry(da1window, width=5)
18870  DAC1Entry.grid(row=0, column=1, sticky=W)
18871  DAC1Entry.delete(0,"end")
18872  DAC1Entry.insert(0,0)
18873  d2lab = Label(da1window, text="DAC B1 output")
18874  d2lab.grid(row=1, column=0, columnspan=1, sticky=W)
18875  DAC2Entry = Entry(da1window, width=5)
18876  DAC2Entry.grid(row=1, column=1, sticky=W)
18877  DAC2Entry.delete(0,"end")
18878  DAC2Entry.insert(0,0)
18879 
18880  d3lab = Label(da1window, text="DAC A2 output")
18881  d3lab.grid(row=2, column=0, columnspan=1, sticky=W)
18882  DAC3Entry = Entry(da1window, width=5)
18883  DAC3Entry.grid(row=2, column=1, sticky=W)
18884  DAC3Entry.delete(0,"end")
18885  DAC3Entry.insert(0,0)
18886 
18887  d4lab = Label(da1window, text="DAC B2 output")
18888  d4lab.grid(row=3, column=0, columnspan=1, sticky=W)
18889  DAC4Entry = Entry(da1window, width=5)
18890  DAC4Entry.grid(row=3, column=1, sticky=W)
18891  DAC4Entry.delete(0,"end")
18892  DAC4Entry.insert(0,0)
18893 
18894  d5lab = Label(da1window, text="Reference V")
18895  d5lab.grid(row=4, column=0, columnspan=1, sticky=W)
18896  REFEntry = Entry(da1window, width=5)
18897  REFEntry.grid(row=4, column=1, sticky=W)
18898  REFEntry.delete(0,"end")
18899  REFEntry.insert(0,3.3)
18900 
18901  bsn1 = Button(da1window, text='UpDate', style="W7.TButton", command=BSendDA1)
18902  bsn1.grid(row=5, column=0, sticky=W)
18903  dismissdabutton = Button(da1window, text="Dismiss", style="W8.TButton", command=DestroyDA1Screen)
18904  dismissdabutton.grid(row=5, column=1, sticky=W, pady=4)
18905 
18908  global da1window, DA1ScreenStatus
18909 
18910  DA1ScreenStatus.set(0)
18911  da1window.destroy()
18912 
18913 def DigPotShiftOut(DValue):
18914  global devx, SingleDualPot
18915  global PIO_0, PIO_1, PIO_2, PIO_3
18916 
18917  binstr = bin(DValue)
18918  binlen = len(binstr)
18919  datastr = binstr[2:binlen]
18920  datalen = len(datastr)
18921  if SingleDualPot.get() == 0: # send 10 bits of data
18922  if datalen < 10:
18923  datastr = str.rjust(datastr , 10 , '0')
18924  datalen = len(datastr)
18925  if SingleDualPot.get() == 1: # send 8 bits of data
18926  if datalen < 8:
18927  datastr = str.rjust(datastr , 8 , '0')
18928  datalen = len(datastr)
18929  if SingleDualPot.get() == 2: # send 8 bits of data
18930  if datalen < 8:
18931  datastr = str.rjust(datastr , 8 , '0')
18932  datalen = len(datastr)
18933  i = 1
18934  devx.ctrl_transfer(0x40, 0x50, PIO_3, 0, 0, 0, 100) # clock to 0
18935  devx.ctrl_transfer(0x40, 0x50, PIO_0, 0, 0, 0, 100) # CS to 0
18936  while i < datalen+1:
18937  # CS --> PIO 0
18938  # D0 --> PIO 1
18939  # D1 --> PIO 2
18940  # SCLK --> PIO 3
18941  D1code = 0x50 + int(datastr[i-1])
18942  devx.ctrl_transfer(0x40, D1code, PIO_1, 0, 0, 0, 100) # data bit
18943  devx.ctrl_transfer(0x40, 0x51, PIO_3, 0, 0, 0, 100) # clock to 1
18944  devx.ctrl_transfer(0x40, 0x50, PIO_3, 0, 0, 0, 100) # clock to 0
18945  i = i + 1
18946  devx.ctrl_transfer(0x40, 0x51, 0, 0, 0, 0, 100) # CS to 1
18947  #
18948 def DigPotSend(Temp):
18949  global DigPot1, DigPot2, DigPot3, DigPot4, SendPot1, SendPot2, SendPot3, SendPot4
18950  global SingleDualPot
18951 
18952  if SingleDualPot.get() == 0 or SingleDualPot.get() == 1:
18953  NumTaps = 255
18954  if SingleDualPot.get() == 2:
18955  NumTaps = 63
18956  try:
18957  DValue1 = DigPot1.get()
18958  if DValue1 > NumTaps:
18959  DValue1 = NumTaps
18960  except:
18961  DValue1 = 0
18962  try:
18963  DValue2 = DigPot2.get()
18964  if DValue2 > NumTaps:
18965  DValue2 = NumTaps
18966  except:
18967  DValue2 = 0
18968  try:
18969  DValue3 = DigPot3.get()
18970  if DValue3 > NumTaps:
18971  DValue3 = NumTaps
18972  except:
18973  DValue3 = 0
18974  try:
18975  DValue4 = DigPot4.get()
18976  if DValue4 > NumTaps:
18977  DValue4 = NumTaps
18978  except:
18979  DValue4 = 0
18980  if SendPot1.get() > 0:
18981  DigPotShiftOut(DValue1)
18982  if SendPot2.get() > 0:
18983  DigPotShiftOut(DValue2+NumTaps+1)
18984  if SendPot3.get() > 0:
18985  DigPotShiftOut(DValue3+2*(NumTaps+1))
18986  if SendPot4.get() > 0:
18987  DigPotShiftOut(DValue4+3*(NumTaps+1))
18988 
18990  global SingleDualPot, DPotlabel, DigPot1, DigPot2, DigPot3, DigPot4
18991 
18992  if SingleDualPot.get() == 0 or SingleDualPot.get() == 1:
18993  DPotlabel.config(text="Enter number from 0 to 255")
18994  DigPot1.config(from_=0, to=255, length=256)
18995  DigPot2.config(from_=0, to=255, length=256)
18996  DigPot3.config(from_=0, to=255, length=256)
18997  DigPot4.config(from_=0, to=255, length=256)
18998  if SingleDualPot.get() == 2:
18999  DPotlabel.config(text="Enter number from 0 to 63")
19000  DigPot1.config(from_=0, to=63, length=64)
19001  DigPot2.config(from_=0, to=63, length=64)
19002  DigPot3.config(from_=0, to=63, length=64)
19003  DigPot4.config(from_=0, to=63, length=64)
19004 
19007  global digpotwindow, DigPotScreenStatus, DigPot1, DigPot2, DigPot3, DigPot4, RevDate
19008  global SendPot1, SendPot2, SendPot3, SendPot4, SingleDualPot, SWRev
19009  global DPotlabel, DigPot1, DigPot2, DigPot3, DigPot4
19010 
19011  if DigPotScreenStatus.get() == 0:
19012  DigPotScreenStatus.set(1)
19013  digpotwindow = Toplevel()
19014  digpotwindow.title("Digital Potentiometer " + SWRev + RevDate)
19015  digpotwindow.resizable(FALSE,FALSE)
19016  digpotwindow.protocol("WM_DELETE_WINDOW", DestroyDigPotScreen)
19017  #
19018  SendPot1 = IntVar(0)
19019  SendPot1.set(1)
19020  SendPot2 = IntVar(0)
19021  SendPot2.set(1)
19022  SendPot3 = IntVar(0)
19023  SendPot3.set(0)
19024  SendPot4 = IntVar(0)
19025  SendPot4.set(0)
19026  DPotlabel = Label(digpotwindow,text="Enter number from 0 to 255", style="A12B.TLabel")
19027  DPotlabel.grid(row=0, column=0, columnspan=3, sticky=W)
19028 
19029  SingleDualPot = IntVar(0)
19030  SingleDualPot.set(0)
19031  CompMenu = Menubutton(digpotwindow, text="Sel Comp.", style="W8.TButton")
19032  CompMenu.menu = Menu(CompMenu, tearoff = 0 )
19033  CompMenu["menu"] = CompMenu.menu
19034  CompMenu.menu.add_radiobutton(label="AD840X", variable=SingleDualPot, value=0, command=UpdatePotSlider)
19035  CompMenu.menu.add_radiobutton(label="AD5160", variable=SingleDualPot, value=1, command=UpdatePotSlider)
19036  CompMenu.menu.add_radiobutton(label="AD5203", variable=SingleDualPot, value=2, command=UpdatePotSlider)
19037  CompMenu.grid(row=1, column=0, columnspan=2, sticky=W)
19038  lab1 = Checkbutton(digpotwindow,text="Pot 1", variable=SendPot1)
19039  lab1.grid(row=2, column=0, sticky=W)
19040  DigPot1 = Scale(digpotwindow, from_=0, to=255, orient=HORIZONTAL, command=DigPotSend, length=256)
19041  DigPot1.grid(row=3, column=0, columnspan=3, sticky=W)
19042  lab2 = Checkbutton(digpotwindow,text="Pot 2", variable=SendPot2)
19043  lab2.grid(row=4, column=0, sticky=W)
19044  DigPot2 = Scale(digpotwindow, from_=0, to=255, orient=HORIZONTAL, command=DigPotSend, length=256)
19045  DigPot2.grid(row=5, column=0, columnspan=3, sticky=W)
19046  lab3 = Checkbutton(digpotwindow,text="Pot 3", variable=SendPot3)
19047  lab3.grid(row=6, column=0, sticky=W)
19048  DigPot3 = Scale(digpotwindow, from_=0, to=255, orient=HORIZONTAL, command=DigPotSend, length=256)
19049  DigPot3.grid(row=7, column=0, columnspan=3, sticky=W)
19050  lab4 = Checkbutton(digpotwindow,text="Pot 4", variable=SendPot4)
19051  lab4.grid(row=8, column=0, sticky=W)
19052  DigPot4 = Scale(digpotwindow, from_=0, to=255, orient=HORIZONTAL, command=DigPotSend, length=256)
19053  DigPot4.grid(row=9, column=0, columnspan=3, sticky=W)
19054  dismissdpbutton = Button(digpotwindow, text="Dismiss", style="W8.TButton", command=DestroyDigPotScreen)
19055  dismissdpbutton.grid(row=10, column=0, sticky=W, pady=4)
19056 
19058  global digpotwindow, DigPotScreenStatus
19059 
19060  DigPotScreenStatus.set(0)
19061  digpotwindow.destroy()
19062 
19063 def BSendGS():
19064  global serialwindow, GenericSerialStatus, SCLKPort, SDATAPort, SLATCHPort, SLatchPhase, SClockPhase
19065  global NumBitsEntry, DataBitsEntry, devx, SerDirection, DValue, NumBits, AD5626SerialStatus, AD5626Entry
19066 
19067  if AD5626SerialStatus.get() == 0:
19068  try:
19069  DValue = int(eval(DataBitsEntry.get()))
19070  if DValue < 0:
19071  DValue = 0
19072  except:
19073  DValue = 0
19074  try:
19075  NumBits = int(NumBitsEntry.get())
19076  if NumBits < 1:
19077  NumBits = 1
19078  except:
19079  NumBits = 8
19080  else:
19081  try:
19082  DValue = int(eval(AD5626Entry.get())*1000)
19083  if DValue < 0:
19084  DValue = 0
19085  AD5626Entry.delete(0,"end")
19086  AD5626Entry.insert(0,'0.000')
19087  if DValue > 4095:
19088  DValue = 4095
19089  AD5626Entry.delete(0,"end")
19090  AD5626Entry.insert(0,DValue/1000.0)
19091  except:
19092  DValue = 0
19093  AD5626Entry.delete(0,"end")
19094  AD5626Entry.insert(0,'0.000')
19095  NumBits = 12
19096  # print DValue
19097  binstr = bin(DValue)
19098  binlen = len(binstr)
19099  datastr = binstr[2:binlen]
19100  datalen = len(datastr)
19101  if datalen < NumBits:
19102  datastr = str.rjust(datastr , NumBits , '0')
19103  datalen = len(datastr)
19104  if SLatchPhase.get() == 0:
19105  LatchInt = 0x50
19106  LatchEnd = 0x51
19107  else:
19108  LatchInt = 0x51
19109  LatchEnd = 0x50
19110  if AD5626SerialStatus.get() > 0:
19111  LatchInt = 0x51
19112  LatchEnd = 0x50
19113  if SClockPhase.get() == 0:
19114  ClockInt = 0x50
19115  ClockEnd = 0x51
19116  else:
19117  ClockInt = 0x51
19118  ClockEnd = 0x50
19119  devx.ctrl_transfer(0x40, ClockInt, SCLKPort.get(), 0, 0, 0, 100) # clock to start value
19120  devx.ctrl_transfer(0x40, LatchInt, SLATCHPort.get(), 0, 0, 0, 100) # CS to start value
19121  i = 1
19122  while i < datalen+1:
19123  if SerDirection.get() == 1: # for MSB first
19124  D1code = 0x50 + int(datastr[datalen-i]) # 0x50 = set to 0, 0x51 = set to 1
19125  else:
19126  D1code = 0x50 + int(datastr[i-1]) # for LSB first
19127  devx.ctrl_transfer(0x40, D1code, SDATAPort.get(), 0, 0, 0, 100) # data bit
19128  devx.ctrl_transfer(0x40, ClockEnd, SCLKPort.get(), 0, 0, 0, 100) # clock to end value
19129  devx.ctrl_transfer(0x40, ClockInt, SCLKPort.get(), 0, 0, 0, 100) # clock to start value
19130  i = i + 1
19131  devx.ctrl_transfer(0x40, ClockEnd, SCLKPort.get(), 0, 0, 0, 100) # clock to end value
19132  devx.ctrl_transfer(0x40, LatchEnd, SLATCHPort.get(), 0, 0, 0, 100) # CS to end value
19133  devx.ctrl_transfer(0x40, LatchInt, SLATCHPort.get(), 0, 0, 0, 100) # CS to start value
19134  devx.ctrl_transfer(0x40, LatchEnd, SLATCHPort.get(), 0, 0, 0, 100) # CS to end value
19135 
19138  global ad5626window, AD5626SerialStatus, SCLKPort, SDATAPort, SLATCHPort, SLatchPhase, SClockPhase
19139  global GenericSerialStatus, AD5626Entry, SerDirection, SWRev
19140  global PIO_0, PIO_1, PIO_2, PIO_3
19141 
19142  if GenericSerialStatus.get() == 1:
19143  GenericSerialStatus.set(0)
19145  if AD5626SerialStatus.get() == 0:
19146  AD5626SerialStatus.set(1)
19147  ad5626window = Toplevel()
19148  ad5626window.title("AD5626 Output " + SWRev + RevDate)
19149  ad5626window.resizable(FALSE,FALSE)
19150  ad5626window.protocol("WM_DELETE_WINDOW", DestroyAD5626Screen)
19151 #
19152  SLatchPhase = IntVar(0)
19153  SLatchPhase.set(0)
19154  SClockPhase = IntVar(0)
19155  SClockPhase.set(1)
19156  SerDirection = IntVar(0)
19157  SerDirection.set(0)
19158  #
19159  label2 = Label(ad5626window,text="Enter Output Volts")
19160  label2.grid(row=1, column=0, columnspan=1, sticky=W)
19161  AD5626Entry = Entry(ad5626window, width=10, cursor='double_arrow')
19162  AD5626Entry.bind('<MouseWheel>', onAD5626Scroll)
19163  AD5626Entry.bind("<Button-4>", onAD5626Scroll)# with Linux OS
19164  AD5626Entry.bind("<Button-5>", onAD5626Scroll)
19165  AD5626Entry.grid(row=1, column=1, columnspan=3, sticky=W)
19166  AD5626Entry.delete(0,"end")
19167  AD5626Entry.insert(0,'0.000')
19168  #
19169  label3 = Label(ad5626window,text="SCLK PI/O Port ")
19170  label3.grid(row=2, column=0, columnspan=1, sticky=W)
19171  sclk1 = Radiobutton(ad5626window, text="0", variable=SCLKPort, value=PIO_0)
19172  sclk1.grid(row=2, column=1, sticky=W)
19173  sclk2 = Radiobutton(ad5626window, text="1", variable=SCLKPort, value=PIO_1)
19174  sclk2.grid(row=2, column=2, sticky=W)
19175  sclk3 = Radiobutton(ad5626window, text="2", variable=SCLKPort, value=PIO_2)
19176  sclk3.grid(row=2, column=3, sticky=W)
19177  sclk4 = Radiobutton(ad5626window, text="3", variable=SCLKPort, value=PIO_3)
19178  sclk4.grid(row=2, column=4, sticky=W)
19179  #
19180  label4 = Label(ad5626window,text="SData PI/O Port ")
19181  label4.grid(row=3, column=0, columnspan=1, sticky=W)
19182  sdat1 = Radiobutton(ad5626window, text="0", variable=SDATAPort, value=PIO_0)
19183  sdat1.grid(row=3, column=1, sticky=W)
19184  sdat2 = Radiobutton(ad5626window, text="1", variable=SDATAPort, value=PIO_1)
19185  sdat2.grid(row=3, column=2, sticky=W)
19186  sdat3 = Radiobutton(ad5626window, text="2", variable=SDATAPort, value=PIO_2)
19187  sdat3.grid(row=3, column=3, sticky=W)
19188  sdat4 = Radiobutton(ad5626window, text="3", variable=SDATAPort, value=PIO_3)
19189  sdat4.grid(row=3, column=4, sticky=W)
19190  #
19191  label5 = Label(ad5626window,text="Latch PI/O Port ")
19192  label5.grid(row=4, column=0, columnspan=1, sticky=W)
19193  slth1 = Radiobutton(ad5626window, text="0", variable=SLATCHPort, value=PIO_0)
19194  slth1.grid(row=4, column=1, sticky=W)
19195  slth2 = Radiobutton(ad5626window, text="1", variable=SLATCHPort, value=PIO_1)
19196  slth2.grid(row=4, column=2, sticky=W)
19197  slth3 = Radiobutton(ad5626window, text="2", variable=SLATCHPort, value=PIO_2)
19198  slth3.grid(row=4, column=3, sticky=W)
19199  slth4 = Radiobutton(ad5626window, text="3", variable=SLATCHPort, value=PIO_3)
19200  slth4.grid(row=4, column=4, sticky=W)
19201  #
19202  bsn1 = Button(ad5626window, text='Send', style="W5.TButton", command=BSendGS)
19203  bsn1.grid(row=5, column=0, sticky=W)
19204  dismissgsbutton = Button(ad5626window, text="Dismiss", style="W8.TButton", command=DestroyAD5626Screen)
19205  dismissgsbutton.grid(row=5, column=1, columnspan=2, sticky=W, pady=4)
19206 #
19207 def onAD5626Scroll(event):
19208  onTextScroll(event)
19209  BSendGS()
19210 
19212  global ad5626window, AD5626SerialStatus
19213 
19214  AD5626SerialStatus.set(0)
19215  ad5626window.destroy()
19216 
19218  global serialwindow, GenericSerialStatus, SCLKPort, SDATAPort, SLATCHPort, SLatchPhase, SClockPhase
19219  global NumBitsEntry, DataBitsEntry, SerDirection, RevDate, SWRev
19220  global PIO_0, PIO_1, PIO_2, PIO_3
19221 
19222  if GenericSerialStatus.get() == 0:
19223  GenericSerialStatus.set(1)
19224  serialwindow = Toplevel()
19225  serialwindow.title("Generic Serial Output " + SWRev + RevDate)
19226  serialwindow.resizable(FALSE,FALSE)
19227  serialwindow.protocol("WM_DELETE_WINDOW", DestroyGenericSerialScreen)
19228  #
19229  SCLKPort = IntVar(0)
19230  SCLKPort.set(PIO_2)
19231  SDATAPort = IntVar(0)
19232  SDATAPort.set(PIO_1)
19233  SLATCHPort = IntVar(0)
19234  SLATCHPort.set(PIO_0)
19235  SLatchPhase = IntVar(0)
19236  SClockPhase = IntVar(0)
19237  SerDirection = IntVar(0)
19238  label = Label(serialwindow,text="Enter number of Bits")
19239  label.grid(row=1, column=0, columnspan=2, sticky=W)
19240  NumBitsEntry = Entry(serialwindow, width=3)
19241  NumBitsEntry.grid(row=1, column=2, sticky=W)
19242  NumBitsEntry.delete(0,"end")
19243  NumBitsEntry.insert(0,8)
19244  #
19245  label2 = Label(serialwindow,text="Enter Data Word")
19246  label2.grid(row=2, column=0, columnspan=1, sticky=W)
19247  DataBitsEntry = Entry(serialwindow, width=10)
19248  DataBitsEntry.grid(row=2, column=1, columnspan=3, sticky=W)
19249  DataBitsEntry.delete(0,"end")
19250  DataBitsEntry.insert(0,0)
19251  #
19252  label3 = Label(serialwindow,text="SCLK PI/O Port ")
19253  label3.grid(row=3, column=0, columnspan=1, sticky=W)
19254  sclk1 = Radiobutton(serialwindow, text="0", variable=SCLKPort, value=PIO_0)
19255  sclk1.grid(row=3, column=1, sticky=W)
19256  sclk2 = Radiobutton(serialwindow, text="1", variable=SCLKPort, value=PIO_1)
19257  sclk2.grid(row=3, column=2, sticky=W)
19258  sclk3 = Radiobutton(serialwindow, text="2", variable=SCLKPort, value=PIO_2)
19259  sclk3.grid(row=3, column=3, sticky=W)
19260  sclk4 = Radiobutton(serialwindow, text="3", variable=SCLKPort, value=PIO_3)
19261  sclk4.grid(row=3, column=4, sticky=W)
19262  #
19263  label4 = Label(serialwindow,text="SData PI/O Port ")
19264  label4.grid(row=4, column=0, columnspan=1, sticky=W)
19265  sdat1 = Radiobutton(serialwindow, text="0", variable=SDATAPort, value=PIO_0)
19266  sdat1.grid(row=4, column=1, sticky=W)
19267  sdat2 = Radiobutton(serialwindow, text="1", variable=SDATAPort, value=PIO_1)
19268  sdat2.grid(row=4, column=2, sticky=W)
19269  sdat3 = Radiobutton(serialwindow, text="2", variable=SDATAPort, value=PIO_2)
19270  sdat3.grid(row=4, column=3, sticky=W)
19271  sdat4 = Radiobutton(serialwindow, text="3", variable=SDATAPort, value=PIO_3)
19272  sdat4.grid(row=4, column=4, sticky=W)
19273  #
19274  label5 = Label(serialwindow,text="Latch PI/O Port ")
19275  label5.grid(row=5, column=0, columnspan=1, sticky=W)
19276  slth1 = Radiobutton(serialwindow, text="0", variable=SLATCHPort, value=PIO_0)
19277  slth1.grid(row=5, column=1, sticky=W)
19278  slth2 = Radiobutton(serialwindow, text="1", variable=SLATCHPort, value=PIO_1)
19279  slth2.grid(row=5, column=2, sticky=W)
19280  slth3 = Radiobutton(serialwindow, text="2", variable=SLATCHPort, value=PIO_2)
19281  slth3.grid(row=5, column=3, sticky=W)
19282  slth4 = Radiobutton(serialwindow, text="3", variable=SLATCHPort, value=PIO_3)
19283  slth4.grid(row=5, column=4, sticky=W)
19284  #
19285  label6 = Label(serialwindow,text="Latch Phase ")
19286  label6.grid(row=6, column=0, columnspan=1, sticky=W)
19287  sph1 = Radiobutton(serialwindow, text="0", variable=SLatchPhase, value=0)
19288  sph1.grid(row=6, column=1, sticky=W)
19289  sph2 = Radiobutton(serialwindow, text="1", variable=SLatchPhase, value=1)
19290  sph2.grid(row=6, column=2, sticky=W)
19291  #
19292  label7 = Label(serialwindow,text="Clock Phase ")
19293  label7.grid(row=7, column=0, columnspan=1, sticky=W)
19294  sph7 = Radiobutton(serialwindow, text="0", variable=SClockPhase, value=0)
19295  sph7.grid(row=7, column=1, sticky=W)
19296  sph8 = Radiobutton(serialwindow, text="1", variable=SClockPhase, value=1)
19297  sph8.grid(row=7, column=2, sticky=W)
19298  #
19299  sdir1 = Radiobutton(serialwindow, text="LSB First", variable=SerDirection, value=0 )
19300  sdir1.grid(row=8, column=0, sticky=W)
19301  sdir2 = Radiobutton(serialwindow, text="MSB First", variable=SerDirection, value=1 )
19302  sdir2.grid(row=8, column=1, columnspan=2, sticky=W)
19303 
19304  bsn1 = Button(serialwindow, text='Send', style="W5.TButton", command=BSendGS)
19305  bsn1.grid(row=9, column=0, sticky=W)
19306  dismissgsbutton = Button(serialwindow, text="Dismiss", style="W8.TButton", command=DestroyGenericSerialScreen)
19307  dismissgsbutton.grid(row=9, column=1, columnspan=2, sticky=W, pady=4)
19308 
19310  global serialwindow, GenericSerialStatus
19311 
19312  GenericSerialStatus.set(0)
19313  serialwindow.destroy()
19314 
19317  global digfltwindow, DigFiltStatus, RevDate, SWRev
19318  global DigFiltA, DigFiltB, DifFiltALength, DifFiltBLength, DifFiltAFile, DifFiltBFile
19319  global DigFiltABoxCar, DigFiltBBoxCar, BCALenEntry, BCBLenEntry
19320 
19321  if DigFiltStatus.get() == 0:
19322  DigFiltStatus.set(1)
19323  digfltwindow = Toplevel()
19324  digfltwindow.title("Digital Filter " + SWRev + RevDate)
19325  digfltwindow.resizable(FALSE,FALSE)
19326  digfltwindow.protocol("WM_DELETE_WINDOW", DestroyDigFiltScreen)
19327  #
19328  frame2 = LabelFrame(digfltwindow, text="CH A Filter", style="A10R1.TLabelframe")
19329  frame3 = LabelFrame(digfltwindow, text="CH B Filter", style="A10R2.TLabelframe")
19330  frame2.pack(side=LEFT, expand=1, fill=X)
19331  frame3.pack(side=LEFT, expand=1, fill=X)
19332  #
19333  digfilta = Frame( frame2 )
19334  digfilta.pack(side=TOP)
19335  #titlab = Label(digfltwindow,text="Apply Digital Filters ", style="A12B.TLabel")
19336  #titlab.grid(row=0, column=0, sticky=W)
19337  lab1 = Checkbutton(digfilta,text="Filter CH A", variable=DigFiltA)
19338  lab1.grid(row=0, column=0, columnspan=2, sticky=W)
19339  lab3 = Checkbutton(digfilta,text="Box Car", variable=DigFiltABoxCar, command=BuildBoxCarA)
19340  lab3.grid(row=1, column=0, sticky=W)
19341  BCALenEntry = Entry(digfilta, width=3, cursor='double_arrow')
19342  BCALenEntry.bind("<Return>", onRetDigFiltA)
19343  BCALenEntry.bind('<MouseWheel>', onDigFiltAScroll)
19344  BCALenEntry.bind("<Button-4>", onDigFiltAScroll)# with Linux OS
19345  BCALenEntry.bind("<Button-5>", onDigFiltAScroll)
19346  # BCALenEntry.bind('<Key>', onTextKey)
19347  BCALenEntry.grid(row=1, column=1, sticky=W)
19348  BCALenEntry.delete(0,"end")
19349  BCALenEntry.insert(0,2)
19350  bcalab = Label(digfilta, text="Length")
19351  bcalab.grid(row=1, column=2, sticky=W)
19352  DifFiltALength = Label(digfilta, text="Length = 0 ")
19353  DifFiltALength.grid(row=2, column=0, sticky=W)
19354  DifFiltAFile = Label(digfilta, text="File Name, none ")
19355  DifFiltAFile.grid(row=3, column=0, sticky=W)
19356  cald = Button(digfilta, text='Load CH A Filter Coef', command=BLoadDFiltA)
19357  cald.grid(row=4, column=0, columnspan=2, sticky=W)
19358  camath = Button(digfilta, text='CH A Filter formula', command=BDFiltAMath)
19359  camath.grid(row=5, column=0, columnspan=2, sticky=W)
19360  #
19361  digfiltb = Frame( frame3 )
19362  digfiltb.pack(side=TOP)
19363  lab2 = Checkbutton(digfiltb,text="Filter CH B", variable=DigFiltB)
19364  lab2.grid(row=0, column=0, columnspan=2, sticky=W)
19365  lab4 = Checkbutton(digfiltb,text="Box Car", variable=DigFiltBBoxCar, command=BuildBoxCarB)
19366  lab4.grid(row=1, column=0, sticky=W)
19367  BCBLenEntry = Entry(digfiltb, width=3, cursor='double_arrow')
19368  BCBLenEntry.bind("<Return>", onRetDigFiltB)
19369  BCBLenEntry.bind('<MouseWheel>', onDigFiltBScroll)
19370  BCBLenEntry.bind("<Button-4>", onDigFiltBScroll)# with Linux OS
19371  BCBLenEntry.bind("<Button-5>", onDigFiltBScroll)
19372  # BCALenEntry.bind('<Key>', onTextKey)
19373  BCBLenEntry.grid(row=1, column=1, sticky=W)
19374  BCBLenEntry.delete(0,"end")
19375  BCBLenEntry.insert(0,2)
19376  bcblab = Label(digfiltb, text="Length")
19377  bcblab.grid(row=1, column=2, sticky=W)
19378  DifFiltBLength = Label(digfiltb,text="Length = 0 ")
19379  DifFiltBLength.grid(row=2, column=0, sticky=W)
19380  DifFiltBFile = Label(digfiltb,text="File Name, none ")
19381  DifFiltBFile.grid(row=3, column=0, sticky=W)
19382  camath.grid(row=8, column=0, sticky=W)
19383  cbld = Button(digfiltb, text='Load CH B Filter Coef', command=BLoadDFiltB)
19384  cbld.grid(row=4, column=0, sticky=W)
19385  cbmath = Button(digfiltb, text='CH B Filter formula', command=BDFiltBMath)
19386  cbmath.grid(row=5, column=0, sticky=W)
19387  dismissdfbutton = Button(digfiltb, text="Dismiss", style="W8.TButton", command=DestroyDigFiltScreen)
19388  dismissdfbutton.grid(row=6, column=0, columnspan=1, sticky=W)
19389  #
19390 def onRetDigFiltA(event):
19391  BuildBoxCarA()
19392 
19393 def onDigFiltAScroll(event):
19394  onTextScroll(event)
19395  BuildBoxCarA()
19396 
19398  global BCALenEntry, DFiltACoef, DigFiltABoxCar, DifFiltALength
19399 
19400  if DigFiltABoxCar.get() == 0:
19401  return
19402 
19403  FLength = int(BCALenEntry.get())
19404  if FLength < 2:
19405  return
19406 
19407  DFiltACoef = [] # empty coef array
19408 
19409  for n in range(FLength):
19410  DFiltACoef.append(float(1.0/FLength))
19411 
19412  DFiltACoef = numpy.array(DFiltACoef)
19413  DifFiltALength.config(text = "Length = " + str(int(len(DFiltACoef)))) # change displayed length value
19414 
19415 def onRetDigFiltB(event):
19416  BuildBoxCarB()
19417 
19418 def onDigFiltBScroll(event):
19419  onTextScroll(event)
19420  BuildBoxCarB()
19421 
19423  global BCBLenEntry, DFiltBCoef, DigFiltBBoxCar, DifFiltBLength
19424 
19425  if DigFiltBBoxCar.get() == 0:
19426  return
19427 
19428  FLength = int(BCBLenEntry.get())
19429  if FLength < 2:
19430  return
19431 
19432  DFiltBCoef = [] # empty coef array
19433 
19434  for n in range(FLength):
19435  DFiltBCoef.append(float(1.0/FLength))
19436 
19437  DFiltBCoef = numpy.array(DFiltBCoef)
19438  DifFiltBLength.config(text = "Length = " + str(int(len(DFiltBCoef)))) # change displayed length value
19439 
19441  global digfltwindow, DigFiltStatus
19442 
19443  DigFiltStatus.set(0)
19444  digfltwindow.destroy()
19445 
19447  global DFiltACoef, digfltwindow, DifFiltALength, DifFiltAFile
19448 
19449 # Read values from CVS file
19450  filename = askopenfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent=digfltwindow)
19451  try:
19452  CSVFile = open(filename)
19453  csv_f = csv.reader(CSVFile)
19454  except:
19455  showwarning("WARNING","No such file found or wrong format!", parent=digfltwindow)
19456  return
19457  DFiltACoef = []
19458 
19459  for row in csv_f:
19460  try:
19461  DFiltACoef.append(float(row[0]))
19462  except:
19463  print( 'skipping non-numeric row')
19464  DFiltACoef = numpy.array(DFiltACoef)
19465  DifFiltALength.config(text = "Length = " + str(int(len(DFiltACoef)))) # change displayed length value
19466  DifFiltAFile.config(text = "File Name, " + os.path.basename(filename)) # change displayed file name
19467  CSVFile.close()
19468 #
19470  global DFiltACoef, digfltwindow, DifFiltALength, DifFiltAFile, DigFilterAString
19471 
19472  TempString = DigFilterAString
19473  DigFilterAString = askstring("CH A Filter Math Formula", "Current Formula: " + DigFilterAString + "\n\nNew Formula:\n", initialvalue=DigFilterAString, parent=digfltwindow)
19474  if (DigFilterAString == None): # If Cancel pressed, then None
19475  DigFilterAString = TempString
19476  return
19477  DFiltACoef = eval(DigFilterAString)
19478  DFiltACoef = numpy.array(DFiltACoef)
19479  coefsum = numpy.sum(DFiltACoef)
19480  DFiltACoef = DFiltACoef / coefsum
19481  DifFiltALength.config(text = "Length = " + str(int(len(DFiltACoef)))) # change displayed length value
19482  DifFiltAFile.config(text = "Using Filter A formula" ) # change displayed file name
19483 
19485  global DFiltBCoef, digfltwindow, DifFiltBLength, DifFiltBFile
19486 
19487 # Read values from CVS file
19488  filename = askopenfilename(defaultextension = ".csv", filetypes=[("CSV files", "*.csv")], parent=digfltwindow)
19489  try:
19490  CSVFile = open(filename)
19491  csv_f = csv.reader(CSVFile)
19492  except:
19493  showwarning("WARNING","No such file found or wrong format!", parent=digfltwindow)
19494  return
19495  DFiltBCoef = []
19496 
19497  for row in csv_f:
19498  try:
19499  DFiltBCoef.append(float(row[0]))
19500  except:
19501  print( 'skipping non-numeric row')
19502  DFiltBCoef = numpy.array(DFiltBCoef)
19503  DifFiltBLength.config(text = "Length = " + str(int(len(DFiltBCoef)))) # change displayed length value
19504  DifFiltBFile.config(text = "File Name, " + os.path.basename(filename)) # change displayed file name
19505  CSVFile.close()
19506 #
19508  global DFiltBCoef, digfltwindow, DifFiltBLength, DifFiltBFile, DigFilterBString
19509 
19510  TempString = DigFilterBString
19511  DigFilterBString = askstring("CH B Filter Math Formula", "Current Formula: " + DigFilterBString + "\n\nNew Formula:\n", initialvalue=DigFilterBString, parent=digfltwindow)
19512  if (DigFilterBString == None): # If Cancel pressed, then None
19513  DigFilterBString = TempString
19514  return
19515  DFiltBCoef = eval(DigFilterBString)
19516  DFiltBCoef = numpy.array(DFiltBCoef)
19517  coefsum = numpy.sum(DFiltBCoef)
19518  DFiltBCoef = DFiltBCoef / coefsum
19519  DifFiltBLength.config(text = "Length = " + str(int(len(DFiltBCoef)))) # change displayed length value
19520  DifFiltBFile.config(text = "Using Filter B formula" ) # change displayed file name
19521 #
19523  global commandwindow, CommandStatus, ExecString, LastCommand, RevDate, SWRev
19524 
19525  if CommandStatus.get() == 0:
19526  CommandStatus.set(1)
19527  commandwindow = Toplevel()
19528  commandwindow.title("Command Line " + SWRev + RevDate)
19529  commandwindow.resizable(FALSE,FALSE)
19530  commandwindow.protocol("WM_DELETE_WINDOW", DestroyCommandScreen)
19531  toplab = Label(commandwindow,text="Command Line Interface ", style="A12B.TLabel")
19532  toplab.grid(row=0, column=0, columnspan=2, sticky=W)
19533  cl1 = Label(commandwindow,text="Last command:")
19534  cl1.grid(row=1, column=0, sticky=W)
19535  LastCommand = Label(commandwindow,text=" ")
19536  LastCommand.grid(row=2, column=0, columnspan=4, sticky=W)
19537  ExecString = Entry(commandwindow, width=40)
19538  ExecString.bind("<Return>", RExecuteFromString)
19539  ExecString.grid(row=3, column=0, columnspan=4, sticky=W)
19540  ExecString.delete(0,"end")
19541  ExecString.insert(0,"global ; ")
19542  executeclbutton = Button(commandwindow, text="Execute", style="W8.TButton", command=BExecuteFromString)
19543  executeclbutton.grid(row=4, column=0, sticky=W, pady=8)
19544  #
19545  dismissclbutton = Button(commandwindow, text="Dismiss", style="W8.TButton", command=DestroyCommandScreen)
19546  dismissclbutton.grid(row=4, column=1, sticky=W, pady=7)
19547 
19549  global commandwindow, CommandStatus
19550 
19551  CommandStatus.set(0)
19552  commandwindow.destroy()
19553 
19555 
19557 
19558 def BExecuteFromString(): # global VBuffA,AWGAwaveform;VBuffA=AWGAwaveform
19559  global ExecString, LastCommand
19560 
19561  try:
19562  exec( ExecString.get() )
19563  LastCommand.config(text = ExecString.get() ) # change displayed last command
19564  except:
19565  LastCommand.config(text = "Syntax Error Encountered" ) # change displayed last command
19566  return()
19567 #
19568 def CAresize(event):
19569  global ca, GRW, XOL, GRH, Y0T, CANVASwidth, CANVASheight, FontSize
19570 
19571  XOL = FontSize * 7
19572  CANVASwidth = event.width - 4
19573  CANVASheight = event.height - 4
19574  GRW = CANVASwidth - (2 * X0L) # new grid width
19575  GRH = CANVASheight - (Y0T + (FontSize * 7)) # new grid height
19576  UpdateTimeAll()
19577 #
19579  global ChaLab1, ChaLab12, ChaLab3, ChaLab4, ChaLab5, ChaLab6
19580  global ChaValue1, ChaValue2, ChaValue3, ChaValue4, ChaValue5, ChaValue6
19581  global ChbLab1, ChbLab12, ChbLab3, ChbLab4, ChbLab5, ChbLab6
19582  global ChbValue1, ChbValue2, ChbValue3, ChbValue4, ChbValue5, ChbValue6
19583  global ChaMeasString1, ChaMeasString2, ChaMeasString3, ChaMeasString4, ChaMeasString5, ChaMeasString6
19584  global ChbMeasString1, ChbMeasString2, ChbMeasString3, ChbMeasString4, ChbMeasString5, ChbMeasString6
19585 
19586  ValueText = ' {0:.4f} '.format(eval(ChaMeasString1))
19587  ChaValue1.config(text = ValueText)
19588  ValueText = ' {0:.4f} '.format(eval(ChaMeasString2))
19589  ChaValue2.config(text = ValueText)
19590  ValueText = ' {0:.4f} '.format(eval(ChaMeasString3))
19591  ChaValue3.config(text = ValueText)
19592  ValueText = ' {0:.4f} '.format(eval(ChaMeasString4))
19593  ChaValue4.config(text = ValueText)
19594  ValueText = ' {0:.4f} '.format(eval(ChaMeasString5))
19595  ChaValue5.config(text = ValueText)
19596  ValueText = ' {0:.4f} '.format(eval(ChaMeasString6))
19597  ChaValue6.config(text = ValueText)
19598  ValueText = ' {0:.4f} '.format(eval(ChbMeasString1))
19599  ChbValue1.config(text = ValueText)
19600  ValueText = ' {0:.4f} '.format(eval(ChbMeasString2))
19601  ChbValue2.config(text = ValueText)
19602  ValueText = ' {0:.4f} '.format(eval(ChbMeasString3))
19603  ChbValue3.config(text = ValueText)
19604  ValueText = ' {0:.4f} '.format(eval(ChbMeasString4))
19605  ChbValue4.config(text = ValueText)
19606  ValueText = ' {0:.4f} '.format(eval(ChbMeasString5))
19607  ChbValue5.config(text = ValueText)
19608  ValueText = ' {0:.4f} '.format(eval(ChbMeasString6))
19609  ChbValue6.config(text = ValueText)
19610 #
19612  global measurewindow, MeasureStatus, RevDate, SWRev
19613  global ChaLab1, ChaLab12, ChaLab3, ChaLab4, ChaLab5, ChaLab6
19614  global ChaValue1, ChaValue2, ChaValue3, ChaValue4, ChaValue5, ChaValue6
19615  global ChbLab1, ChbLab12, ChbLab3, ChbLab4, ChbLab5, ChbLab6
19616  global ChbValue1, ChbValue2, ChbValue3, ChbValue4, ChbValue5, ChbValue6
19617  global ChaLableSrring1, ChaLableSrring2, ChaLableSrring3, ChaLableSrring4, ChaLableSrring5, ChaLableSrring6
19618  global ChbLableSrring1, ChbLableSrring2, ChbLableSrring3, ChbLableSrring4, ChbLableSrring5, ChbLableSrring6
19619 
19620  if MeasureStatus.get() == 0:
19621  MeasureStatus.set(1)
19622  measurewindow = Toplevel()
19623  measurewindow.title("Measurements " + SWRev + RevDate)
19624  measurewindow.resizable(FALSE,FALSE)
19625  measurewindow.protocol("WM_DELETE_WINDOW", DestroyMeasureScreen)
19626  toplab = Label(measurewindow,text="Measurements ", style="A12B.TLabel")
19627  toplab.grid(row=0, column=0, columnspan=2, sticky=W)
19628  ChaLab1 = Label(measurewindow,text=ChaLableSrring1, style="A10B.TLabel")
19629  ChaLab1.grid(row=1, column=0, columnspan=1, sticky=W)
19630  ChaValue1 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19631  ChaValue1.grid(row=1, column=1, columnspan=1, sticky=W)
19632  ChaLab2 = Label(measurewindow,text=ChaLableSrring2, style="A10B.TLabel")
19633  ChaLab2.grid(row=1, column=2, columnspan=1, sticky=W)
19634  ChaValue2 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19635  ChaValue2.grid(row=1, column=3, columnspan=1, sticky=W)
19636  ChaLab3 = Label(measurewindow,text=ChaLableSrring3, style="A10B.TLabel")
19637  ChaLab3.grid(row=2, column=0, columnspan=1, sticky=W)
19638  ChaValue3 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19639  ChaValue3.grid(row=2, column=1, columnspan=1, sticky=W)
19640  ChaLab4 = Label(measurewindow,text=ChaLableSrring4, style="A10B.TLabel")
19641  ChaLab4.grid(row=2, column=2, columnspan=1, sticky=W)
19642  ChaValue4 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19643  ChaValue4.grid(row=2, column=3, columnspan=1, sticky=W)
19644  ChaLab5 = Label(measurewindow,text=ChaLableSrring5, style="A10B.TLabel")
19645  ChaLab5.grid(row=3, column=0, columnspan=1, sticky=W)
19646  ChaValue5 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19647  ChaValue5.grid(row=3, column=1, columnspan=1, sticky=W)
19648  ChaLab6 = Label(measurewindow,text=ChaLableSrring6, style="A10B.TLabel")
19649  ChaLab6.grid(row=3, column=2, columnspan=1, sticky=W)
19650  ChaValue6 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19651  ChaValue6.grid(row=3, column=3, columnspan=1, sticky=W)
19652  #
19653  ChbLab1 = Label(measurewindow,text=ChbLableSrring1, style="A10B.TLabel")
19654  ChbLab1.grid(row=4, column=0, columnspan=1, sticky=W)
19655  ChbValue1 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19656  ChbValue1.grid(row=4, column=1, columnspan=1, sticky=W)
19657  ChbLab2 = Label(measurewindow,text=ChbLableSrring2, style="A10B.TLabel")
19658  ChbLab2.grid(row=4, column=2, columnspan=1, sticky=W)
19659  ChbValue2 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19660  ChbValue2.grid(row=4, column=3, columnspan=1, sticky=W)
19661  ChbLab3 = Label(measurewindow,text=ChbLableSrring3, style="A10B.TLabel")
19662  ChbLab3.grid(row=5, column=0, columnspan=1, sticky=W)
19663  ChbValue3 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19664  ChbValue3.grid(row=5, column=1, columnspan=1, sticky=W)
19665  ChbLab4 = Label(measurewindow,text=ChbLableSrring4, style="A10B.TLabel")
19666  ChbLab4.grid(row=5, column=2, columnspan=1, sticky=W)
19667  ChbValue4 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19668  ChbValue4.grid(row=5, column=3, columnspan=1, sticky=W)
19669  ChbLab5 = Label(measurewindow,text=ChbLableSrring5, style="A10B.TLabel")
19670  ChbLab5.grid(row=6, column=0, columnspan=1, sticky=W)
19671  ChbValue5 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19672  ChbValue5.grid(row=6, column=1, columnspan=1, sticky=W)
19673  ChbLab6 = Label(measurewindow,text=ChbLableSrring6, style="A10B.TLabel")
19674  ChbLab6.grid(row=6, column=2, columnspan=1, sticky=W)
19675  ChbValue6 = Label(measurewindow,text="0.0000", style="A10B.TLabel")
19676  ChbValue6.grid(row=6, column=3, columnspan=1, sticky=W)
19677 #
19679  global measurewindow, MeasureStatus
19680 
19681  MeasureStatus.set(0)
19682  measurewindow.destroy()
19683 #
19685  global boardwindow, BoardStatus, session, devx, dev0, dev1, dev2, MultipleBoards
19686  global RevDate, BrdSel, FWRevOne, HWRevOne, FWRevTwo, HWRevTwo, WRevThree, HWRevThree
19687 
19688  if len(session.devices) > 1 and MultipleBoards.get() > 0: # make screen only if more than one board present
19689  if BoardStatus.get() == 0:
19690  BoardStatus.set(1)
19691  boardwindow = Toplevel()
19692  boardwindow.title("Select Board " + RevDate)
19693  boardwindow.resizable(FALSE,FALSE)
19694  boardwindow.protocol("WM_DELETE_WINDOW", DestroyBoardScreen)
19695  toplab = Label(boardwindow,text="- Select ALM1000 -", style="A12B.TLabel")
19696  toplab.pack(side=TOP)
19697  for idx, devx in enumerate(session.devices):
19698  BrdText = "Board # " + str(idx)
19699  if idx == 0:
19700  devx.set_led(0b010) # LED.green
19701  FWRevOne = float(devx.fwver)
19702  HWRevOne = devx.hwver
19703  dev0 = devx #session.devices[0]
19704  brd = Radiobutton(boardwindow, text=BrdText, style="Run.TRadiobutton", variable=BrdSel, value=idx, command=SelectBoard)
19705  elif idx == 1:
19706  devx.set_led(0b100) # LED.blue,
19707  FWRevTwo = float(devx.fwver)
19708  HWRevTwo = devx.hwver
19709  dev1 = devx #session.devices[1]
19710  brd = Radiobutton(boardwindow, text=BrdText, style="Stop.TRadiobutton", variable=BrdSel, value=idx, command=SelectBoard)
19711  elif idx == 2:
19712  devx.set_led(0b001) # LED.red,
19713  FWRevThree = float(devx.fwver)
19714  HWRevThree = devx.hwver
19715  dev2 = devx #session.devices[2]
19716  brd = Radiobutton(boardwindow, text=BrdText, variable=BrdSel, value=idx, command=SelectBoard)
19717  else:
19718  dev3 = session.devices[3]
19719  brd = Radiobutton(boardwindow, text=BrdText, variable=BrdSel, value=idx, command=SelectBoard)
19720  brd.pack(side=TOP)
19721  else:
19722  devx = session.devices[0]
19723  # devx.ignore_dataflow = True
19724  devx.set_led(0b010) # if only one board set LED.green
19725  try:
19726  FWRevOne = float(devx.fwver)
19727  HWRevOne = devx.hwver
19728  except:
19729  FWRevOne = "Before 2.06"
19730  HWRevOne = "?"
19731  dev0 = session.devices[0]
19732 #
19734  global boardwindow, BoardStatus
19735 
19736  BoardStatus.set(0)
19737  boardwindow.destroy()
19738 #
19740  global devx, dev0, dev1, dev2, session, BrdSel, CHA, CHB, DevID, MaxSamples, AWGSAMPLErate
19741  global bcon, FWRevOne, HWRevOne, FWRevTwo, HWRevTwo, WRevThree, HWRevThree, SAMPLErate, MultipleBoards
19742 
19743  if DevID == "No Device" or DevID == "m1k":
19744  #print("Request sample rate: " + str(SAMPLErate))
19745  session = Session(ignore_dataflow=True, sample_rate=SAMPLErate, queue_size=MaxSamples)
19746  # session.add_all()
19747  # SAMPLErate = 200000 #AWGSAMPLErate # Scope sample rate
19748  if not session.devices:
19749  print( 'No Device plugged IN!')
19750  DevID = "No Device"
19751  FWRevOne = 0.0
19752  bcon.configure(text="Recon", style="RConn.TButton")
19753  return
19754  session.configure(sample_rate=SAMPLErate)
19755  # print("Session sample rate: " + str(session.sample_rate))
19756  MakeBoardScreen()
19757  SelectBoard()
19758  bcon.configure(text="Conn", style="GConn.TButton")
19759  devx.set_adc_mux(0)
19760  devx.ctrl_transfer(0x40, 0x24, 0x0, 0, 0, 0, 100) # set to addr DAC A
19761  devx.ctrl_transfer(0x40, 0x25, 0x1, 0, 0, 0, 100) # set not addr DAC B
19762 
19766  session.start(0)
19767 #
19769  global devx, dev0, dev1, dev2, session, BrdSel, CHA, CHB, DevID, RUNstatus, FWRevOne, HWRevOne
19770  global PIO_0, PIO_1, PIO_2, PIO_3, PIO_4, PIO_5, PIO_6, PIO_7, cal, SAMPLErate, MaxSamples
19771  global IgnoreFirmwareCheck, SDATAPort, SCLKPort, SLATCHPort
19772 
19773  if RUNstatus.get() == 1:
19774  BStop()
19775  print( "STOP")
19776 
19777  if BrdSel.get() == 0:
19778  try:
19779  session.remove(dev1)
19780  print( "Removing dev1")
19781  except:
19782  print( "Skipping dev1")
19783  try:
19784  session.remove(dev2)
19785  print( "Removing dev2")
19786  except:
19787  print( "Skipping dev2")
19788  session.add(dev0)
19789  devx = dev0
19790  #session.add(devx)
19791  if BrdSel.get() == 1:
19792  try:
19793  session.remove(dev0)
19794  print( "Removing dev0")
19795  except:
19796  print( "Skipping dev0")
19797  try:
19798  session.remove(dev2)
19799  print( "Removing dev2")
19800  except:
19801  print( "Skipping dev2")
19802  session.add(dev1)
19803  devx = dev1
19804  #session.add(devx)
19805  DevID = devx.serial
19806  print( DevID)
19807  FWRevOne = float(devx.fwver)
19808  HWRevOne = str(devx.hwver)
19809  print( FWRevOne, HWRevOne)
19810  # print("Session sample rate: " + str(session.sample_rate))
19811 
19812  if IgnoreFirmwareCheck == 0:
19813  if FWRevOne < 2.17:
19814  showwarning("WARNING","This ALICE version Requires Firmware version > 2.16")
19815  UpdateFirmware()
19816  cal = devx.calibration
19817  CHA = devx.channels['A'] # Open CHA
19818  CHA.mode = Mode.HI_Z_SPLIT # Put CHA in Hi Z split mode
19819  CHB = devx.channels['B'] # Open CHB
19820  CHB.mode = Mode.HI_Z_SPLIT # Put CHB in Hi Z split mode
19821  #
19822  # if session.continuous == 0:
19823  #session.start(0)
19824 
19833  devx.set_adc_mux(0)
19834  if devx.hwver == "F":
19835  print( "Rev F Board I/O ports set")
19836  PIO_0 = 28
19837  PIO_1 = 29
19838  PIO_2 = 47
19839  PIO_3 = 3
19840  PIO_4 = 4
19841  PIO_5 = 5
19842  PIO_6 = 6
19843  PIO_7 = 7
19844  else:
19845  PIO_0 = 0
19846  PIO_1 = 1
19847  PIO_2 = 2
19848  PIO_3 = 3
19849  PIO_4 = 4
19850  PIO_5 = 5
19851  PIO_6 = 6
19852  PIO_7 = 7
19853 #
19854  SDATAPort.set(PIO_1)
19855  SCLKPort.set(PIO_2)
19856  SLATCHPort.set(PIO_0)
19857 
19859  global SAMPLErate, AWGSAMPLErate, BaseSampleRate, session, ETSStatus, etssrlab, RevDate
19860  global Two_X_Sample, ADC_Mux_Mode, SampleRatewindow, SampleRateStatus, BaseRatesb
19861  global Alternate_Sweep_Mode, DeBugMode, FWRevOne, SWRev, SampRateList
19862  global FrameRefief, BorderSize
19863 
19864  if SampleRateStatus.get() == 0:
19865  SampleRateStatus.set(1)
19866  SampleRatewindow = Toplevel()
19867  SampleRatewindow.title("Set Sample Rate " + SWRev + RevDate)
19868  SampleRatewindow.resizable(FALSE,FALSE)
19869  SampleRatewindow.protocol("WM_DELETE_WINDOW", DestroySampleRate)
19870  frame1 = Frame(SampleRatewindow, borderwidth=BorderSize, relief=FrameRefief)
19871  frame1.grid(row=0, column=0, sticky=W)
19872  #
19873  BaseRATE = Frame( frame1 )
19874  BaseRATE.grid(row=0, column=0, sticky=W)
19875  baseratelab = Label(BaseRATE, text="Base Sample Rate", style="A10B.TLabel") #, font = "Arial 10 bold")
19876  baseratelab.pack(side=LEFT)
19877  BaseRatesb = Spinbox(BaseRATE, width=6, values=SampRateList, command=SetSampleRate)
19878  BaseRatesb.bind('<MouseWheel>', onSrateScroll)
19879  BaseRatesb.bind("<Button-4>", onSrateScroll)# with Linux OS
19880  BaseRatesb.bind("<Button-5>", onSrateScroll)
19881  BaseRatesb.bind("<Return>", onRetSrate)
19882  BaseRatesb.pack(side=LEFT)
19883  BaseRatesb.delete(0,"end")
19884  BaseRatesb.insert(0,BaseSampleRate)
19885  #
19886  nextrow = 2
19887  if FWRevOne > 2.16:
19888  twoX = Checkbutton(frame1, text="Double Sample Rate", variable=Two_X_Sample, command=SetADC_Mux )
19889  twoX.grid(row=1, column=0, sticky=W)
19890  muxlab1 = Label(frame1, text="ADC MUX Modes", style="A10B.TLabel") #, font = "Arial 10 bold")
19891  muxlab1.grid(row=2, column=0, sticky=W)
19892  AltSweep = Checkbutton(frame1, text="Alternate Sweep Mode", variable=Alternate_Sweep_Mode ) #, command=SetADC_Mux )
19893  AltSweep.grid(row=3, column=0, sticky=W)
19894  chabuttons = Frame( frame1 )
19895  chabuttons.grid(row=4, column=0, sticky=W)
19896  muxrb1 = Radiobutton(chabuttons, text="VA and VB", variable=ADC_Mux_Mode, value=0, command=SetADC_Mux ) #style="W8.TButton",
19897  muxrb1.pack(side=LEFT)
19898  muxrb2 = Radiobutton(chabuttons, text="IA and IB", variable=ADC_Mux_Mode, value=1, command=SetADC_Mux ) #style="W8.TButton",
19899  muxrb2.pack(side=LEFT)
19900  chcbuttons = Frame( frame1 )
19901  chcbuttons.grid(row=5, column=0, sticky=W)
19902  muxrb5 = Radiobutton(chcbuttons, text="VA and IA", variable=ADC_Mux_Mode, value=4, command=SetADC_Mux ) # style="W8.TButton",
19903  muxrb5.pack(side=LEFT)
19904  muxrb6 = Radiobutton(chcbuttons, text="VB and IB", variable=ADC_Mux_Mode, value=5, command=SetADC_Mux ) # style="W8.TButton",
19905  muxrb6.pack(side=LEFT)
19906  nextrow = 6
19907  if DeBugMode == 1:
19908  chbbuttons = Frame( frame1 )
19909  chbbuttons.grid(row=nextrow, column=0, sticky=W)
19910  muxrb3 = Radiobutton(chbbuttons, text="VA and IB", variable=ADC_Mux_Mode, value=2, command=SetADC_Mux ) # style="W8.TButton",
19911  muxrb3.pack(side=LEFT)
19912  muxrb4 = Radiobutton(chbbuttons, text="VB and IA", variable=ADC_Mux_Mode, value=3, command=SetADC_Mux ) # style="W8.TButton",
19913  muxrb4.pack(side=LEFT)
19914  nextrow = nextrow + 1
19915  #
19916  sratedismissclbutton = Button(frame1, text="Dismiss", style="W8.TButton", command=DestroySampleRate)
19917  sratedismissclbutton.grid(row=nextrow, column=0, sticky=W, pady=7)
19918 #
19920  global SampleRatewindow, SampleRateStatus
19921 
19922  SampleRateStatus.set(0)
19923  SampleRatewindow.destroy()
19924 #
19925 #
19926 def onSrateScroll(event):
19927 
19928  #onTextScroll
19929  onSpinBoxScroll(event)
19930  SetSampleRate()
19931 #
19932 def onRetSrate(event):
19933 
19934  SetSampleRate()
19935 #
19937  global SAMPLErate, BaseSampleRate, AWGSAMPLErate, session, ETSStatus, etssrlab, BaseRatesb
19938  global Two_X_Sample, ADC_Mux_Mode, rtsrlab, RUNstatus
19939 
19940  #
19941  WasRunning = 0
19942  if (RUNstatus.get() == 1):
19943  WasRunning = 1
19944  BStop() # Force Stop loop if running
19945  try:
19946  NewRate = int(BaseRatesb.get())
19947  if NewRate <= 100000: # rate has to be less than or equal to 100,000
19948  BaseSampleRate = NewRate
19949  else:
19950  BaseSampleRate = 100000
19951  BaseRatesb.delete(0,"end")
19952  BaseRatesb.insert(0,BaseSampleRate)
19953  SAMPLErate = BaseSampleRate # Scope sample rate
19954  except:
19955  donothing()
19956  session.configure(sample_rate=BaseSampleRate)
19957  BaseSampleRate = session.sample_rate
19958  #print("Session sample rate: " + str(session.sample_rate), BaseSampleRate)
19959  SAMPLErate = BaseSampleRate # Scope sample rate
19960  #print("Session sample rate: " + str(session.sample_rate), SAMPLErate)
19961  AWGSAMPLErate = BaseSampleRate
19962  if ETSStatus.get() > 0:
19963  SRstring = "RT Sample Rate = " + str(BaseSampleRate)
19964  rtsrlab.config(text=SRstring)
19965  ETSUpdate()
19966  BaseRatesb.delete(0,"end")
19967  BaseRatesb.insert(0,BaseSampleRate)
19968  ReMakeAWGwaves() # remake AWG waveforms for new rate
19969  if (WasRunning == 1):
19970  WasRunning = 0
19971  BStart() # restart loop if was running
19972 #
19973 def onStopfreqScroll(event):
19974  global StopFreqEntry, Two_X_Sample, ADC_Mux_Mode, FWRevOne
19975 
19976  onTextScroll(event)
19977  try:
19978  StopFrequency = float(StopFreqEntry.get())
19979  except:
19980  StopFreqEntry.delete(0,"end")
19981  StopFreqEntry.insert(0,50000)
19982  StopFrequency = 50000
19983  if FWRevOne > 2.16:
19984  if StopFrequency >= 50000:
19985  Two_X_Sample.set(1)
19986  ADC_Mux_Mode.set(0)
19987  SetADC_Mux()
19988  else:
19989  Two_X_Sample.set(0)
19990  ADC_Mux_Mode.set(0)
19991  SetADC_Mux()
19992 #
19993 def onStopBodeScroll(event):
19994  global StopBodeEntry, Two_X_Sample, ADC_Mux_Mode, FWRevOne
19995 
19996  onTextScroll(event)
19997  try:
19998  StopFrequency = float(StopBodeEntry.get())
19999  except:
20000  StopBodeEntry.delete(0,"end")
20001  StopBodeEntry.insert(0,20000)
20002  StopFrequency = 20000
20003  if FWRevOne > 2.16:
20004  if StopFrequency >= 20000:
20005  Two_X_Sample.set(1)
20006  ADC_Mux_Mode.set(0)
20007  SetADC_Mux()
20008  else:
20009  Two_X_Sample.set(0)
20010  ADC_Mux_Mode.set(0)
20011  SetADC_Mux()
20012 #
20014  global devx, SAMPLErate, BaseSampleRate, Two_X_Sample, ADC_Mux_Mode, CHA, CHB
20015  global v1_adc_conf, i1_adc_conf, v2_adc_conf, i2_adc_conf
20016 
20017  if Two_X_Sample.get() == 1:
20018  if ADC_Mux_Mode.get() == 0: # VA and VB
20019  devx.set_adc_mux(1)
20020  elif ADC_Mux_Mode.get() == 1: # IA and IB
20021  devx.set_adc_mux(2)
20022  elif ADC_Mux_Mode.get() == 2: # VA and IB
20023  # cycle trhough default mux values as starting point
20024  devx.set_adc_mux(2)
20025  # now set new mux values
20026  devx.set_adc_mux(7)
20027  devx.ctrl_transfer(0x40, 0x20, v1_adc_conf, 0, 0, 0, 100) # U12
20028  devx.ctrl_transfer(0x40, 0x21, i1_adc_conf, 0, 0, 0, 100) # U12
20029  devx.ctrl_transfer(0x40, 0x22, v2_adc_conf, 0, 0, 0, 100) # U11
20030  devx.ctrl_transfer(0x40, 0x22, i2_adc_conf, 0, 0, 0, 100) # U11
20031  time.sleep(0.1)
20032  elif ADC_Mux_Mode.get() == 3: # VB and IA
20033  # cycle trhough default mux values as starting point
20034  # now set new mux values
20035  devx.set_adc_mux(7)
20036  devx.ctrl_transfer(0x40, 0x20, v1_adc_conf, 0, 0, 0, 100) # U12
20037  devx.ctrl_transfer(0x40, 0x21, i1_adc_conf, 0, 0, 0, 100) # U12
20038  devx.ctrl_transfer(0x40, 0x22, v2_adc_conf, 0, 0, 0, 100) # U11
20039  devx.ctrl_transfer(0x40, 0x22, i2_adc_conf, 0, 0, 0, 100) # U11
20040  time.sleep(0.1)
20041  elif ADC_Mux_Mode.get() == 4: # VA and IA
20042  # now set new mux values
20043  devx.set_adc_mux(4)
20044  elif ADC_Mux_Mode.get() == 5: # VB and IB
20045  # now set new mux values
20046  devx.set_adc_mux(5)
20047  SAMPLErate = BaseSampleRate * 2 # set to 2X sample mode
20048  else:
20049  devx.set_adc_mux(0)
20050  SAMPLErate = BaseSampleRate
20051 #
20053  global ADC_Mux_Mode, Alternate_Sweep_Mode, ShowC1_V, ShowC1_I, ShowC2_V, ShowC2_I
20054 
20055  if ShowC1_V.get() == 1 and ShowC1_I.get() == 1 and ShowC2_V.get() == 1 and ShowC2_I.get() == 1:
20056  ADC_Mux_Mode.set(0) # All four traces
20057  Alternate_Sweep_Mode.set(1)
20058  elif ShowC1_V.get() == 1 and ShowC1_I.get() == 1 and ShowC2_V.get() == 1 and ShowC2_I.get() == 0:
20059  ADC_Mux_Mode.set(0) # three traces
20060  Alternate_Sweep_Mode.set(1)
20061  elif ShowC1_V.get() == 1 and ShowC1_I.get() == 1 and ShowC2_V.get() == 0 and ShowC2_I.get() == 1:
20062  ADC_Mux_Mode.set(0) # three traces
20063  Alternate_Sweep_Mode.set(1)
20064  elif ShowC1_V.get() == 0 and ShowC1_I.get() == 1 and ShowC2_V.get() == 1 and ShowC2_I.get() == 1:
20065  ADC_Mux_Mode.set(0) # three traces
20066  Alternate_Sweep_Mode.set(1)
20067  elif ShowC1_V.get() == 1 and ShowC1_I.get() == 0 and ShowC2_V.get() == 1 and ShowC2_I.get() == 1:
20068  ADC_Mux_Mode.set(0) # three traces
20069  Alternate_Sweep_Mode.set(1)
20070  #
20071  elif ShowC1_V.get() == 0 and ShowC1_I.get() == 1 and ShowC2_V.get() == 0 and ShowC2_I.get() == 1:
20072  ADC_Mux_Mode.set(1) # IA and IB
20073  Alternate_Sweep_Mode.set(0)
20074  elif ShowC1_V.get() == 0 and ShowC1_I.get() == 1 and ShowC2_V.get() == 0 and ShowC2_I.get() == 0:
20075  ADC_Mux_Mode.set(1) # just IA
20076  Alternate_Sweep_Mode.set(0)
20077  elif ShowC1_V.get() == 0 and ShowC1_I.get() == 0 and ShowC2_V.get() == 0 and ShowC2_I.get() == 1:
20078  ADC_Mux_Mode.set(1) # just IB
20079  Alternate_Sweep_Mode.set(0)
20080  elif ShowC1_V.get() == 1 and ShowC1_I.get() == 1 and ShowC2_V.get() == 0 and ShowC2_I.get() == 0:
20081  ADC_Mux_Mode.set(4) # VA and IA
20082  Alternate_Sweep_Mode.set(0)
20083  elif ShowC1_V.get() == 0 and ShowC1_I.get() == 0 and ShowC2_V.get() == 1 and ShowC2_I.get() == 1:
20084  ADC_Mux_Mode.set(5) # VB and IB
20085  Alternate_Sweep_Mode.set(0)
20086  else:
20087  ADC_Mux_Mode.set(0)
20088  Alternate_Sweep_Mode.set(0)
20089  SetADC_Mux()
20090  UpdateTimeTrace()
20091 #
20093  global devx, dev0, dev1, dev2, session, BrdSel, CHA, CHB, DevID, MaxSamples
20094  global bcon, FWRevOne, HWRevOne, FWRevTwo, HWRevTwo, WRevThree, HWRevThree
20095 
20096  RUNstatus.set(0)
20097  if askyesno("Update current firmware","Flash new firmware to current device:\n(Yes) or (No)?"):
20098  filename = askopenfilename(defaultextension = ".bin", filetypes=[("Binary", "*.bin")])
20099  print( filename)
20100  #print DevID
20101  #print FWRevOne, HWRevOne # devx.fwver, devx.hwver
20102  try:
20103  print( "Cancel current session.")
20104  session.cancel()
20105  print( session.cancelled)
20106  session.end()
20107  print( "Waiting 5...")
20108  time.sleep(5)
20109  print( "Put board in Samba mode and flash firmware.")
20110  session.flash_firmware(filename)
20111  except:
20112  showwarning("Complete","Flash Firmware Complete: \n Un-plug board to cycle power.")
20113 
20121  showwarning("Complete","Flash Firmware Complete: \n Un-plug board to cycle power.")
20122  showwarning("Exit ALICE","Must Exit Program: \n Restart ALICE to continue.")
20123  Bcloseexit()
20124 
20134  global OhmDisp, OhmStatus, ohmwindow, RevDate, RMode, OhmA0, OhmA1, OhmRunStatus
20135  global CHATestVEntry, CHATestREntry, SWRev, AWGSync, OnBoardRes
20136  global FrameRefief, BorderSize
20137 
20138  if OhmStatus.get() == 0:
20139  AWGSync.set(1)
20140  OhmStatus.set(1)
20141  OhmDisp.set(1)
20142  OhmCheckBox()
20143  ohmwindow = Toplevel()
20144  ohmwindow.title("DC Ohmmeter " + SWRev + RevDate)
20145  ohmwindow.resizable(FALSE,FALSE)
20146  ohmwindow.protocol("WM_DELETE_WINDOW", DestroyOhmScreen)
20147  frame1 = Frame(ohmwindow, borderwidth=BorderSize, relief=FrameRefief)
20148  frame1.grid(row=0, column=0, sticky=W)
20149  #
20150  buttons = Frame( frame1 )
20151  buttons.grid(row=0, column=0, sticky=W)
20152  omrb2 = Radiobutton(buttons, text="Run", style="Run.TRadiobutton", variable=OhmRunStatus, value=1, command=BStartOhm )
20153  omrb2.pack(side=LEFT)
20154  omrb1 = Radiobutton(buttons, text="Stop", style="Stop.TRadiobutton", variable=OhmRunStatus, value=0, command=BStop )
20155  omrb1.pack(side=LEFT)
20156  #
20157  OhmA0 = Label(frame1, style="A16B.TLabel") # , font = "Arial 16 bold")
20158  OhmA0.grid(row=1, column=0, columnspan=2, sticky=W)
20159  OhmA0.config(text = "0.000 Ohms")
20160 
20161  OhmA1 = Label(frame1, style="A12B.TLabel") #, font = "Arial 12 bold")
20162  OhmA1.grid(row=2, column=0, columnspan=2, sticky=W)
20163  OhmA1.config(text = "Meas 0.00 mA 0.00 V")
20164  #
20165  TestVA = Frame( frame1 )
20166  TestVA.grid(row=3, column=0, sticky=W)
20167  chatestvlab = Label(TestVA, text="Test Voltage", style="A10B.TLabel") #, font = "Arial 10 bold")
20168  chatestvlab.pack(side=LEFT)
20169  CHATestVEntry = Entry(TestVA, width=6, cursor='double_arrow') #
20170  CHATestVEntry.pack(side=LEFT)
20171  CHATestVEntry.bind('<MouseWheel>', onTextScroll)
20172  CHATestVEntry.bind("<Button-4>", onTextScroll)# with Linux OS
20173  CHATestVEntry.bind("<Button-5>", onTextScroll)
20174  CHATestVEntry.delete(0,"end")
20175  CHATestVEntry.insert(0,5.0)
20176  #
20177  RMode = IntVar(0)
20178  RMode.set(1)
20179  TestMode = Frame( frame1 )
20180  TestMode.grid(row=4, column=0, sticky=W)
20181  modelab = Label(TestMode, text="Known Res", style="A10B.TLabel") #, font = "Arial 10 bold")
20182  modelab.pack(side=LEFT)
20183  rm3 = Radiobutton(TestMode, text="Ext", variable=RMode, value=0)
20184  rm3.pack(side=LEFT)
20185  rm4 = Radiobutton(TestMode, text="Int", variable=RMode, value=1)
20186  rm4.pack(side=LEFT)
20187  #
20188  TestRA = Frame( frame1 )
20189  TestRA.grid(row=5, column=0, sticky=W)
20190  chatestrlab = Label(TestRA, text="Known Res", style="A10B.TLabel") #, font = "Arial 10 bold")
20191  chatestrlab.pack(side=LEFT)
20192  CHATestREntry = Entry(TestRA, width=6, cursor='double_arrow') #
20193  CHATestREntry.pack(side=LEFT)
20194  CHATestREntry.bind('<MouseWheel>', onTextScroll)
20195  CHATestREntry.bind("<Button-4>", onTextScroll)# with Linux OS
20196  CHATestREntry.bind("<Button-5>", onTextScroll)
20197  CHATestREntry.delete(0,"end")
20198  CHATestREntry.insert(0,OnBoardRes)
20199  #
20200  ohmdismissclbutton = Button(frame1, text="Dismiss", style="W8.TButton", command=DestroyOhmScreen)
20201  ohmdismissclbutton.grid(row=6, column=0, sticky=W, pady=7)
20202 #
20204  global ohmwindow, OhmStatus, OhmDisp
20205 
20206  OhmStatus.set(0)
20207  OhmDisp.set(0)
20208  OhmCheckBox()
20209  ohmwindow.destroy()
20210 #
20212  global FMulXEntry, MulXEntry, etswindow, ETSStatus, ETSDisp, ETSDir, ETSts, eqivsamplerate
20213  global SAMPLErate, DivXEntry, FOffEntry, FminDisp, enb1, rtsrlab, etssrlab, RevDate, SWRev
20214  global MinigenScreenStatus, DeBugMode
20215  global FrameRefief, BorderSize
20216 
20217  #
20218  if ETSStatus.get() == 0:
20219  BaseFreq = (-10, -15, -20, -25, -30, -35, -40, -45, -50, -60, -70, -80, -90, -100)
20220  ETSStatus.set(1)
20221  ETSDisp.set(0)
20222  etswindow = Toplevel()
20223  etswindow.title("ETS Controls " + SWRev + RevDate)
20224  etswindow.resizable(FALSE,FALSE)
20225  etswindow.protocol("WM_DELETE_WINDOW", DestroyETSScreen)
20226  frame1 = Frame(etswindow, borderwidth=BorderSize, relief=FrameRefief)
20227  frame1.grid(row=0, column=0, sticky=W)
20228  # Sampling controls Widgets
20229  SRstring = "RT Sample Rate = " + str(SAMPLErate)
20230  rtsrlab = Label(frame1, text=SRstring, style= "A10B.TLabel")
20231  rtsrlab.grid(row=1, column=0, sticky=W)
20232  ESRstring = "ET Sample Rate = " + str(SAMPLErate)
20233  etssrlab = Label(frame1, text=SRstring, style= "A10B.TLabel")
20234  etssrlab.grid(row=2, column=0, sticky=W)
20235  etssrbutton = Button(frame1, text="Set RT Sample Rate", command=MakeSampleRateMenu) #, style= "W8.TButton"
20236  etssrbutton.grid(row=3, column=0, sticky=W, pady=7)
20237  enb1 = Checkbutton(frame1,text="Enable ETS", variable=ETSDisp, command=ETSCheckBox)
20238  enb1.grid(row=4, column=0, sticky=W)
20239  #
20240  Divx = Frame( frame1 )
20241  Divx.grid(row=5, column=0, sticky=W)
20242  DivXEntry = Entry(Divx, width=6, cursor='double_arrow')
20243  DivXEntry.bind('<MouseWheel>', ETSscroll)
20244  DivXEntry.bind("<Button-4>", ETSscroll)# with Linux OS
20245  DivXEntry.bind("<Button-5>", ETSscroll)
20246  DivXEntry.pack(side=RIGHT)
20247  DivXEntry.delete(0,"end")
20248  DivXEntry.insert(0,2)
20249  divxlab = Label( Divx, text = "Divide Factor")
20250  divxlab.pack(side=RIGHT)
20251  GridRow = 5
20252  #
20253  if DeBugMode > 0:
20254  FOffEntry = Label(frame1, text="Samples")
20255  FOffEntry.grid(row=GridRow+1, column=0, sticky=W)
20256  MulXEntry = Label( frame1, text = "Rec Len Mul")
20257  MulXEntry.grid(row=GridRow+2, column=0, sticky=W)
20258  GridRow = GridRow + 2
20259  #
20260  eqivsamplerate = Label(frame1, text="MHz", style= "A10B.TLabel")
20261  eqivsamplerate.grid(row=GridRow+1, column=0, sticky=W)
20262  #
20263  FConv = Frame( frame1 )
20264  FConv.grid(row=GridRow+2, column=0, sticky=W)
20265  FMulXEntry = Entry(FConv, width=3, cursor='double_arrow')
20266  FMulXEntry.bind('<MouseWheel>', ETSscroll)
20267  FMulXEntry.bind("<Button-4>", ETSscroll)# with Linux OS
20268  FMulXEntry.bind("<Button-5>", ETSscroll)
20269  FMulXEntry.pack(side=RIGHT)
20270  FMulXEntry.delete(0,"end")
20271  FMulXEntry.insert(0,1)
20272  fminlab = Label( FConv, text = "Freq Multiplier")
20273  fminlab.pack(side=RIGHT)
20274  #
20275  FminDisp = Label(frame1, text="32768 Hz", style= "A10B.TLabel")
20276  FminDisp.grid(row=GridRow+3, column=0, sticky=W)
20277  #
20278  if MinigenScreenStatus.get() > 0:
20279  mgloadbutton = Button(frame1, text="Load to MinGen", command=MGLoad)
20280  mgloadbutton.grid(row=GridRow+4, column=0, sticky=W)
20281  GridRow = GridRow + 1
20282  #
20283  dirlab = Label(frame1, text="Sample Data Order", style= "A10B.TLabel")
20284  dirlab.grid(row=GridRow+5, column=0, sticky=W)
20285  DataMode = Frame( frame1 )
20286  DataMode.grid(row=GridRow+6, column=0, sticky=W)
20287  dm3 = Radiobutton(DataMode, text="Forward", variable=ETSDir, value=0)
20288  dm3.pack(side=LEFT)
20289  dm4 = Radiobutton(DataMode, text="Reverse", variable=ETSDir, value=1)
20290  dm4.pack(side=LEFT)
20291  tclab = Label(frame1, text="CH B Time Shift", style= "A10B.TLabel")
20292  tclab.grid(row=GridRow+7, column=0, sticky=W)
20293  TSMode = Frame( frame1 )
20294  TSMode.grid(row=GridRow+8, column=0, sticky=W)
20295  ETSts = Entry(TSMode, width=6, cursor='double_arrow')
20296  ETSts.bind('<MouseWheel>', ETSscroll)
20297  ETSts.bind("<Button-4>", ETSscroll)# with Linux OS
20298  ETSts.bind("<Button-5>", ETSscroll)
20299  ETSts.pack(side=RIGHT)
20300  ETSts.delete(0,"end")
20301  ETSts.insert(0,1)
20302  ETStslab = Label( TSMode, text = "Factor")
20303  ETStslab.pack(side=RIGHT)
20304  #
20305  etsdismissclbutton = Button(frame1, text="Dismiss", style= "W8.TButton", command=DestroyETSScreen)
20306  etsdismissclbutton.grid(row=GridRow+9, column=0, sticky=W, pady=7)
20307  ETSDisp.set(0)
20308  ETSCheckBox()
20309 #
20311  global etswindow, ETSStatus, ETSDisp
20312 
20313  ETSStatus.set(0)
20314  ETSDisp.set(0)
20315  ETSCheckBox()
20316  etswindow.destroy()
20317 #
20318 def MGLoad():
20319  global MinigenFout, Fmin, ETSDir
20320 
20321  MinigenFout.delete(0,"end")
20322  if ETSDir.get() == 0:
20323  MinigenFout.insert(0,Fmin+20)
20324  else:
20325  MinigenFout.insert(0,Fmin-20)
20326  BSendMG()
20327 #
20328 def ETSscroll(event):
20329  onTextScroll(event)
20330  ETSUpdate()
20331 #
20332 def onFminScroll(event):
20333  onTextScroll(event)
20334  ETSUpdate()
20335  SetETSComp()
20336  SetAD9833(event)
20337 
20338 def onMulXScroll(event):
20339  global Two_X_Sample, HtMulEntry, ETSts, etssrlab, SAMPLErate
20340 
20341  onTextScroll(event)
20342  # ETSUpdate()
20343  try:
20344  TscaleX = float(HtMulEntry.get())
20345  except:
20346  HtMulEntry.delete(0,END)
20347  HtMulEntry.insert(0, 1)
20348  if Two_X_Sample.get() == 0:
20349  ToffsetX = TscaleX/10.0 # set channel B offset to 1/10 the time scale only for 1X sampeling
20350  else:
20351  ToffsetX = 0
20352  ETSts.delete(0,"end")
20353  ETSts.insert(0,ToffsetX)
20354  SRstring = "ET Sample Rate = " + str(SAMPLErate*TscaleX)
20355  etssrlab.config(text=SRstring)
20356  #
20357  SetETSComp()
20358  SetAD9833(event)
20359 #
20361  global FMulXEntry, MulXEntry, ETSStatus, ETSDisp, ETSDir, ETSts, eqivsamplerate, MaxETSrecord
20362  global SAMPLErate, DivXEntry, FOffEntry, FminDisp, DivX, FOff, MulX, Fmin, FMul, SAMPLErate, TIMEdiv
20363  global FminEntry, HtMulEntry, Two_X_Sample, DeBugMode
20364 
20365  if TIMEdiv > 0.2:
20366  MaxETSrecord = int(SAMPLErate * 10 * TIMEdiv / 1000.0)
20367  else:
20368  MaxETSrecord = int(SAMPLErate * 20 * TIMEdiv / 1000.0)
20369  if (MaxETSrecord*100) > MaxSamples:
20370  MaxETSrecord = MaxSamples / 100
20371  try:
20372  DivX = float(eval(DivXEntry.get()))
20373  if DivX < 2:
20374  DivX = 2
20375  if DivX > 75:
20376  DivX = 75
20377  DivXEntry.delete(0,END)
20378  DivXEntry.insert(0, DivX)
20379  except:
20380  DivXEntry.delete(0,END)
20381  DivXEntry.insert(0, DivX)
20382  #
20383  FOff = 25
20384  MulX = (DivX*SAMPLErate)/(100*FOff)
20385  while MulX > MaxETSrecord:
20386  FOff = FOff + 5
20387  MulX = (DivX*SAMPLErate)/(100*FOff)
20388  FOff = 0 - FOff
20389  if DeBugMode > 0:
20390  SRstring = "Rec Len Mul = " + str(MulX) + " samples"
20391  MulXEntry.config(text = SRstring) # change displayed value
20392  SRstring = "Offset = " + str(FOff) + " samples"
20393  FOffEntry.config(text = SRstring) # change displayed value
20394  baseFreq = SAMPLErate/DivX
20395  try:
20396  FMul = float(eval(FMulXEntry.get()))
20397  if FMul < 1:
20398  FMul = 1
20399  FMulXEntry.delete(0,END)
20400  FMulXEntry.insert(0, int(FMul))
20401  if FMul > 75:
20402  FMul = 75
20403  FMulXEntry.delete(0,END)
20404  FMulXEntry.insert(0, int(FMul))
20405  except:
20406  FMulXEntry.delete(0,END)
20407  FMulXEntry.insert(0, int(FMul))
20408  FreqMin = baseFreq * FMul
20409  SRstring = "Multiplied Freq = " + ' {0:.1f} '.format(FreqMin) + " Hz"
20410  FminDisp.config(text = SRstring) # change displayed value
20411  SRstring = "Base Frequency = " + ' {0:.2f} '.format(baseFreq) + " Hz"
20412  eqivsamplerate.config(text = SRstring) # change displayed value
20413  # calculate time scale multiplication factor
20414  try:
20415  MinFreq = eval(FminEntry.get()) * 1000 # convert KHz to Hz
20416  except:
20417  FminEntry.delete(0,END)
20418  FminEntry.insert(0, 25)
20419  #
20420  try: # catch for divide by zero
20421  TscaleX = int((MinFreq)/(DivX * (MinFreq - FreqMin)))
20422  except:
20423  TscaleX = 1
20424 
20425  if TscaleX > 0:
20426  ETSDir.set(0) # set sample direction to forward if positive
20427  else:
20428  ETSDir.set(1) # set sample direction to reverse if negative
20429  TscaleX = abs(TscaleX)
20430  if Two_X_Sample.get() == 0:
20431  ToffsetX = TscaleX/10.0 # set channel B offset to 1/10 the time scale only for 1X sampeling
20432  else:
20433  ToffsetX = 0
20434  ETSts.delete(0,"end")
20435  ETSts.insert(0,ToffsetX)
20436 
20437  HtMulEntry.delete(0,END)
20438  HtMulEntry.insert(0, TscaleX)
20439  SRstring = "RT Sample Rate = " + str(SAMPLErate)
20440  rtsrlab.config(text=SRstring)
20441  SRstring = "ET Sample Rate = " + str(SAMPLErate*TscaleX)
20442  etssrlab.config(text=SRstring)
20443 #
20444 def Settingsscroll(event):
20445  onTextScroll(event)
20446  SettingsUpdate()
20447 #
20448 def SettingsTextKey(event):
20449  onTextKey(event)
20450  SettingsUpdate()
20451 #
20453  global GridWidth, TRACEwidth, TRACEaverage, Vdiv, HarmonicMarkers, ZEROstuffing, RevDate
20454  global Settingswindow, SettingsStatus, ZSTuff, TAvg, VDivE, TwdthE, GwdthE, HarMon
20455  global AWG_Amp_Mode, SWRev, EnableHSsampling, Auto_ETS_Comp, ETS_TC1, ETS_A1, ETS_TC2, ETS_A2
20456  global ets_TC1Entry, ets_A1Entry, ets_TC2Entry, ets_A2Entry, TrgLPFEntry, Trigger_LPF_length
20457  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2
20458  global CHA_A1, CHA_A2, CHB_A1, CHB_A2
20459  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
20460  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
20461  global FrameRefief, BorderSize
20462 
20463  if SettingsStatus.get() == 0:
20464  SettingsStatus.set(1)
20465  Settingswindow = Toplevel()
20466  Settingswindow.title("Settings " + SWRev + RevDate)
20467  Settingswindow.resizable(FALSE,FALSE)
20468  Settingswindow.protocol("WM_DELETE_WINDOW", DestroySettings)
20469  frame1 = Frame(Settingswindow, borderwidth=BorderSize, relief=FrameRefief)
20470  frame1.grid(row=0, column=0, sticky=W)
20471  #
20472  zstlab = Label(frame1, text="FFT Zero Stuffing", style= "A10B.TLabel")
20473  zstlab.grid(row=0, column=0, sticky=W)
20474  zstMode = Frame( frame1 )
20475  zstMode.grid(row=0, column=1, sticky=W)
20476  ZSTuff = Entry(zstMode, width=4, cursor='double_arrow')
20477  ZSTuff.bind("<Return>", SettingsTextKey)
20478  ZSTuff.bind('<MouseWheel>', Settingsscroll)
20479  ZSTuff.bind("<Button-4>", Settingsscroll)# with Linux OS
20480  ZSTuff.bind("<Button-5>", Settingsscroll)
20481  ZSTuff.bind('<Key>', SettingsTextKey)
20482  ZSTuff.pack(side=RIGHT)
20483  ZSTuff.delete(0,"end")
20484  ZSTuff.insert(0,ZEROstuffing.get())
20485  #
20486  Avglab = Label(frame1, text="Number Traces to Average", style= "A10B.TLabel")
20487  Avglab.grid(row=1, column=0, sticky=W)
20488  AvgMode = Frame( frame1 )
20489  AvgMode.grid(row=1, column=1, sticky=W)
20490  TAvg = Entry(AvgMode, width=4, cursor='double_arrow')
20491  TAvg.bind("<Return>", SettingsTextKey)
20492  TAvg.bind('<MouseWheel>', Settingsscroll)
20493  TAvg.bind("<Button-4>", Settingsscroll)# with Linux OS
20494  TAvg.bind("<Button-5>", Settingsscroll)
20495  TAvg.bind('<Key>', SettingsTextKey)
20496  TAvg.pack(side=RIGHT)
20497  TAvg.delete(0,"end")
20498  TAvg.insert(0,TRACEaverage.get())
20499  #
20500  HarMlab = Label(frame1, text="Number of Harmonic Markers", style= "A10B.TLabel")
20501  HarMlab.grid(row=2, column=0, sticky=W)
20502  HarMMode = Frame( frame1 )
20503  HarMMode.grid(row=2, column=1, sticky=W)
20504  HarMon = Entry(HarMMode, width=4, cursor='double_arrow')
20505  HarMon.bind("<Return>", SettingsTextKey)
20506  HarMon.bind('<MouseWheel>', Settingsscroll)
20507  HarMon.bind("<Button-4>", Settingsscroll)# with Linux OS
20508  HarMon.bind("<Button-5>", Settingsscroll)
20509  HarMon.bind('<Key>', SettingsTextKey)
20510  HarMon.pack(side=RIGHT)
20511  HarMon.delete(0,"end")
20512  HarMon.insert(0,HarmonicMarkers.get())
20513  #
20514  Vdivlab = Label(frame1, text="Number Vertical Div (SA, Bode)", style= "A10B.TLabel")
20515  Vdivlab.grid(row=3, column=0, sticky=W)
20516  VdivMode = Frame( frame1 )
20517  VdivMode.grid(row=3, column=1, sticky=W)
20518  VDivE = Entry(VdivMode, width=4, cursor='double_arrow')
20519  VDivE.bind("<Return>", SettingsTextKey)
20520  VDivE.bind('<MouseWheel>', Settingsscroll)
20521  VDivE.bind("<Button-4>", Settingsscroll)# with Linux OS
20522  VDivE.bind("<Button-5>", Settingsscroll)
20523  VDivE.bind('<Key>', SettingsTextKey)
20524  VDivE.pack(side=RIGHT)
20525  VDivE.delete(0,"end")
20526  VDivE.insert(0,Vdiv.get())
20527  #
20528  Twdthlab = Label(frame1, text="Trace Width in Pixels", style= "A10B.TLabel")
20529  Twdthlab.grid(row=4, column=0, sticky=W)
20530  TwdthMode = Frame( frame1 )
20531  TwdthMode.grid(row=4, column=1, sticky=W)
20532  TwdthE = Entry(TwdthMode, width=4, cursor='double_arrow')
20533  TwdthE.bind("<Return>", SettingsTextKey)
20534  TwdthE.bind('<MouseWheel>', Settingsscroll)
20535  TwdthE.bind("<Button-4>", Settingsscroll)# with Linux OS
20536  TwdthE.bind("<Button-5>", Settingsscroll)
20537  TwdthE.bind('<Key>', SettingsTextKey)
20538  TwdthE.pack(side=RIGHT)
20539  TwdthE.delete(0,"end")
20540  TwdthE.insert(0,TRACEwidth.get())
20541  #
20542  Gwdthlab = Label(frame1, text="Grid Width in Pixels", style= "A10B.TLabel")
20543  Gwdthlab.grid(row=5, column=0, sticky=W)
20544  GwdthMode = Frame( frame1 )
20545  GwdthMode.grid(row=5, column=1, sticky=W)
20546  GwdthE = Entry(GwdthMode, width=4, cursor='double_arrow')
20547  GwdthE.bind("<Return>", SettingsTextKey)
20548  GwdthE.bind('<MouseWheel>', Settingsscroll)
20549  GwdthE.bind("<Button-4>", Settingsscroll)# with Linux OS
20550  GwdthE.bind("<Button-5>", Settingsscroll)
20551  GwdthE.bind('<Key>', SettingsTextKey)
20552  GwdthE.pack(side=RIGHT)
20553  GwdthE.delete(0,"end")
20554  GwdthE.insert(0,GridWidth.get())
20555  #
20556  trglpflab = Label(frame1, text="Trigger LPF Length", style= "A10B.TLabel")
20557  trglpflab.grid(row=6, column=0, sticky=W)
20558  TrgLPFMode = Frame( frame1 )
20559  TrgLPFMode.grid(row=6, column=1, sticky=W)
20560  TrgLPFEntry = Entry(TrgLPFMode, width=4, cursor='double_arrow')
20561  TrgLPFEntry.bind("<Return>", SettingsTextKey)
20562  TrgLPFEntry.bind('<MouseWheel>', Settingsscroll)
20563  TrgLPFEntry.bind("<Button-4>", Settingsscroll)# with Linux OS
20564  TrgLPFEntry.bind("<Button-5>", Settingsscroll)
20565  TrgLPFEntry.bind('<Key>', SettingsTextKey)
20566  TrgLPFEntry.pack(side=RIGHT)
20567  TrgLPFEntry.delete(0,"end")
20568  TrgLPFEntry.insert(0,Trigger_LPF_length.get())
20569  #
20570  AwgAmplrb1 = Radiobutton(frame1, text="AWG Min/Max", variable=AWG_Amp_Mode, value=0, command=UpdateAWGWin)
20571  AwgAmplrb1.grid(row=7, column=0, sticky=W)
20572  AwgAmplrb2 = Radiobutton(frame1, text="AWG Amp/Off ", variable=AWG_Amp_Mode, value=1, command=UpdateAWGWin)
20573  AwgAmplrb2.grid(row=7, column=1, sticky=W)
20574  #
20575  cha_Rcomplab = Label(frame1, text="CHA Comp, TC1 (uSec), A1", style= "A10B.TLabel") # in micro seconds
20576  cha_Rcomplab.grid(row=8, column=0, sticky=W)
20577  cha_RcomplabMode = Frame( frame1 )
20578  cha_RcomplabMode.grid(row=8, column=1, sticky=W)
20579  cha_TC1Entry = Entry(cha_RcomplabMode, width=5, cursor='double_arrow')
20580  cha_TC1Entry.bind("<Return>", SettingsTextKey)
20581  cha_TC1Entry.bind('<MouseWheel>', Settingsscroll)
20582  cha_TC1Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20583  cha_TC1Entry.bind("<Button-5>", Settingsscroll)
20584  cha_TC1Entry.bind('<Key>', SettingsTextKey)
20585  cha_TC1Entry.pack(side=LEFT)
20586  cha_TC1Entry.delete(0,"end")
20587  cha_TC1Entry.insert(0,CHA_TC1.get())
20588  cha_A1Entry = Entry(cha_RcomplabMode, width=5, cursor='double_arrow')
20589  cha_A1Entry.bind("<Return>", SettingsTextKey)
20590  cha_A1Entry.bind('<MouseWheel>', Settingsscroll)
20591  cha_A1Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20592  cha_A1Entry.bind("<Button-5>", Settingsscroll)
20593  cha_A1Entry.bind('<Key>', SettingsTextKey)
20594  cha_A1Entry.pack(side=LEFT)
20595  cha_A1Entry.delete(0,"end")
20596  cha_A1Entry.insert(0,CHA_A1.get())
20597  #
20598  cha_Ccomplab = Label(frame1, text="CHA Comp, TC2 (uSec), A2", style= "A10B.TLabel") # in micro seconds
20599  cha_Ccomplab.grid(row=9, column=0, sticky=W)
20600  cha_CcomplabMode = Frame( frame1 )
20601  cha_CcomplabMode.grid(row=9, column=1, sticky=W)
20602  cha_TC2Entry = Entry(cha_CcomplabMode, width=5, cursor='double_arrow')
20603  cha_TC2Entry.bind("<Return>", SettingsTextKey)
20604  cha_TC2Entry.bind('<MouseWheel>', Settingsscroll)
20605  cha_TC2Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20606  cha_TC2Entry.bind("<Button-5>", Settingsscroll)
20607  cha_TC2Entry.bind('<Key>', SettingsTextKey)
20608  cha_TC2Entry.pack(side=LEFT)
20609  cha_TC2Entry.delete(0,"end")
20610  cha_TC2Entry.insert(0,CHA_TC2.get())
20611  cha_A2Entry = Entry(cha_CcomplabMode, width=5, cursor='double_arrow')
20612  cha_A2Entry.bind("<Return>", SettingsTextKey)
20613  cha_A2Entry.bind('<MouseWheel>', Settingsscroll)
20614  cha_A2Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20615  cha_A2Entry.bind("<Button-5>", Settingsscroll)
20616  cha_A2Entry.bind('<Key>', SettingsTextKey)
20617  cha_A2Entry.pack(side=LEFT)
20618  cha_A2Entry.delete(0,"end")
20619  cha_A2Entry.insert(0,CHA_A2.get())
20620  #
20621  chb_Rcomplab = Label(frame1, text="CHB Comp, TC1 (uSec), A1", style= "A10B.TLabel") # in micro seconds
20622  chb_Rcomplab.grid(row=10, column=0, sticky=W)
20623  chb_RcomplabMode = Frame( frame1 )
20624  chb_RcomplabMode.grid(row=10, column=1, sticky=W)
20625  chb_TC1Entry = Entry(chb_RcomplabMode, width=5, cursor='double_arrow')
20626  chb_TC1Entry.bind("<Return>", SettingsTextKey)
20627  chb_TC1Entry.bind('<MouseWheel>', Settingsscroll)
20628  chb_TC1Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20629  chb_TC1Entry.bind("<Button-5>", Settingsscroll)
20630  chb_TC1Entry.bind('<Key>', SettingsTextKey)
20631  chb_TC1Entry.pack(side=LEFT)
20632  chb_TC1Entry.delete(0,"end")
20633  chb_TC1Entry.insert(0,CHB_TC1.get())
20634  chb_A1Entry = Entry(chb_RcomplabMode, width=5, cursor='double_arrow')
20635  chb_A1Entry.bind("<Return>", SettingsTextKey)
20636  chb_A1Entry.bind('<MouseWheel>', Settingsscroll)
20637  chb_A1Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20638  chb_A1Entry.bind("<Button-5>", Settingsscroll)
20639  chb_A1Entry.bind('<Key>', SettingsTextKey)
20640  chb_A1Entry.pack(side=LEFT)
20641  chb_A1Entry.delete(0,"end")
20642  chb_A1Entry.insert(0,CHB_A1.get())
20643  #
20644  chb_Ccomplab = Label(frame1, text="CHB Comp, TC2 (uSec), A2", style= "A10B.TLabel") # in micro seconds
20645  chb_Ccomplab.grid(row=11, column=0, sticky=W)
20646  chb_CcomplabMode = Frame( frame1 )
20647  chb_CcomplabMode.grid(row=11, column=1, sticky=W)
20648  chb_TC2Entry = Entry(chb_CcomplabMode, width=5, cursor='double_arrow')
20649  chb_TC2Entry.bind("<Return>", SettingsTextKey)
20650  chb_TC2Entry.bind('<MouseWheel>', Settingsscroll)
20651  chb_TC2Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20652  chb_TC2Entry.bind("<Button-5>", Settingsscroll)
20653  chb_TC2Entry.bind('<Key>', SettingsTextKey)
20654  chb_TC2Entry.pack(side=LEFT)
20655  chb_TC2Entry.delete(0,"end")
20656  chb_TC2Entry.insert(0,CHB_TC2.get())
20657  chb_A2Entry = Entry(chb_CcomplabMode, width=5, cursor='double_arrow')
20658  chb_A2Entry.bind("<Return>", SettingsTextKey)
20659  chb_A2Entry.bind('<MouseWheel>', Settingsscroll)
20660  chb_A2Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20661  chb_A2Entry.bind("<Button-5>", Settingsscroll)
20662  chb_A2Entry.bind('<Key>', SettingsTextKey)
20663  chb_A2Entry.pack(side=LEFT)
20664  chb_A2Entry.delete(0,"end")
20665  chb_A2Entry.insert(0,CHB_A2.get())
20666  #
20667  if EnableHSsampling > 0:
20668  hs_ckb1 = Checkbutton(frame1, text="Auto Set ETS Comp", variable=Auto_ETS_Comp, command=SetETSComp)
20669  hs_ckb1.grid(row=12, column=0, sticky=W)
20670  hs1_Complab = Label(frame1, text="ETS Comp, TC1 (uSec), A1", style= "A10B.TLabel") # in micro seconds
20671  hs1_Complab.grid(row=13, column=0, sticky=W)
20672  hs1_ComplabMode = Frame( frame1 )
20673  hs1_ComplabMode.grid(row=13, column=1, sticky=W)
20674  ets_TC1Entry = Entry(hs1_ComplabMode, width=5, cursor='double_arrow')
20675  ets_TC1Entry.bind("<Return>", SettingsTextKey)
20676  ets_TC1Entry.bind('<MouseWheel>', Settingsscroll)
20677  ets_TC1Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20678  ets_TC1Entry.bind("<Button-5>", Settingsscroll)
20679  ets_TC1Entry.bind('<Key>', SettingsTextKey)
20680  ets_TC1Entry.pack(side=LEFT)
20681  ets_TC1Entry.delete(0,"end")
20682  ets_TC1Entry.insert(0,ETS_TC1.get())
20683  ets_A1Entry = Entry(hs1_ComplabMode, width=5, cursor='double_arrow')
20684  ets_A1Entry.bind("<Return>", SettingsTextKey)
20685  ets_A1Entry.bind('<MouseWheel>', Settingsscroll)
20686  ets_A1Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20687  ets_A1Entry.bind("<Button-5>", Settingsscroll)
20688  ets_A1Entry.bind('<Key>', SettingsTextKey)
20689  ets_A1Entry.pack(side=LEFT)
20690  ets_A1Entry.delete(0,"end")
20691  ets_A1Entry.insert(0,ETS_A1.get())
20692  #
20693  hs2_Complab = Label(frame1, text="ETS Comp, TC2 (uSec), A2", style= "A10B.TLabel") # in micro seconds
20694  hs2_Complab.grid(row=14, column=0, sticky=W)
20695  hs2_ComplabMode = Frame( frame1 )
20696  hs2_ComplabMode.grid(row=14, column=1, sticky=W)
20697  ets_TC2Entry = Entry(hs2_ComplabMode, width=5, cursor='double_arrow')
20698  ets_TC2Entry.bind("<Return>", SettingsTextKey)
20699  ets_TC2Entry.bind('<MouseWheel>', Settingsscroll)
20700  ets_TC2Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20701  ets_TC2Entry.bind("<Button-5>", Settingsscroll)
20702  ets_TC2Entry.bind('<Key>', SettingsTextKey)
20703  ets_TC2Entry.pack(side=LEFT)
20704  ets_TC2Entry.delete(0,"end")
20705  ets_TC2Entry.insert(0,ETS_TC2.get())
20706  ets_A2Entry = Entry(hs2_ComplabMode, width=5, cursor='double_arrow')
20707  ets_A2Entry.bind("<Return>", SettingsTextKey)
20708  ets_A2Entry.bind('<MouseWheel>', Settingsscroll)
20709  ets_A2Entry.bind("<Button-4>", Settingsscroll)# with Linux OS
20710  ets_A2Entry.bind("<Button-5>", Settingsscroll)
20711  ets_A2Entry.bind('<Key>', SettingsTextKey)
20712  ets_A2Entry.pack(side=LEFT)
20713  ets_A2Entry.delete(0,"end")
20714  ets_A2Entry.insert(0,ETS_A2.get())
20715  #
20716  Settingsdismissbutton = Button(frame1, text="Dismiss", style= "W8.TButton", command=DestroySettings)
20717  Settingsdismissbutton.grid(row=15, column=0, sticky=W, pady=7)
20718  else:
20719  Settingsdismissbutton = Button(frame1, text="Dismiss", style= "W8.TButton", command=DestroySettings)
20720  Settingsdismissbutton.grid(row=12, column=0, sticky=W, pady=7)
20721 #
20723  global Auto_ETS_Comp, ETS_TC1, ETS_A1, ETS_TC2, ETS_A2
20724  global ets_TC1Entry, ets_A1Entry, ets_TC2Entry, ets_A2Entry
20725  global CHA_RC_HP, CHB_RC_HP, CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2
20726  global CHA_A1, CHA_A2, CHB_A1, CHB_A2
20727  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
20728  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
20729 
20730  if Auto_ETS_Comp.get() == 1:
20731  try:
20732  MulX = float(HtMulEntry.get())
20733  #
20734  Value = float(ets_TC1Entry.get()) * MulX
20735  cha_TC1Entry.delete(0,"end")
20736  cha_TC1Entry.insert(0, Value)
20737  cha_A1Entry.delete(0,"end")
20738  cha_A1Entry.insert(0, ets_A1Entry.get())
20739  chb_TC1Entry.delete(0,"end")
20740  chb_TC1Entry.insert(0, Value)
20741  chb_A1Entry.delete(0,"end")
20742  chb_A1Entry.insert(0, ets_A1Entry.get())
20743  #
20744  Value = float(ets_TC2Entry.get()) * MulX
20745  cha_TC2Entry.delete(0,"end")
20746  cha_TC2Entry.insert(0, Value)
20747  cha_A2Entry.delete(0,"end")
20748  cha_A2Entry.insert(0, ets_A2Entry.get())
20749  chb_TC2Entry.delete(0,"end")
20750  chb_TC2Entry.insert(0, Value)
20751  chb_A2Entry.delete(0,"end")
20752  chb_A2Entry.insert(0, ets_A2Entry.get())
20753  except:
20754  MulX = 1.0
20755 
20757 
20758  UpdateAWGA()
20759  UpdateAWGB()
20760  ReMakeAWGwaves()
20761 
20763  global GridWidth, TRACEwidth, TRACEaverage, Vdiv, HarmonicMarkers, ZEROstuffing, RevDate
20764  global Settingswindow, SettingsStatus, ZSTuff, TAvg, VDivE, TwdthE, GwdthE, HarMon
20765  global CHA_TC1, CHA_TC2, CHB_TC1, CHB_TC2
20766  global CHA_A1, CHA_A2, CHB_A1, CHB_A2, TrgLPFEntry, Trigger_LPF_length
20767  global cha_TC1Entry, cha_TC2Entry, chb_TC1Entry, chb_TC2Entry
20768  global cha_A1Entry, cha_A2Entry, chb_A1Entry, chb_A2Entry
20769 
20770  try:
20771  GW = int(eval(GwdthE.get()))
20772  if GW < 1:
20773  GW = 1
20774  GwdthE.delete(0,END)
20775  GwdthE.insert(0, int(GW))
20776  if GW > 5:
20777  GW = 5
20778  GwdthE.delete(0,END)
20779  GwdthE.insert(0, int(GW))
20780  except:
20781  GwdthE.delete(0,END)
20782  GwdthE.insert(0, GridWidth.get())
20783  GridWidth.set(GW)
20784  #
20785  try:
20786  T_length = int(eval(TrgLPFEntry.get()))
20787  if T_length < 1:
20788  T_length = 1
20789  TrgLPFEntry.delete(0,END)
20790  TrgLPFEntry.insert(0, int(GW))
20791  if T_length > 100:
20792  T_length = 100
20793  TrgLPFEntry.delete(0,END)
20794  TrgLPFEntry.insert(0, int(GW))
20795  except:
20796  TrgLPFEntry.delete(0,END)
20797  TrgLPFEntry.insert(0, Trigger_LPF_length.get())
20798  Trigger_LPF_length.set(T_length)
20799  #
20800  try:
20801  TW = int(eval(TwdthE.get()))
20802  if TW < 1:
20803  TW = 1
20804  TwdthE.delete(0,END)
20805  TwdthE.insert(0, int(TW))
20806  if TW > 5:
20807  TW = 5
20808  TwdthE.delete(0,END)
20809  TwdthE.insert(0, int(TW))
20810  except:
20811  TwdthE.delete(0,END)
20812  TwdthE.insert(0, TRACEwidth.get())
20813  TRACEwidth.set(TW)
20814  # Number of average sweeps for average mode
20815  try:
20816  TA = int(eval(TAvg.get()))
20817  if TA < 1:
20818  TA = 1
20819  TAvg.delete(0,END)
20820  TAvg.insert(0, int(TA))
20821  if TA > 16:
20822  TA = 16
20823  TAvg.delete(0,END)
20824  TAvg.insert(0, int(TA))
20825  except:
20826  TAvg.delete(0,END)
20827  TAvg.insert(0, TRACEaverage.get())
20828  TRACEaverage.set(TA)
20829  # Number of vertical divisions for spectrum / Bode
20830  try:
20831  VDv = int(eval(VDivE.get()))
20832  if VDv < 1:
20833  VDv = 1
20834  VDivE.delete(0,END)
20835  VDivE.insert(0, int(VDv))
20836  if VDv > 16:
20837  VDv = 16
20838  VDivE.delete(0,END)
20839  VDivE.insert(0, int(VDv))
20840  except:
20841  VDivE.delete(0,END)
20842  VDivE.insert(0, Vdiv.get())
20843  Vdiv.set(VDv)
20844  # number of Harmonic Markers in SA
20845  try:
20846  HM = int(eval(HarMon.get()))
20847  if HM < 1:
20848  HM = 1
20849  HarMon.delete(0,END)
20850  HarMon.insert(0, int(HM))
20851  if HM > 9:
20852  HM =9
20853  HarMon.delete(0,END)
20854  HarMon.insert(0, int(HM))
20855  except:
20856  HarMon.delete(0,END)
20857  HarMon.insert(0, HarmonicMarkers.get())
20858  HarmonicMarkers.set(HM)
20859  # The zero stuffing value is 2 ** ZERO stuffing, calculated on initialize
20860  try:
20861  ZST = int(eval(ZSTuff.get()))
20862  if ZST < 1:
20863  ZST = 1
20864  ZSTuff.delete(0,END)
20865  ZSTuff.insert(0, int(ZST))
20866  if ZST > 5:
20867  ZST = 5
20868  ZSTuff.delete(0,END)
20869  ZSTuff.insert(0, int(ZST))
20870  except:
20871  ZSTuff.delete(0,END)
20872  ZSTuff.insert(0, ZEROstuffing.get())
20873  ZEROstuffing.set(ZST)
20874 #
20875  try:
20876  TC1A = float(cha_TC1Entry.get())
20877  CHA_TC1.set(TC1A)
20878  if TC1A < 0:
20879  TC1A = 0
20880  cha_TC1Entry.delete(0,END)
20881  cha_TC1Entry.insert(0, TC1A)
20882  except:
20883  cha_TC1Entry.delete(0,END)
20884  cha_TC1Entry.insert(0, CHA_TC1.get())
20885  try:
20886  TC2A = float(cha_TC2Entry.get())
20887  CHA_TC2.set(TC2A)
20888  if TC2A < 0:
20889  TC2A = 0
20890  cha_TC2Entry.delete(0,END)
20891  cha_TC2Entry.insert(0, TC2A)
20892  except:
20893  cha_TC2Entry.delete(0,END)
20894  cha_TC2Entry.insert(0, CHA_TC2.get())
20895  #
20896  try:
20897  Gain1A = float(cha_A1Entry.get())
20898  CHA_A1.set(Gain1A)
20899  except:
20900  cha_A1Entry.delete(0,END)
20901  cha_A1Entry.insert(0, CHA_A1.get())
20902  try:
20903  Gain2A = float(cha_A2Entry.get())
20904  CHA_A2.set(Gain2A)
20905  except:
20906  cha_A2Entry.delete(0,END)
20907  cha_A2Entry.insert(0, CHA_A2.get())
20908  #
20909  try:
20910  TC1B = float(chb_TC1Entry.get())
20911  CHB_TC1.set(TC1B)
20912  if TC1B < 0:
20913  TC1B = 0
20914  chb_TC1Entry.delete(0, END)
20915  chb_TC1Entry.insert(0, TC1B)
20916  except:
20917  chb_TC1Entry.delete(0,END)
20918  chb_TC1Entry.insert(0, CHB_TC1.get())
20919  try:
20920  TC2B = float(chb_TC2Entry.get())
20921  CHB_TC2.set(TC2B)
20922  if TC2B < 0:
20923  TC2B = 0
20924  chb_TC2Entry.delete(0, END)
20925  chb_TC2Entry.insert(0, TC2B)
20926  except:
20927  chb_TC2Entry.delete(0,END)
20928  chb_TC2Entry.insert(0, CHB_TC2.get())
20929  #
20930  try:
20931  Gain1B = float(chb_A1Entry.get())
20932  CHB_A1.set(Gain1B)
20933  except:
20934  chb_A1Entry.delete(0,END)
20935  chb_A1Entry.insert(0, CHB_A1.get())
20936  try:
20937  Gain2B = float(chb_A2Entry.get())
20938  CHB_A2.set(Gain2B)
20939  except:
20940  chb_A2Entry.delete(0,END)
20941  chb_A2Entry.insert(0, CHB_A2.get())
20942  # set ETS base comp
20943  #
20944  SetETSComp()
20945 #
20947  global Settingswindow, SettingsStatus
20948 
20949  SettingsStatus.set(0)
20950  SettingsUpdate()
20951  Settingswindow.destroy()
20952 #
20953 def onCanvasMouse_xy(event):
20954  global MouseX, MouseY, MouseWidget
20955 
20956  MouseWidget = event.widget
20957  MouseX, MouseY = event.x, event.y
20958 #
20959 def BSetFmin():
20960  global FminEntry, CHAfreq
20961 
20962  if CHAfreq > 0:
20963  String = '{0:.3f}'.format(CHAfreq/1000)
20964  FminEntry.delete(0,"end")
20965  FminEntry.insert(0,String)
20966 #
20967 def ReSetAGO():
20968  global CHAVGainEntry, CHAVOffsetEntry
20969 
20970  CHAVGainEntry.delete(0,"end")
20971  CHAVGainEntry.insert(0,1.0)
20972  CHAVOffsetEntry.delete(0,"end")
20973  CHAVOffsetEntry.insert(0,0.0)
20974 #
20975 def ReSetBGO():
20976  global CHBVGainEntry, CHBVOffsetEntry
20977 
20978  CHBVGainEntry.delete(0,"end")
20979  CHBVGainEntry.insert(0,1.0)
20980  CHBVOffsetEntry.delete(0,"end")
20981  CHBVOffsetEntry.insert(0,0.0)
20982 #
20984  global CHAIGainEntry, CHAIOffsetEntry
20985 
20986  CHAIGainEntry.delete(0,"end")
20987  CHAIGainEntry.insert(0,1.0)
20988  CHAIOffsetEntry.delete(0,"end")
20989  CHAIOffsetEntry.insert(0,0.0)
20990 #
20992  global CHBIGainEntry, CHBIOffsetEntry
20993 
20994  CHBIGainEntry.delete(0,"end")
20995  CHBIGainEntry.insert(0,1.0)
20996  CHBIOffsetEntry.delete(0,"end")
20997  CHBIOffsetEntry.insert(0,0.0)
20998 #
21000  global EnablePhaseAnalizer, EnableSpectrumAnalizer, EnableBodePlotter, EnableImpedanceAnalizer
21001  global EnableOhmMeter, OOTphckb, OOTBuildPhAScreen, OOTckb3, OOTBuildSpectrumScreen, OOTckb5
21002  global OOTBuildBodeScreen, OOTckb4, OOTBuildIAScreen, OOTckb6, OOTBuildOhmScreen, OOTScreenStatus
21003  global OOTwindow, SWRev, RevDate, BorderSize, FrameRefief, OOTdismissclbutton, EnableDigIO
21004  global EnablePIODACMode, EnableMuxMode, EnableMinigenMode, EnablePmodDA1Mode, EnableDigPotMode, EnableGenericSerialMode
21005  global EnableAD5626SerialMode, EnableDigitalFilter, EnableCommandInterface, EnableMeasureScreen, EnableETSScreen
21006 
21007  if OOTScreenStatus.get() == 0:
21008  OOTScreenStatus.set(1)
21009  OOTwindow = Toplevel()
21010  OOTwindow.title("Instruments " + SWRev + RevDate)
21011  OOTwindow.resizable(FALSE,FALSE)
21012  OOTwindow.protocol("WM_DELETE_WINDOW", DestroyOOTwindow)
21013  frame1 = Frame(OOTwindow, borderwidth=BorderSize, relief=FrameRefief)
21014  frame1.grid(row=0, column=0, sticky=W)
21015  nextrow = 1
21016  if EnablePhaseAnalizer > 0:
21017  phasebtn = Frame( frame1 )
21018  phasebtn.grid(row=nextrow, column=0, sticky=W)
21019  OOTphckb = Checkbutton(phasebtn, text="Enab", style="Disab.TCheckbutton", variable=PhADisp, command=PhACheckBox)
21020  OOTphckb.pack(side=LEFT)
21021  OOTBuildPhAScreen = Button(phasebtn, text="Phasor Plot", style="W11.TButton", command=MakePhAWindow)
21022  OOTBuildPhAScreen.pack(side=LEFT)
21023  nextrow = nextrow + 1
21024  #
21025  if EnableSpectrumAnalizer > 0:
21026  freqbtn = Frame( frame1 )
21027  freqbtn.grid(row=nextrow, column=0, sticky=W)
21028  OOTckb3 = Checkbutton(freqbtn, text="Enab", style="Disab.TCheckbutton", variable=FreqDisp, command=FreqCheckBox)
21029  OOTckb3.pack(side=LEFT)
21030  OOTBuildSpectrumScreen = Button(freqbtn, text="Spectrum Plot", style="W11.TButton", command=MakeSpectrumWindow)
21031  OOTBuildSpectrumScreen.pack(side=LEFT)
21032  nextrow = nextrow + 1
21033  #
21034  if EnableBodePlotter > 0:
21035  bodebtn = Frame( frame1 )
21036  bodebtn.grid(row=nextrow, column=0, sticky=W)
21037  OOTckb5 = Checkbutton(bodebtn, text="Enab", style="Disab.TCheckbutton", variable=BodeDisp, command=BodeCheckBox)
21038  OOTckb5.pack(side=LEFT)
21039  OOTBuildBodeScreen = Button(bodebtn, text="Bode Plot", style="W11.TButton", command=MakeBodeWindow)
21040  OOTBuildBodeScreen.pack(side=LEFT)
21041  nextrow = nextrow + 1
21042  #
21043  if EnableImpedanceAnalizer > 0:
21044  impdbtn = Frame( frame1 )
21045  impdbtn.grid(row=nextrow, column=0, sticky=W)
21046  OOTckb4 = Checkbutton(impdbtn, text="Enab", style="Disab.TCheckbutton", variable=IADisp, command=IACheckBox)
21047  OOTckb4.pack(side=LEFT)
21048  OOTBuildIAScreen = Button(impdbtn, text="Impedance", style="W11.TButton", command=MakeIAWindow)
21049  OOTBuildIAScreen.pack(side=LEFT)
21050  nextrow = nextrow + 1
21051  #
21052  if EnableOhmMeter > 0:
21053  dcohmbtn = Frame( frame1 )
21054  dcohmbtn.grid(row=nextrow, column=0, sticky=W)
21055  OOTckb6 = Checkbutton(dcohmbtn, text="Enab", style="Disab.TCheckbutton", variable=OhmDisp, command=OhmCheckBox)
21056  OOTckb6.pack(side=LEFT)
21057  OOTBuildOhmScreen = Button(dcohmbtn, text="Ohmmeter", style="W11.TButton", command=MakeOhmWindow)
21058  OOTBuildOhmScreen.pack(side=LEFT)
21059  nextrow = nextrow + 1
21060 
21061  if EnableDigIO > 0:
21062  OOTBuildDigScreen = Button(frame1, text="Digital I/O Screen", style="W17.TButton", command=MakeDigScreen)
21063  OOTBuildDigScreen.grid(row=nextrow, column=0, sticky=W)
21064  nextrow = nextrow + 1
21065  # Optional plugin tools
21066  if EnablePIODACMode > 0:
21067  OOTBuildDacScreen = Button(frame1, text="PIO-DAC Screen", style="W17.TButton", command=MakeDacScreen)
21068  OOTBuildDacScreen.grid(row=nextrow, column=0, sticky=W)
21069  nextrow = nextrow + 1
21070  if EnableMuxMode > 0:
21071  OOTBuildMuxScreen = Button(frame1, text="Analog In Mux Screen", style="W17.TButton", command=MakeMuxModeWindow)
21072  OOTBuildMuxScreen.grid(row=nextrow, column=0, sticky=W)
21073  nextrow = nextrow + 1
21074  if EnableMinigenMode > 0:
21075  OOTBuildMinigenScreen = Button(frame1, text="AD983x DDS Screen", style="W17.TButton", command=MakeMinigenWindow)
21076  OOTBuildMinigenScreen.grid(row=nextrow, column=0, sticky=W)
21077  nextrow = nextrow + 1
21078  if EnablePmodDA1Mode > 0:
21079  OOTBuildDA1Screen = Button(frame1, text="PMOD DA1 Screen", style="W17.TButton", command=MakeDA1Window)
21080  OOTBuildDA1Screen.grid(row=nextrow, column=0, sticky=W)
21081  nextrow = nextrow + 1
21082  if EnableDigPotMode >0:
21083  OOTBuildDigPotScreen = Button(frame1, text="Dig Pot Screen", style="W17.TButton", command=MakeDigPotWindow)
21084  OOTBuildDigPotScreen.grid(row=nextrow, column=0, sticky=W)
21085  nextrow = nextrow + 1
21086  if EnableGenericSerialMode >0:
21087  OOTGenericSerialScreen = Button(frame1, text="Generic Serial Output", style="W17.TButton", command=MakeGenericSerialWindow)
21088  OOTGenericSerialScreen.grid(row=nextrow, column=0, sticky=W)
21089  nextrow = nextrow + 1
21090  if EnableAD5626SerialMode >0:
21091  OOTAD5626SerialScreen = Button(frame1, text="AD5626 Output", style="W17.TButton", command=MakeAD5626Window)
21092  OOTAD5626SerialScreen.grid(row=nextrow, column=0, sticky=W)
21093  nextrow = nextrow + 1
21094  if EnableDigitalFilter >0:
21095  OOTDigFiltScreen = Button(frame1, text="Digital Filter", style="W17.TButton", command=MakeDigFiltWindow)
21096  OOTDigFiltScreen.grid(row=nextrow, column=0, sticky=W)
21097  nextrow = nextrow + 1
21098  if EnableCommandInterface > 0:
21099  OOTCommandLineScreen = Button(frame1, text="Command Interface", style="W17.TButton", command=MakeCommandScreen)
21100  OOTCommandLineScreen.grid(row=nextrow, column=0, sticky=W)
21101  nextrow = nextrow + 1
21102  if EnableMeasureScreen > 0:
21103  OOTMeasureScreen = Button(frame1, text="Measure Screen", style="W17.TButton", command=MakeMeasureScreen)
21104  OOTMeasureScreen.grid(row=nextrow, column=0, sticky=W)
21105  nextrow = nextrow + 1
21106  if EnableETSScreen > 0:
21107  OOTETSScreen = Button(frame1, text="ETS Controls", style="W17.TButton", command=MakeETSWindow)
21108  OOTETSScreen.grid(row=nextrow, column=0, sticky=W)
21109  nextrow = nextrow + 1
21110  #
21111  OOTdismissclbutton = Button(frame1, text="Dismiss", style="W8.TButton", command=DestroyOOTwindow)
21112  OOTdismissclbutton.grid(row=nextrow, column=0, sticky=W, pady=7)
21113 #
21115  global OOTwindow, OOTScreenStatus
21116 
21117  OOTScreenStatus.set(0)
21118  OOTwindow.destroy()
21119 #
21120 #
21121 # ================ Make main Screen ==========================
21122 TgInput = IntVar(0) # Trigger Input variable
21123 SingleShot = IntVar(0) # variable for single shot triger
21124 ManualTrigger = IntVar(0) # variable for Manual trigger
21125 AutoLevel = IntVar(0) # variable for Auto Level trigger at mid point
21126 ShowC1_V = IntVar(0) # curves to display variables
21127 TgEdge = IntVar(0) # Trigger edge variable
21128 # Show channels variables
21129 ShowC1_V = IntVar(0) # curves to display variables
21130 ShowC1_I = IntVar(0)
21131 ShowC2_V = IntVar(0)
21132 ShowC2_I = IntVar(0)
21133 ShowAV_I = IntVar(0)
21134 ShowBV_I = IntVar(0)
21135 ShowRA_V = IntVar(0)
21136 ShowRA_I = IntVar(0)
21137 ShowRB_V = IntVar(0)
21138 ShowRB_I = IntVar(0)
21139 ShowMath = IntVar(0)
21140 ShowPB_A = IntVar(0)
21141 ShowPB_B = IntVar(0)
21142 ShowPB_C = IntVar(0)
21143 ShowPB_D = IntVar(0)
21144 # Bode and SA variables
21145 ShowC1_VdB = IntVar(0) # curves to display variables
21146 ShowC1_P = IntVar(0)
21147 ShowC2_VdB = IntVar(0)
21148 ShowC2_P = IntVar(0)
21149 ShowMarker = IntVar(0)
21150 ShowRA_VdB = IntVar(0)
21151 ShowRA_P = IntVar(0)
21152 ShowRB_VdB = IntVar(0)
21153 ShowRB_P = IntVar(0)
21154 ShowMathSA = IntVar(0)
21155 ShowRMath = IntVar(0)
21156 ShowAWGASA = IntVar(0)
21157 ShowAWGBSA = IntVar(0)
21158 HScaleBP = IntVar(0)
21159 HScaleBP.set(1)
21160 #
21161 Show_MathX = IntVar(0)
21162 Show_MathY = IntVar(0)
21163 AutoCenterA = IntVar(0)
21164 AutoCenterB = IntVar(0)
21165 SmoothCurves = IntVar(0)
21166 ZOHold = IntVar(0)
21167 TRACEmodeTime = IntVar(0)
21168 TRACEmodeTime.set(0)
21169 DecimateOption = IntVar(0)
21170 MathTrace = IntVar(0)
21171 # AWG variables
21172 AWGAMode = IntVar(0) # AWG A mode variable
21173 AWGAIOMode = IntVar(0) # AWG A Split I/O mode variable
21174 AWGATerm = IntVar(0) # AWG A termination variable
21175 AWGAShape = IntVar(0) # AWG A Wave shape variable
21176 AWGAPhaseDelay = IntVar(0) #
21177 AWGARepeatFlag = IntVar(0) # AWG A Arb shape repeat flag
21178 AWGABurstFlag = IntVar(0) # AWG A Burst mode flag
21179 AWGBBurstFlag = IntVar(0) # AWG B Burst mode flag
21180 AWGBMode = IntVar(0) # AWG B mode variable
21181 AWGBIOMode = IntVar(0) # AWG B Split I/O mode variable
21182 AWGBTerm = IntVar(0) # AWG B termination variable
21183 AWGBShape = IntVar(0) # AWG B Wave shape variable
21184 AWGBPhaseDelay = IntVar(0) #
21185 AWGBRepeatFlag = IntVar(0) # AWG B Arb shape repeat flag
21186 AWGAMode.set(2)
21187 AWGBMode.set(2)
21188 AWGSync = IntVar(0) # Sync start both AWG channels
21189 AWGSync.set(1)
21190 BisCompA = IntVar(0) # Make Channel B comp of channel A
21191 BisCompA.set(0)
21192 # define vertical measurment variables
21193 MeasDCV1 = IntVar(0)
21194 MeasMinV1 = IntVar(0)
21195 MeasMaxV1 = IntVar(0)
21196 MeasMidV1 = IntVar(0)
21197 MeasPPV1 = IntVar(0)
21198 MeasRMSV1 = IntVar(0)
21199 MeasRMSVA_B = IntVar(0)
21200 MeasDCI1 = IntVar(0)
21201 MeasMinI1 = IntVar(0)
21202 MeasMaxI1 = IntVar(0)
21203 MeasMidI1 = IntVar(0)
21204 MeasPPI1 = IntVar(0)
21205 MeasRMSI1 = IntVar(0)
21206 MeasDiffAB = IntVar(0)
21207 MeasDCV2 = IntVar(0)
21208 MeasMinV2 = IntVar(0)
21209 MeasMaxV2 = IntVar(0)
21210 MeasMidV2 = IntVar(0)
21211 MeasPPV2 = IntVar(0)
21212 MeasRMSV2 = IntVar(0)
21213 MeasDCI2 = IntVar(0)
21214 MeasMinI2 = IntVar(0)
21215 MeasMaxI2 = IntVar(0)
21216 MeasMidI2 = IntVar(0)
21217 MeasPPI2 = IntVar(0)
21218 MeasRMSI2 = IntVar(0)
21219 MeasDiffBA = IntVar(0)
21220 MeasUserA = IntVar(0)
21221 MeasAHW = IntVar(0)
21222 MeasALW = IntVar(0)
21223 MeasADCy = IntVar(0)
21224 MeasAPER = IntVar(0)
21225 MeasAFREQ = IntVar(0)
21226 MeasBHW = IntVar(0)
21227 MeasBLW = IntVar(0)
21228 MeasBDCy = IntVar(0)
21229 MeasBPER = IntVar(0)
21230 MeasBFREQ = IntVar(0)
21231 MeasPhase = IntVar(0)
21232 MeasTopV1 = IntVar(0)
21233 MeasBaseV1 = IntVar(0)
21234 MeasTopV2 = IntVar(0)
21235 MeasBaseV2 = IntVar(0)
21236 MeasUserB = IntVar(0)
21237 MeasDelay = IntVar(0)
21238 TimeDisp = IntVar(0)
21239 TimeDisp.set(1)
21240 XYDisp = IntVar(0)
21241 FreqDisp = IntVar(0)
21242 PhADisp = IntVar(0)
21243 BodeDisp = IntVar(0)
21244 IADisp = IntVar(0)
21245 OhmDisp = IntVar(0)
21246 OOTScreenStatus = IntVar(0)
21247 OOTScreenStatus.set(0)
21248 PhAScreenStatus = IntVar(0)
21249 PhAScreenStatus.set(0)
21250 AppendPhAData = IntVar(0)
21251 AppendPhAData.set(0)
21252 PhAPlotMode = IntVar(0)
21253 PhADatafilename = "PhaseData.csv"
21254 BodeScreenStatus = IntVar(0)
21255 BodeScreenStatus.set(0)
21256 DigScreenStatus = IntVar(0)
21257 DigScreenStatus.set(0)
21258 DacScreenStatus = IntVar(0)
21259 DacScreenStatus.set(0)
21260 MuxScreenStatus = IntVar(0)
21261 MuxScreenStatus.set(0)
21262 DualMuxMode = IntVar(0)
21263 MinigenScreenStatus = IntVar(0)
21264 MinigenScreenStatus.set(0)
21265 DA1ScreenStatus = IntVar(0)
21266 DA1ScreenStatus.set(0)
21267 DigPotScreenStatus = IntVar(0)
21268 DigPotScreenStatus.set(0)
21269 GenericSerialStatus = IntVar(0)
21270 GenericSerialStatus.set(0)
21271 AD5626SerialStatus = IntVar(0)
21272 AD5626SerialStatus.set(0)
21273 DigFiltStatus = IntVar(0)
21274 DigFiltStatus.set(0)
21275 CommandStatus = IntVar(0)
21276 CommandStatus.set(0)
21277 MeasureStatus = IntVar(0)
21278 MeasureStatus.set(0)
21279 MarkerScale = IntVar(0)
21280 MarkerScale.set(1)
21281 SettingsStatus = IntVar(0)
21282 CHA_RC_HP = IntVar(0)
21283 CHB_RC_HP = IntVar(0)
21284 CHAI_RC_HP = IntVar(0)
21285 CHBI_RC_HP = IntVar(0)
21286 #
21287 if GUITheme == "Light": # Can be Light or Dark or Blue or LtBlue
21288  FrameBG = "#d7d7d7"
21289  ButtonText = "#000000"
21290 elif GUITheme == "Dark":
21291  FrameBG = "#484848"
21292  ButtonText = "#ffffff"
21293 elif GUITheme == "Blue":
21294  FrameBG = "#242468"
21295  ButtonText = "#d0d0ff"
21296 elif GUITheme == "LtBlue":
21297  FrameBG = "#c0e8ff"
21298  ButtonText = "#000040"
21299 EntryText = "#000000"
21300 BoxColor = "#0000ff" # 100% blue
21301 root.style.configure("TFrame", background=FrameBG, borderwidth=BorderSize)
21302 root.style.configure("TLabelframe", background=FrameBG)
21303 root.style.configure("TLabel", foreground=ButtonText, background=FrameBG, relief=LabRelief)
21304 root.style.configure("TEntry", foreground=EntryText, background=FrameBG, relief=ButRelief) #cursor='sb_v_double_arrow'
21305 root.style.configure("TCheckbutton", foreground=ButtonText, background=FrameBG, indicatorcolor=FrameBG)
21306 root.style.configure("TRadiobutton", foreground=ButtonText, background=FrameBG, indicatorcolor=FrameBG)
21307 root.style.configure("TButton", foreground=ButtonText, background=FrameBG, highlightcolor=FrameBG, relief=ButRelief)
21308 # define custom buttons
21309 root.style.configure("TSpinbox", arrowsize=13) # only changes things in Python 3
21310 root.style.configure("W3.TButton", width=3, relief=ButRelief)
21311 root.style.configure("W4.TButton", width=4, relief=ButRelief)
21312 root.style.configure("W5.TButton", width=5, relief=ButRelief)
21313 root.style.configure("W6.TButton", width=6, relief=ButRelief)
21314 root.style.configure("W7.TButton", width=7, relief=ButRelief)
21315 root.style.configure("W8.TButton", width=8, relief=ButRelief)
21316 root.style.configure("W9.TButton", width=9, relief=ButRelief)
21317 root.style.configure("W10.TButton", width=10, relief=ButRelief)
21318 root.style.configure("W11.TButton", width=11, relief=ButRelief)
21319 root.style.configure("W16.TButton", width=16, relief=ButRelief)
21320 root.style.configure("W17.TButton", width=17, relief=ButRelief)
21321 root.style.configure("Stop.TButton", background=ButtonRed, foreground="#000000", width=4, relief=ButRelief)
21322 root.style.configure("Run.TButton", background=ButtonGreen, foreground="#000000", width=4, relief=ButRelief)
21323 root.style.configure("Pwr.TButton", background=ButtonGreen, foreground="#000000", width=8, relief=ButRelief)
21324 root.style.configure("PwrOff.TButton", background=ButtonRed, foreground="#000000", width=8, relief=ButRelief)
21325 root.style.configure("RConn.TButton", background=ButtonRed, foreground="#000000", width=5, relief=ButRelief)
21326 root.style.configure("GConn.TButton", background=ButtonGreen, foreground="#000000", width=5, relief=ButRelief)
21327 root.style.configure("Rtrace1.TButton", background=COLORtrace1, foreground="#000000", width=7, relief=RAISED)
21328 root.style.configure("Strace1.TButton", background=COLORtrace1, foreground="#000000", width=7, relief=SUNKEN)
21329 root.style.configure("Ctrace1.TButton", background=COLORtrace1, foreground="#000000", relief=ButRelief)
21330 root.style.configure("Rtrace2.TButton", background=COLORtrace2, foreground="#000000", width=7, relief=RAISED)
21331 root.style.configure("Strace2.TButton", background=COLORtrace2, foreground="#000000", width=7, relief=SUNKEN)
21332 root.style.configure("Ctrace2.TButton", background=COLORtrace2, foreground="#000000", relief=ButRelief)
21333 root.style.configure("Rtrace3.TButton", background=COLORtrace3, foreground="#000000", width=7, relief=RAISED)
21334 root.style.configure("Strace3.TButton", background=COLORtrace3, foreground="#000000", width=7, relief=SUNKEN)
21335 root.style.configure("Ctrace3.TButton", background=COLORtrace3, foreground="#000000", relief=ButRelief)
21336 root.style.configure("Rtrace4.TButton", background=COLORtrace4, foreground="#000000", width=7, relief=RAISED)
21337 root.style.configure("Strace4.TButton", background=COLORtrace4, foreground="#000000", width=7, relief=SUNKEN)
21338 root.style.configure("Ctrace4.TButton", background=COLORtrace4, foreground="#000000", relief=ButRelief)
21339 root.style.configure("Rtrace6.TButton", background=COLORtrace6, foreground="#000000", width=7, relief=RAISED)
21340 root.style.configure("Strace6.TButton", background=COLORtrace6, foreground="#000000", width=7, relief=SUNKEN)
21341 root.style.configure("Rtrace7.TButton", background=COLORtrace7, foreground="#000000", width=7, relief=RAISED)
21342 root.style.configure("Strace7.TButton", background=COLORtrace7, foreground="#000000", width=7, relief=SUNKEN)
21343 root.style.configure("RGray.TButton", background="#808080", width=7, relief=RAISED)
21344 root.style.configure("SGray.TButton", background="#808080", width=7, relief=SUNKEN)
21345 root.style.configure("A10R1.TLabelframe.Label", background=FrameBG, foreground=COLORtraceR1, font=('Arial', 10, 'bold'))
21346 root.style.configure("A10R1.TLabelframe", borderwidth=BorderSize, relief=FrameRefief)
21347 root.style.configure("A10R2.TLabelframe.Label", background=FrameBG, foreground=COLORtraceR2, font=('Arial', 10, 'bold'))
21348 root.style.configure("A10R2.TLabelframe", borderwidth=BorderSize, relief=FrameRefief)
21349 root.style.configure("A10B.TLabel", foreground=ButtonText, font="Arial 10 bold") # Black text
21350 root.style.configure("A10R.TLabel", foreground=ButtonRed, font="Arial 10 bold") # Red text
21351 root.style.configure("A10G.TLabel", foreground=ButtonGreen, font="Arial 10 bold") # Red text
21352 root.style.configure("A12B.TLabel", foreground=ButtonText, font="Arial 12 bold") # Black text
21353 root.style.configure("A16B.TLabel", foreground=ButtonText, font="Arial 16 bold") # Black text
21354 root.style.configure("Stop.TRadiobutton", background=ButtonRed, indicatorcolor=FrameBG)
21355 root.style.configure("Run.TRadiobutton", background=ButtonGreen, indicatorcolor=FrameBG)
21356 root.style.configure("Disab.TCheckbutton", foreground=ButtonText, background=FrameBG, indicatorcolor=ButtonRed)
21357 root.style.configure("Enab.TCheckbutton", foreground=ButtonText, background=FrameBG, indicatorcolor=ButtonGreen)
21358 root.style.configure("Strace1.TCheckbutton", background=COLORtrace1, foreground="#000000", indicatorcolor="#ffffff")
21359 root.style.configure("Strace2.TCheckbutton", background=COLORtrace2, foreground="#000000", indicatorcolor="#ffffff")
21360 root.style.configure("Strace3.TCheckbutton", background=COLORtrace3, foreground="#000000", indicatorcolor="#ffffff")
21361 root.style.configure("Strace4.TCheckbutton", background=COLORtrace4, foreground="#000000", indicatorcolor="#ffffff")
21362 root.style.configure("Strace6.TCheckbutton", background=COLORtrace6, foreground="#000000", indicatorcolor="#ffffff")
21363 root.style.configure("Strace7.TCheckbutton", background=COLORtrace7, foreground="#000000", indicatorcolor="#ffffff")
21364 root.style.configure("WPhase.TRadiobutton", width=5, foreground="#000000", background="white", indicatorcolor=("red", "green"))
21365 root.style.configure("GPhase.TRadiobutton", width=5, foreground="#000000", background="gray", indicatorcolor=("red", "green"))
21366 # Create frames
21367 frame2r = Frame(root, borderwidth=BorderSize, relief=FrameRefief)
21368 frame2r.pack(side=RIGHT, fill=BOTH, expand=NO)
21369 
21370 frame1 = Frame(root, borderwidth=BorderSize, relief=FrameRefief)
21371 frame1.pack(side=TOP, fill=BOTH, expand=NO)
21372 
21373 frame2 = Frame(root, borderwidth=BorderSize, relief=FrameRefief)
21374 frame2.pack(side=TOP, fill=BOTH, expand=YES)
21375 
21376 frame3 = Frame(root, borderwidth=BorderSize, relief=FrameRefief)
21377 frame3.pack(side=TOP, fill=BOTH, expand=NO)
21378 # create a pulldown menu
21379 # Trigger signals
21380 Triggermenu = Menubutton(frame1, text="Trigger", style="W7.TButton")
21381 Triggermenu.menu = Menu(Triggermenu, tearoff = 0 )
21382 Triggermenu["menu"] = Triggermenu.menu
21383 Triggermenu.menu.add_radiobutton(label='None', variable=TgInput, value=0)
21384 Triggermenu.menu.add_radiobutton(label='CA-V', variable=TgInput, value=1)
21385 Triggermenu.menu.add_radiobutton(label='CA-I', variable=TgInput, value=2)
21386 Triggermenu.menu.add_radiobutton(label='CB-V', variable=TgInput, value=3)
21387 Triggermenu.menu.add_radiobutton(label='CB-I', variable=TgInput, value=4)
21388 Triggermenu.menu.add_radiobutton(label='CA-V or CB-V', variable=TgInput, value=5)
21389 # Triggermenu.menu.add_radiobutton(label='Alternate A/B', variable=TgInput, value=6)
21390 Triggermenu.menu.add_checkbutton(label='Auto Level', variable=AutoLevel)
21391 Triggermenu.menu.add_checkbutton(label='Low Pass Filter', variable=LPFTrigger)
21392 Triggermenu.menu.add_checkbutton(label='Manual Trgger', variable=ManualTrigger)
21393 Triggermenu.menu.add_checkbutton(label='SingleShot', variable=SingleShot)
21394 Triggermenu.pack(side=LEFT)
21395 #
21396 Edgemenu = Menubutton(frame1, text="Edge", style="W5.TButton")
21397 Edgemenu.menu = Menu(Edgemenu, tearoff = 0 )
21398 Edgemenu["menu"] = Edgemenu.menu
21399 Edgemenu.menu.add_radiobutton(label='Rising (+)', variable=TgEdge, value=0)
21400 Edgemenu.menu.add_radiobutton(label='Falling (-)', variable=TgEdge, value=1)
21401 Edgemenu.pack(side=LEFT)
21402 #
21403 tlab = Label(frame1, text="Trig Level")
21404 tlab.pack(side=LEFT)
21405 TRIGGERentry = Entry(frame1, width=5, cursor='double_arrow')
21406 TRIGGERentry.bind('<MouseWheel>', onTextScroll)
21407 TRIGGERentry.bind("<Button-4>", onTextScroll)# with Linux OS
21408 TRIGGERentry.bind("<Button-5>", onTextScroll)
21409 TRIGGERentry.bind("<Return>", BTriglevel)
21410 TRIGGERentry.bind('<Key>', onTextKey)
21411 TRIGGERentry.pack(side=LEFT)
21412 TRIGGERentry.delete(0,"end")
21413 TRIGGERentry.insert(0,0.0)
21414 #
21415 tgb = Button(frame1, text="50%", style="W4.TButton", command=BTrigger50p)
21416 tgb.pack(side=LEFT)
21417 #
21418 hldlab = Button(frame1, text="Hold Off", style="W8.TButton", command=IncHoldOff)
21419 hldlab.pack(side=LEFT)
21420 HoldOffentry = Entry(frame1, width=4, cursor='double_arrow')
21421 HoldOffentry.bind('<MouseWheel>', onTextScroll)
21422 HoldOffentry.bind("<Button-4>", onTextScroll)# with Linux OS
21423 HoldOffentry.bind("<Button-5>", onTextScroll)
21424 HoldOffentry.bind("<Return>", BHoldOff)
21425 HoldOffentry.bind('<Key>', onTextKey)
21426 HoldOffentry.pack(side=LEFT)
21427 HoldOffentry.delete(0,"end")
21428 HoldOffentry.insert(0,0.0)
21429 #
21430 hozlab = Button(frame1, text="Horz Pos", style="W8.TButton", command=SetTriggerPoss)
21431 hozlab.pack(side=LEFT)
21432 HozPossentry = Entry(frame1, width=4, cursor='double_arrow')
21433 HozPossentry.bind('<MouseWheel>', onTextScroll)
21434 HozPossentry.bind("<Button-4>", onTextScroll)# with Linux OS
21435 HozPossentry.bind("<Button-5>", onTextScroll)
21436 HozPossentry.bind("<Return>", BHozPoss)
21437 HozPossentry.bind('<Key>', onTextKey)
21438 HozPossentry.pack(side=LEFT)
21439 HozPossentry.delete(0,"end")
21440 HozPossentry.insert(0,0.0)
21441 #
21442 bexit = Button(frame1, text="Exit", style="W4.TButton", command=Bcloseexit)
21443 bexit.pack(side=RIGHT)
21444 bstop = Button(frame1, text="Stop", style="Stop.TButton", command=BStop)
21445 bstop.pack(side=RIGHT)
21446 brun = Button(frame1, text="Run", style="Run.TButton", command=BStart)
21447 brun.pack(side=RIGHT)
21448 PwrBt = Button(frame1, text="PWR-ON", style="Pwr.TButton", command=BPower)
21449 PwrBt.pack(side=RIGHT)
21450 # Curves Menu
21451 Showmenu = Menubutton(frame1, text="Curves", style="W7.TButton")
21452 Showmenu.menu = Menu(Showmenu, tearoff = 0 )
21453 Showmenu["menu"] = Showmenu.menu
21454 Showmenu.menu.add_command(label="-Show-", foreground="blue", command=donothing)
21455 Showmenu.menu.add_command(label="All", command=BShowCurvesAll)
21456 Showmenu.menu.add_command(label="None", command=BShowCurvesNone)
21457 Showmenu.menu.add_checkbutton(label='CA-V (1)', background=COLORtrace1, variable=ShowC1_V, command=TraceSelectADC_Mux)
21458 Showmenu.menu.add_checkbutton(label='CA-I (3)', background=COLORtrace3, variable=ShowC1_I, command=TraceSelectADC_Mux)
21459 Showmenu.menu.add_checkbutton(label='CB-V (2)', background=COLORtrace2, variable=ShowC2_V, command=TraceSelectADC_Mux)
21460 Showmenu.menu.add_checkbutton(label='CB-I (4)', background=COLORtrace4,variable=ShowC2_I, command=TraceSelectADC_Mux)
21461 Showmenu.menu.add_checkbutton(label='Math-X', background=COLORtrace6, variable=Show_MathX, command=UpdateTimeTrace)
21462 Showmenu.menu.add_checkbutton(label='Math-Y', background=COLORtrace7, variable=Show_MathY, command=UpdateTimeTrace)
21463 Showmenu.menu.add_command(label="-Auto Vert Center-", foreground="blue", command=donothing)
21464 Showmenu.menu.add_checkbutton(label='Center CA-V', variable=AutoCenterA)
21465 Showmenu.menu.add_checkbutton(label='Center CB-V', variable=AutoCenterB)
21466 Showmenu.menu.add_command(label="-Input HP Comp-", foreground="blue", command=donothing)
21467 Showmenu.menu.add_checkbutton(label='Comp CA-V', variable=CHA_RC_HP)
21468 Showmenu.menu.add_checkbutton(label='Comp CB-V', variable=CHB_RC_HP)
21469 if EnableHSsampling > 0:
21470  Showmenu.menu.add_checkbutton(label='Comp CA-I', variable=CHAI_RC_HP)
21471  Showmenu.menu.add_checkbutton(label='Comp CB-I', variable=CHBI_RC_HP)
21472 Showmenu.menu.add_separator()
21473 Showmenu.menu.add_checkbutton(label='RA-V', background=COLORtraceR1, variable=ShowRA_V, command=UpdateTimeTrace)
21474 Showmenu.menu.add_checkbutton(label='RA-I', background=COLORtraceR3, variable=ShowRA_I, command=UpdateTimeTrace)
21475 Showmenu.menu.add_checkbutton(label='RB-V', background=COLORtraceR2, variable=ShowRB_V, command=UpdateTimeTrace)
21476 Showmenu.menu.add_checkbutton(label='RB-I', background=COLORtraceR4, variable=ShowRB_I, command=UpdateTimeTrace)
21477 Showmenu.menu.add_checkbutton(label='RMath', background=COLORtraceR5, variable=ShowMath, command=UpdateTimeTrace)
21478 Showmenu.menu.add_separator()
21479 Showmenu.menu.add_checkbutton(label='T Cursor (t)', variable=ShowTCur, command=UpdateTimeTrace)
21480 Showmenu.menu.add_checkbutton(label='V Cursor (v)', variable=ShowVCur, command=UpdateTimeTrace)
21481 Showmenu.pack(side=RIGHT)
21482 #
21483 if ShowBallonHelp > 0:
21484  Triggermenu_tip = CreateToolTip(Triggermenu, 'Select trigger signal')
21485  Edgemenu_tip = CreateToolTip(Edgemenu, 'Select trigger edge')
21486  tgb_tip = CreateToolTip(tgb, 'Set trigger level to waveform mid point')
21487  hldlab_tip = CreateToolTip(hldlab, 'Increment Hold Off setting by one time division')
21488  hozlab_tip = CreateToolTip(hozlab, 'When triggering, set trigger point to center of screen')
21489  bexit_tip = CreateToolTip(bexit, 'Exit ALICE Desktop')
21490  bstop_tip = CreateToolTip(bstop, 'Stop acquiring data')
21491  brun_tip = CreateToolTip(brun, 'Start acquiring data')
21492  pwrbt_tip = CreateToolTip(PwrBt, 'Toggle ext power supply')
21493  Showmenu_tip = CreateToolTip(Showmenu, 'Select which traces to display')
21494 
21495 # Sampling controls Widgets
21496 if EnableHSsampling > 0:
21497  fminlab2 = Label(frame1, text="KHz")
21498  fminlab2.pack(side=RIGHT)
21499  FminEntry = Entry(frame1, width=6, cursor='double_arrow')
21500  FminEntry.bind('<MouseWheel>', onFminScroll)
21501  FminEntry.bind("<Button-4>", onFminScroll)# with Linux OS
21502  FminEntry.bind("<Button-5>", onFminScroll)
21503  FminEntry.bind("<Return>", SetAD9833)
21504  FminEntry.pack(side=RIGHT)
21505  FminEntry.delete(0,"end")
21506  FminEntry.insert(0,25)
21507  fminlab = Button(frame1, text="Fmin", style="W5.TButton", command=BSetFmin)
21508  fminlab.pack(side=RIGHT)
21509  #
21510  HtMulEntry = Entry(frame1, width=4, cursor='double_arrow')
21511  HtMulEntry.bind('<MouseWheel>', onMulXScroll)
21512  HtMulEntry.bind("<Button-4>", onMulXScroll)# with Linux OS
21513  HtMulEntry.bind("<Button-5>", onMulXScroll)
21514  HtMulEntry.bind("<Return>", SetAD9833)
21515  HtMulEntry.pack(side=RIGHT)
21516  HtMulEntry.delete(0,"end")
21517  HtMulEntry.insert(0,1)
21518  mulxlab = Label( frame1, text = "Mul X")
21519  mulxlab.pack(side=RIGHT)
21520 #
21521 # Time per Div
21522 TMsb = Spinbox(frame1, width=5, values= TMpdiv, cursor='double_arrow', command=BTime)
21523 TMsb.bind('<MouseWheel>', onSpinBoxScroll)
21524 TMsb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
21525 TMsb.bind("<Button-5>", onSpinBoxScroll)
21526 TMsb.pack(side=RIGHT)
21527 TMsb.delete(0,"end")
21528 TMsb.insert(0,0.5)
21529 TMlab = Label(frame1, text="Time mS/Div")
21530 TMlab.pack(side=RIGHT)
21531 #
21532 ca = Canvas(frame2, width=CANVASwidth, height=CANVASheight, background=COLORcanvas, cursor='cross')
21533 # add mouse left and right button click to canvas
21534 ca.bind('<Configure>', CAresize)
21535 ca.bind('<1>', onCanvasClickLeft)
21536 ca.bind('<3>', onCanvasClickRight)
21537 ca.bind("<Motion>",onCanvasMouse_xy)
21538 ca.bind("<Up>", onCanvasUpArrow) # DoNothing)
21539 ca.bind("<Down>", onCanvasDownArrow)
21540 ca.bind("<Left>", onCanvasLeftArrow)
21541 ca.bind("<Right>", onCanvasRightArrow)
21542 ca.bind("<space>", onCanvasSpaceBar)
21543 ca.bind("1", onCanvasOne)
21544 ca.bind("2", onCanvasTwo)
21545 ca.bind("3", onCanvasThree)
21546 ca.bind("4", onCanvasFour)
21547 ca.bind("5", onCanvasFive)
21548 ca.bind("6", onCanvasSix)
21549 ca.bind("7", onCanvasSeven)
21550 ca.bind("8", onCanvasEight)
21551 ca.bind("9", onCanvasNine)
21552 ca.bind("0", onCanvasZero)
21553 ca.bind("a", onCanvasAverage)
21554 ca.bind("t", onCanvasShowTcur)
21555 ca.bind("v", onCanvasShowVcur)
21556 ca.bind("s", onCanvasSnap)
21557 ca.bind("+", onCanvasTrising)
21558 ca.bind("-", onCanvasTfalling)
21559 ca.bind('<MouseWheel>', onCanvasClickScroll)
21560 ca.bind("<Button-4>", onCanvasClickScroll)# with Linux OS
21561 ca.bind("<Button-5>", onCanvasClickScroll)
21562 ca.pack(side=TOP, fill=BOTH, expand=YES)
21563 MouseWidget = ca
21564 # right side menu buttons
21565 dropmenu = Frame( frame2r )
21566 dropmenu.pack(side=TOP)
21567 bcon = Button(dropmenu, text="Recon", style="RConn.TButton", command=ConnectDevice)
21568 bcon.pack(side=LEFT, anchor=W)
21569 # File menu
21570 Filemenu = Menubutton(dropmenu, text="File", style="W4.TButton")
21571 Filemenu.menu = Menu(Filemenu, tearoff = 0 )
21572 Filemenu["menu"] = Filemenu.menu
21573 Filemenu.menu.add_command(label="Save Config", command=BSaveConfigTime)
21574 Filemenu.menu.add_command(label="Load Config", command=BLoadConfigTime)
21575 Filemenu.menu.add_command(label="Save Adj", command=BSaveCal)
21576 Filemenu.menu.add_command(label="Load Adj", command=BLoadCal)
21577 Filemenu.menu.add_command(label="Save Screen", command=BSaveScreen)
21578 Filemenu.menu.add_command(label="Save To CSV", command=BSaveData)
21579 Filemenu.menu.add_command(label="Load From CSV", command=BReadData)
21580 Filemenu.menu.add_command(label="Save PWL Data", command=BSaveChannelData)
21581 Filemenu.menu.add_command(label="Help", command=BHelp)
21582 Filemenu.menu.add_command(label="About", command=BAbout)
21583 Filemenu.pack(side=LEFT, anchor=W)
21584 # Options Menu
21585 Optionmenu = Menubutton(dropmenu, text="Options", style="W7.TButton")
21586 Optionmenu.menu = Menu(Optionmenu, tearoff = 0 )
21587 Optionmenu["menu"] = Optionmenu.menu
21588 Optionmenu.menu.add_command(label='Change Settings', command=MakeSettingsMenu)
21589 Optionmenu.menu.add_command(label='Set Sample Rate', command=MakeSampleRateMenu) # SetSampleRate)
21590 Optionmenu.menu.add_checkbutton(label='Smooth', variable=SmoothCurves, command=UpdateTimeTrace)
21591 Optionmenu.menu.add_checkbutton(label='Z-O-Hold', variable=ZOHold, command=UpdateTimeTrace)
21592 Optionmenu.menu.add_checkbutton(label='Decimate', variable=DecimateOption)
21593 Optionmenu.menu.add_checkbutton(label='Gated Meas', variable=MeasGateStatus)
21594 Optionmenu.menu.add_checkbutton(label='Trace Avg (a)', variable=TRACEmodeTime)
21595 Optionmenu.menu.add_checkbutton(label='Persistance', variable=ScreenTrefresh)
21596 Optionmenu.menu.add_command(label='Set Marker Location', command=BSetMarkerLocation)
21597 Optionmenu.menu.add_command(label='Change Plot Label', command=BUserCustomPlotText)
21598 Optionmenu.menu.add_command(label="SnapShot (s)", command=BSnapShot)
21599 Optionmenu.menu.add_radiobutton(label='Black BG', variable=ColorMode, value=0, command=BgColor)
21600 Optionmenu.menu.add_radiobutton(label='White BG', variable=ColorMode, value=1, command=BgColor)
21601 Optionmenu.menu.add_command(label="Run Self Cal", command=SelfCalibration)
21602 if EnableScopeOnly != 0:
21603  Optionmenu.menu.add_command(label="Open Instruments", command=OpenOtherTools)
21604 if AllowFlashFirmware == 1:
21605  Optionmenu.menu.add_command(label="Save Cal Settings", command=Save_Cal_file)
21606  Optionmenu.menu.add_command(label="Update Firmware", command=UpdateFirmware)
21607 Optionmenu.pack(side=LEFT, anchor=W)
21608 #
21609 dropmenu2 = Frame( frame2r )
21610 dropmenu2.pack(side=TOP)
21611 # Open Math trace menu
21612 mathbt = Button(dropmenu2, text="Math", style="W4.TButton", command = NewEnterMathControls)
21613 mathbt.pack(side=RIGHT, anchor=W)
21614 # Measurments menu
21615 measlab = Label(dropmenu2, text="Meas")
21616 measlab.pack(side=LEFT, anchor=W)
21617 MeasmenuA = Menubutton(dropmenu2, text="CA", style="W3.TButton")
21618 MeasmenuA.menu = Menu(MeasmenuA, tearoff = 0 )
21619 MeasmenuA["menu"] = MeasmenuA.menu
21620 MeasmenuA.menu.add_command(label="-CA-V-", foreground="blue", command=donothing)
21621 MeasmenuA.menu.add_checkbutton(label='Avg', variable=MeasDCV1)
21622 MeasmenuA.menu.add_checkbutton(label='Min', variable=MeasMinV1)
21623 MeasmenuA.menu.add_checkbutton(label='Max', variable=MeasMaxV1)
21624 MeasmenuA.menu.add_checkbutton(label='Base', variable=MeasBaseV1)
21625 MeasmenuA.menu.add_checkbutton(label='Top', variable=MeasTopV1)
21626 MeasmenuA.menu.add_checkbutton(label='Mid', variable=MeasMidV1)
21627 MeasmenuA.menu.add_checkbutton(label='P-P', variable=MeasPPV1)
21628 MeasmenuA.menu.add_checkbutton(label='RMS', variable=MeasRMSV1)
21629 MeasmenuA.menu.add_checkbutton(label='CA-CB', variable=MeasDiffAB)
21630 MeasmenuA.menu.add_checkbutton(label='CA-CB RMS', variable=MeasRMSVA_B)
21631 MeasmenuA.menu.add_checkbutton(label='User', variable=MeasUserA, command=BUserAMeas)
21632 #MeasmenuA.menu.add_separator()
21633 MeasmenuA.menu.add_command(label="-CA-I-", foreground="blue", command=donothing)
21634 MeasmenuA.menu.add_checkbutton(label='Avg', variable=MeasDCI1)
21635 MeasmenuA.menu.add_checkbutton(label='Min', variable=MeasMinI1)
21636 MeasmenuA.menu.add_checkbutton(label='Max', variable=MeasMaxI1)
21637 MeasmenuA.menu.add_checkbutton(label='Mid', variable=MeasMidI1)
21638 MeasmenuA.menu.add_checkbutton(label='P-P', variable=MeasPPI1)
21639 MeasmenuA.menu.add_checkbutton(label='RMS', variable=MeasRMSI1)
21640 #MeasmenuA.menu.add_separator()
21641 MeasmenuA.menu.add_command(label="-CA-Time-", foreground="blue", command=donothing)
21642 MeasmenuA.menu.add_checkbutton(label='H-Width', variable=MeasAHW)
21643 MeasmenuA.menu.add_checkbutton(label='L-Width', variable=MeasALW)
21644 MeasmenuA.menu.add_checkbutton(label='DutyCyle', variable=MeasADCy)
21645 MeasmenuA.menu.add_checkbutton(label='Period', variable=MeasAPER)
21646 MeasmenuA.menu.add_checkbutton(label='Freq', variable=MeasAFREQ)
21647 MeasmenuA.menu.add_checkbutton(label='A-B Phase', variable=MeasPhase)
21648 #
21649 MeasmenuA.pack(side=LEFT)
21650 #
21651 MeasmenuB = Menubutton(dropmenu2, text="CB", style="W3.TButton")
21652 MeasmenuB.menu = Menu(MeasmenuB, tearoff = 0 )
21653 MeasmenuB["menu"] = MeasmenuB.menu
21654 MeasmenuB.menu.add_command(label="-CB-V-", foreground="blue", command=donothing)
21655 MeasmenuB.menu.add_checkbutton(label='Avg', variable=MeasDCV2)
21656 MeasmenuB.menu.add_checkbutton(label='Min', variable=MeasMinV2)
21657 MeasmenuB.menu.add_checkbutton(label='Max', variable=MeasMaxV2)
21658 MeasmenuB.menu.add_checkbutton(label='Base', variable=MeasBaseV2)
21659 MeasmenuB.menu.add_checkbutton(label='Top', variable=MeasTopV2)
21660 MeasmenuB.menu.add_checkbutton(label='Mid', variable=MeasMidV2)
21661 MeasmenuB.menu.add_checkbutton(label='P-P', variable=MeasPPV2)
21662 MeasmenuB.menu.add_checkbutton(label='RMS', variable=MeasRMSV2)
21663 MeasmenuB.menu.add_checkbutton(label='CB-CA', variable=MeasDiffBA)
21664 MeasmenuB.menu.add_checkbutton(label='User', variable=MeasUserB, command=BUserBMeas)
21665 #MeasmenuB.menu.add_separator()
21666 MeasmenuB.menu.add_command(label="-CB-I-", foreground="blue", command=donothing)
21667 MeasmenuB.menu.add_checkbutton(label='Avg', variable=MeasDCI2)
21668 MeasmenuB.menu.add_checkbutton(label='Min', variable=MeasMinI2)
21669 MeasmenuB.menu.add_checkbutton(label='Max', variable=MeasMaxI2)
21670 MeasmenuB.menu.add_checkbutton(label='Mid', variable=MeasMidI2)
21671 MeasmenuB.menu.add_checkbutton(label='P-P', variable=MeasPPI2)
21672 MeasmenuB.menu.add_checkbutton(label='RMS', variable=MeasRMSI2)
21673 #MeasmenuB.menu.add_separator()
21674 MeasmenuB.menu.add_command(label="-CB-Time-", foreground="blue", command=donothing)
21675 MeasmenuB.menu.add_checkbutton(label='H-Width', variable=MeasBHW)
21676 MeasmenuB.menu.add_checkbutton(label='L-Width', variable=MeasBLW)
21677 MeasmenuB.menu.add_checkbutton(label='DutyCyle', variable=MeasBDCy)
21678 MeasmenuB.menu.add_checkbutton(label='Period', variable=MeasBPER)
21679 MeasmenuB.menu.add_checkbutton(label='Freq', variable=MeasBFREQ)
21680 MeasmenuB.menu.add_checkbutton(label='B-A Delay', variable=MeasDelay)
21681 MeasmenuB.pack(side=LEFT)
21682 #
21683 DigScreenStatus = IntVar(0)
21684 DigScreenStatus.set(0)
21685 #
21686 if EnableScopeOnly == 0:
21687  BuildAWGScreen = Button(frame2r, text="AWG Window", style="W16.TButton", command=MakeAWGWindow)
21688  BuildAWGScreen.pack(side=TOP)
21689  # Mode selector
21690  timebtn = Frame( frame2r )
21691  timebtn.pack(side=TOP)
21692  ckb1 = Checkbutton(timebtn, text="Enab", style="Disab.TCheckbutton", variable=TimeDisp, command=TimeCheckBox)
21693  ckb1.pack(side=LEFT)
21694  timelab = Label(timebtn, text="Time Plot")
21695  timelab.pack(side=LEFT)
21696  if EnableXYPlotter > 0:
21697  xybtn = Frame( frame2r )
21698  xybtn.pack(side=TOP)
21699  ckb2 = Checkbutton(xybtn, text="Enab", style="Disab.TCheckbutton", variable=XYDisp, command=XYCheckBox)
21700  ckb2.pack(side=LEFT)
21701  BuildXYScreen = Button(xybtn, text="X-Y Plot", style="W11.TButton", command=MakeXYWindow)
21702  BuildXYScreen.pack(side=TOP)
21703  #
21704  if EnablePhaseAnalizer > 0:
21705  phasebtn = Frame( frame2r )
21706  phasebtn.pack(side=TOP)
21707  phckb = Checkbutton(phasebtn, text="Enab", style="Disab.TCheckbutton", variable=PhADisp, command=PhACheckBox)
21708  phckb.pack(side=LEFT)
21709  BuildPhAScreen = Button(phasebtn, text="Phasor Plot", style="W11.TButton", command=MakePhAWindow)
21710  BuildPhAScreen.pack(side=LEFT)
21711  #
21712  if EnableSpectrumAnalizer > 0:
21713  freqbtn = Frame( frame2r )
21714  freqbtn.pack(side=TOP)
21715  ckb3 = Checkbutton(freqbtn, text="Enab", style="Disab.TCheckbutton", variable=FreqDisp, command=FreqCheckBox)
21716  ckb3.pack(side=LEFT)
21717  BuildSpectrumScreen = Button(freqbtn, text="Spectrum Plot", style="W11.TButton", command=MakeSpectrumWindow)
21718  BuildSpectrumScreen.pack(side=LEFT)
21719  #
21720  if EnableBodePlotter > 0:
21721  bodebtn = Frame( frame2r )
21722  bodebtn.pack(side=TOP)
21723  ckb5 = Checkbutton(bodebtn, text="Enab", style="Disab.TCheckbutton", variable=BodeDisp, command=BodeCheckBox)
21724  ckb5.pack(side=LEFT)
21725  BuildBodeScreen = Button(bodebtn, text="Bode Plot", style="W11.TButton", command=MakeBodeWindow)
21726  BuildBodeScreen.pack(side=LEFT)
21727  #
21728  if EnableImpedanceAnalizer > 0:
21729  impdbtn = Frame( frame2r )
21730  impdbtn.pack(side=TOP)
21731  ckb4 = Checkbutton(impdbtn, text="Enab", style="Disab.TCheckbutton", variable=IADisp, command=IACheckBox)
21732  ckb4.pack(side=LEFT)
21733  BuildIAScreen = Button(impdbtn, text="Impedance", style="W11.TButton", command=MakeIAWindow)
21734  BuildIAScreen.pack(side=LEFT)
21735  #
21736  if EnableOhmMeter > 0:
21737  dcohmbtn = Frame( frame2r )
21738  dcohmbtn.pack(side=TOP)
21739  ckb6 = Checkbutton(dcohmbtn, text="Enab", style="Disab.TCheckbutton", variable=OhmDisp, command=OhmCheckBox)
21740  ckb6.pack(side=LEFT)
21741  BuildOhmScreen = Button(dcohmbtn, text="Ohmmeter", style="W11.TButton", command=MakeOhmWindow)
21742  BuildOhmScreen.pack(side=LEFT)
21743  #
21744  if ShowTraceControls > 0:
21745  ckbt1 = Checkbutton(frame2r, text='CA-V (1)', style="Strace1.TCheckbutton", variable=ShowC1_V, command=TraceSelectADC_Mux)
21746  ckbt1.pack(side=TOP,fill=X)
21747  ckbt2 = Checkbutton(frame2r, text='CA-I (3)', style="Strace3.TCheckbutton", variable=ShowC1_I, command=TraceSelectADC_Mux)
21748  ckbt2.pack(side=TOP,fill=X)
21749  ckbt3 = Checkbutton(frame2r, text='CB-V (2)', style="Strace2.TCheckbutton", variable=ShowC2_V, command=TraceSelectADC_Mux)
21750  ckbt3.pack(side=TOP,fill=X)
21751  ckbt4 = Checkbutton(frame2r, text='CB-I (4)', style="Strace4.TCheckbutton", variable=ShowC2_I, command=TraceSelectADC_Mux)
21752  ckbt4.pack(side=TOP,fill=X)
21753 
21754  if ShowBallonHelp > 0:
21755  math_tip = CreateToolTip(mathbt, 'Open Math window')
21756  BuildAWGScreen_tip = CreateToolTip(BuildAWGScreen, 'Surface AWG Controls window')
21757  BuildXYScreen_tip = CreateToolTip(BuildXYScreen, 'Open X vs Y plot window')
21758  BuildPhAScreen_tip = CreateToolTip(BuildPhAScreen, 'Open Phase Analyzer window')
21759  BuildSpectrumScreen_tip = CreateToolTip(BuildSpectrumScreen, 'Open Spectrum Analyzer window')
21760  BuildBodeScreen_tip = CreateToolTip(BuildBodeScreen, 'Open Bode plot window')
21761  BuildIAScreen_tip = CreateToolTip(BuildIAScreen, 'Open Impedance Analyzer window')
21762  BuildOhmScreen_tip = CreateToolTip(BuildOhmScreen, 'Open DC Ohmmeter window')
21763  # Digital Input / Output Option screens
21764  if EnableDigIO > 0:
21765  BuildDigScreen = Button(frame2r, text="Digital I/O Screen", style="W17.TButton", command=MakeDigScreen)
21766  BuildDigScreen.pack(side=TOP)
21767  # Optional plugin tools
21768  if EnablePIODACMode > 0:
21769  BuildDacScreen = Button(frame2r, text="PIO-DAC Screen", style="W17.TButton", command=MakeDacScreen)
21770  BuildDacScreen.pack(side=TOP)
21771  if EnableMuxMode > 0:
21772  BuildMuxScreen = Button(frame2r, text="Analog In Mux Screen", style="W17.TButton", command=MakeMuxModeWindow)
21773  BuildMuxScreen.pack(side=TOP)
21774  if EnableMinigenMode > 0:
21775  BuildMinigenScreen = Button(frame2r, text="AD983x DDS Screen", style="W17.TButton", command=MakeMinigenWindow)
21776  BuildMinigenScreen.pack(side=TOP)
21777  if EnablePmodDA1Mode > 0:
21778  BuildDA1Screen = Button(frame2r, text="PMOD DA1 Screen", style="W17.TButton", command=MakeDA1Window)
21779  BuildDA1Screen.pack(side=TOP)
21780  if EnableDigPotMode >0:
21781  BuildDigPotScreen = Button(frame2r, text="Dig Pot Screen", style="W17.TButton", command=MakeDigPotWindow)
21782  BuildDigPotScreen.pack(side=TOP)
21783  if EnableGenericSerialMode >0:
21784  GenericSerialScreen = Button(frame2r, text="Generic Serial Output", style="W17.TButton", command=MakeGenericSerialWindow)
21785  GenericSerialScreen.pack(side=TOP)
21786  if EnableAD5626SerialMode >0:
21787  AD5626SerialScreen = Button(frame2r, text="AD5626 Output", style="W17.TButton", command=MakeAD5626Window)
21788  AD5626SerialScreen.pack(side=TOP)
21789  if EnableDigitalFilter >0:
21790  DigFiltScreen = Button(frame2r, text="Digital Filter", style="W17.TButton", command=MakeDigFiltWindow)
21791  DigFiltScreen.pack(side=TOP)
21792  if EnableCommandInterface > 0:
21793  CommandLineScreen = Button(frame2r, text="Command Interface", style="W17.TButton", command=MakeCommandScreen)
21794  CommandLineScreen.pack(side=TOP)
21795  if EnableMeasureScreen > 0:
21796  MeasureScreen = Button(frame2r, text="Measure Screen", style="W17.TButton", command=MakeMeasureScreen)
21797  MeasureScreen.pack(side=TOP)
21798  if EnableETSScreen > 0:
21799  ETSScreen = Button(frame2r, text="ETS Controls", style="W17.TButton", command=MakeETSWindow)
21800  ETSScreen.pack(side=TOP)
21801 else:
21802 # Mode selector
21803  timebtn = Frame( frame2r )
21804  timebtn.pack(side=TOP)
21805  ckb1 = Checkbutton(timebtn, text="Enab", style="Disab.TCheckbutton", variable=TimeDisp, command=TimeCheckBox)
21806  ckb1.pack(side=LEFT)
21807  timelab = Label(timebtn, text="Time Plot")
21808  timelab.pack(side=LEFT)
21809  if EnableXYPlotter > 0:
21810  xybtn = Frame( frame2r )
21811  xybtn.pack(side=TOP)
21812  ckb2 = Checkbutton(xybtn, text="Enab", style="Disab.TCheckbutton", variable=XYDisp, command=XYCheckBox)
21813  ckb2.pack(side=LEFT)
21814  BuildXYScreen = Button(xybtn, text="X-Y Plot", style="W11.TButton", command=MakeXYWindow)
21815  BuildXYScreen.pack(side=TOP)
21816  #
21817  awg1eb = Frame( frame2r )
21818  awg1eb.pack(side=TOP)
21819  ModeAMenu = Menubutton(awg1eb, text="Mode", width=5, style="Ctrace1.TButton")#, style="W5.TButton")
21820  ModeAMenu.menu = Menu(ModeAMenu, tearoff = 0 )
21821  ModeAMenu["menu"] = ModeAMenu.menu
21822  ModeAMenu.menu.add_command(label="-Mode-", foreground="blue", command=donothing)
21823  ModeAMenu.menu.add_radiobutton(label="SVMI", variable=AWGAMode, value=0, command=BAWGAModeLabel)
21824  ModeAMenu.menu.add_radiobutton(label="SIMV", variable=AWGAMode, value=1, command=BAWGAModeLabel)
21825  ModeAMenu.menu.add_radiobutton(label="Hi-Z", variable=AWGAMode, value=2, command=BAWGAModeLabel)
21826  ModeAMenu.menu.add_checkbutton(label="Split I/O", variable=AWGAIOMode, command=BAWGAModeLabel)
21827  ModeAMenu.menu.add_separator()
21828  ModeAMenu.menu.add_command(label="-Term-", foreground="blue", command=donothing)
21829  ModeAMenu.menu.add_radiobutton(label="Open", variable=AWGATerm, value=0, command=UpdateAwgCont)
21830  ModeAMenu.menu.add_radiobutton(label="To GND", variable=AWGATerm, value=1, command=UpdateAwgCont)
21831  ModeAMenu.menu.add_radiobutton(label="To 2.5V", variable=AWGATerm, value=2, command=UpdateAwgCont)
21832  ModeAMenu.pack(side=LEFT, anchor=W)
21833  ShapeAMenu = Menubutton(awg1eb, text="Shape", width=6, style="Ctrace1.TButton")#, style="W6.TButton")
21834  ShapeAMenu.menu = Menu(ShapeAMenu, tearoff = 0 )
21835  ShapeAMenu["menu"] = ShapeAMenu.menu
21836  ShapeAMenu.menu.add_command(label="-Basic-", foreground="blue", command=donothing)
21837  ShapeAMenu.menu.add_radiobutton(label="DC", variable=AWGAShape, value=0, command=ReMakeAWGwaves)
21838  ShapeAMenu.menu.add_radiobutton(label="Sine", variable=AWGAShape, value=18, command=ReMakeAWGwaves)
21839  ShapeAMenu.menu.add_radiobutton(label="Triangle", variable=AWGAShape, value=2, command=ReMakeAWGwaves)
21840  ShapeAMenu.menu.add_radiobutton(label="Sawtooth", variable=AWGAShape, value=3, command=ReMakeAWGwaves)
21841  ShapeAMenu.menu.add_radiobutton(label="Square", variable=AWGAShape, value=4, command=ReMakeAWGwaves)
21842  ShapeAMenu.menu.add_radiobutton(label="StairStep", variable=AWGAShape, value=5, command=ReMakeAWGwaves)
21843  if AWGShowAdvanced.get() > 0:
21844  ShapeAMenu.menu.add_command(label="-Advanced-", foreground="blue", command=donothing)
21845  ShapeAMenu.menu.add_radiobutton(label="Impulse", variable=AWGAShape, value=9, command=ReMakeAWGwaves)
21846  ShapeAMenu.menu.add_radiobutton(label="Trapezoid", variable=AWGAShape, value=11, command=ReMakeAWGwaves)
21847  ShapeAMenu.menu.add_radiobutton(label="Pulse", variable=AWGAShape, value=20, command=ReMakeAWGwaves)
21848  ShapeAMenu.menu.add_radiobutton(label="Ramp", variable=AWGAShape, value=16, command=ReMakeAWGwaves)
21849  ShapeAMenu.menu.add_radiobutton(label="SSQ Pulse", variable=AWGAShape, value=15, command=ReMakeAWGwaves)
21850  ShapeAMenu.menu.add_radiobutton(label="U-D Ramp", variable=AWGAShape, value=12, command=ReMakeAWGwaves)
21851  ShapeAMenu.menu.add_radiobutton(label="Fourier Series", variable=AWGAShape, value=14, command=AWGAMakeFourier)
21852  ShapeAMenu.menu.add_radiobutton(label="Sin X/X", variable=AWGAShape, value=19, command=ReMakeAWGwaves)
21853  ShapeAMenu.menu.add_radiobutton(label="PWM Sine", variable=AWGAShape, value=17, command=ReMakeAWGwaves)
21854  ShapeAMenu.menu.add_radiobutton(label="FM Sine", variable=AWGAShape, value=21, command=AWGAMakeFMSine)
21855  ShapeAMenu.menu.add_radiobutton(label="AM Sine", variable=AWGAShape, value=22, command=AWGAMakeAMSine)
21856  ShapeAMenu.menu.add_radiobutton(label="UU Noise", variable=AWGAShape, value=7, command=ReMakeAWGwaves)
21857  ShapeAMenu.menu.add_radiobutton(label="UG Noise", variable=AWGAShape, value=8, command=ReMakeAWGwaves)
21858  else:
21859  ShapeAMenu.menu.add_separator()
21860  ShapeAMenu.menu.add_radiobutton(label="Math", variable=AWGAShape, value=10, command=AWGAMakeMath)
21861  ShapeAMenu.menu.add_radiobutton(label="Read CSV File", variable=AWGAShape, value=6, command=AWGAReadFile)
21862  ShapeAMenu.menu.add_radiobutton(label="Read WAV File", variable=AWGAShape, value=13, command=AWGAReadWAV)
21863  ShapeAMenu.menu.add_command(label="Save CSV File", command=AWGAWriteFile)
21864  ShapeAMenu.menu.add_checkbutton(label='Burst', variable=AWGABurstFlag, command=AWGANumCycles)
21865  ShapeAMenu.menu.add_checkbutton(label='Repeat', variable=AWGARepeatFlag)
21866  ShapeAMenu.pack(side=LEFT, anchor=W)
21867  #
21868  AWGAModeLabel = Label(frame2r, text="AWG A Mode", background=COLORtrace1, font=('Arial', FontSize, 'bold'))
21869  AWGAModeLabel.pack(side=TOP, fill=X)
21870  AWGAShapeLabel = Label(frame2r, text="AWG A Shape", background=COLORtrace1, font=('Arial', FontSize, 'bold'))
21871  AWGAShapeLabel.pack(side=TOP, fill=X)
21872  #
21873  awg1ampl = Frame( frame2r )
21874  awg1ampl.pack(side=TOP)
21875  AWGAAmplEntry = Entry(awg1ampl, width=5, cursor='double_arrow')
21876  AWGAAmplEntry.bind("<Return>", UpdateAwgContRet)
21877  AWGAAmplEntry.bind('<MouseWheel>', onAWGAscroll)
21878  AWGAAmplEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
21879  AWGAAmplEntry.bind("<Button-5>", onAWGAscroll)
21880  AWGAAmplEntry.bind('<Key>', onTextKeyAWG)
21881  AWGAAmplEntry.pack(side=LEFT, anchor=W)
21882  AWGAAmplEntry.delete(0,"end")
21883  AWGAAmplEntry.insert(0,0.0)
21884  amp1lab = Label(awg1ampl) #
21885  amp1lab.pack(side=LEFT, anchor=W)
21886  #
21887  awg1off = Frame( frame2r )
21888  awg1off.pack(side=TOP)
21889  AWGAOffsetEntry = Entry(awg1off, width=5, cursor='double_arrow')
21890  AWGAOffsetEntry.bind("<Return>", UpdateAwgContRet)
21891  AWGAOffsetEntry.bind('<MouseWheel>', onAWGAscroll)
21892  AWGAOffsetEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
21893  AWGAOffsetEntry.bind("<Button-5>", onAWGAscroll)
21894  AWGAOffsetEntry.bind('<Key>', onTextKeyAWG)
21895  AWGAOffsetEntry.pack(side=LEFT, anchor=W)
21896  AWGAOffsetEntry.delete(0,"end")
21897  AWGAOffsetEntry.insert(0,0.0)
21898  off1lab = Label(awg1off) #
21899  off1lab.pack(side=LEFT, anchor=W)
21900  if AWG_Amp_Mode.get() == 0:
21901  amp1lab.config(text = "Min Ch A" ) # change displayed value
21902  off1lab.config(text = "Max Ch A" ) # change displayed value
21903  else:
21904  amp1lab.config(text = "Amp Ch A" )
21905  off1lab.config(text = "Off Ch A" )
21906  # AWG Frequency sub frame
21907  awg1freq = Frame( frame2r )
21908  awg1freq.pack(side=TOP)
21909  AWGAFreqEntry = Entry(awg1freq, width=7, cursor='double_arrow')
21910  AWGAFreqEntry.bind("<Return>", UpdateAwgContRet)
21911  AWGAFreqEntry.bind('<MouseWheel>', onAWGAscroll)
21912  AWGAFreqEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
21913  AWGAFreqEntry.bind("<Button-5>", onAWGAscroll)
21914  AWGAFreqEntry.bind('<Key>', onTextKeyAWG)
21915  AWGAFreqEntry.pack(side=LEFT, anchor=W)
21916  AWGAFreqEntry.delete(0,"end")
21917  AWGAFreqEntry.insert(0,100.0)
21918  freq1lab = Label(awg1freq, text="Freq Ch A")
21919  freq1lab.pack(side=LEFT, anchor=W)
21920  # AWG Phase or delay select sub frame
21921 
21922  awgadelay = Frame( frame2r )
21923  awgadelay.pack(side=TOP)
21924  awgaph = Radiobutton(awgadelay, text="Phase", style="WPhase.TRadiobutton", variable=AWGAPhaseDelay, value=0, command=BAWGAPhaseDelay)
21925  awgaph.pack(side=LEFT, anchor=W)
21926  awgadel = Radiobutton(awgadelay, text="Delay", style="GPhase.TRadiobutton", variable=AWGAPhaseDelay, value=1, command=BAWGAPhaseDelay)
21927  awgadel.pack(side=LEFT, anchor=W)
21928  # AWG Phase entry sub frame
21929  awg1phase = Frame( frame2r )
21930  awg1phase.pack(side=TOP)
21931  AWGAPhaseEntry = Entry(awg1phase, width=4, cursor='double_arrow')
21932  AWGAPhaseEntry.bind("<Return>", UpdateAwgContRet)
21933  AWGAPhaseEntry.bind('<MouseWheel>', onAWGAscroll)
21934  AWGAPhaseEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
21935  AWGAPhaseEntry.bind("<Button-5>", onAWGAscroll)
21936  AWGAPhaseEntry.bind('<Key>', onTextKeyAWG)
21937  AWGAPhaseEntry.pack(side=LEFT, anchor=W)
21938  AWGAPhaseEntry.delete(0,"end")
21939  AWGAPhaseEntry.insert(0,0)
21940  phasealab = Label(awg1phase, text="Deg")
21941  phasealab.pack(side=LEFT, anchor=W)
21942  # AWG duty cycle frame
21943  AWGADutyCycleEntry = Entry(awg1phase, width=4, cursor='double_arrow')
21944  AWGADutyCycleEntry.bind("<Return>", UpdateAwgContRet)
21945  AWGADutyCycleEntry.bind('<MouseWheel>', onAWGAscroll)
21946  AWGADutyCycleEntry.bind("<Button-4>", onAWGAscroll)# with Linux OS
21947  AWGADutyCycleEntry.bind("<Button-5>", onAWGAscroll)
21948  AWGADutyCycleEntry.bind('<Key>', onTextKeyAWG)
21949  AWGADutyCycleEntry.pack(side=LEFT, anchor=W)
21950  AWGADutyCycleEntry.delete(0,"end")
21951  AWGADutyCycleEntry.insert(0,50)
21952  duty1lab = Label(awg1phase, text="%")
21953  duty1lab.pack(side=LEFT, anchor=W)
21954 
21967  awg2eb = Frame( frame2r )
21968  awg2eb.pack(side=TOP)
21969  ModeBMenu = Menubutton(awg2eb, text="Mode", width=5, style="Ctrace2.TButton")# , style="W5.TButton")
21970  ModeBMenu.menu = Menu(ModeBMenu, tearoff = 0 )
21971  ModeBMenu["menu"] = ModeBMenu.menu
21972  ModeBMenu.menu.add_command(label="-Mode-", foreground="blue", command=donothing)
21973  ModeBMenu.menu.add_radiobutton(label="SVMI", variable=AWGBMode, value=0, command=BAWGBModeLabel)
21974  ModeBMenu.menu.add_radiobutton(label="SIMV", variable=AWGBMode, value=1, command=BAWGBModeLabel)
21975  ModeBMenu.menu.add_radiobutton(label="Hi-Z", variable=AWGBMode, value=2, command=BAWGBModeLabel)
21976  ModeBMenu.menu.add_checkbutton(label="Split I/O", variable=AWGBIOMode, command=BAWGBModeLabel)
21977  ModeBMenu.menu.add_separator()
21978  ModeBMenu.menu.add_command(label="-Term-", foreground="blue", command=donothing)
21979  ModeBMenu.menu.add_radiobutton(label="Open", variable=AWGBTerm, value=0, command=UpdateAwgCont)
21980  ModeBMenu.menu.add_radiobutton(label="To GND", variable=AWGBTerm, value=1, command=UpdateAwgCont)
21981  ModeBMenu.menu.add_radiobutton(label="To 2.5V", variable=AWGBTerm, value=2, command=UpdateAwgCont)
21982  ModeBMenu.pack(side=LEFT, anchor=W)
21983  ShapeBMenu = Menubutton(awg2eb, text="Shape", width=6, style="Ctrace2.TButton")#, style="W6.TButton")
21984  ShapeBMenu.menu = Menu(ShapeBMenu, tearoff = 0 )
21985  ShapeBMenu["menu"] = ShapeBMenu.menu
21986  ShapeBMenu.menu.add_command(label="-Basic-", foreground="blue", command=donothing)
21987  ShapeBMenu.menu.add_radiobutton(label="DC", variable=AWGBShape, value=0, command=ReMakeAWGwaves)
21988  ShapeBMenu.menu.add_radiobutton(label="Sine", variable=AWGBShape, value=18, command=ReMakeAWGwaves)
21989  ShapeBMenu.menu.add_radiobutton(label="Triangle", variable=AWGBShape, value=2, command=ReMakeAWGwaves)
21990  ShapeBMenu.menu.add_radiobutton(label="Sawtooth", variable=AWGBShape, value=3, command=ReMakeAWGwaves)
21991  ShapeBMenu.menu.add_radiobutton(label="Square", variable=AWGBShape, value=4, command=ReMakeAWGwaves)
21992  ShapeBMenu.menu.add_radiobutton(label="StairStep", variable=AWGBShape, value=5, command=ReMakeAWGwaves)
21993  if AWGShowAdvanced.get() > 0:
21994  ShapeBMenu.menu.add_command(label="-Advanced-", foreground="blue", command=donothing)
21995  ShapeBMenu.menu.add_radiobutton(label="Impulse", variable=AWGBShape, value=9, command=ReMakeAWGwaves)
21996  ShapeBMenu.menu.add_radiobutton(label="Trapezoid", variable=AWGBShape, value=11, command=ReMakeAWGwaves)
21997  ShapeBMenu.menu.add_radiobutton(label="Pulse", variable=AWGBShape, value=20, command=ReMakeAWGwaves)
21998  ShapeBMenu.menu.add_radiobutton(label="Ramp", variable=AWGBShape, value=16, command=ReMakeAWGwaves)
21999  ShapeBMenu.menu.add_radiobutton(label="SSQ Pulse", variable=AWGBShape, value=15, command=ReMakeAWGwaves)
22000  ShapeBMenu.menu.add_radiobutton(label="U-D Ramp", variable=AWGBShape, value=12, command=ReMakeAWGwaves)
22001  ShapeBMenu.menu.add_radiobutton(label="Fourier Series", variable=AWGBShape, value=14, command=AWGBMakeFourier)
22002  ShapeBMenu.menu.add_radiobutton(label="Sin X/X", variable=AWGBShape, value=19, command=ReMakeAWGwaves)
22003  ShapeBMenu.menu.add_radiobutton(label="PWM Sine", variable=AWGBShape, value=17, command=ReMakeAWGwaves)
22004  ShapeBMenu.menu.add_radiobutton(label="UU Noise", variable=AWGBShape, value=7, command=ReMakeAWGwaves)
22005  ShapeBMenu.menu.add_radiobutton(label="UG Noise", variable=AWGBShape, value=8, command=ReMakeAWGwaves)
22006  else:
22007  ShapeBMenu.menu.add_separator()
22008  ShapeBMenu.menu.add_radiobutton(label="Math", variable=AWGBShape, value=10, command=AWGBMakeMath)
22009  ShapeBMenu.menu.add_radiobutton(label="Read CSV File", variable=AWGBShape, value=6, command=AWGBReadFile)
22010  ShapeBMenu.menu.add_radiobutton(label="Read WAV File", variable=AWGBShape, value=13, command=AWGBReadWAV)
22011  ShapeBMenu.menu.add_command(label="Save CSV File", command=AWGBWriteFile)
22012  ShapeBMenu.menu.add_checkbutton(label='Burst', variable=AWGBBurstFlag, command=AWGBNumCycles)
22013  ShapeBMenu.menu.add_checkbutton(label='Repeat', variable=AWGBRepeatFlag)
22014  ShapeBMenu.pack(side=LEFT, anchor=W)
22015  #
22016  AWGBModeLabel = Label(frame2r, text="AWG B Mode", background=COLORtrace2, font=('Arial', FontSize, 'bold'))
22017  AWGBModeLabel.pack(side=TOP, fill=X)
22018  AWGBShapeLabel = Label(frame2r, text="AWG B Shape", background=COLORtrace2, font=('Arial', FontSize, 'bold'))
22019  AWGBShapeLabel.pack(side=TOP, fill=X)
22020  #
22021  awg2ampl = Frame( frame2r )
22022  awg2ampl.pack(side=TOP)
22023  AWGBAmplEntry = Entry(awg2ampl, width=5, cursor='double_arrow')
22024  AWGBAmplEntry.bind("<Return>", UpdateAwgContRet)
22025  AWGBAmplEntry.bind('<MouseWheel>', onAWGBscroll)
22026  AWGBAmplEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
22027  AWGBAmplEntry.bind("<Button-5>", onAWGBscroll)
22028  AWGBAmplEntry.bind('<Key>', onTextKeyAWG)
22029  AWGBAmplEntry.pack(side=LEFT, anchor=W)
22030  AWGBAmplEntry.delete(0,"end")
22031  AWGBAmplEntry.insert(0,0.0)
22032  amp2lab = Label(awg2ampl) #, text="Min Ch B")
22033  amp2lab.pack(side=LEFT, anchor=W)
22034  #
22035  awg2off = Frame( frame2r )
22036  awg2off.pack(side=TOP)
22037  AWGBOffsetEntry = Entry(awg2off, width=5, cursor='double_arrow')
22038  AWGBOffsetEntry.bind("<Return>", UpdateAwgContRet)
22039  AWGBOffsetEntry.bind('<MouseWheel>', onAWGBscroll)
22040  AWGBOffsetEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
22041  AWGBOffsetEntry.bind("<Button-5>", onAWGBscroll)
22042  AWGBOffsetEntry.bind('<Key>', onTextKeyAWG)
22043  AWGBOffsetEntry.pack(side=LEFT, anchor=W)
22044  AWGBOffsetEntry.delete(0,"end")
22045  AWGBOffsetEntry.insert(0,0.0)
22046  off2lab = Label(awg2off) #, text="Max Ch B")
22047  off2lab.pack(side=LEFT, anchor=W)
22048  if AWG_Amp_Mode.get() == 0:
22049  amp2lab.config(text = "Min Ch B" ) # change displayed value
22050  off2lab.config(text = "Max Ch B" ) # change displayed value
22051  else:
22052  amp2lab.config(text = "Amp Ch B" )
22053  off2lab.config(text = "Off Ch B" )
22054  # AWG Frequency sub frame
22055  awg2freq = Frame( frame2r )
22056  awg2freq.pack(side=TOP)
22057  AWGBFreqEntry = Entry(awg2freq, width=7, cursor='double_arrow')
22058  AWGBFreqEntry.bind("<Return>", UpdateAwgContRet)
22059  AWGBFreqEntry.bind('<MouseWheel>', onAWGBscroll)
22060  AWGBFreqEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
22061  AWGBFreqEntry.bind("<Button-5>", onAWGBscroll)
22062  AWGBFreqEntry.bind('<Key>', onTextKeyAWG)
22063  AWGBFreqEntry.pack(side=LEFT, anchor=W)
22064  AWGBFreqEntry.delete(0,"end")
22065  AWGBFreqEntry.insert(0,100.0)
22066  freq2lab = Label(awg2freq, text="Freq Ch B")
22067  freq2lab.pack(side=LEFT, anchor=W)
22068  # AWG Phase or delay select sub frame
22069  awgbdelay = Frame( frame2r )
22070  awgbdelay.pack(side=TOP)
22071  awgbph = Radiobutton(awgbdelay, text="Phase", style="WPhase.TRadiobutton", variable=AWGBPhaseDelay, value=0, command=BAWGBPhaseDelay)
22072  awgbph.pack(side=LEFT, anchor=W)
22073  awgbdel = Radiobutton(awgbdelay, text="Delay", style="GPhase.TRadiobutton", variable=AWGBPhaseDelay, value=1, command=BAWGBPhaseDelay)
22074  awgbdel.pack(side=LEFT, anchor=W)
22075  # AWG Phase sub frame
22076  awg2phase = Frame( frame2r )
22077  awg2phase.pack(side=TOP)
22078  AWGBPhaseEntry = Entry(awg2phase, width=5, cursor='double_arrow')
22079  AWGBPhaseEntry.bind("<Return>", UpdateAwgContRet)
22080  AWGBPhaseEntry.bind('<MouseWheel>', onAWGBscroll)
22081  AWGBPhaseEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
22082  AWGBPhaseEntry.bind("<Button-5>", onAWGBscroll)
22083  AWGBPhaseEntry.bind('<Key>', onTextKeyAWG)
22084  AWGBPhaseEntry.pack(side=LEFT, anchor=W)
22085  AWGBPhaseEntry.delete(0,"end")
22086  AWGBPhaseEntry.insert(0,0)
22087  phaseblab = Label(awg2phase, text="Deg")
22088  phaseblab.pack(side=LEFT, anchor=W)
22089  # AWG duty cycle frame
22090  AWGBDutyCycleEntry = Entry(awg2phase, width=5, cursor='double_arrow')
22091  AWGBDutyCycleEntry.bind("<Return>", UpdateAwgContRet)
22092  AWGBDutyCycleEntry.bind('<MouseWheel>', onAWGBscroll)
22093  AWGBDutyCycleEntry.bind("<Button-4>", onAWGBscroll)# with Linux OS
22094  AWGBDutyCycleEntry.bind("<Button-5>", onAWGBscroll)
22095  AWGBDutyCycleEntry.bind('<Key>', onTextKeyAWG)
22096  AWGBDutyCycleEntry.pack(side=LEFT, anchor=W)
22097  AWGBDutyCycleEntry.delete(0,"end")
22098  AWGBDutyCycleEntry.insert(0,50)
22099  duty2lab = Label(awg2phase, text="%")
22100  duty2lab.pack(side=LEFT, anchor=W)
22101  #
22102  bcompa = Checkbutton(frame2r, text="B = Comp A", variable=BisCompA, command=ReMakeAWGwaves)
22103  bcompa.pack(side=TOP)
22104 
22105  awgsync = Checkbutton(frame2r, text="Sync AWG", variable=AWGSync, command=BAWGSync)
22106  awgsync.pack(side=TOP)
22107 
22108 # input probe wigets
22109 prlab = Label(frame2r, text="Adjust Gain / Offset")
22110 prlab.pack(side=TOP)
22111 # Input Probes sub frame
22112 ProbeA = Frame( frame2r )
22113 ProbeA.pack(side=TOP)
22114 gain1lab = Button(ProbeA, text="CA-V", width=4, style="Ctrace1.TButton", command=ReSetAGO)
22115 gain1lab.pack(side=LEFT,fill=X)
22116 CHAVGainEntry = Entry(ProbeA, width=5, cursor='double_arrow')
22117 CHAVGainEntry.bind('<Return>', onTextKey)
22118 CHAVGainEntry.bind('<MouseWheel>', onTextScroll)
22119 CHAVGainEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22120 CHAVGainEntry.bind("<Button-5>", onTextScroll)
22121 CHAVGainEntry.bind('<Key>', onTextKey)
22122 CHAVGainEntry.pack(side=LEFT)
22123 CHAVGainEntry.delete(0,"end")
22124 CHAVGainEntry.insert(0,1.0)
22125 CHAVOffsetEntry = Entry(ProbeA, width=5, cursor='double_arrow')
22126 CHAVOffsetEntry.bind('<Return>', onTextKey)
22127 CHAVOffsetEntry.bind('<MouseWheel>', onTextScroll)
22128 CHAVOffsetEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22129 CHAVOffsetEntry.bind("<Button-5>", onTextScroll)
22130 CHAVOffsetEntry.bind('<Key>', onTextKey)
22131 CHAVOffsetEntry.pack(side=LEFT)
22132 CHAVOffsetEntry.delete(0,"end")
22133 CHAVOffsetEntry.insert(0,0.0)
22134 #
22135 ProbeB = Frame( frame2r )
22136 ProbeB.pack(side=TOP)
22137 gain2lab = Button(ProbeB, text="CB-V", width=4, style="Ctrace2.TButton", command=ReSetBGO)
22138 gain2lab.pack(side=LEFT,fill=X)
22139 CHBVGainEntry = Entry(ProbeB, width=5, cursor='double_arrow')
22140 CHBVGainEntry.bind('<Return>', onTextKey)
22141 CHBVGainEntry.bind('<MouseWheel>', onTextScroll)
22142 CHBVGainEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22143 CHBVGainEntry.bind("<Button-5>", onTextScroll)
22144 CHBVGainEntry.bind('<Key>', onTextKey)
22145 CHBVGainEntry.pack(side=LEFT)
22146 CHBVGainEntry.delete(0,"end")
22147 CHBVGainEntry.insert(0,1.0)
22148 CHBVOffsetEntry = Entry(ProbeB, width=5, cursor='double_arrow')
22149 CHBVOffsetEntry.bind('<Return>', onTextKey)
22150 CHBVOffsetEntry.bind('<MouseWheel>', onTextScroll)
22151 CHBVOffsetEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22152 CHBVOffsetEntry.bind("<Button-5>", onTextScroll)
22153 CHBVOffsetEntry.bind('<Key>', onTextKey)
22154 CHBVOffsetEntry.pack(side=LEFT)
22155 CHBVOffsetEntry.delete(0,"end")
22156 CHBVOffsetEntry.insert(0,0.0)
22157 #
22158 ProbeAI = Frame( frame2r )
22159 ProbeAI.pack(side=TOP)
22160 gainailab = Button(ProbeAI, text="CA-I", width=4, style="Ctrace3.TButton", command=ReSetAIGO)
22161 gainailab.pack(side=LEFT,fill=X)
22162 CHAIGainEntry = Entry(ProbeAI, width=5, cursor='double_arrow')
22163 CHAIGainEntry.bind('<Return>', onTextKey)
22164 CHAIGainEntry.bind('<MouseWheel>', onTextScroll)
22165 CHAIGainEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22166 CHAIGainEntry.bind("<Button-5>", onTextScroll)
22167 CHAIGainEntry.bind('<Key>', onTextKey)
22168 CHAIGainEntry.pack(side=LEFT)
22169 CHAIGainEntry.delete(0,"end")
22170 CHAIGainEntry.insert(0,1.0)
22171 CHAIOffsetEntry = Entry(ProbeAI, width=5, cursor='double_arrow')
22172 CHAIOffsetEntry.bind('<Return>', onTextKey)
22173 CHAIOffsetEntry.bind('<MouseWheel>', onTextScroll)
22174 CHAIOffsetEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22175 CHAIOffsetEntry.bind("<Button-5>", onTextScroll)
22176 CHAIOffsetEntry.bind('<Key>', onTextKey)
22177 CHAIOffsetEntry.pack(side=LEFT)
22178 CHAIOffsetEntry.delete(0,"end")
22179 CHAIOffsetEntry.insert(0,0.0)
22180 #
22181 ProbeBI = Frame( frame2r )
22182 ProbeBI.pack(side=TOP)
22183 gainbilab = Button(ProbeBI, text="CB-I", width=4, style="Ctrace4.TButton", command=ReSetBIGO)
22184 gainbilab.pack(side=LEFT,fill=X)
22185 CHBIGainEntry = Entry(ProbeBI, width=5, cursor='double_arrow')
22186 CHBIGainEntry.bind('<Return>', onTextKey)
22187 CHBIGainEntry.bind('<MouseWheel>', onTextScroll)
22188 CHBIGainEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22189 CHBIGainEntry.bind("<Button-5>", onTextScroll)
22190 CHBIGainEntry.bind('<Key>', onTextKey)
22191 CHBIGainEntry.pack(side=LEFT)
22192 CHBIGainEntry.delete(0,"end")
22193 CHBIGainEntry.insert(0,1.0)
22194 CHBIOffsetEntry = Entry(ProbeBI, width=5, cursor='double_arrow')
22195 CHBIOffsetEntry.bind('<Return>', onTextKey)
22196 CHBIOffsetEntry.bind('<MouseWheel>', onTextScroll)
22197 CHBIOffsetEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22198 CHBIOffsetEntry.bind("<Button-5>", onTextScroll)
22199 CHBIOffsetEntry.bind('<Key>', onTextKey)
22200 CHBIOffsetEntry.pack(side=LEFT)
22201 CHBIOffsetEntry.delete(0,"end")
22202 CHBIOffsetEntry.insert(0,0.0)
22203 # add ADI logo Don't mess with this bit map data!
22204 ADIlogo = """
22205 R0lGODlhdAAxAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD/
22206 /////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
22207 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBm
22208 AABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/
22209 MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNm
22210 ZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/
22211 mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZm
22212 zGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb/
22213 /5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZ
22214 AJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwA
22215 M8wAZswAmcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZ
22216 ZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8A
22217 mf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+Z
22218 zP+Z///MAP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAB0ADEA
22219 AAj/AP8JHEiwoMGDCBMqXMiwocOHEBlSS5WKIUWJfqj9S+XnokGPEUOKdEito0WNCC9OpEbtz7+V
22220 HyuOnEnzI6yMEylWpNgx50aOGkt6LElUoB9VPFHyTAXrYipVNaOSTOWzEEuqA61SXTnxH06ZK7EK
22221 5Ap2J9WdKKWqRVjyJ1c/1ZbqvPnyrKqS215mzEiwo8yfer22XUs4Zse9V31mPFuxbdKxjAU65Si5
22222 8Vm+hTNXrvuWKFKdjs8WJEqR5V63bkP/1bx28E+rK28ihckRayHQnH/yVdUTMtB/1fywHj7TI0iR
22223 x4krd7g0bcjSy6NLn069uvXr2LNr3/6Sip/vU777//EOXjx5P+G/nw/vnCA18gXFOy+JWfL31V6/
22224 s001ZQqK8AdN1B8KJiVETX9TMIGggv0xmOCCEDbYX3sDoTdhXwi6199qFjJRUIMB3iEhgs7x56CC
22225 wrH134r+tcjiiy7G+B+FL7nIYYsp1ojCX9SwuFqLBh343xQc+bGiUjhyhCNbLTbR4oBTODlkk09S
22226 iQKNBz7Z139OotQjkQPxx2WO/3D5kZNUDDSRk8IJOUVabqoo45ww1tkijejt+N9fUM64kX9/GQne
22227 lQMBWdCRGs6Yyp4FFYllhIVM6aCkCFL65kGAHshEjhZa2NiGAlWzJzUK8pngaAmSKVAh/fHWX0Rf
22228 sv+oSnB01iprkIwOWKF//wzIEqBG8drrf4USS9CiYBYEy39/GCrQHzpZFWCVhOoFpZSVRkktheg1
22229 MRaoXhGLbEaM9tpEinmiNGSj4CaaipNTqKltuaPBOF+ftt6JKgpUnGUoFcIaGR6wX371X4rOjnXw
22230 R3tSYexLL+L37YgUmhjhgxSjijHGGln4rYMVoXdihr2eqiETdxhEooUUtuuevQEiayeL7eU5p3B5
22231 ZmXjsHRWlLBAWgA7ULME/rPsqxjuOC2X/tE4VrfUztuef6oCKXDSRBb8MoBc6gSalD1BDVW4E5rW
22232 osQQx+i0mgLbOd/CSWeJwtY7pvvhjLWmDWOOJc3/jHaWHDckd4TOsawxePEeuyGJ7O44opbWDukH
22233 LB8hOGFtAcI4dkNEx7g5d+6xtBBLa8s7ZbUk/XF66aBLFau+D/GntntbwdQo6bXnHmTu83FFO+6k
22234 wxm8QoAzyDrbI186UPIF/vk4in6UStA2DKaC4q4OKp98qsFmnPnsC21jM8zF3izZzB1RTRDRfrBa
22235 dMl1alSrcPgOmVeQVpYuYNRSOtf/RFDbSaaCJzop9cVJFOkPzs6mF3iVjEheo0qzmvAHpcCtXuA7
22236 iJjy5ZyE2Wwi9IpPub4ULzFlhIFP25P6DCKwzQlJVRML3EEstDFLOYdBH7qcyxQ3hUJIJkE7ORip
22237 /5CmptJcEENMQNv3bkW7mc3pcz8bl8xilKN1ka0i7HMfDMsHo42wqIdiWVqlSmSlbGHLVwTRleII
22238 tMFrccpPVnxXeGSnxH+csUk/tFJ96Aa7kuTLbWl82PnmKLn06OeHOxKTTExowoTgCD3i6UvbVqix
22239 wMlue5i80PKIuKoN0VEhCJLd2KzHnushxJSjuySFXnewP3IwkIkrH0WYpRCBkewfWnSTc1TRyvfF
22240 RwuqEtgqy3gt/hkTdXYUVl0cqEiFyE5ozlugL+GXpS32pwkdjNIqncjNWnXwYBZaEVSm+CIyQekv
22241 jYTffaDkpjqpzpOym6a8HmepKk2KcAS5J+OcV0JDAIXJioPMEZQaxJd6Kkqfe1RTNxfquWNRBFo6
22242 oV0qbvNQ6BQxjP/4TOGSpBSKUDQVEH2awHrTupKa9KQoTWl0AgIAOw==
22243 """
22244 logo = PhotoImage(data=ADIlogo)
22245 ADI1 = Label(frame2r, image=logo, anchor= "sw", compound="top") # , height=49, width=116
22246 ADI1.pack(side=TOP)
22247 
22248 # Bottom Buttons
22249 # Voltage channel A
22250 if ButtonOrder == 1:
22251  CHAlab = Button(frame3, text="CA V/Div", style="Rtrace1.TButton", command=SetScaleA)
22252  CHAlab.pack(side=LEFT)
22253 CHAsb = Spinbox(frame3, cursor='double_arrow', width=4, values=CHvpdiv, command=BCHAlevel)
22254 #CHAsb = ttk.Spinbox(frame3, cursor='double_arrow', style="Div.TSpinbox", values=CHvpdiv, command=BCHAlevel)
22255 CHAsb.bind('<MouseWheel>', onSpinBoxScroll)
22256 CHAsb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
22257 CHAsb.bind("<Button-5>", onSpinBoxScroll)
22258 CHAsb.pack(side=LEFT)
22259 CHAsb.delete(0,"end")
22260 CHAsb.insert(0,0.5)
22261 #
22262 if ButtonOrder == 0:
22263  CHAlab = Button(frame3, text="CA V/Div", style="Rtrace1.TButton", command=SetScaleA)
22264  CHAlab.pack(side=LEFT)
22265 #
22266 if ButtonOrder == 1:
22267  CHAofflab = Button(frame3, text="CA V Pos", style="Rtrace1.TButton", command=SetVAPoss)
22268  CHAofflab.pack(side=LEFT)
22269 CHAVPosEntry = Entry(frame3, width=5, cursor='double_arrow')
22270 CHAVPosEntry.bind("<Return>", BOffsetA)
22271 CHAVPosEntry.bind('<MouseWheel>', onTextScroll)# with Windows OS
22272 CHAVPosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22273 CHAVPosEntry.bind("<Button-5>", onTextScroll)
22274 CHAVPosEntry.bind('<Key>', onTextKey)
22275 CHAVPosEntry.pack(side=LEFT)
22276 CHAVPosEntry.delete(0,"end")
22277 CHAVPosEntry.insert(0,2.5)
22278 if ButtonOrder == 0:
22279  CHAofflab = Button(frame3, text="CA V Pos", style="Rtrace1.TButton", command=SetVAPoss)
22280  CHAofflab.pack(side=LEFT)
22281 # Current channel A
22282 if ButtonOrder == 1:
22283  CHAIlab = Button(frame3, text="CA mA/Div", style="Strace3.TButton", command=SetScaleIA)
22284  CHAIlab.pack(side=LEFT)
22285 CHAIsb = Spinbox(frame3, cursor='double_arrow', width=4, values=CHipdiv, command=BCHAIlevel)
22286 CHAIsb.bind('<MouseWheel>', onSpinBoxScroll)
22287 CHAIsb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
22288 CHAIsb.bind("<Button-5>", onSpinBoxScroll)
22289 CHAIsb.pack(side=LEFT)
22290 CHAIsb.delete(0,"end")
22291 CHAIsb.insert(0,50.0)
22292 if ButtonOrder == 0:
22293  CHAIlab = Button(frame3, text="CA mA/Div", style="Strace3.TButton", command=SetScaleIA)
22294  CHAIlab.pack(side=LEFT)
22295 #
22296 if ButtonOrder == 1:
22297  CHAIofflab = Button(frame3, text="CA I Pos", style="Rtrace3.TButton", command=SetIAPoss)
22298  CHAIofflab.pack(side=LEFT)
22299 CHAIPosEntry = Entry(frame3, width=5, cursor='double_arrow')
22300 CHAIPosEntry.bind("<Return>", BIOffsetA)
22301 CHAIPosEntry.bind('<MouseWheel>', onTextScroll)# with Windows OS
22302 CHAIPosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22303 CHAIPosEntry.bind("<Button-5>", onTextScroll)
22304 CHAIPosEntry.bind('<Key>', onTextKey)
22305 CHAIPosEntry.pack(side=LEFT)
22306 CHAIPosEntry.delete(0,"end")
22307 CHAIPosEntry.insert(0,0.0)
22308 if ButtonOrder == 0:
22309  CHAIofflab = Button(frame3, text="CA I Pos", style="Rtrace3.TButton", command=SetIAPoss)
22310  CHAIofflab.pack(side=LEFT)
22311 # Voltage channel B
22312 if ButtonOrder == 1:
22313  CHBlab = Button(frame3, text="CB V/Div", style="Strace2.TButton", command=SetScaleB)
22314  CHBlab.pack(side=LEFT)
22315 CHBsb = Spinbox(frame3, width=4, cursor='double_arrow', values=CHvpdiv, command=BCHBlevel)
22316 CHBsb.bind('<MouseWheel>', onSpinBoxScroll)
22317 CHAIsb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
22318 CHAIsb.bind("<Button-5>", onSpinBoxScroll)
22319 CHBsb.pack(side=LEFT)
22320 CHBsb.delete(0,"end")
22321 CHBsb.insert(0,0.5)
22322 #
22323 if ButtonOrder == 0:
22324  CHBlab = Button(frame3, text="CB V/Div", style="Strace2.TButton", command=SetScaleB)
22325  CHBlab.pack(side=LEFT)
22326 #
22327 if ButtonOrder == 1:
22328  CHBofflab = Button(frame3, text="CB V Pos", style="Rtrace2.TButton", command=SetVBPoss)
22329  CHBofflab.pack(side=LEFT)
22330 CHBVPosEntry = Entry(frame3, width=5, cursor='double_arrow')
22331 CHBVPosEntry.bind("<Return>", BOffsetB)
22332 CHBVPosEntry.bind('<MouseWheel>', onTextScroll)# with Windows OS
22333 CHBVPosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22334 CHBVPosEntry.bind("<Button-5>", onTextScroll)
22335 CHBVPosEntry.bind('<Key>', onTextKey)
22336 CHBVPosEntry.pack(side=LEFT)
22337 CHBVPosEntry.delete(0,"end")
22338 CHBVPosEntry.insert(0,2.5)
22339 if ButtonOrder == 0:
22340  CHBofflab = Button(frame3, text="CB V Pos", style="Rtrace2.TButton", command=SetVBPoss)
22341  CHBofflab.pack(side=LEFT)
22342 # Current channel B
22343 if ButtonOrder == 1:
22344  CHBIlab = Button(frame3, text="CB mA/Div", style="Strace4.TButton", command=SetScaleIB)
22345  CHBIlab.pack(side=LEFT)
22346 CHBIsb = Spinbox(frame3, width=4, cursor='double_arrow', values=CHipdiv, command=BCHBIlevel)
22347 CHBIsb.bind('<MouseWheel>', onSpinBoxScroll)
22348 CHBIsb.bind("<Button-4>", onSpinBoxScroll)# with Linux OS
22349 CHBIsb.bind("<Button-5>", onSpinBoxScroll)
22350 CHBIsb.pack(side=LEFT)
22351 CHBIsb.delete(0,"end")
22352 CHBIsb.insert(0,50.0)
22353 if ButtonOrder == 0:
22354  CHBIlab = Button(frame3, text="CB mA/Div", style="Strace4.TButton", command=SetScaleIB)
22355  CHBIlab.pack(side=LEFT)
22356 #
22357 if ButtonOrder == 1:
22358  CHBIofflab = Button(frame3, text="CB I Pos", style="Rtrace4.TButton", command=SetIBPoss)
22359  CHBIofflab.pack(side=LEFT)
22360 CHBIPosEntry = Entry(frame3, width=5, cursor='double_arrow')
22361 CHBIPosEntry.bind("<Return>", BIOffsetB)
22362 CHBIPosEntry.bind('<MouseWheel>', onTextScroll)# with Windows OS
22363 CHBIPosEntry.bind("<Button-4>", onTextScroll)# with Linux OS
22364 CHBIPosEntry.bind("<Button-5>", onTextScroll)
22365 CHBIPosEntry.bind('<Key>', onTextKey)
22366 CHBIPosEntry.pack(side=LEFT)
22367 CHBIPosEntry.delete(0,"end")
22368 CHBIPosEntry.insert(0,0.0)
22369 if ButtonOrder == 0:
22370  CHBIofflab = Button(frame3, text="CB I Pos", style="Rtrace4.TButton", command=SetIBPoss)
22371  CHBIofflab.pack(side=LEFT)
22372 #
22373 if ShowBallonHelp > 0:
22374  CHAlab_tip = CreateToolTip(CHAlab, 'Select CHA-V vertical range/position axis to be used for markers and drawn color')
22375  CHBlab_tip = CreateToolTip(CHBlab, 'Select CHB-V vertical range/position axis to be used for markers and drawn color')
22376  CHAIlab_tip = CreateToolTip(CHAIlab, 'Select CHA-I vertical range/position axis to be used for markers and drawn color')
22377  CHBIlab_tip = CreateToolTip(CHBIlab, 'Select CHB-I vertical range/position axis to be used for markers and drawn color')
22378  CHAofflab_tip = CreateToolTip(CHAofflab, 'Set CHA-V position to DC average of signal')
22379  CHBofflab_tip = CreateToolTip(CHBofflab, 'Set CHB-V position to DC average of signal')
22380  CHAIofflab_tip = CreateToolTip(CHAIofflab, 'Set CHA-I position to DC average of signal')
22381  CHBIofflab_tip = CreateToolTip(CHBIofflab, 'Set CHB-I position to DC average of signal')
22382  gain1lab_tip = CreateToolTip(gain1lab, 'Reset Gain to 1.0 and Ovvset to 0.0')
22383  gain2lab_tip = CreateToolTip(gain2lab, 'Reset Gain to 1.0 and Ovvset to 0.0')
22384  gainailab_tip = CreateToolTip(gainailab, 'Reset Gain to 1.0 and Ovvset to 0.0')
22385  gainbilab_tip = CreateToolTip(gainbilab, 'Reset Gain to 1.0 and Ovvset to 0.0')
22386 #
22387 root.geometry('+300+0')
22388 root.protocol("WM_DELETE_WINDOW", Bcloseexit)
22389 #===== Initalize device ======
22390 if not numpy_found:
22391  root.update()
22392  showwarning("WARNING","Numpy not found!")
22393  root.destroy()
22394  exit()
22395 #
22396 BrdSel = IntVar(0)
22397 BoardStatus = IntVar(0)
22398 if pysmu_found:
22399  ConnectDevice()
22400  #session.hotplug_attach(ConnectDevice)
22401  #session.hotplug_detach(ConnectDevice)
22402  if EnableScopeOnly == 0:
22403  MakeAWGWindow() # build AWG window
22404  else:
22405  AWGScreenStatus.set(1)
22406  BLoadConfig("alice-last-config.cfg") # load configuration from last session
22407  if LocalLanguage != "English":
22408  BLoadConfig(LocalLanguage) # load local language configuration
22409 # ================ Call main routine ===============================
22410  root.update() # Activate updated screens
22411 # Start sampling
22412  Analog_In()
22413 else:
22414  root.update()
22415  showwarning("WARNING","Pysmu not found!")
22416  root.destroy()
22417  exit()
22418 
alice-desktop-1.UpdateNqPAll
def UpdateNqPAll()
Definition: alice-desktop-1.3.pyw:14371
alice-desktop-1.AWGBMakeRamp
def AWGBMakeRamp()
Definition: alice-desktop-1.3.pyw:11158
alice-desktop-1.DestroyNiCScreen
def DestroyNiCScreen()
Definition: alice-desktop-1.3.pyw:14229
alice-desktop-1.SetETSComp
def SetETSComp()
Definition: alice-desktop-1.3.pyw:20722
alice-desktop-1.DestroySettings
def DestroySettings()
Definition: alice-desktop-1.3.pyw:20946
alice-desktop-1.MakeNqPScreen
def MakeNqPScreen()
Draw the Nyquist plot screen.
Definition: alice-desktop-1.3.pyw:14119
alice-desktop-1.BResetFreqAvg
def BResetFreqAvg()
Definition: alice-desktop-1.3.pyw:11689
alice-desktop-1.onCanvasOne
def onCanvasOne(event)
Definition: alice-desktop-1.3.pyw:8715
alice-desktop-1.DestroyDigScreen
def DestroyDigScreen()
Distroy the Digital I/O screen.
Definition: alice-desktop-1.3.pyw:4987
alice-desktop-1.MGLoad
def MGLoad()
Definition: alice-desktop-1.3.pyw:20318
alice-desktop-1.DestroyDacScreen
def DestroyDacScreen()
Destroy the DAC Screen.
Definition: alice-desktop-1.3.pyw:5094
alice-desktop-1.BLoadConfig
def BLoadConfig(filename)
Load configuration from a file
Definition: alice-desktop-1.3.pyw:1421
alice-desktop-1.ReInterploateTrigger
def ReInterploateTrigger(TrgBuff)
Interpolate time between samples around trigger event.
Definition: alice-desktop-1.3.pyw:4857
alice-desktop-1.MakeCommandScreen
def MakeCommandScreen()
Definition: alice-desktop-1.3.pyw:19522
alice-desktop-1.UpdateNiCScreen
def UpdateNiCScreen()
Definition: alice-desktop-1.3.pyw:14404
alice-desktop-1.onCanvasFreqClickScroll
def onCanvasFreqClickScroll(event)
Definition: alice-desktop-1.3.pyw:16044
alice-desktop-1.onCanvasMouse_xy
def onCanvasMouse_xy(event)
Definition: alice-desktop-1.3.pyw:20953
alice-desktop-1.onCanvasSnap
def onCanvasSnap(event)
Definition: alice-desktop-1.3.pyw:8787
alice-desktop-1.onCanvasBdSeven
def onCanvasBdSeven(event)
Definition: alice-desktop-1.3.pyw:16394
alice-desktop-1.onCanvasSATwo
def onCanvasSATwo(event)
Definition: alice-desktop-1.3.pyw:16149
alice-desktop-1.SetTriggerPoss
def SetTriggerPoss()
Definition: alice-desktop-1.3.pyw:2413
alice-desktop-1.shift_buffer
def shift_buffer(arr, num, fill_value=numpy.nan)
Function to left (-num) or right (+num) shift buffer and fill with a value returns same length buffer...
Definition: alice-desktop-1.3.pyw:4335
alice-desktop-1.BTime
def BTime()
Set Hor time scale from entry widget.
Definition: alice-desktop-1.3.pyw:2745
alice-desktop-1.OpenOtherTools
def OpenOtherTools()
Definition: alice-desktop-1.3.pyw:20999
alice-desktop-1.VAtoggle
def VAtoggle()
Definition: alice-desktop-1.3.pyw:14410
alice-desktop-1.onCanvasSpaceBar
def onCanvasSpaceBar(event)
Pause / start on space bar.
Definition: alice-desktop-1.3.pyw:8407
alice-desktop-1.SetXYScaleB
def SetXYScaleB()
Definition: alice-desktop-1.3.pyw:8178
alice-desktop-1.MakeAWGWindow
def MakeAWGWindow()
Definition: alice-desktop-1.3.pyw:16565
alice-desktop-1.MakeFreqTrace
def MakeFreqTrace()
Definition: alice-desktop-1.3.pyw:12608
alice-desktop-1.BDSweepFromFile
def BDSweepFromFile()
Definition: alice-desktop-1.3.pyw:17148
alice-desktop-1.ReSetBGO
def ReSetBGO()
Definition: alice-desktop-1.3.pyw:20975
alice-desktop-1.SetMuxBPoss
def SetMuxBPoss()
Definition: alice-desktop-1.3.pyw:2455
alice-desktop-1.sel
def sel()
Definition: alice-desktop-1.3.pyw:4993
alice-desktop-1.MakeNyquistPlot
def MakeNyquistPlot()
Definition: alice-desktop-1.3.pyw:14077
alice-desktop-1.MakeXYWindow
def MakeXYWindow()
Definition: alice-desktop-1.3.pyw:17793
alice-desktop-1.AWGBMakeUpDownRamp
def AWGBMakeUpDownRamp()
Definition: alice-desktop-1.3.pyw:11220
alice-desktop-1.DoImpedance
def DoImpedance()
Definition: alice-desktop-1.3.pyw:13425
alice-desktop-1.BAWGBOffset
def BAWGBOffset(temp)
Definition: alice-desktop-1.3.pyw:10488
alice-desktop-1.onAWGBscroll
def onAWGBscroll(event)
Definition: alice-desktop-1.3.pyw:16445
alice-desktop-1.MakeSpectrumWindow
def MakeSpectrumWindow()
Definition: alice-desktop-1.3.pyw:17516
alice-desktop-1.SettingsUpdate
def SettingsUpdate()
Definition: alice-desktop-1.3.pyw:20762
alice-desktop-1.BAWGBPhaseDelay
def BAWGBPhaseDelay()
Definition: alice-desktop-1.3.pyw:10557
alice-desktop-1.MakeXYScreen
def MakeXYScreen()
Update the XY screen traces and text.
Definition: alice-desktop-1.3.pyw:7416
alice-desktop-1.UpdateFirmware
def UpdateFirmware()
Definition: alice-desktop-1.3.pyw:20092
alice-desktop-1.UpdateBodeScreen
def UpdateBodeScreen()
Definition: alice-desktop-1.3.pyw:12253
alice-desktop-1.UpdateAWGB
def UpdateAWGB()
Definition: alice-desktop-1.3.pyw:11443
alice-desktop-1.MakeBodeWindow
def MakeBodeWindow()
Definition: alice-desktop-1.3.pyw:17193
alice-desktop-1.BPower
def BPower()
Toggel on/off analog power.
Definition: alice-desktop-1.3.pyw:2731
alice-desktop-1.CAresize
def CAresize(event)
Definition: alice-desktop-1.3.pyw:19568
alice-desktop-1.BSweepSync
def BSweepSync()
Definition: alice-desktop-1.3.pyw:17138
alice-desktop-1.BDFiltAMath
def BDFiltAMath()
Definition: alice-desktop-1.3.pyw:19469
alice-desktop-1.SetScaleA
def SetScaleA()
Definition: alice-desktop-1.3.pyw:8123
alice-desktop-1.DestroyMuxScreen
def DestroyMuxScreen()
Definition: alice-desktop-1.3.pyw:17107
alice-desktop-1.SetScaleMuxA
def SetScaleMuxA()
Definition: alice-desktop-1.3.pyw:2473
alice-desktop-1.BSaveScreenXY
def BSaveScreenXY()
Save XY canvas as encapsulated postscript file.
Definition: alice-desktop-1.3.pyw:1743
alice-desktop-1.PlotPhAFromFile
def PlotPhAFromFile()
Definition: alice-desktop-1.3.pyw:15453
alice-desktop-1.DA1ShiftOut
def DA1ShiftOut(D1Value, D2Value)
if ETSStatus.get() > 0 and ETSDisp.get() > 0: MGLoad()
Definition: alice-desktop-1.3.pyw:18774
alice-desktop-1.Analog_In
def Analog_In()
Main Loop.
Definition: alice-desktop-1.3.pyw:2954
alice-desktop-1.IACheckBox
def IACheckBox()
Definition: alice-desktop-1.3.pyw:2904
alice-desktop-1.AWGALoadWAV
def AWGALoadWAV()
Definition: alice-desktop-1.3.pyw:9366
alice-desktop-1.BSaveIASweep
def BSaveIASweep()
Definition: alice-desktop-1.3.pyw:14071
alice-desktop-1.AWGAMakePulse
def AWGAMakePulse()
Definition: alice-desktop-1.3.pyw:9911
alice-desktop-1.ApplyMathString
def ApplyMathString()
Apply Math string from entry widget.
Definition: alice-desktop-1.3.pyw:2275
alice-desktop-1.AWGAMakeUpDownRamp
def AWGAMakeUpDownRamp()
Definition: alice-desktop-1.3.pyw:10045
alice-desktop-1.onCanvasShowdBcur
def onCanvasShowdBcur(event)
Definition: alice-desktop-1.3.pyw:16225
alice-desktop-1.DestroyAD5626Screen
def DestroyAD5626Screen()
Definition: alice-desktop-1.3.pyw:19211
alice-desktop-1.SplitAWGAwaveform
def SplitAWGAwaveform()
Definition: alice-desktop-1.3.pyw:9333
alice-desktop-1.BStartIA
def BStartIA()
Start Impedance Tool
Definition: alice-desktop-1.3.pyw:2665
alice-desktop-1.SetBCompA
def SetBCompA()
Definition: alice-desktop-1.3.pyw:10407
alice-desktop-1.onCanvasSAAverage
def onCanvasSAAverage(event)
Definition: alice-desktop-1.3.pyw:16215
alice-desktop-1.MakeETSWindow
def MakeETSWindow()
Definition: alice-desktop-1.3.pyw:20211
alice-desktop-1.SplitAWGBwaveform
def SplitAWGBwaveform()
Definition: alice-desktop-1.3.pyw:10684
alice-desktop-1.BSendDA1
def BSendDA1()
Definition: alice-desktop-1.3.pyw:18812
alice-desktop-1.SetVBPoss
def SetVBPoss()
Definition: alice-desktop-1.3.pyw:2527
alice-desktop-1.AWGBMakeUGNoise
def AWGBMakeUGNoise()
Definition: alice-desktop-1.3.pyw:11381
alice-desktop-1.BCHBIlevel
def BCHBIlevel()
Definition: alice-desktop-1.3.pyw:2804
alice-desktop-1.ETSscroll
def ETSscroll(event)
Definition: alice-desktop-1.3.pyw:20328
alice-desktop-1.Bsamples1
def Bsamples1()
Definition: alice-desktop-1.3.pyw:11982
alice-desktop-1.BAWGADutyCycle
def BAWGADutyCycle(temp)
Definition: alice-desktop-1.3.pyw:9237
alice-desktop-1.BAWG2X
def BAWG2X()
Definition: alice-desktop-1.3.pyw:16903
alice-desktop-1.ReSetAIGO
def ReSetAIGO()
Definition: alice-desktop-1.3.pyw:20983
alice-desktop-1.onCanvasShowBdBcur
def onCanvasShowBdBcur(event)
Definition: alice-desktop-1.3.pyw:16423
alice-desktop-1.onRetSrate
def onRetSrate(event)
Definition: alice-desktop-1.3.pyw:19932
alice-desktop-1.BAveragemode
def BAveragemode()
Definition: alice-desktop-1.3.pyw:11679
alice-desktop-1.SetScaleIB
def SetScaleIB()
Definition: alice-desktop-1.3.pyw:8159
alice-desktop-1.AWGBWriteFile
def AWGBWriteFile()
Definition: alice-desktop-1.3.pyw:10729
alice-desktop-1.Blevel4
def Blevel4()
Definition: alice-desktop-1.3.pyw:11973
alice-desktop-1.BReadData
def BReadData()
Read scope all time array data from saved file.
Definition: alice-desktop-1.3.pyw:1831
alice-desktop-1.MakeFreqScreen
def MakeFreqScreen()
Make Spectrum Analyzer Screen.
Definition: alice-desktop-1.3.pyw:15587
alice-desktop-1.Blevel1
def Blevel1()
Definition: alice-desktop-1.3.pyw:11946
alice-desktop-1.BHistAsPercent
def BHistAsPercent()
Plot Histogram as Percent?
Definition: alice-desktop-1.3.pyw:4698
alice-desktop-1.UpdateTimeTrace
def UpdateTimeTrace()
Update time trace and screen.
Definition: alice-desktop-1.3.pyw:5259
alice-desktop-1.onCanvasBdOne
def onCanvasBdOne(event)
Definition: alice-desktop-1.3.pyw:16352
alice-desktop-1.BSaveScreen
def BSaveScreen()
Save scope canvas as encapsulated postscript file.
Definition: alice-desktop-1.3.pyw:1724
alice-desktop-1.UpdateNiCAll
def UpdateNiCAll()
Definition: alice-desktop-1.3.pyw:14390
alice-desktop-1.Blevel2BP
def Blevel2BP()
Definition: alice-desktop-1.3.pyw:12179
alice-desktop-1.onSpinBoxScroll
def onSpinBoxScroll(event)
Definition: alice-desktop-1.3.pyw:16555
alice-desktop-1.onCanvasSASnap
def onCanvasSASnap(event)
Definition: alice-desktop-1.3.pyw:16203
alice-desktop-1.BAWGEnab
def BAWGEnab()
Definition: alice-desktop-1.3.pyw:11581
alice-desktop-1.BIOffsetB
def BIOffsetB(event)
Definition: alice-desktop-1.3.pyw:2851
alice-desktop-1.SetScaleMuxD
def SetScaleMuxD()
Definition: alice-desktop-1.3.pyw:2509
alice-desktop-1.AWGBMakeSinc
def AWGBMakeSinc()
Definition: alice-desktop-1.3.pyw:10909
alice-desktop-1.AWGBReadWAV
def AWGBReadWAV()
Definition: alice-desktop-1.3.pyw:10694
alice-desktop-1.UpdateTimeAll
def UpdateTimeAll()
Update Data, trace and time screen.
Definition: alice-desktop-1.3.pyw:5254
alice-desktop-1.onCanvasSASeven
def onCanvasSASeven(event)
Definition: alice-desktop-1.3.pyw:16184
alice-desktop-1.Bcloseexit
def Bcloseexit()
Fubntion to close and exit ALICE.
Definition: alice-desktop-1.3.pyw:2569
alice-desktop-1.AWGAMakePWMSine
def AWGAMakePWMSine()
Definition: alice-desktop-1.3.pyw:9652
alice-desktop-1.Sine_Phase
def Sine_Phase()
Definition: alice-desktop-1.3.pyw:4275
alice-desktop-1.CreateToolTip.tw
tw
Definition: alice-desktop-1.3.pyw:774
alice-desktop-1.MakeIAWindow
def MakeIAWindow()
Definition: alice-desktop-1.3.pyw:13899
alice-desktop-1.SetScaleB
def SetScaleB()
Definition: alice-desktop-1.3.pyw:8147
alice-desktop-1.SetXYScaleA
def SetXYScaleA()
Definition: alice-desktop-1.3.pyw:8171
alice-desktop-1.TraceSelectADC_Mux
def TraceSelectADC_Mux()
Definition: alice-desktop-1.3.pyw:20052
alice-desktop-1.SetXYIAPoss
def SetXYIAPoss()
Definition: alice-desktop-1.3.pyw:2557
alice-desktop-1.SetSampleRate
def SetSampleRate()
Definition: alice-desktop-1.3.pyw:19936
alice-desktop-1.BSaveConfigTime
def BSaveConfigTime()
Save current configuration from Scope window.
Definition: alice-desktop-1.3.pyw:1416
alice-desktop-1.MakeHistogram
def MakeHistogram()
Make histogram of time signals.
Definition: alice-desktop-1.3.pyw:4657
alice-desktop-1.SetScaleIA
def SetScaleIA()
Definition: alice-desktop-1.3.pyw:8135
alice-desktop-1.BFileFFTwindow
def BFileFFTwindow()
Definition: alice-desktop-1.3.pyw:16010
alice-desktop-1.IncHoldOff
def IncHoldOff()
Definition: alice-desktop-1.3.pyw:2431
alice-desktop-1.BAWGBModeLabel
def BAWGBModeLabel()
Definition: alice-desktop-1.3.pyw:11422
alice-desktop-1.UpdateFreqTrace
def UpdateFreqTrace()
Definition: alice-desktop-1.3.pyw:12269
alice-desktop-1.onCanvasFreqLeftClick
def onCanvasFreqLeftClick(event)
Definition: alice-desktop-1.3.pyw:16063
alice-desktop-1.DoFFT
def DoFFT()
Definition: alice-desktop-1.3.pyw:12276
alice-desktop-1.Digital_RC_High_Pass
def Digital_RC_High_Pass(InBuff, TC1, Gain)
Digital filter function for input divider frequency compensation TC1 is in micro seconds.
Definition: alice-desktop-1.3.pyw:4297
alice-desktop-1.onCanvasBdSnap
def onCanvasBdSnap(event)
Definition: alice-desktop-1.3.pyw:16413
alice-desktop-1.Settingsscroll
def Settingsscroll(event)
Definition: alice-desktop-1.3.pyw:20444
alice-desktop-1.BOffsetA
def BOffsetA(event)
Definition: alice-desktop-1.3.pyw:2815
alice-desktop-1.onAWGBkey
def onAWGBkey(event)
Definition: alice-desktop-1.3.pyw:16492
alice-desktop-1.onMulXScroll
def onMulXScroll(event)
Definition: alice-desktop-1.3.pyw:20338
alice-desktop-1.SchroederPhase
def SchroederPhase(Length, NrTones, Ampl)
Definition: alice-desktop-1.3.pyw:9018
alice-desktop-1.UpdateAwgContRet
def UpdateAwgContRet(temp)
Definition: alice-desktop-1.3.pyw:11578
alice-desktop-1.CheckMathString
def CheckMathString()
Check Math String for syntac errors.
Definition: alice-desktop-1.3.pyw:2218
alice-desktop-1.VBtoggle
def VBtoggle()
Definition: alice-desktop-1.3.pyw:14426
alice-desktop-1.BgColor
def BgColor()
Toggle the Background and text colors based on ColorMode.
Definition: alice-desktop-1.3.pyw:1689
alice-desktop-1.UpdateNiCTrace
def UpdateNiCTrace()
Definition: alice-desktop-1.3.pyw:14399
alice-desktop-1.ETSUpdate
def ETSUpdate()
Definition: alice-desktop-1.3.pyw:20360
alice-desktop-1.MakeMuxModeWindow
def MakeMuxModeWindow()
Definition: alice-desktop-1.3.pyw:16932
alice-desktop-1.BShowCurvesAllBP
def BShowCurvesAllBP()
Definition: alice-desktop-1.3.pyw:12227
font
alice-desktop-1.SelfCalibration
def SelfCalibration()
Definition: alice-desktop-1.3.pyw:18037
alice-desktop-1.BTriggerMode
def BTriggerMode()
place holder for future hardware triggering if implemented
Definition: alice-desktop-1.3.pyw:2365
alice-desktop-1.onRetDigFiltB
def onRetDigFiltB(event)
Definition: alice-desktop-1.3.pyw:19415
alice-desktop-1.Bsamples2
def Bsamples2()
Definition: alice-desktop-1.3.pyw:12003
alice-desktop-1.BStart
def BStart()
Start aquaring scope time data.
Definition: alice-desktop-1.3.pyw:2594
alice-desktop-1.onCanvasBodeClickScroll
def onCanvasBodeClickScroll(event)
Definition: alice-desktop-1.3.pyw:16251
alice-desktop-1.Blevel1BP
def Blevel1BP()
Definition: alice-desktop-1.3.pyw:12170
alice-desktop-1.MakeNicPlot
def MakeNicPlot()
Definition: alice-desktop-1.3.pyw:14203
alice-desktop-1.AWGAMakeAMSine
def AWGAMakeAMSine()
Definition: alice-desktop-1.3.pyw:9578
alice-desktop-1.DestroyETSScreen
def DestroyETSScreen()
Definition: alice-desktop-1.3.pyw:20310
alice-desktop-1.AWGAMakeFourier
def AWGAMakeFourier()
Definition: alice-desktop-1.3.pyw:9693
alice-desktop-1.MakeGenericSerialWindow
def MakeGenericSerialWindow()
Definition: alice-desktop-1.3.pyw:19217
alice-desktop-1.UpdateAwgCont
def UpdateAwgCont()
Definition: alice-desktop-1.3.pyw:11568
alice-desktop-1.AWGBLoadCSV
def AWGBLoadCSV()
Definition: alice-desktop-1.3.pyw:10648
alice-desktop-1.RExecuteFromString
def RExecuteFromString(temp)
Definition: alice-desktop-1.3.pyw:19554
alice-desktop-1.BuildBoxCarA
def BuildBoxCarA()
Definition: alice-desktop-1.3.pyw:19397
alice-desktop-1.MakePhAScreen
def MakePhAScreen()
Definition: alice-desktop-1.3.pyw:14833
alice-desktop-1.BAWGAPhaseDelay
def BAWGAPhaseDelay()
Definition: alice-desktop-1.3.pyw:9207
alice-desktop-1.BAWGBFreq
def BAWGBFreq(temp)
Definition: alice-desktop-1.3.pyw:10526
alice-desktop-1.IACaresize
def IACaresize(event)
Definition: alice-desktop-1.3.pyw:13889
alice-desktop-1.DestroyOOTwindow
def DestroyOOTwindow()
Definition: alice-desktop-1.3.pyw:21114
alice-desktop-1.CreateToolTip.widget
widget
Definition: alice-desktop-1.3.pyw:768
alice-desktop-1.MakeTimeScreen
def MakeTimeScreen()
Update the time screen with traces and text
Definition: alice-desktop-1.3.pyw:6565
alice-desktop-1.onAWGAkey
def onAWGAkey(event)
Definition: alice-desktop-1.3.pyw:16486
alice-desktop-1.BTriggerEdge
def BTriggerEdge()
Function no longer used.
Definition: alice-desktop-1.3.pyw:2332
alice-desktop-1.AWGBMakeFourier
def AWGBMakeFourier()
Definition: alice-desktop-1.3.pyw:10765
alice-desktop-1.BAWGBDutyCycle
def BAWGBDutyCycle(temp)
Definition: alice-desktop-1.3.pyw:10587
alice-desktop-1.MakeOhmWindow
def MakeOhmWindow()
if askyesno("Flash Failed", "Failed to update firmware.\n Try again?"): try: session....
Definition: alice-desktop-1.3.pyw:20133
alice-desktop-1.onCanvasAverage
def onCanvasAverage(event)
Definition: alice-desktop-1.3.pyw:8791
alice-desktop-1.onCanvasSASix
def onCanvasSASix(event)
Definition: alice-desktop-1.3.pyw:16177
alice-desktop-1.STOREcsvfile
def STOREcsvfile()
Definition: alice-desktop-1.3.pyw:15509
alice-desktop-1.BAbout
def BAbout()
Show info on software / firmware / hardware.
Definition: alice-desktop-1.3.pyw:1870
alice-desktop-1.MakeMeasureScreen
def MakeMeasureScreen()
Definition: alice-desktop-1.3.pyw:19611
alice-desktop-1.BUserBMeas
def BUserBMeas()
Ask user for channel B Measurement Label and Formula.
Definition: alice-desktop-1.3.pyw:2027
alice-desktop-1.MakeMinigenWindow
def MakeMinigenWindow()
Make AD983x based DDS generator screen.
Definition: alice-desktop-1.3.pyw:18681
alice-desktop-1.DestroySpectrumScreen
def DestroySpectrumScreen()
Definition: alice-desktop-1.3.pyw:17769
alice-desktop-1.onCanvasSAFour
def onCanvasSAFour(event)
Definition: alice-desktop-1.3.pyw:16163
alice-desktop-1.sel2
def sel2(temp)
Definition: alice-desktop-1.3.pyw:5166
alice-desktop-1.Save_Cal_file
def Save_Cal_file()
Definition: alice-desktop-1.3.pyw:18504
alice-desktop-1.NqPCaresize
def NqPCaresize(event)
Definition: alice-desktop-1.3.pyw:14109
alice-desktop-1.BHozPoss
def BHozPoss(event)
Definition: alice-desktop-1.3.pyw:2402
alice-desktop-1.onCanvasXYRightClick
def onCanvasXYRightClick(event)
Definition: alice-desktop-1.3.pyw:8815
alice-desktop-1.BStepSync
def BStepSync()
Definition: alice-desktop-1.3.pyw:17128
alice-desktop-1.BSendGS
def BSendGS()
Definition: alice-desktop-1.3.pyw:19063
alice-desktop-1.onCanvasTwo
def onCanvasTwo(event)
Definition: alice-desktop-1.3.pyw:8723
alice-desktop-1.MakeDA1Window
def MakeDA1Window()
Make window to control PMOD DA1 board.
Definition: alice-desktop-1.3.pyw:18856
alice-desktop-1.CreateToolTip.waittime
waittime
Definition: alice-desktop-1.3.pyw:766
alice-desktop-1.FindRisingEdge
def FindRisingEdge(Trace1, Trace2)
Routine to find rising edge of traces.
Definition: alice-desktop-1.3.pyw:4706
alice-desktop-1.onCanvasBodeLeftClick
def onCanvasBodeLeftClick(event)
Definition: alice-desktop-1.3.pyw:16271
alice-desktop-1.SetXYVAPoss
def SetXYVAPoss()
Definition: alice-desktop-1.3.pyw:2545
alice-desktop-1.onCanvasSAThree
def onCanvasSAThree(event)
Definition: alice-desktop-1.3.pyw:16156
alice-desktop-1.IASourceSet
def IASourceSet()
Set up IA AWG sources.
Definition: alice-desktop-1.3.pyw:2682
alice-desktop-1.AWGBMakeTrapazoid
def AWGBMakeTrapazoid()
Definition: alice-desktop-1.3.pyw:11023
alice-desktop-1.BShowCurvesNone
def BShowCurvesNone()
Turn off display of all time waveforms.
Definition: alice-desktop-1.3.pyw:2322
alice-desktop-1.sel0
def sel0(temp)
Definition: alice-desktop-1.3.pyw:5100
alice-desktop-1.onCanvasSANine
def onCanvasSANine(event)
Definition: alice-desktop-1.3.pyw:16195
alice-desktop-1.Bnot
def Bnot()
Definition: alice-desktop-1.3.pyw:11642
alice-desktop-1.onAWGAscroll
def onAWGAscroll(event)
Definition: alice-desktop-1.3.pyw:16437
alice-desktop-1.onCanvasBodeRightClick
def onCanvasBodeRightClick(event)
Definition: alice-desktop-1.3.pyw:16239
alice-desktop-1.BStartOhm
def BStartOhm()
Definition: alice-desktop-1.3.pyw:2647
alice-desktop-1.BDBdiv1BP
def BDBdiv1BP()
Definition: alice-desktop-1.3.pyw:12206
alice-desktop-1.DestroyPhAScreen
def DestroyPhAScreen()
Definition: alice-desktop-1.3.pyw:14629
alice-desktop-1.onCanvasBdFour
def onCanvasBdFour(event)
Definition: alice-desktop-1.3.pyw:16373
alice-desktop-1.BDBdiv1
def BDBdiv1()
Definition: alice-desktop-1.3.pyw:12024
alice-desktop-1.AWGAMakeSinc
def AWGAMakeSinc()
Definition: alice-desktop-1.3.pyw:9728
alice-desktop-1.SetXYVBPoss
def SetXYVBPoss()
Definition: alice-desktop-1.3.pyw:2551
alice-desktop-1.MakePhAWindow
def MakePhAWindow()
Definition: alice-desktop-1.3.pyw:14451
alice-desktop-1.UnWrap
def UnWrap(InArray, WrFactor)
Definition: alice-desktop-1.3.pyw:9045
alice-desktop-1.ConnectDevice
def ConnectDevice()
Definition: alice-desktop-1.3.pyw:19739
alice-desktop-1.DestroyGenericSerialScreen
def DestroyGenericSerialScreen()
Definition: alice-desktop-1.3.pyw:19309
alice-desktop-1.Blevel2
def Blevel2()
Definition: alice-desktop-1.3.pyw:11955
alice-desktop-1.SelectBoard
def SelectBoard()
temp = 0 print "read ADM1177 controler" print devx.ctrl_transfer( 0xa0, 0x17, 0, 0,...
Definition: alice-desktop-1.3.pyw:19768
alice-desktop-1.BodeCheckBox
def BodeCheckBox()
Definition: alice-desktop-1.3.pyw:2890
alice-desktop-1.SetIBPoss
def SetIBPoss()
Definition: alice-desktop-1.3.pyw:2539
alice-desktop-1.BSaveCal
def BSaveCal()
Save gain, offset and filter variables for external dividers.
Definition: alice-desktop-1.3.pyw:1919
alice-desktop-1.SettingsTextKey
def SettingsTextKey(event)
Definition: alice-desktop-1.3.pyw:20448
alice-desktop-1.onCanvasZero
def onCanvasZero(event)
Definition: alice-desktop-1.3.pyw:8772
alice-desktop-1.DigPotShiftOut
def DigPotShiftOut(DValue)
Definition: alice-desktop-1.3.pyw:18913
alice-desktop-1.CreateToolTip.id
id
Definition: alice-desktop-1.3.pyw:773
alice-desktop-1.BStopBP
def BStopBP()
Definition: alice-desktop-1.3.pyw:12148
alice-desktop-1.BSaveData
def BSaveData()
Save scope all time array data to file.
Definition: alice-desktop-1.3.pyw:1796
alice-desktop-1.onTextKeyAWG
def onTextKeyAWG(event)
Definition: alice-desktop-1.3.pyw:16498
alice-desktop-1.BHelp
def BHelp()
Open User Guide in Browser open a URL, in this case, the ALICE desk-top-users-guide.
Definition: alice-desktop-1.3.pyw:1865
alice-desktop-1.BAWGSync
def BAWGSync()
Definition: alice-desktop-1.3.pyw:11602
alice-desktop-1.BAWGAShape
def BAWGAShape()
Definition: alice-desktop-1.3.pyw:9256
alice-desktop-1.BSetFmin
def BSetFmin()
Definition: alice-desktop-1.3.pyw:20959
alice-desktop-1.Analog_Phase_In
def Analog_Phase_In()
Definition: alice-desktop-1.3.pyw:3305
alice-desktop-1.BLoadConfigSA
def BLoadConfigSA()
Load confirfuration from SA window button.
Definition: alice-desktop-1.3.pyw:1670
alice-desktop-1.BCHBlevel
def BCHBlevel()
Definition: alice-desktop-1.3.pyw:2793
alice-desktop-1.UpdateBodeAll
def UpdateBodeAll()
Definition: alice-desktop-1.3.pyw:12241
alice-desktop-1.onCanvasBdNine
def onCanvasBdNine(event)
Definition: alice-desktop-1.3.pyw:16405
alice-desktop-1.Ohm_Analog_In
def Ohm_Analog_In()
Ohmmeter loop.
Definition: alice-desktop-1.3.pyw:3084
alice-desktop-1.UpdateXYTrace
def UpdateXYTrace()
Update XY trace and screen.
Definition: alice-desktop-1.3.pyw:5274
alice-desktop-1.DestroyBoardScreen
def DestroyBoardScreen()
Definition: alice-desktop-1.3.pyw:19733
alice-desktop-1.BStopSA
def BStopSA()
Definition: alice-desktop-1.3.pyw:11919
alice-desktop-1.donothing
def donothing()
Nop.
Definition: alice-desktop-1.3.pyw:2306
alice-desktop-1.ApplyMathYString
def ApplyMathYString()
Apply Y Math string from entry widget.
Definition: alice-desktop-1.3.pyw:2289
alice-desktop-1.Blevel4BP
def Blevel4BP()
Definition: alice-desktop-1.3.pyw:12197
alice-desktop-1.MakeDigFiltWindow
def MakeDigFiltWindow()
Make screen for applying digital filters.
Definition: alice-desktop-1.3.pyw:19316
alice-desktop-1.AWGAMakeImpulse
def AWGAMakeImpulse()
Definition: alice-desktop-1.3.pyw:10112
alice-desktop-1.onCanvasNine
def onCanvasNine(event)
Definition: alice-desktop-1.3.pyw:8767
alice-desktop-1.AWGAReadWAV
def AWGAReadWAV()
Definition: alice-desktop-1.3.pyw:9357
alice-desktop-1.AWGAMakeUGNoise
def AWGAMakeUGNoise()
Definition: alice-desktop-1.3.pyw:10210
alice-desktop-1.BLoadCal
def BLoadCal()
Load gain, offset and filter variables for external dividers.
Definition: alice-desktop-1.3.pyw:1991
alice-desktop-1.BSaveScreenIA
def BSaveScreenIA()
Save IA canvas as encapsulated postscript file.
Definition: alice-desktop-1.3.pyw:1762
alice-desktop-1.DestroyDA1Screen
def DestroyDA1Screen()
Destroy PMOD DA1 screen.
Definition: alice-desktop-1.3.pyw:18907
alice-desktop-1.DestroyOhmScreen
def DestroyOhmScreen()
Definition: alice-desktop-1.3.pyw:20203
alice-desktop-1.BLoadConfigTime
def BLoadConfigTime()
Load confirfuration from Scope window button.
Definition: alice-desktop-1.3.pyw:1682
alice-desktop-1.onCanvasLeftArrow
def onCanvasLeftArrow(event)
Move Time curcors left 1 or 5.
Definition: alice-desktop-1.3.pyw:8323
alice-desktop-1.Write_WAV
def Write_WAV(data, repeat, filename)
Definition: alice-desktop-1.3.pyw:9062
alice-desktop-1.MakeDacScreen
def MakeDacScreen()
Make the DAC interface screen
Definition: alice-desktop-1.3.pyw:5232
alice-desktop-1.BTriglevel
def BTriglevel(event)
evalute trigger level entry string to a numerical value and set new trigger level
Definition: alice-desktop-1.3.pyw:2377
alice-desktop-1.AWGBMakePWMSine
def AWGBMakePWMSine()
Definition: alice-desktop-1.3.pyw:10868
alice-desktop-1.ETSCheckBox
def ETSCheckBox()
Definition: alice-desktop-1.3.pyw:2943
alice-desktop-1.DestroyNqPScreen
def DestroyNqPScreen()
Definition: alice-desktop-1.3.pyw:14102
alice-desktop-1.BSTOREtraceBP
def BSTOREtraceBP()
Definition: alice-desktop-1.3.pyw:11730
alice-desktop-1.BSetMarkerLocation
def BSetMarkerLocation()
Ask user for new Marker text location on screen.
Definition: alice-desktop-1.3.pyw:2296
alice-desktop-1.BAWGBAmpl
def BAWGBAmpl(temp)
Definition: alice-desktop-1.3.pyw:10449
alice-desktop-1.CreateToolTip.unschedule
def unschedule(self)
Un-schedule Action.
Definition: alice-desktop-1.3.pyw:787
alice-desktop-1.MakeAD5626Window
def MakeAD5626Window()
Make Controls for AD5626 serial DAC.
Definition: alice-desktop-1.3.pyw:19137
alice-desktop-1.onCanvasBdFive
def onCanvasBdFive(event)
Definition: alice-desktop-1.3.pyw:16380
alice-desktop-1.onCanvasTrising
def onCanvasTrising(event)
Definition: alice-desktop-1.3.pyw:8777
alice-desktop-1.onCanvasFreqRightClick
def onCanvasFreqRightClick(event)
Definition: alice-desktop-1.3.pyw:16033
alice-desktop-1.onCanvasShowPdBcur
def onCanvasShowPdBcur(event)
Definition: alice-desktop-1.3.pyw:16430
alice-desktop-1.BAWGAFreq
def BAWGAFreq(temp)
Definition: alice-desktop-1.3.pyw:9176
alice-desktop-1.BCHAlevel
def BCHAlevel()
Definition: alice-desktop-1.3.pyw:2771
alice-desktop-1.MakeIATrace
def MakeIATrace()
Definition: alice-desktop-1.3.pyw:13469
alice-desktop-1.IAtoggle
def IAtoggle()
Definition: alice-desktop-1.3.pyw:14434
alice-desktop-1.BOffsetB
def BOffsetB(event)
Definition: alice-desktop-1.3.pyw:2839
alice-desktop-1.onCanvasClickRight
def onCanvasClickRight(event)
Definition: alice-desktop-1.3.pyw:8185
alice-desktop-1.SyncImage
def SyncImage()
Definition: alice-desktop-1.3.pyw:17099
alice-desktop-1.DoNothing
def DoNothing(event)
Another Nop.
Definition: alice-desktop-1.3.pyw:2309
alice-desktop-1.BCSVfile
def BCSVfile()
Definition: alice-desktop-1.3.pyw:11775
alice-desktop-1.onStopBodeScroll
def onStopBodeScroll(event)
Definition: alice-desktop-1.3.pyw:19993
alice-desktop-1.BSaveScreenBP
def BSaveScreenBP()
Save Bode canvas as encapsulated postscript file.
Definition: alice-desktop-1.3.pyw:1779
alice-desktop-1.MakeNiCScreen
def MakeNiCScreen()
Make the Nichols Plot screen.
Definition: alice-desktop-1.3.pyw:14246
alice-desktop-1.BAWGBShape
def BAWGBShape()
Definition: alice-desktop-1.3.pyw:10606
alice-desktop-1.AWGANumCycles
def AWGANumCycles()
Definition: alice-desktop-1.3.pyw:9343
alice-desktop-1.DestroySampleRate
def DestroySampleRate()
Definition: alice-desktop-1.3.pyw:19919
alice-desktop-1.DigPotSend
def DigPotSend(Temp)
Definition: alice-desktop-1.3.pyw:18948
alice-desktop-1.DestroyDigFiltScreen
def DestroyDigFiltScreen()
Definition: alice-desktop-1.3.pyw:19440
alice-desktop-1.ReSetBIGO
def ReSetBIGO()
Definition: alice-desktop-1.3.pyw:20991
alice-desktop-1.CreateToolTip.configure
def configure(self, text)
Re Configure text string.
Definition: alice-desktop-1.3.pyw:815
alice-desktop-1.CreateToolTip.enter
def enter(self, event=None)
Action when mouse enters.
Definition: alice-desktop-1.3.pyw:776
alice-desktop-1.AWGAMakeTrapazoid
def AWGAMakeTrapazoid()
Definition: alice-desktop-1.3.pyw:9845
alice-desktop-1.Analog_Slow_time
def Analog_Slow_time()
Right now this is a failed attempt to plot slow sweeps.
Definition: alice-desktop-1.3.pyw:3522
alice-desktop-1.BSaveDataIA
def BSaveDataIA()
Definition: alice-desktop-1.3.pyw:11849
alice-desktop-1.AWGBMakePulse
def AWGBMakePulse()
Definition: alice-desktop-1.3.pyw:11088
alice-desktop-1.MakeDigScreen
def MakeDigScreen()
Make the Digital I/O screen.
Definition: alice-desktop-1.3.pyw:5031
alice-desktop-1.onCanvasDownArrow
def onCanvasDownArrow(event)
Move Vertical cursors down 1 or 5.
Definition: alice-desktop-1.3.pyw:8281
alice-desktop-1.sel1
def sel1(temp)
Definition: alice-desktop-1.3.pyw:5133
alice-desktop-1.Analog_Freq_In
def Analog_Freq_In()
Main SA and Bode loop Read from the stream and store the data into the arrays.
Definition: alice-desktop-1.3.pyw:4349
alice-desktop-1.BHoldOff
def BHoldOff(event)
Set Hold off time from entry widget.
Definition: alice-desktop-1.3.pyw:2391
alice-desktop-1.CreateToolTip.__init__
def __init__(self, widget, text='widget info')
create a tooltip for a given widget
Definition: alice-desktop-1.3.pyw:765
alice-desktop-1.INITIALIZEstart
def INITIALIZEstart()
Definition: alice-desktop-1.3.pyw:15897
alice-desktop-1.BStartBP
def BStartBP()
Definition: alice-desktop-1.3.pyw:12045
alice-desktop-1.onCanvasSAZero
def onCanvasSAZero(event)
Definition: alice-desktop-1.3.pyw:16199
alice-desktop-1.AWGAMakeUUNoise
def AWGAMakeUUNoise()
Definition: alice-desktop-1.3.pyw:10166
alice-desktop-1.BAWGBPhase
def BAWGBPhase(temp)
Definition: alice-desktop-1.3.pyw:10569
alice-desktop-1.BUserFFTwindow
def BUserFFTwindow()
Definition: alice-desktop-1.3.pyw:16002
alice-desktop-1.SetScaleMuxC
def SetScaleMuxC()
Definition: alice-desktop-1.3.pyw:2497
alice-desktop-1.AWGBMakeMath
def AWGBMakeMath()
Definition: alice-desktop-1.3.pyw:10735
alice-desktop-1.onCanvasSAOne
def onCanvasSAOne(event)
Definition: alice-desktop-1.3.pyw:16142
alice-desktop-1.onTextKey
def onTextKey(event)
Definition: alice-desktop-1.3.pyw:16503
alice-desktop-1.onAD5626Scroll
def onAD5626Scroll(event)
Definition: alice-desktop-1.3.pyw:19207
alice-desktop-1.onCanvasFive
def onCanvasFive(event)
Definition: alice-desktop-1.3.pyw:8747
alice-desktop-1.SetMuxCPoss
def SetMuxCPoss()
Definition: alice-desktop-1.3.pyw:2461
alice-desktop-1.SetMuxAPoss
def SetMuxAPoss()
Analog Mux buttons.
Definition: alice-desktop-1.3.pyw:2449
alice-desktop-1.BCHAIlevel
def BCHAIlevel()
Definition: alice-desktop-1.3.pyw:2782
alice-desktop-1.BodeCaresize
def BodeCaresize(event)
Definition: alice-desktop-1.3.pyw:17119
alice-desktop-1.BAWGAOffset
def BAWGAOffset(temp)
Definition: alice-desktop-1.3.pyw:9138
alice-desktop-1.BUserAMeas
def BUserAMeas()
Ask user for channel A Measurement Label and Formula.
Definition: alice-desktop-1.3.pyw:2010
alice-desktop-1.UpdateXYScreen
def UpdateXYScreen()
Update XY screen with trace and text.
Definition: alice-desktop-1.3.pyw:5279
alice-desktop-1.BLoadConfigIA
def BLoadConfigIA()
Load confirfuration from IA window button.
Definition: alice-desktop-1.3.pyw:1664
alice-desktop-1.onCanvasXYScrollClick
def onCanvasXYScrollClick(event)
Definition: alice-desktop-1.3.pyw:8824
alice-desktop-1.onCanvasSAPeak
def onCanvasSAPeak(event)
Definition: alice-desktop-1.3.pyw:16209
alice-desktop-1.CreateToolTip.text
text
Definition: alice-desktop-1.3.pyw:769
alice-desktop-1.BPeakholdmode
def BPeakholdmode()
Definition: alice-desktop-1.3.pyw:11669
alice-desktop-1.PhACheckBox
def PhACheckBox()
Definition: alice-desktop-1.3.pyw:2917
alice-desktop-1.onCanvasShowPcur
def onCanvasShowPcur(event)
Definition: alice-desktop-1.3.pyw:16232
alice-desktop-1.onCanvasBdTwo
def onCanvasBdTwo(event)
Definition: alice-desktop-1.3.pyw:16359
alice-desktop-1.onCanvasClickLeft
def onCanvasClickLeft(event)
Definition: alice-desktop-1.3.pyw:8448
alice-desktop-1.AWGAMakeBodeSine
def AWGAMakeBodeSine()
Definition: alice-desktop-1.3.pyw:9440
alice-desktop-1.BTrigger50p
def BTrigger50p()
Set Trigger level to 50% (mid) point of current waveform.
Definition: alice-desktop-1.3.pyw:2338
alice-desktop-1.BAWGAAmpl
def BAWGAAmpl(temp)
Definition: alice-desktop-1.3.pyw:9098
alice-desktop-1.onCanvasSAEight
def onCanvasSAEight(event)
Definition: alice-desktop-1.3.pyw:16191
alice-desktop-1.CreateToolTip.wraplength
wraplength
Definition: alice-desktop-1.3.pyw:767
alice-desktop-1.MakePhATrace
def MakePhATrace()
Definition: alice-desktop-1.3.pyw:14661
alice-desktop-1.AWGBMakeBodeSine
def AWGBMakeBodeSine()
Definition: alice-desktop-1.3.pyw:10799
messagebox
alice-desktop-1.MakeBodeTrace
def MakeBodeTrace()
Definition: alice-desktop-1.3.pyw:12840
alice-desktop-1.SetVAPoss
def SetVAPoss()
Definition: alice-desktop-1.3.pyw:2521
alice-desktop-1.onDigFiltBScroll
def onDigFiltBScroll(event)
Definition: alice-desktop-1.3.pyw:19418
alice-desktop-1.ApplyMathXString
def ApplyMathXString()
Apply X Math string from entry widget.
Definition: alice-desktop-1.3.pyw:2282
alice-desktop-1.UpdateAWGWin
def UpdateAWGWin()
Definition: alice-desktop-1.3.pyw:20756
alice-desktop-1.onCanvasBdZero
def onCanvasBdZero(event)
Definition: alice-desktop-1.3.pyw:16409
alice-desktop-1.AWGAReadFile
def AWGAReadFile()
Definition: alice-desktop-1.3.pyw:9287
alice-desktop-1.BSavePhAData
def BSavePhAData()
Definition: alice-desktop-1.3.pyw:15417
alice-desktop-1.DestroyIAScreen
def DestroyIAScreen()
Definition: alice-desktop-1.3.pyw:14063
alice-desktop-1.CreateToolTip.leave
def leave(self, event=None)
Action when mouse leaves.
Definition: alice-desktop-1.3.pyw:779
alice-desktop-1.DestroyBodeScreen
def DestroyBodeScreen()
Definition: alice-desktop-1.3.pyw:17496
alice-desktop-1.UpdatePotSlider
def UpdatePotSlider()
Definition: alice-desktop-1.3.pyw:18989
alice-desktop-1.onCanvasBdThree
def onCanvasBdThree(event)
Definition: alice-desktop-1.3.pyw:16366
alice-desktop-1.ReSetAGO
def ReSetAGO()
Definition: alice-desktop-1.3.pyw:20967
alice-desktop-1.onRetDigFiltA
def onRetDigFiltA(event)
Definition: alice-desktop-1.3.pyw:19390
alice-desktop-1.UpdateFreqAll
def UpdateFreqAll()
Definition: alice-desktop-1.3.pyw:12258
alice-desktop-1.AWGAMakeMath
def AWGAMakeMath()
Definition: alice-desktop-1.3.pyw:9410
alice-desktop-1.onCanvasUpArrow
def onCanvasUpArrow(event)
Move Vertical cursors up 1 or 5.
Definition: alice-desktop-1.3.pyw:8239
alice-desktop-1.UpdatePhATrace
def UpdatePhATrace()
Definition: alice-desktop-1.3.pyw:14652
alice-desktop-1.onStopfreqScroll
def onStopfreqScroll(event)
Definition: alice-desktop-1.3.pyw:19973
alice-desktop-1.DestroyMeasureScreen
def DestroyMeasureScreen()
Definition: alice-desktop-1.3.pyw:19678
alice-desktop-1.BShowCurvesNoneSA
def BShowCurvesNoneSA()
Definition: alice-desktop-1.3.pyw:11652
alice-desktop-1.onDigFiltAScroll
def onDigFiltAScroll(event)
Definition: alice-desktop-1.3.pyw:19393
alice-desktop-1.SetScaleMuxB
def SetScaleMuxB()
Definition: alice-desktop-1.3.pyw:2485
alice-desktop-1.XYcaresize
def XYcaresize(event)
Definition: alice-desktop-1.3.pyw:17778
alice-desktop-1.TimeCheckBox
def TimeCheckBox()
set check box colors
Definition: alice-desktop-1.3.pyw:2863
alice-desktop-1.BShowCurvesAll
def BShowCurvesAll()
Set to display all time waveforms.
Definition: alice-desktop-1.3.pyw:2312
alice-desktop-1.BDFiltBMath
def BDFiltBMath()
Definition: alice-desktop-1.3.pyw:19507
alice-desktop-1.BLoadDFiltA
def BLoadDFiltA()
Definition: alice-desktop-1.3.pyw:19446
alice-desktop-1.AWGBMakeImpulse
def AWGBMakeImpulse()
Definition: alice-desktop-1.3.pyw:11286
alice-desktop-1.DestroyMathScreen
def DestroyMathScreen()
Destroy New Math waveform controls menu window.
Definition: alice-desktop-1.3.pyw:2211
alice-desktop-1.CALCFFTwindowshape
def CALCFFTwindowshape()
Definition: alice-desktop-1.3.pyw:15913
alice-desktop-1.ReMakeAWGwaves
def ReMakeAWGwaves()
Re Make the current selected AWG waveform buffers.
Definition: alice-desktop-1.3.pyw:1537
alice-desktop-1.BDBdiv2BP
def BDBdiv2BP()
Definition: alice-desktop-1.3.pyw:12216
alice-desktop-1.BIOffsetA
def BIOffsetA(event)
Definition: alice-desktop-1.3.pyw:2827
alice-desktop-1.AWGAMakeRamp
def AWGAMakeRamp()
Definition: alice-desktop-1.3.pyw:9982
alice-desktop-1.BDBdiv2
def BDBdiv2()
Definition: alice-desktop-1.3.pyw:12034
alice-desktop-1.CheckMathXString
def CheckMathXString()
Check X Math String for syntac errors.
Definition: alice-desktop-1.3.pyw:2237
alice-desktop-1.BShowCurvesNoneBP
def BShowCurvesNoneBP()
Definition: alice-desktop-1.3.pyw:12234
alice-desktop-1.AWGAMakeSSQ
def AWGAMakeSSQ()
Definition: alice-desktop-1.3.pyw:9785
alice-desktop-1.MakeSampleRateMenu
def MakeSampleRateMenu()
Definition: alice-desktop-1.3.pyw:19858
alice-desktop-1.AWGBLoadWAV
def AWGBLoadWAV()
Definition: alice-desktop-1.3.pyw:10703
alice-desktop-1.SetXYIBPoss
def SetXYIBPoss()
Definition: alice-desktop-1.3.pyw:2563
alice-desktop-1.onCanvasEight
def onCanvasEight(event)
Definition: alice-desktop-1.3.pyw:8762
alice-desktop-1.Blevel3
def Blevel3()
Definition: alice-desktop-1.3.pyw:11964
alice-desktop-1.AWGAMakeFMSine
def AWGAMakeFMSine()
Definition: alice-desktop-1.3.pyw:9504
alice-desktop-1.onCanvasSeven
def onCanvasSeven(event)
Definition: alice-desktop-1.3.pyw:8757
alice-desktop-1.BSaveConfigBP
def BSaveConfigBP()
Save current configuration from Bode window.
Definition: alice-desktop-1.3.pyw:1410
alice-desktop-1.FindTriggerSample
def FindTriggerSample(TrgBuff)
Find the sample where trigger event happened.
Definition: alice-desktop-1.3.pyw:4868
alice-desktop-1.BAWGAPhase
def BAWGAPhase(temp)
Definition: alice-desktop-1.3.pyw:9219
alice-desktop-1.BSaveConfigIA
def BSaveConfigIA()
Save current configuration from IA window.
Definition: alice-desktop-1.3.pyw:1398
alice-desktop-1.MakeTimeTrace
def MakeTimeTrace()
Make the scope time traces.
Definition: alice-desktop-1.3.pyw:5284
alice-desktop-1.onCanvasThree
def onCanvasThree(event)
Definition: alice-desktop-1.3.pyw:8731
alice-desktop-1.BStartSA
def BStartSA()
Definition: alice-desktop-1.3.pyw:11876
alice-desktop-1.BUserCustomPlotText
def BUserCustomPlotText()
Ask user to enter custom plot label string.
Definition: alice-desktop-1.3.pyw:2045
alice-desktop-1.BStop
def BStop()
Stop (pause) scope tool.
Definition: alice-desktop-1.3.pyw:2698
alice-desktop-1.onCanvasBdSix
def onCanvasBdSix(event)
Definition: alice-desktop-1.3.pyw:16387
alice-desktop-1.BSendMG
def BSendMG()
Send serial data to DDS board.
Definition: alice-desktop-1.3.pyw:18649
alice-desktop-1.BSaveChannelData
def BSaveChannelData()
Save selected scope time array data to file.
Definition: alice-desktop-1.3.pyw:1809
alice-desktop-1.onCanvasSAFive
def onCanvasSAFive(event)
Definition: alice-desktop-1.3.pyw:16170
alice-desktop-1.UpdateIATrace
def UpdateIATrace()
Definition: alice-desktop-1.3.pyw:13417
alice-desktop-1.VABtoggle
def VABtoggle()
Definition: alice-desktop-1.3.pyw:14418
alice-desktop-1.CreateToolTip.showtip
def showtip(self, event=None)
Display Tip Text.
Definition: alice-desktop-1.3.pyw:793
alice-desktop-1.onCanvasSix
def onCanvasSix(event)
Definition: alice-desktop-1.3.pyw:8752
alice-desktop-1.DestroyMinigenScreen
def DestroyMinigenScreen()
Destroy DDS board sacrren.
Definition: alice-desktop-1.3.pyw:18761
alice-desktop-1.UpdateNqPTrace
def UpdateNqPTrace()
Definition: alice-desktop-1.3.pyw:14380
alice-desktop-1.onCanvasShowFcur
def onCanvasShowFcur(event)
Definition: alice-desktop-1.3.pyw:16218
alice-desktop-1.UpdateMeasureScreen
def UpdateMeasureScreen()
Definition: alice-desktop-1.3.pyw:19578
alice-desktop-1.onCanvasShowVcur
def onCanvasShowVcur(event)
Definition: alice-desktop-1.3.pyw:8807
alice-desktop-1.SetAD9833
def SetAD9833(temp)
Definition: alice-desktop-1.3.pyw:18619
alice-desktop-1.BSaveScreenSA
def BSaveScreenSA()
Definition: alice-desktop-1.3.pyw:11625
alice-desktop-1.MakeDigPotWindow
def MakeDigPotWindow()
set up controls for single, dual or quad, digital pots
Definition: alice-desktop-1.3.pyw:19006
alice-desktop-1.onCanvasShowTcur
def onCanvasShowTcur(event)
Definition: alice-desktop-1.3.pyw:8799
alice-desktop-1.AWGBMakeUUNoise
def AWGBMakeUUNoise()
Definition: alice-desktop-1.3.pyw:11339
alice-desktop-1.Analog_Time_In
def Analog_Time_In()
Scope time main loop Read the analog data and store the data into the arrays.
Definition: alice-desktop-1.3.pyw:3206
alice-desktop-1.AWGBConfigMath
def AWGBConfigMath()
Definition: alice-desktop-1.3.pyw:10753
alice-desktop-1.Wrap
def Wrap(InArray, WrFactor)
Definition: alice-desktop-1.3.pyw:9031
alice-desktop-1.onCanvasRightArrow
def onCanvasRightArrow(event)
Move Time curcors right 1 or 5.
Definition: alice-desktop-1.3.pyw:8365
alice-desktop-1.onCanvasFour
def onCanvasFour(event)
Definition: alice-desktop-1.3.pyw:8739
alice-desktop-1.onCanvasSAReset
def onCanvasSAReset(event)
Definition: alice-desktop-1.3.pyw:16212
alice-desktop-1.BSTOREtraceSA
def BSTOREtraceSA()
Definition: alice-desktop-1.3.pyw:11695
alice-desktop-1.XYCheckBox
def XYCheckBox()
Definition: alice-desktop-1.3.pyw:2870
alice-desktop-1.Digital_RC_Low_Pass
def Digital_RC_Low_Pass(InBuff, TC1, Gain)
Digital filter function for input divider frequency compensation TC1 is in micro seconds.
Definition: alice-desktop-1.3.pyw:4315
alice-desktop-1.BLoadDFiltB
def BLoadDFiltB()
Definition: alice-desktop-1.3.pyw:19484
alice-desktop-1.UpdateBodeTrace
def UpdateBodeTrace()
Definition: alice-desktop-1.3.pyw:12249
alice-desktop-1.DestroyDigPotScreen
def DestroyDigPotScreen()
Definition: alice-desktop-1.3.pyw:19057
alice-desktop-1.BNormalmode
def BNormalmode()
Definition: alice-desktop-1.3.pyw:11659
alice-desktop-1.onCanvasTfalling
def onCanvasTfalling(event)
Definition: alice-desktop-1.3.pyw:8782
alice-desktop-1.UpdateAWGA
def UpdateAWGA()
Definition: alice-desktop-1.3.pyw:10276
alice-desktop-1.NiCCaresize
def NiCCaresize(event)
Definition: alice-desktop-1.3.pyw:14236
ttk
alice-desktop-1.MakeSettingsMenu
def MakeSettingsMenu()
Definition: alice-desktop-1.3.pyw:20452
alice-desktop-1.BSnapShot
def BSnapShot()
Take snap shot of displayed time waveforms.
Definition: alice-desktop-1.3.pyw:1889
alice-desktop-1.AWGALoadCSV
def AWGALoadCSV()
Definition: alice-desktop-1.3.pyw:9295
alice-desktop-1.SPIShiftOut
def SPIShiftOut(DValue)
========== MiniGen routines ========== SPI shift output routine
Definition: alice-desktop-1.3.pyw:18597
alice-desktop-1.CreateToolTip
Tool Tip Ballon help stuff.
Definition: alice-desktop-1.3.pyw:763
alice-desktop-1.onCanvasSANormal
def onCanvasSANormal(event)
Definition: alice-desktop-1.3.pyw:16206
alice-desktop-1.UpdateNqPScreen
def UpdateNqPScreen()
Definition: alice-desktop-1.3.pyw:14385
alice-desktop-1.DestroyCommandScreen
def DestroyCommandScreen()
Definition: alice-desktop-1.3.pyw:19548
alice-desktop-1.OhmCheckBox
def OhmCheckBox()
Definition: alice-desktop-1.3.pyw:2930
alice-desktop-1.BAWGAModeLabel
def BAWGAModeLabel()
Definition: alice-desktop-1.3.pyw:10254
alice-desktop-1.AWGAConfigMath
def AWGAConfigMath()
Definition: alice-desktop-1.3.pyw:9428
alice-desktop-1.onCanvasClickScroll
def onCanvasClickScroll(event)
Shift Time or vertical cursors if on or shift gated measurement cursors if enabled.
Definition: alice-desktop-1.3.pyw:8194
alice-desktop-1.onFminScroll
def onFminScroll(event)
Definition: alice-desktop-1.3.pyw:20332
alice-desktop-1.onSrateScroll
def onSrateScroll(event)
Definition: alice-desktop-1.3.pyw:19926
alice-desktop-1.CheckMathYString
def CheckMathYString()
Check Y Math String for syntac errors.
Definition: alice-desktop-1.3.pyw:2256
alice-desktop-1.BLoadConfigBP
def BLoadConfigBP()
Load confirfuration from Bode window button.
Definition: alice-desktop-1.3.pyw:1676
alice-desktop-1.SetDualMuxMode
def SetDualMuxMode()
Definition: alice-desktop-1.3.pyw:17073
alice-desktop-1.MakeBoardScreen
def MakeBoardScreen()
Definition: alice-desktop-1.3.pyw:19684
alice-desktop-1.SetMuxDPoss
def SetMuxDPoss()
Definition: alice-desktop-1.3.pyw:2467
alice-desktop-1.onTextScroll
def onTextScroll(event)
Definition: alice-desktop-1.3.pyw:16453
alice-desktop-1.AWGAWriteFile
def AWGAWriteFile()
Definition: alice-desktop-1.3.pyw:9404
alice-desktop-1.Blevel3BP
def Blevel3BP()
Definition: alice-desktop-1.3.pyw:12188
alice-desktop-1.SetADC_Mux
def SetADC_Mux()
Definition: alice-desktop-1.3.pyw:20013
alice-desktop-1.CreateToolTip.schedule
def schedule(self)
Sehedule Action.
Definition: alice-desktop-1.3.pyw:783
alice-desktop-1.AWGBNumCycles
def AWGBNumCycles()
Definition: alice-desktop-1.3.pyw:10435
alice-desktop-1.IBtoggle
def IBtoggle()
Definition: alice-desktop-1.3.pyw:14442
alice-desktop-1.MakeBodeScreen
def MakeBodeScreen()
Definition: alice-desktop-1.3.pyw:13085
alice-desktop-1.UpdateXYAll
def UpdateXYAll()
Update Data, trace and XY screen.
Definition: alice-desktop-1.3.pyw:5269
alice-desktop-1.FreqCheckBox
def FreqCheckBox()
Definition: alice-desktop-1.3.pyw:2877
alice-desktop-1.DestroyXYScreen
def DestroyXYScreen()
Definition: alice-desktop-1.3.pyw:18026
alice-desktop-1.BSaveConfig
def BSaveConfig(filename)
Save current configureation to file.
Definition: alice-desktop-1.3.pyw:821
alice-desktop-1.UpdateFreqScreen
def UpdateFreqScreen()
Definition: alice-desktop-1.3.pyw:12273
alice-desktop-1.AWGBMakeSSQ
def AWGBMakeSSQ()
Definition: alice-desktop-1.3.pyw:10964
alice-desktop-1.FreqCaresize
def FreqCaresize(event)
Definition: alice-desktop-1.3.pyw:17506
alice-desktop-1.BSaveConfigSA
def BSaveConfigSA()
Save current configuration from SA window.
Definition: alice-desktop-1.3.pyw:1404
alice-desktop-1.AWGBReadFile
def AWGBReadFile()
Definition: alice-desktop-1.3.pyw:10640
alice-desktop-1.UpdateTimeScreen
def UpdateTimeScreen()
Update time screen with trace and text.
Definition: alice-desktop-1.3.pyw:5264
alice-desktop-1.UpdateIAAll
def UpdateIAAll()
Definition: alice-desktop-1.3.pyw:13407
alice-desktop-1.UpdateIAScreen
def UpdateIAScreen()
Definition: alice-desktop-1.3.pyw:13421
alice-desktop-1.DestroyAWGScreen
def DestroyAWGScreen()
Definition: alice-desktop-1.3.pyw:16925
alice-desktop-1.NewEnterMathControls
def NewEnterMathControls()
Make New Math waveform controls menu window.
Definition: alice-desktop-1.3.pyw:2056
alice-desktop-1.MakeIAScreen
def MakeIAScreen()
Draw the impedance Analyzer screen.
Definition: alice-desktop-1.3.pyw:13593
alice-desktop-1.SetIAPoss
def SetIAPoss()
Definition: alice-desktop-1.3.pyw:2533
alice-desktop-1.MakeXYTrace
def MakeXYTrace()
Make the XY plot traces.
Definition: alice-desktop-1.3.pyw:6318
alice-desktop-1.onCanvasXYLeftClick
def onCanvasXYLeftClick(event)
Definition: alice-desktop-1.3.pyw:8846
alice-desktop-1.CreateToolTip.hidetip
def hidetip(self)
Hide Tip Action.
Definition: alice-desktop-1.3.pyw:809
alice-desktop-1.BExecuteFromString
def BExecuteFromString()
Definition: alice-desktop-1.3.pyw:19558
alice-desktop-1.onCanvasBdEight
def onCanvasBdEight(event)
Definition: alice-desktop-1.3.pyw:16401
alice-desktop-1.BShowCurvesAllSA
def BShowCurvesAllSA()
Definition: alice-desktop-1.3.pyw:11645
alice-desktop-1.Analog_Fast_time
def Analog_Fast_time()
routine for time scales faster than 500 mSec/Div
Definition: alice-desktop-1.3.pyw:3659
alice-desktop-1.onMiniGenScroll
def onMiniGenScroll(event)
Definition: alice-desktop-1.3.pyw:18767
alice-desktop-1.onCanvasShowBPcur
def onCanvasShowBPcur(event)
Definition: alice-desktop-1.3.pyw:16416
alice-desktop-1.PhACaresize
def PhACaresize(event)
Definition: alice-desktop-1.3.pyw:14638
alice-desktop-1.UpdatePhAAll
def UpdatePhAAll()
Definition: alice-desktop-1.3.pyw:14647
alice-desktop-1.BuildBoxCarB
def BuildBoxCarB()
Definition: alice-desktop-1.3.pyw:19422
alice-desktop-1.sel3
def sel3(temp)
Definition: alice-desktop-1.3.pyw:5199
alice-desktop-1.UpdatePhAScreen
def UpdatePhAScreen()
Definition: alice-desktop-1.3.pyw:14656