Skip to content

Commit 0844913

Browse files
committed
First attempt fixing Visa scope interface. Still WIP.
1 parent a238b1d commit 0844913

4 files changed

Lines changed: 186 additions & 14 deletions

File tree

‎software/chipwhisperer/capture/scopes/visascope_interface/_base.py‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ class VisaScope(Parameterized):
3535

3636
yScales = {"10 V":10, "5 V":5, "2 V":2, "500 mV":500E-3, "250 mV":250E-3, "100 mV":100E-3, "50 mV":50E-3}
3737

38-
header = ":SYSTem:HEADer OFF\n"
38+
header = [":SYSTem:HEADer OFF\n"]
3939

4040
def __init__(self):
4141
self.visaInst = None
42+
self.rm = None
4243
self.dataUpdated = util.Signal()
4344

4445
self.getParams().addChildren([
@@ -51,9 +52,14 @@ def __init__(self):
5152
])
5253

5354
def con(self, constr):
54-
self.visaInst = instrument(constr)
55+
if not self.rm:
56+
try:
57+
self.rm = ResourceManager()
58+
except OSError:
59+
self.rm = ResourceManager('@py')
60+
self.visaInst = self.rm.get_instrument(constr)
5561
self.visaInst.write("*RST")
56-
logging.info(self.visaInst.ask("*IDN?"))
62+
logging.info(self.visaInst.query("*IDN?"))
5763
for cmd in self.header:
5864
self.visaInst.write(cmd)
5965
logging.info('VISA: %s' % cmd)
@@ -76,6 +82,14 @@ def arm(self):
7682
"""Example arm implementation works on most"""
7783
self.visaInst.write(":DIGitize")
7884

85+
def dis(self):
86+
if self.visaInst:
87+
self.visaInst.close()
88+
self.visaInst = None
89+
if self.rm:
90+
self.rm.close()
91+
self.rm = None
92+
7993
def capture(self):
8094
"""You MUST implement this"""
8195
self.dataUpdated.emit(self.datapoints, 0)

‎software/chipwhisperer/capture/scopes/visascope_interface/dso1024A.py‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,26 @@ class VisaScopeInterface_DSO1024A(VisaScope):
5454

5555
def currentSettings(self):
5656
# TODO: Delete these?
57-
self.XScale = self.visaInst.ask_for_values(":TIMebase:SCALe?")
57+
self.XScale = self.visaInst.query_values(":TIMebase:SCALe?")
5858
self.XScale = self.XScale[0]
59-
self.XOffset = self.visaInst.ask_for_values(":TIMebase:POSition?")
59+
self.XOffset = self.visaInst.query_values(":TIMebase:POSition?")
6060
self.XOffset = self.XOffset[0]
61-
self.YOffset = self.visaInst.ask_for_values(":CHANnel1:OFFSet?")
61+
self.YOffset = self.visaInst.query_values(":CHANnel1:OFFSet?")
6262
self.YOffset = self.YOffset[0]
63-
self.YScale = self.visaInst.ask_for_values(":CHANnel1:SCALe?")
63+
self.YScale = self.visaInst.query_values(":CHANnel1:SCALe?")
6464
self.YScale = self.YScale[0]
6565

6666
def arm(self):
6767
self.visaInst.write(":RUN\n")
6868
result = "fake"
6969
while (result.startswith("WAIT") == False) and (result.startswith("RUN") == False):
70-
result = self.visaInst.ask(":TRIGger:STATus?")
70+
result = self.visaInst.query(":TRIGger:STATus?")
7171
time.sleep(0.1)
7272
logging.info('1Waiting...')
7373

7474
def capture(self):
7575
# Wait?
76-
while self.visaInst.ask("*OPC?\n") != "1":
76+
while self.visaInst.query("*OPC?\n") != "1":
7777
time.sleep(0.1)
7878
util.updateUI()
7979
logging.info('2Waiting...')

‎software/chipwhisperer/capture/scopes/visascope_interface/mso54831D.py‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def currentSettings(self):
5555
self.visaInst.write(":TRIG:SWE AUTO")
5656
self.visaInst.write(":RUN")
5757
time.sleep(0.5)
58-
test = self.visaInst.ask_for_values(":WAVeform:PREamble?")
58+
test = self.visaInst.query_values(":WAVeform:PREamble?")
5959
self.visaInst.write(":TRIG:SWE TRIG")
6060

6161
if test[4] != 0.0:
@@ -72,13 +72,13 @@ def currentSettings(self):
7272
else:
7373
self.XDisplayedRange = spoints
7474

75-
self.XScale = self.visaInst.ask_for_values(":TIMebase:SCALe?")
75+
self.XScale = self.visaInst.query_values(":TIMebase:SCALe?")
7676
self.XScale = self.XScale[0]
77-
self.XOffset = self.visaInst.ask_for_values(":TIMebase:POSition?")
77+
self.XOffset = self.visaInst.query_values(":TIMebase:POSition?")
7878
self.XOffset = self.XOffset[0]
79-
self.YOffset = self.visaInst.ask_for_values(":CHANnel1:OFFSet?")
79+
self.YOffset = self.visaInst.query_values(":CHANnel1:OFFSet?")
8080
self.YOffset = self.YOffset[0]
81-
self.YScale = self.visaInst.ask_for_values(":CHANnel1:SCALe?")
81+
self.YScale = self.visaInst.query_values(":CHANnel1:SCALe?")
8282
self.YScale = self.YScale[0]
8383

8484
def arm(self):
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# Authors: Jean-Michel Picod
2+
#
3+
# Find this and more at newae.com - this file is part of the chipwhisperer
4+
# project, http://www.assembla.com/spaces/chipwhisperer
5+
#
6+
# This file is part of chipwhisperer.
7+
#
8+
# chipwhisperer is free software: you can redistribute it and/or modify
9+
# it under the terms of the GNU General Public License as published by
10+
# the Free Software Foundation, either version 3 of the License, or
11+
# (at your option) any later version.
12+
#
13+
# chipwhisperer is distributed in the hope that it will be useful,
14+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16+
# GNU Lesser General Public License for more details.
17+
#
18+
# You should have received a copy of the GNU General Public License
19+
# along with chipwhisperer. If not, see <http://www.gnu.org/licenses/>.
20+
#=================================================
21+
import logging
22+
import time
23+
from _base import VisaScope
24+
from chipwhisperer.common.utils import util
25+
from chipwhisperer.common.utils.parameter import setupSetParam, Parameterized
26+
from chipwhisperer.common.utils.pluginmanager import Plugin
27+
28+
29+
class VisaScopeInterface_RigolDS4054(VisaScope, Parameterized, Plugin):
30+
_name = "Rigol DS 4054"
31+
32+
# TODO: What scales & ranges are allowed on the DS4054?
33+
xScales = {"500 mS":500E-3, "200 mS":200E-3, "100 mS":100E-3, "50 mS":50E-3,
34+
"20 mS":20E-3, "10 mS":10E-3, "5 mS":5E-3, "2 mS":2E-3, "1 mS":1E-3,
35+
"500 uS":500E-6, "200 uS":200E-6, "100 uS":100E-6, "50 uS":50E-6,
36+
"20 uS":20E-6, "10 uS":10E-6, "5 uS":5E-6, "2uS":2E-6, "1 uS":1E-6}
37+
38+
yScales = {"10 V":10, "5 V":5, "2 V":2, "500 mV":500E-3, "200 mV":200E-3, "100 mV":100E-3,
39+
"50 mV":50E-3, "20 mV":20E-3, "10 mV":10E-3, "5 mV":5E-3}
40+
41+
probeAttenuations = {'0.01':0.01, '0.02':0.02, '0.05':0.05, '0.1':0.1, '0.2':0.2, '0.5':0.5,
42+
'1':1, '2':2, '5':5, '10':10, '20':20, '50':50, '100':100, '200':200,
43+
'500':500, '1000':1000}
44+
45+
triggerModes = {'Edge':'EDGE', 'Pulse':'PULS', 'Runt':'RUNT', 'Num. Edges':'NEDG', 'Slope':'SLOP',
46+
'Video':'VID', 'Pattern':'PATT', 'RS-232':'RS232', 'I2C':'IIC', 'SPI':'SPI',
47+
'CAN':'CAN', 'Flexray':'FLEX', 'USB':'USB'}
48+
49+
triggerSources = {'CHAN1':'CHAN1', 'CHAN2':'CHAN2', 'CHAN3':'CHAN3', 'CHAN4':'CHAN4',
50+
'EXT':'EXT', 'EXT5':'EXT5', 'ACL':'ACL'}
51+
52+
header = [ ":CHANnel1:PROBe 1",
53+
":CHANnel1:DISPlay ON",
54+
":CHANnel1:COUPling DC",
55+
":CHANnel2:PROBe 1",
56+
":CHANnel2:SCALe 1",
57+
":CHANnel2:OFFSet 0",
58+
":CHANnel2:DISPLay ON",
59+
":TRIGger:COUPling DC",
60+
":TRIGger:MODE EDGE",
61+
":TRIGger:EDGE:SOURce CHANnel2",
62+
":TRIGger:EDGE:SLOPe NEGative",
63+
":TRIGger:EDGE:LEVel 2.0",
64+
":TRIGger:NREJect ON",
65+
":TRIGger:SWEep NORMal",
66+
":WAVeform:SOURce CHANnel1",
67+
":WAVeform:FORMat WORD",
68+
":WAVeform:MODE NORMal",
69+
]
70+
71+
72+
def __init__(self):
73+
VisaScope.__init__(self)
74+
channels = {}
75+
for i in range(1, 5):
76+
channels['CHAN{}'.format(i)] = i
77+
self.getParams().addChildren([
78+
{'name':'Trace Measurement', 'key': 'trace', 'type':'group', 'children':[
79+
{'name':'Source', 'key':'tracesource', 'type':'list', 'values':channels, 'value':1, 'action':self.updateCurrentSettings},
80+
{'name':'Probe Att.', 'key':'traceprobe', 'type':'list', 'values':self.probeAttenuations, 'value':1, 'action':self.updateCurrentSettings},
81+
{'name':'Coupling', 'key':'tracecouple', 'type':'list', 'values':{'AC':'AC', 'DC':'DC', 'GND':'GND'}, 'value':'DC', 'action':self.updateCurrentSettings},
82+
{'name':'BW Limit.', 'key':'tracebandwidth', 'type':'list', 'values':{'20M':'20M', '100M':'100M', 'OFF':'OFF'}, 'value':'OFF', 'action':self.updateCurrentSettings},
83+
{'name':'Impedance', 'key':'traceimpedance', 'type':'list', 'values':{'1M':'OMEG', '50R':'FIFTy'}, 'value':'1M', 'action':self.updateCurrentSettings},
84+
]},
85+
{'name':'Trigger', 'key':'trig', 'type':'group', 'children':[
86+
{'name':'Source', 'key':'trigsource', 'type':'list', 'values':channels, 'value':2, 'action':self.updateCurrentSettings},
87+
{'name':'Probe Att.', 'key':'trigprobe', 'type':'list', 'values':self.probeAttenuations, 'value':1, 'action':self.updateCurrentSettings},
88+
{'name':'Coupling', 'key':'trigcouple', 'type':'list', 'values':{'AC':'AC', 'DC':'DC', 'GND':'GND'}, 'value':'DC', 'action':self.updateCurrentSettings},
89+
{'name':'BW Limit.', 'key':'trigbandwidth', 'type':'list', 'values':{'20M':'20M', '100M':'100M', 'OFF':'OFF'}, 'value':'OFF', 'action':self.updateCurrentSettings},
90+
{'name':'Impedance', 'key':'trigimpedance', 'type':'list', 'values':{'1M':'OMEG', '50R':'FIFTy'}, 'value':'1M', 'action':self.updateCurrentSettings},
91+
]},
92+
{'name':'Acquisition', 'key':'acquisition', 'type':'list', 'values':{'Normal':'NORM', 'High-Res':'HRES'}, 'value':'Normal', 'action':self.updateCurrentSettings},
93+
])
94+
95+
def currentSettings(self):
96+
# TODO: Delete these?
97+
self.XScale = self.visaInst.query_values(":TIMebase:SCALe?")
98+
self.XScale = self.XScale[0]
99+
self.XOffset = self.visaInst.query_values(":TIMebase:POSition?")
100+
self.XOffset = self.XOffset[0]
101+
self.YOffset = self.visaInst.query_values(":CHANnel1:OFFSet?")
102+
self.YOffset = self.YOffset[0]
103+
self.YScale = self.visaInst.query_values(":CHANnel1:SCALe?")
104+
self.YScale = self.YScale[0]
105+
106+
def arm(self):
107+
self.visaInst.write(":RUN\n")
108+
result = "fake"
109+
while (result.startswith("WAIT") == False) and (result.startswith("RUN") == False):
110+
result = self.visaInst.query(":TRIGger:STATus?")
111+
time.sleep(0.1)
112+
logging.info('1Waiting...')
113+
114+
def capture(self):
115+
# Wait?
116+
while self.visaInst.query("*OPC?\n") != "1":
117+
time.sleep(0.1)
118+
util.updateUI()
119+
logging.info('2Waiting...')
120+
121+
# print command
122+
self.visaInst.write(":WAVeform:DATA?")
123+
data = self.visaInst.read_raw()
124+
125+
# Find '#' which is start of frame
126+
start = data.find('#')
127+
128+
if start < 0:
129+
raise IOError('Error in header')
130+
131+
start += 1
132+
hdrlen = data[start]
133+
hdrlen = int(hdrlen)
134+
135+
# print hdrlen
136+
137+
start += 1
138+
datalen = data[start:(start + hdrlen)]
139+
datalen = int(datalen)
140+
# print datalen
141+
142+
start += hdrlen
143+
144+
# Each is two bytes
145+
wavdata = bytearray(data[start:(start + datalen)])
146+
147+
self.datapoints = []
148+
149+
for j in range(0, datalen, 2):
150+
data = wavdata[j] | (wavdata[j + 1] << 8)
151+
152+
if (data & 0x8000):
153+
data += -65536
154+
155+
self.datapoints.append(data)
156+
157+
self.dataUpdated.emit(0, self.datapoints, 0, 0)
158+
return False

0 commit comments

Comments
 (0)