1
0
mirror of https://github.com/jonathanhogg/scopething synced 2025-07-14 11:12:09 +01:00

Some simplifications

This commit is contained in:
2016-10-24 19:19:52 +00:00
parent 3d12065469
commit 2174382464
2 changed files with 19 additions and 22 deletions

View File

@ -3,6 +3,7 @@
import argparse import argparse
import asyncio import asyncio
import logging import logging
import math
import os import os
import struct import struct
@ -33,10 +34,6 @@ class Scope(vm.VirtualMachine):
await scope.setup() await scope.setup()
return scope return scope
@staticmethod
def _analog_map_func(ks, low, high):
return ks[0] + ks[1]*low + ks[2]*high
async def setup(self): async def setup(self):
Log.info("Resetting scope") Log.info("Resetting scope")
await self.reset() await self.reset()
@ -173,17 +170,17 @@ class Scope(vm.VirtualMachine):
for dump_channel, channel in enumerate(sorted(channels)): for dump_channel, channel in enumerate(sorted(channels)):
async with self.transaction(): async with self.transaction():
await self.set_registers(SampleAddress=(address - nsamples) * nsamples_multiplier % buffer_width, await self.set_registers(SampleAddress=(address - nsamples) * nsamples_multiplier % buffer_width,
DumpMode=clock_mode.DumpMode, DumpChan=dump_channel, DumpMode=vm.DumpMode.Native if clock_mode.sample_width == 2 else vm.DumpMode.Raw,
DumpCount=nsamples, DumpRepeat=1, DumpSend=1, DumpSkip=0) DumpChan=dump_channel, DumpCount=nsamples, DumpRepeat=1, DumpSend=1, DumpSkip=0)
await self.issue_program_spock_registers() await self.issue_program_spock_registers()
await self.issue_analog_dump_binary() await self.issue_analog_dump_binary()
data = await self._reader.readexactly(nsamples * clock_mode.sample_width) data = await self._reader.readexactly(nsamples * clock_mode.sample_width)
if clock_mode.sample_width == 2: if clock_mode.sample_width == 2:
data = struct.unpack('>{}h'.format(nsamples), data)
if raw: if raw:
trace = [(value / 65536 + 0.5) for value in struct.unpack('>{}h'.format(nsamples), data)] trace = [(value / 65536 + 0.5) for value in data]
else: else:
trace = [(value / 65536 + 0.5) * (high - low) + low + self.analog_offsets[channel] trace = [(value / 65536 + 0.5) * (high - low) + low + self.analog_offsets[channel] for value in data]
for value in struct.unpack('>{}h'.format(nsamples), data)]
else: else:
if raw: if raw:
trace = [value / 256 for value in data] trace = [value / 256 for value in data]
@ -197,7 +194,7 @@ class Scope(vm.VirtualMachine):
if vpp is None: if vpp is None:
vpp = self.awg_maximum_voltage vpp = self.awg_maximum_voltage
possible_params = [] possible_params = []
max_clock = int(round(1 / frequency / min_samples / self.awg_clock_period, 0)) max_clock = int(math.floor(1 / frequency / min_samples / self.awg_clock_period))
for clock in range(self.awg_minimum_clock, max_clock+1): for clock in range(self.awg_minimum_clock, max_clock+1):
width = 1 / frequency / (clock * self.awg_clock_period) width = 1 / frequency / (clock * self.awg_clock_period)
if width <= self.awg_sample_buffer_size: if width <= self.awg_sample_buffer_size:
@ -222,7 +219,7 @@ class Scope(vm.VirtualMachine):
await self.set_registers(Cmd=0, Mode=1, Address=0, Size=1) await self.set_registers(Cmd=0, Mode=1, Address=0, Size=1)
await self.wavetable_write_bytes(wavetable) await self.wavetable_write_bytes(wavetable)
await self.set_registers(Cmd=0, Mode=0, Level=vpp / self.awg_maximum_voltage, await self.set_registers(Cmd=0, Mode=0, Level=vpp / self.awg_maximum_voltage,
Offset=2*offset/self.awg_maximum_voltage, Offset=offset / self.awg_maximum_voltage,
Ratio=nwaves * self.awg_wavetable_size / size, Ratio=nwaves * self.awg_wavetable_size / size,
Index=0, Address=0, Size=size) Index=0, Address=0, Size=size)
await self.issue_translate_wavetable() await self.issue_translate_wavetable()

20
vm.py
View File

@ -49,7 +49,7 @@ Registers = {
"Clock": (0x50, 'U16', "Sample (clock) period (ticks)"), "Clock": (0x50, 'U16', "Sample (clock) period (ticks)"),
"Modulo": (0x52, 'U16', "Modulo Size (generic)"), "Modulo": (0x52, 'U16', "Modulo Size (generic)"),
"Level": (0x54, 'U0.16', "Output (analog) attenuation (unsigned)"), "Level": (0x54, 'U0.16', "Output (analog) attenuation (unsigned)"),
"Offset": (0x56, 'S1.15', "Output (analog) offset (signed)"), "Offset": (0x56, 'S0.16', "Output (analog) offset (signed)"),
"Mask": (0x58, 'U16', "Translate source modulo mask"), "Mask": (0x58, 'U16', "Translate source modulo mask"),
"Ratio": (0x5a, 'U16.16', "Translate command ratio (phase step)"), "Ratio": (0x5a, 'U16.16', "Translate command ratio (phase step)"),
"Mark": (0x5e, 'U16', "Mark count/phase (ticks/step)"), "Mark": (0x5e, 'U16', "Mark count/phase (ticks/step)"),
@ -138,17 +138,17 @@ class KitchenSinkB(IntEnum):
WaveformGeneratorEnable = 0x40 WaveformGeneratorEnable = 0x40
ClockMode = namedtuple('ClockMode', ('clock_low', 'clock_high', 'clock_max', 'dual', 'sample_width', ClockMode = namedtuple('ClockMode', ('clock_low', 'clock_high', 'clock_max', 'dual', 'sample_width',
'TraceMode', 'BufferMode', 'DumpMode')) 'TraceMode', 'BufferMode'))
ClockModes = [ ClockModes = [
ClockMode(40, 65536, None, False, 2, TraceMode.Macro, BufferMode.Macro, DumpMode.Native), ClockMode(40, 65536, None, False, 2, TraceMode.Macro, BufferMode.Macro),
ClockMode(40, 65536, None, True, 2, TraceMode.MacroChop, BufferMode.MacroChop, DumpMode.Native), ClockMode(40, 65536, None, True, 2, TraceMode.MacroChop, BufferMode.MacroChop),
ClockMode(15, 40, None, False, 1, TraceMode.Analog, BufferMode.Single, DumpMode.Raw), ClockMode(15, 40, None, False, 1, TraceMode.Analog, BufferMode.Single),
ClockMode(13, 40, None, True, 1, TraceMode.AnalogChop, BufferMode.Chop, DumpMode.Raw), ClockMode(13, 40, None, True, 1, TraceMode.AnalogChop, BufferMode.Chop),
ClockMode( 8, 14, None, False, 1, TraceMode.AnalogFast, BufferMode.Single, DumpMode.Raw), ClockMode( 8, 14, None, False, 1, TraceMode.AnalogFast, BufferMode.Single),
ClockMode( 8, 40, None, True, 1, TraceMode.AnalogFastChop, BufferMode.Chop, DumpMode.Raw), ClockMode( 8, 40, None, True, 1, TraceMode.AnalogFastChop, BufferMode.Chop),
ClockMode( 2, 8, 5, False, 1, TraceMode.AnalogShot, BufferMode.Single, DumpMode.Raw), ClockMode( 2, 8, 5, False, 1, TraceMode.AnalogShot, BufferMode.Single),
ClockMode( 4, 8, 5, True, 1, TraceMode.AnalogShotChop, BufferMode.Chop, DumpMode.Raw), ClockMode( 4, 8, 5, True, 1, TraceMode.AnalogShotChop, BufferMode.Chop),
] ]
def encode(value, dtype): def encode(value, dtype):