mirror of
https://github.com/jonathanhogg/scopething
synced 2025-07-14 11:12:09 +01:00
Use Python 3.6 format strings
This commit is contained in:
27
scope.py
27
scope.py
@ -32,10 +32,10 @@ class Scope(vm.VirtualMachine):
|
|||||||
reader = writer = streams.SerialStream(device=device)
|
reader = writer = streams.SerialStream(device=device)
|
||||||
elif ':' in device:
|
elif ':' in device:
|
||||||
host, port = device.split(':', 1)
|
host, port = device.split(':', 1)
|
||||||
Log.info("Connecting to remote scope at {}:{}".format(host, port))
|
Log.info(f"Connecting to remote scope at {host}:{port}")
|
||||||
reader, writer = await asyncio.open_connection(host, int(port))
|
reader, writer = await asyncio.open_connection(host, int(port))
|
||||||
else:
|
else:
|
||||||
raise ValueError("Don't know what to do with '{}'".format(device))
|
raise ValueError(f"Don't know what to do with '{device}'")
|
||||||
scope = cls(reader, writer)
|
scope = cls(reader, writer)
|
||||||
await scope.setup()
|
await scope.setup()
|
||||||
return scope
|
return scope
|
||||||
@ -62,7 +62,7 @@ class Scope(vm.VirtualMachine):
|
|||||||
self.trigger_high = 10.816
|
self.trigger_high = 10.816
|
||||||
# await self.load_params() XXX switch this off until I understand EEPROM better
|
# await self.load_params() XXX switch this off until I understand EEPROM better
|
||||||
self._generator_running = False
|
self._generator_running = False
|
||||||
Log.info("Initialised scope, revision: {}".format(revision))
|
Log.info(f"Initialised scope, revision: {revision}")
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self._writer is not None:
|
if self._writer is not None:
|
||||||
@ -114,7 +114,7 @@ class Scope(vm.VirtualMachine):
|
|||||||
if clock_mode.dual == dual and ticks in range(clock_mode.clock_low, clock_mode.clock_high + 1):
|
if clock_mode.dual == dual and ticks in range(clock_mode.clock_low, clock_mode.clock_high + 1):
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise RuntimeError("Unsupported clock period: {}".format(ticks))
|
raise RuntimeError(f"Unsupported clock period: {ticks}")
|
||||||
if clock_mode.clock_max is not None and ticks > clock_mode.clock_max:
|
if clock_mode.clock_max is not None and ticks > clock_mode.clock_max:
|
||||||
ticks = clock_mode.clock_max
|
ticks = clock_mode.clock_max
|
||||||
nsamples = int(round(period / ticks / nsamples_multiplier / self.capture_clock_period))
|
nsamples = int(round(period / ticks / nsamples_multiplier / self.capture_clock_period))
|
||||||
@ -189,7 +189,7 @@ class Scope(vm.VirtualMachine):
|
|||||||
data = await self._reader.readexactly(nsamples * clock_mode.sample_width)
|
data = await self._reader.readexactly(nsamples * clock_mode.sample_width)
|
||||||
value_multiplier, value_offset = (1, 0) if raw else ((high-low), low+self.analog_offsets[channel])
|
value_multiplier, value_offset = (1, 0) if raw else ((high-low), low+self.analog_offsets[channel])
|
||||||
if clock_mode.sample_width == 2:
|
if clock_mode.sample_width == 2:
|
||||||
data = struct.unpack('>{}h'.format(nsamples), data)
|
data = struct.unpack(f'>{nsamples}h', data)
|
||||||
traces[channel] = [(value/65536+0.5)*value_multiplier + value_offset for value in data]
|
traces[channel] = [(value/65536+0.5)*value_multiplier + value_offset for value in data]
|
||||||
else:
|
else:
|
||||||
traces[channel] = [(value/256)*value_multiplier + value_offset for value in data]
|
traces[channel] = [(value/256)*value_multiplier + value_offset for value in data]
|
||||||
@ -222,7 +222,7 @@ class Scope(vm.VirtualMachine):
|
|||||||
await self.issue_synthesize_wavetable()
|
await self.issue_synthesize_wavetable()
|
||||||
else:
|
else:
|
||||||
if len(wavetable) != self.awg_wavetable_size:
|
if len(wavetable) != self.awg_wavetable_size:
|
||||||
raise ValueError("Wavetable data must be {} samples".format(self.awg_wavetable_size))
|
raise ValueError(f"Wavetable data must be {self.awg_wavetable_size} samples")
|
||||||
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,
|
||||||
@ -297,7 +297,7 @@ class Scope(vm.VirtualMachine):
|
|||||||
offset = items[:, 4].mean()
|
offset = items[:, 4].mean()
|
||||||
self.analog_offsets = {'A': -offset, 'B': +offset}
|
self.analog_offsets = {'A': -offset, 'B': +offset}
|
||||||
else:
|
else:
|
||||||
Log.warning("Calibration failed: {}".format(result.message))
|
Log.warning(f"Calibration failed: {result.message}")
|
||||||
print(result.message)
|
print(result.message)
|
||||||
return result.success
|
return result.success
|
||||||
|
|
||||||
@ -313,7 +313,7 @@ INFO:scope:Initialised scope, revision: BS000501
|
|||||||
In [2]: generate(2000, 'triangle')
|
In [2]: generate(2000, 'triangle')
|
||||||
Out[2]: 2000.0
|
Out[2]: 2000.0
|
||||||
|
|
||||||
In [3]: traces = capture('At', low=0, high=3.3)
|
In [3]: traces = capture('tA', low=0, high=3.3)
|
||||||
|
|
||||||
In [4]: plot(traces.t, traces.A)
|
In [4]: plot(traces.t, traces.A)
|
||||||
Out[4]: [<matplotlib.lines.Line2D at 0x114009160>]
|
Out[4]: [<matplotlib.lines.Line2D at 0x114009160>]
|
||||||
@ -331,17 +331,20 @@ async def main():
|
|||||||
#y = np.round((np.sin(x)**5)*127 + 128, 0).astype('uint8')
|
#y = np.round((np.sin(x)**5)*127 + 128, 0).astype('uint8')
|
||||||
#await s.start_generator(1000, wavetable=y)
|
#await s.start_generator(1000, wavetable=y)
|
||||||
|
|
||||||
|
def await(g):
|
||||||
|
return asyncio.get_event_loop().run_until_complete(g)
|
||||||
|
|
||||||
def capture(*args, **kwargs):
|
def capture(*args, **kwargs):
|
||||||
return asyncio.get_event_loop().run_until_complete(s.capture(*args, **kwargs))
|
return await(s.capture(*args, **kwargs))
|
||||||
|
|
||||||
def calibrate(*args, **kwargs):
|
def calibrate(*args, **kwargs):
|
||||||
return asyncio.get_event_loop().run_until_complete(s.calibrate(*args, **kwargs))
|
return await(s.calibrate(*args, **kwargs))
|
||||||
|
|
||||||
def generate(*args, **kwargs):
|
def generate(*args, **kwargs):
|
||||||
return asyncio.get_event_loop().run_until_complete(s.start_generator(*args, **kwargs))
|
return await(s.start_generator(*args, **kwargs))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import sys
|
import sys
|
||||||
logging.basicConfig(level=logging.INFO, stream=sys.stderr)
|
logging.basicConfig(level=logging.DEBUG, stream=sys.stderr)
|
||||||
asyncio.get_event_loop().run_until_complete(main())
|
asyncio.get_event_loop().run_until_complete(main())
|
||||||
|
|
||||||
|
15
streams.py
15
streams.py
@ -20,18 +20,19 @@ class SerialStream:
|
|||||||
def __init__(self, device, loop=None, **kwargs):
|
def __init__(self, device, loop=None, **kwargs):
|
||||||
self._device = device
|
self._device = device
|
||||||
self._connection = serial.Serial(self._device, timeout=0, write_timeout=0, **kwargs)
|
self._connection = serial.Serial(self._device, timeout=0, write_timeout=0, **kwargs)
|
||||||
Log.debug("Opened SerialStream on {}".format(device))
|
Log.debug(f"Opened SerialStream on {device}")
|
||||||
self._loop = loop if loop is not None else asyncio.get_event_loop()
|
self._loop = loop if loop is not None else asyncio.get_event_loop()
|
||||||
self._input_buffer = bytes()
|
self._input_buffer = bytes()
|
||||||
self._output_buffer = bytes()
|
self._output_buffer = bytes()
|
||||||
self._output_buffer_empty = None
|
self._output_buffer_empty = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<{}:{}>'.format(self.__class__.__name__, self._device)
|
return f'<{self.__class__.__name__}:{self._device}>'
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self._connection.close()
|
if self._connection is not None:
|
||||||
self._connection = None
|
self._connection.close()
|
||||||
|
self._connection = None
|
||||||
|
|
||||||
def write(self, data):
|
def write(self, data):
|
||||||
if not self._output_buffer:
|
if not self._output_buffer:
|
||||||
@ -43,7 +44,7 @@ class SerialStream:
|
|||||||
Log.exception("Error writing to stream")
|
Log.exception("Error writing to stream")
|
||||||
raise
|
raise
|
||||||
if n:
|
if n:
|
||||||
Log.debug('Write %r', data[:n])
|
Log.debug(f"Write {data[:n]!r}")
|
||||||
self._output_buffer = data[n:]
|
self._output_buffer = data[n:]
|
||||||
else:
|
else:
|
||||||
self._output_buffer += data
|
self._output_buffer += data
|
||||||
@ -76,7 +77,7 @@ class SerialStream:
|
|||||||
self._output_buffer_empty.set_exception(e)
|
self._output_buffer_empty.set_exception(e)
|
||||||
self.remove_writer(self._connection, self._feed_data)
|
self.remove_writer(self._connection, self._feed_data)
|
||||||
if n:
|
if n:
|
||||||
Log.debug('Write %r', self._output_buffer[:n])
|
Log.debug(f"Write {self._output_buffer[:n]!r}")
|
||||||
self._output_buffer = self._output_buffer[n:]
|
self._output_buffer = self._output_buffer[n:]
|
||||||
if not self._output_buffer:
|
if not self._output_buffer:
|
||||||
self._loop.remove_writer(self._connection)
|
self._loop.remove_writer(self._connection)
|
||||||
@ -117,7 +118,7 @@ class SerialStream:
|
|||||||
self._loop.add_reader(self._connection, self._handle_data, n, future)
|
self._loop.add_reader(self._connection, self._handle_data, n, future)
|
||||||
try:
|
try:
|
||||||
data = await future
|
data = await future
|
||||||
Log.debug('Read %r', data)
|
Log.debug(f"Read {data}")
|
||||||
return data
|
return data
|
||||||
finally:
|
finally:
|
||||||
self._loop.remove_reader(self._connection)
|
self._loop.remove_reader(self._connection)
|
||||||
|
14
vm.py
14
vm.py
@ -220,7 +220,7 @@ class VirtualMachine:
|
|||||||
if isinstance(cmd, str):
|
if isinstance(cmd, str):
|
||||||
cmd = cmd.encode('ascii')
|
cmd = cmd.encode('ascii')
|
||||||
if not self._transactions:
|
if not self._transactions:
|
||||||
Log.debug("Issue: {}".format(repr(cmd)))
|
Log.debug(f"Issue: {cmd!r}")
|
||||||
self._writer.write(cmd)
|
self._writer.write(cmd)
|
||||||
await self._writer.drain()
|
await self._writer.drain()
|
||||||
echo = await self._reader.readexactly(len(cmd))
|
echo = await self._reader.readexactly(len(cmd))
|
||||||
@ -241,7 +241,7 @@ class VirtualMachine:
|
|||||||
replies = []
|
replies = []
|
||||||
for i in range(n):
|
for i in range(n):
|
||||||
reply = (await self.readuntil(b'\r'))[:-1]
|
reply = (await self.readuntil(b'\r'))[:-1]
|
||||||
Log.debug("Read reply: {}".format(repr(reply)))
|
Log.debug(f"Read reply: {reply!r}")
|
||||||
replies.append(reply)
|
replies.append(reply)
|
||||||
return replies
|
return replies
|
||||||
|
|
||||||
@ -260,27 +260,27 @@ class VirtualMachine:
|
|||||||
for base, name in sorted((Registers[name][0], name) for name in kwargs):
|
for base, name in sorted((Registers[name][0], name) for name in kwargs):
|
||||||
base, dtype, desc = Registers[name]
|
base, dtype, desc = Registers[name]
|
||||||
bs = encode(kwargs[name], dtype)
|
bs = encode(kwargs[name], dtype)
|
||||||
Log.debug("{} = 0x{}".format(name, ''.join('{:02x}'.format(b) for b in reversed(bs))))
|
Log.debug(f"{name} = 0x{''.join(f'{b:02x}' for b in reversed(bs))}")
|
||||||
for i, byte in enumerate(bs):
|
for i, byte in enumerate(bs):
|
||||||
if cmd:
|
if cmd:
|
||||||
cmd += 'z'
|
cmd += 'z'
|
||||||
r1 += 1
|
r1 += 1
|
||||||
address = base + i
|
address = base + i
|
||||||
if r1 is None or address > r1 + 3:
|
if r1 is None or address > r1 + 3:
|
||||||
cmd += '{:02x}@'.format(address)
|
cmd += f'{address:02x}@'
|
||||||
r0 = r1 = address
|
r0 = r1 = address
|
||||||
else:
|
else:
|
||||||
cmd += 'n' * (address - r1)
|
cmd += 'n' * (address - r1)
|
||||||
r1 = address
|
r1 = address
|
||||||
if byte != r0:
|
if byte != r0:
|
||||||
cmd += '[' if byte == 0 else '{:02x}'.format(byte)
|
cmd += '[' if byte == 0 else f'{byte:02x}'
|
||||||
r0 = byte
|
r0 = byte
|
||||||
if cmd:
|
if cmd:
|
||||||
await self.issue(cmd + 's')
|
await self.issue(cmd + 's')
|
||||||
|
|
||||||
async def get_register(self, name):
|
async def get_register(self, name):
|
||||||
base, dtype, desc = Registers[name]
|
base, dtype, desc = Registers[name]
|
||||||
await self.issue('{:02x}@p'.format(base))
|
await self.issue(f'{base:02x}@p')
|
||||||
values = []
|
values = []
|
||||||
width = calculate_width(dtype)
|
width = calculate_width(dtype)
|
||||||
for i in range(width):
|
for i in range(width):
|
||||||
@ -324,7 +324,7 @@ class VirtualMachine:
|
|||||||
last_byte = None
|
last_byte = None
|
||||||
for byte in bs:
|
for byte in bs:
|
||||||
if byte != last_byte:
|
if byte != last_byte:
|
||||||
cmd += '{:02x}'.format(byte)
|
cmd += f'{byte:02x}'
|
||||||
cmd += 'W'
|
cmd += 'W'
|
||||||
last_byte = byte
|
last_byte = byte
|
||||||
if cmd:
|
if cmd:
|
||||||
|
Reference in New Issue
Block a user