From be7e7e97c1de58ee082fabe9b677c80b1d2cd49a Mon Sep 17 00:00:00 2001 From: Jonathan Hogg Date: Tue, 11 Jul 2017 11:33:49 +0100 Subject: [PATCH] Revised analog params; move VM-specific IO routines into vm.py; remove EEPROM params code (doesn't work); a few lines of documentation here and there --- scope.py | 75 ++++++++++++++++++++++-------------------------------- streams.py | 6 +++++ vm.py | 51 ++++++++++++++++++++++++++++++++----- 3 files changed, 80 insertions(+), 52 deletions(-) diff --git a/scope.py b/scope.py index 8711253..458189b 100755 --- a/scope.py +++ b/scope.py @@ -2,10 +2,10 @@ import argparse import asyncio +from collections import namedtuple import logging import math import os -import struct import sys import streams @@ -25,6 +25,8 @@ class Scope(vm.VirtualMachine): PARAMS_MAGIC = 0xb0b2 + AnalogParams = namedtuple('AnalogParams', ['d', 'f', 'b', 'scale', 'offset']) + @classmethod async def connect(cls, device=None): if device is None: @@ -52,16 +54,15 @@ class Scope(vm.VirtualMachine): self.awg_sample_buffer_size = 1024 self.awg_minimum_clock = 33 self.awg_maximum_voltage = 3.33 - self.analog_params = (20.164, -5.2470, 299.00, 18.472, 0.40827) - self.analog_offsets = {'A': -0.011924, 'B': 0.011924} + self.analog_params = self.AnalogParams(20.2, -4.9, 300, 18.333, -7.517) + self.analog_offsets = {'A': 0, 'B': 0} self.analog_min = -5.7 self.analog_max = 8 self.capture_clock_period = 25e-9 self.capture_buffer_size = 12<<10 self.timeout_clock_period = 6.4e-6 - self.trigger_low = -7.517 - self.trigger_high = 10.816 - # await self.load_params() XXX switch this off until I understand EEPROM better + else: + raise RuntimeError(f"Unsupported scope revision: {revision}") self._awg_running = False Log.info(f"Initialised scope, revision: {revision}") @@ -73,32 +74,14 @@ class Scope(vm.VirtualMachine): __del__ = close - async def load_params(self): - params = [] - for i in range(struct.calcsize('{asamples}h', data) - data = ((value/65536+0.5)*value_multiplier + value_offset for value in data) - else: - data = ((value/256)*value_multiplier + value_offset for value in data) + data = await self.read_analog_samples(asamples, capture_mode.sample_width) + data = (value*value_multiplier + value_offset for value in data) ts = (t*self.capture_clock_period for t in range(start_timestamp+dump_channel*ticks*clock_scale, timestamp, ticks*clock_scale*len(analog_channels))) traces[channel] = dict(zip(ts, data)) @@ -262,7 +241,7 @@ class Scope(vm.VirtualMachine): DumpMode=vm.DumpMode.Raw, DumpChan=128, DumpCount=nsamples, DumpRepeat=1, DumpSend=1, DumpSkip=0) await self.issue_program_spock_registers() await self.issue_analog_dump_binary() - data = await self._reader.readexactly(nsamples) + data = await self.read_logic_samples(nsamples) ts = [t*self.capture_clock_period for t in range(start_timestamp, timestamp, ticks*clock_scale)] for i in logic_channels: mask = 1<{n}h', data) + return [value/65536 + 0.5 for value in data] + elif sample_width == 1: + data = await self._reader.readexactly(n) + return [value/256 for value in data] + else: + raise ValueError(f"Bad sample width: {sample_width}") + + async def read_logic_samples(self, n): + if self._transactions: + raise TypeError("Command transaction in progress") + return await self._reader.readexactly(n) + async def issue_cancel_trace(self): await self.issue(b'K') @@ -331,6 +363,11 @@ class VirtualMachine: async def issue_wavetable_read(self): await self.issue(b'R') + async def wavetable_read_bytes(self, n): + if self._transactions: + raise TypeError("Command transaction in progress") + return await self._reader.readexactly(n) + async def wavetable_write_bytes(self, bs): cmd = '' last_byte = None