Skip to content

Commit e96a71e

Browse files
authored
Merge pull request #26 from lightwave-lab/dev-thomas
Driver improvements and behavior changes
2 parents 970c5e0 + b4199bb commit e96a71e

File tree

8 files changed

+296
-44
lines changed

8 files changed

+296
-44
lines changed

lightlab/equipment/lab_instruments/Anritsu_MP1763B_PPG.py

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from . import VISAInstrumentDriver
22
from lightlab.equipment.abstract_drivers import Configurable
33
from lightlab.laboratory.instruments import PulsePatternGenerator
4+
from lightlab.util.data.one_dim import prbs_pattern
45
import warnings
56
import numpy as np
67
import matplotlib.pyplot as plt
@@ -210,7 +211,7 @@ def circ_time(T, pattern):
210211

211212
@classmethod
212213
def PRBS_pattern(cls, order, mark_ratio=0.5):
213-
# Documentation present in poage 5-1 of the manual.
214+
# Documentation present in page 5-1 of the manual.
214215
if mark_ratio != 0.5:
215216
raise NotImplementedError("Only mark ratio of 1/2 is implemented so far.")
216217

@@ -240,21 +241,4 @@ def PRBS_pattern(cls, order, mark_ratio=0.5):
240241
else:
241242
raise NotImplementedError("PRBS{} not implemented.".format(order))
242243

243-
def prbs_generator(characteristic, state):
244-
def compute_parity(n):
245-
parity = False
246-
while n > 0:
247-
parity ^= (n & 1)
248-
n >>= 1
249-
250-
return parity # odd means True
251-
252-
while True:
253-
result = state & 1
254-
state += (compute_parity(state & characteristic) << order)
255-
state >>= 1
256-
yield result
257-
258-
from itertools import islice
259-
prbs_pattern = list(islice(iter(prbs_generator(polynomial, seed)), 2 ** order - 1))
260-
return np.array(prbs_pattern, dtype=np.bool)
244+
return prbs_pattern(polynomial, seed)

lightlab/equipment/lab_instruments/Apex_AP2440A_OSA.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,14 @@ def transferData(self):
190190

191191
dataLen = int(powerData[0])
192192
powerData = np.array(powerData[1:])
193-
wavelengthData = np.linspace(self.wlRange[1], self.wlRange[0], dataLen)
193+
retStr = self._query('SPDATAWL0')
194+
wavelengthData = pyvisa.util.from_ascii_block(retStr,
195+
converter='f',
196+
separator=' ',
197+
container=list)
198+
assert dataLen == wavelengthData[0]
199+
wavelengthData = np.array(wavelengthData[1:])
200+
# wavelengthData = np.linspace(self.wlRange[1], self.wlRange[0], dataLen)
194201

195202
return wavelengthData[::-1], powerData[::-1]
196203

@@ -205,7 +212,7 @@ def spectrum(self, average_count=1):
205212
self.triggerAcquire()
206213
nm, dbm = self.transferData()
207214

208-
if i is 0:
215+
if i == 0:
209216
dbmAvg = dbm / average_count
210217
else:
211218
dbmAvg = dbmAvg + dbm / average_count

lightlab/equipment/lab_instruments/Keithley_2606B_SMU.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,10 @@ def tsp_startup(self, restart=False):
222222

223223
def smu_defaults(self):
224224
self.write("{smuX}.source.offfunc = 0".format(smuX=self.smu_full_string)) # 0 or smuX.OUTPUT_DCAMPS: Source 0 A
225-
self.write("{smuX}.source.offmode = 2".format(smuX=self.smu_full_string)) # 2 or smuX.OUTPUT_HIGH_Z: Opens the output relay when the output is turned of
226-
self.write("{smuX}.sense = 0".format(smuX=self.smu_full_string)) # 0 or smuX.SENSE_LOCAL: Selects local sense (2-wire)
225+
self.write("{smuX}.source.offmode = 0".format(smuX=self.smu_full_string)) # 0 or smuX.OUTPUT_NORMAL: Configures the source function according to smuX.source.offfunc attribute
227226
self.write("{smuX}.source.highc = 1".format(smuX=self.smu_full_string)) # 1 or smuX.ENABLE: Enables high-capacitance mode
227+
# self.write("{smuX}.sense = 0".format(smuX=self.smu_full_string)) # 0 or smuX.SENSE_LOCAL: Selects local sense (2-wire)
228+
self.set_sense_mode(sense_mode="local")
228229

229230
def startup(self):
230231
self.tsp_startup()
@@ -234,6 +235,17 @@ def startup(self):
234235
time.sleep(0.01)
235236
self.query_print('"startup complete."', expected_talker="startup complete.")
236237

238+
def set_sense_mode(self, sense_mode="local"):
239+
''' Set sense mode. Defaults to local sensing. '''
240+
if sense_mode == "remote":
241+
sense_mode = 1 # 1 or smuX.SENSE_REMOTE: Selects remote sense (4-wire)
242+
elif sense_mode == "local":
243+
sense_mode = 0 # 0 or smuX.SENSE_LOCAL: Selects local sense (2-wire)
244+
else:
245+
sense_mode = 0 # 0 or smuX.SENSE_LOCAL: Selects local sense (2-wire)
246+
247+
self.write("{smuX}.sense = {sense_mode}".format(smuX=self.smu_full_string, sense_mode=sense_mode))
248+
237249
# SourceMeter Essential methods
238250

239251
def _configCurrent(self, currAmps):
Binary file not shown.

lightlab/laboratory/instruments/bases.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ class MockInstrument(Instrument):
676676

677677
def __getattr__(self, attrName):
678678
def noop(*args, **kwargs):
679-
raise RuntimeError("Attempted to call a method of a mock Instrument.")
679+
raise AttributeError("Attempted to call method ('{}') of a mock Instrument.".format(attrName))
680680
return noop
681681

682682

0 commit comments

Comments
 (0)