diff --git a/scope.py b/scope.py index 302cc40..5317215 100755 --- a/scope.py +++ b/scope.py @@ -217,6 +217,9 @@ class Scope(vm.VirtualMachine): traces = DotDict() timestamps = array.array('d', (t*self.capture_clock_period for t in range(start_timestamp, timestamp, ticks*clock_scale))) + sample_period = ticks*clock_scale*self.capture_clock_period + sample_rate = 1/sample_period + start_time = start_timestamp*self.capture_clock_period for dump_channel, channel in enumerate(sorted(analog_channels)): asamples = nsamples // len(analog_channels) async with self.transaction(): @@ -228,7 +231,10 @@ class Scope(vm.VirtualMachine): value_multiplier, value_offset = (1, 0) if raw else ((high-low), low+self.analog_offsets[channel]) data = await self.read_analog_samples(asamples, capture_mode.sample_width) traces[channel] = DotDict({'timestamps': timestamps[dump_channel::len(analog_channels)] if len(analog_channels) > 1 else timestamps, - 'samples': array.array('d', (value*value_multiplier+value_offset for value in data))}) + 'samples': array.array('d', (value*value_multiplier+value_offset for value in data)), + 'start_time': start_time+sample_period*dump_channel, + 'sample_period': sample_period*len(analog_channels), + 'sample_rate': sample_rate/len(analog_channels)}) if logic_channels: async with self.transaction(): await self.set_registers(SampleAddress=(address - nsamples) % buffer_width, @@ -239,7 +245,10 @@ class Scope(vm.VirtualMachine): for i in logic_channels: mask = 1< 0.99: continue - B = np.fromiter(data['B'].values(), count=1000, dtype='float') + B = np.array(traces.B.samples) B.sort() Bzero, Bmax = B[25:475].mean(), B[525:975].mean() if Bzero < 0.01 or Bmax > 0.99: diff --git a/vm.py b/vm.py index c42179b..eb5b834 100644 --- a/vm.py +++ b/vm.py @@ -162,8 +162,8 @@ CaptureMode = namedtuple('CaptureMode', ('clock_low', 'clock_high', 'clock_max', 'logic_channels', 'clock_divide', 'trace_mode', 'buffer_mode')) CaptureModes = [ - CaptureMode(40, 65536, None, 1, 2, False, False, TraceMode.Macro, BufferMode.Macro), - CaptureMode(40, 65536, None, 2, 2, False, False, TraceMode.MacroChop, BufferMode.MacroChop), + CaptureMode(40, 65535, None, 1, 2, False, False, TraceMode.Macro, BufferMode.Macro), + CaptureMode(40, 65535, None, 2, 2, False, False, TraceMode.MacroChop, BufferMode.MacroChop), CaptureMode(15, 40, None, 1, 1, False, True, TraceMode.Analog, BufferMode.Single), CaptureMode(13, 40, None, 2, 1, False, True, TraceMode.AnalogChop, BufferMode.Chop), CaptureMode( 8, 14, None, 1, 1, False, False, TraceMode.AnalogFast, BufferMode.Single), @@ -355,12 +355,11 @@ class VirtualMachine: if self._transactions: raise TypeError("Command transaction in progress") if sample_width == 2: - data = await self._reader.readexactly(2 * n) - data = struct.unpack(f'>{n}h', data) - return array.array('d', ((value+32768)/65535 for value in data)) + data = await self._reader.readexactly(2*n) + return array.array('f', ((value+32768)/65535 for (value,) in struct.iter_unpack('>h', data))) elif sample_width == 1: data = await self._reader.readexactly(n) - return array.array('d', (value/255 for value in data)) + return array.array('f', (value/255 for value in data)) else: raise ValueError(f"Bad sample width: {sample_width}")