diff options
Diffstat (limited to 'qolab/hardware')
-rw-r--r-- | qolab/hardware/scope/__init__.py | 93 |
1 files changed, 62 insertions, 31 deletions
diff --git a/qolab/hardware/scope/__init__.py b/qolab/hardware/scope/__init__.py index 80e9cb2..e7fb7eb 100644 --- a/qolab/hardware/scope/__init__.py +++ b/qolab/hardware/scope/__init__.py @@ -6,7 +6,7 @@ Created by Eugeniy E. Mikhailov 2021/11/29 from qolab.hardware.scpi import SCPIinstr from qolab.hardware.basic import BasicInstrument from qolab.data.trace import TraceSetSameX -import yaml + class Scope(BasicInstrument): """Minimal class to implement a scope. @@ -15,67 +15,97 @@ class Scope(BasicInstrument): Provide a minimal set of methods to be implemented by a scope. """ + def __init__(self, *args, **kwds): BasicInstrument.__init__(self, *args, **kwds) - self.config['Device type']='Scope' - self.config['Device model'] = 'Generic Scope Without Hardware interface' - self.config['FnamePrefix'] = 'scope' + self.config["Device type"] = "Scope" + self.config["Device model"] = "Generic Scope Without Hardware interface" + self.config["FnamePrefix"] = "scope" self.numberOfChannels = 0 # deviceProperties must have 'get' and preferably 'set' methods available, # i.e. 'SampleRate' needs getSampleRate() and love to have setSampleRate(value) # they will be used to obtain config and set device according to it - self.deviceProperties.update({'SampleRate', 'TimePerDiv', 'TrigDelay', 'TriggerMode', 'Roll', 'Run' }) - # same is applied to channelProperties but we need setter/getter with channel number - # i.e. VoltsPerDiv -> getChanVoltsPerDiv(chNum) and setSampleRate(chNum, value) - self.channelProperties = {'VoltsPerDiv', 'VoltageOffset', } - - def getTrace(self, chNum, availableNpnts=None, maxRequiredPoints=None, decimate=True): - # Should work with minimal arguments list + self.deviceProperties.update( + {"SampleRate", "TimePerDiv", "TrigDelay", "TriggerMode", "Roll", "Run"} + ) + # same is applied to channelProperties + # but we need setter/getter with channel number + # i.e. VoltsPerDiv must provide + # getChanVoltsPerDiv(chNum) and setSampleRate(chNum, value) + self.channelProperties = { + "VoltsPerDiv", + "VoltageOffset", + } + + def getTrace( + self, chNum, availableNpnts=None, maxRequiredPoints=None, decimate=True + ): + # Should work with minimal arguments list # but might be faster if parameters provided: less IO requests # old_trg_mode = self.getTriggerMode() # self.setTriggerMode('STOP'); # to get synchronous channels - raise NotImplementedError( 'getTrace function is not implemented' ) + raise NotImplementedError("getTrace function is not implemented") # if old_trg_mode != "STOP": - # short speed up here with this check - # self.setTriggerMode(old_trg_mode) + # short speed up here with this check + # self.setTriggerMode(old_trg_mode) def getTriggerMode(self): # we expect NORM, AUTO, SINGLE, STOP - raise NotImplementedError( 'getTriggerMode function is not implemented' ) + raise NotImplementedError("getTriggerMode function is not implemented") def setTriggerMode(self, mode): # we expect NORM, AUTO, SINGLE, STOP - raise NotImplementedError( 'setTriggerMode function is not implemented' ) + raise NotImplementedError("setTriggerMode function is not implemented") def getAllTraces(self, availableNpnts=None, maxRequiredPoints=None, decimate=True): - allTraces=TraceSetSameX('scope traces') - allTraces.config['tags']['DAQ']=self.getConfig() + allTraces = TraceSetSameX("scope traces") + allTraces.config["tags"]["DAQ"] = self.getConfig() old_trg_mode = self.getTriggerMode() - self.setTriggerMode('STOP'); # to get synchronous channels - for chNum in range(1, self.numberOfChannels+1): - allTraces.addTrace( self.getTrace(chNum, availableNpnts=availableNpnts, maxRequiredPoints=maxRequiredPoints, decimate=decimate) ) + self.setTriggerMode("STOP") + # to get synchronous channels + for chNum in range(1, self.numberOfChannels + 1): + allTraces.addTrace( + self.getTrace( + chNum, + availableNpnts=availableNpnts, + maxRequiredPoints=maxRequiredPoints, + decimate=decimate, + ) + ) # restore scope to the before acquisition mode if old_trg_mode != "STOP": # short speed up here with this check self.setTriggerMode(old_trg_mode) - return( allTraces ) + return allTraces def plot(self, **kwargs): - allTraces=self.getAllTraces(**kwargs) + allTraces = self.getAllTraces(**kwargs) allTraces.plot() - def save(self, fname=None, item_format='e', availableNpnts=None, maxRequiredPoints=None, decimate=True, extension='dat'): - allTraces = self.getAllTraces(availableNpnts=availableNpnts, maxRequiredPoints=maxRequiredPoints, decimate=decimate) - allTraces.config['item_format']=item_format + def save( + self, + fname=None, + item_format="e", + availableNpnts=None, + maxRequiredPoints=None, + decimate=True, + extension="dat", + ): + allTraces = self.getAllTraces( + availableNpnts=availableNpnts, + maxRequiredPoints=maxRequiredPoints, + decimate=decimate, + ) + allTraces.config["item_format"] = item_format if fname is None: fname = self.getNextDataFile(extension=extension) allTraces.save(fname) - print(f'Data saved to: {fname}') - return(fname) + print(f"Data saved to: {fname}") + return fname class ScopeSCPI(SCPIinstr, Scope): - """SCPI aware scope. + """SCPI aware scope. Use as a parent for a hardware aware scope classes. @@ -85,11 +115,12 @@ class ScopeSCPI(SCPIinstr, Scope): >>> rm = pyvisa.ResourceManager() >>> ScopeSCPI(rm.open_resource('TCPIP::192.168.0.2::INSTR')) """ + def __init__(self, resource, *args, **kwds): SCPIinstr.__init__(self, resource) Scope.__init__(self, *args, **kwds) - self.config['DeviceId'] = str.strip(self.idn) + self.config["DeviceId"] = str.strip(self.idn) + from .sds1104x import SDS1104X from .sds2304x import SDS2304X - |