Skip to content

Commit

Permalink
py: lint, docs, formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
jordens committed Jan 9, 2025
1 parent 42f9cba commit 83d47a9
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 30 deletions.
5 changes: 3 additions & 2 deletions py/stabilizer/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
"""Stabilizer data conversion and streaming utilities"""

# Sample period in seconds, default 100 MHz timer clock and a reload value of 128
SAMPLE_PERIOD = 10e-9*128
SAMPLE_PERIOD = 10e-9 * 128

# The number of DAC LSB codes per volt on Stabilizer outputs.
DAC_LSB_PER_VOLT = (1 << 16) / (4.096 * 5)

# The number of volts per ADC LSB.
ADC_VOLTS_PER_LSB = (5.0 / 2.0 * 4.096) / (1 << 15)
ADC_VOLTS_PER_LSB = (5.0 / 2.0 * 4.096) / (1 << 15)

# The number of volts per DAC LSB.
DAC_VOLTS_PER_LSB = 1 / DAC_LSB_PER_VOLT
Expand All @@ -17,6 +17,7 @@
# DAC.
DAC_FULL_SCALE = float(0x7FFF / DAC_LSB_PER_VOLT)


def voltage_to_machine_units(voltage):
"""Convert a voltage to machine units."""
code = int(round(voltage * DAC_LSB_PER_VOLT))
Expand Down
5 changes: 2 additions & 3 deletions py/stabilizer/plot_iir_frequency_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
from stabilizer.iir_coefficients import get_filters

# disable warnings about short variable names and similar code
#pylint: disable=invalid-name, duplicate-code, redefined-builtin

# pylint: disable=invalid-name, duplicate-code, redefined-builtin


def _main():
Expand Down Expand Up @@ -52,7 +51,7 @@ def _main():
if forward_gain == 0 and args.x_offset != 0:
print("Filter has no DC gain but x_offset is non-zero")

f = np.logspace(-8.5, 0, 1024, endpoint=False)*(.5/args.sample_period)
f = np.logspace(-8.5, 0, 1024, endpoint=False) * (0.5 / args.sample_period)
f, h = signal.freqz(
coefficients[:3],
np.r_[1, [-c for c in coefficients[3:]]],
Expand Down
59 changes: 34 additions & 25 deletions py/stabilizer/stream.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/python3
# pylint: disable=too-few-public-methods

"""Stabilizer streaming receiver and parsers"""

import argparse
Expand All @@ -21,7 +23,7 @@

def wrap(wide):
"""Wrap to 32 bit integer"""
return wide & 0xffffffff
return wide & 0xFFFFFFFF


def get_local_ip(remote):
Expand All @@ -37,6 +39,7 @@ def get_local_ip(remote):

class AdcDac:
"""Stabilizer default striming data format"""

format_id = 1

def __init__(self, header, body):
Expand Down Expand Up @@ -69,14 +72,16 @@ def to_traces(self):
"""Convert the raw data to labelled Trace instances"""
data = self.to_mu()
return [
Trace(data[0], scale=DAC_VOLTS_PER_LSB, label='ADC0'),
Trace(data[1], scale=DAC_VOLTS_PER_LSB, label='ADC1'),
Trace(data[2], scale=DAC_VOLTS_PER_LSB, label='DAC0'),
Trace(data[3], scale=DAC_VOLTS_PER_LSB, label='DAC1')
Trace(data[0], scale=DAC_VOLTS_PER_LSB, label="ADC0"),
Trace(data[1], scale=DAC_VOLTS_PER_LSB, label="ADC1"),
Trace(data[2], scale=DAC_VOLTS_PER_LSB, label="DAC0"),
Trace(data[3], scale=DAC_VOLTS_PER_LSB, label="DAC1"),
]


class Frame:
"""Stream frame constisting of a header and multiple data batches"""

# The magic header half-word at the start of each packet.
magic = 0x057B
header_fmt = struct.Struct("<HBBI")
Expand All @@ -87,14 +92,15 @@ class Frame:

@classmethod
def parse(cls, data):
"""Parse known length frame"""
header = cls.header._make(cls.header_fmt.unpack_from(data))
if header.magic != cls.magic:
raise ValueError("Bad frame magic: %#04x", header.magic)
raise ValueError(f"Bad frame magic: {header.magic:#04x}")
try:
parser = cls.parsers[header.format_id]
except KeyError:
raise ValueError("No parser for format %s", header.format_id)
return parser(header, data[cls.header_fmt.size:])
except KeyError as exc:
raise ValueError(f"No parser for format: {header.format_id}") from exc
return parser(header, data[cls.header_fmt.size :])


class StabilizerStream(asyncio.DatagramProtocol):
Expand Down Expand Up @@ -125,7 +131,9 @@ async def open(cls, port=9293, addr="0.0.0.0", broker=None, maxsize=1):
else:
sock.bind((addr, port))

transport, protocol = await loop.create_datagram_endpoint(lambda: cls(maxsize), sock=sock)
transport, protocol = await loop.create_datagram_endpoint(
lambda: cls(maxsize), sock=sock
)
return transport, protocol

def __init__(self, maxsize):
Expand All @@ -151,12 +159,14 @@ def datagram_received(self, data, _addr):

async def measure(stream, duration):
"""Measure throughput and loss of stream reception"""

@dataclass
class _Statistics:
expect = None
received = 0
lost = 0
bytes = 0

stat = _Statistics()

async def _record():
Expand All @@ -175,36 +185,35 @@ async def _record():
except asyncio.TimeoutError:
pass

logger.info("Received %g MB, %g MB/s", stat.bytes/1e6,
stat.bytes/1e6/duration)
logger.info(
"Received %g MB, %g MB/s", stat.bytes / 1e6, stat.bytes / 1e6 / duration
)

sent = stat.received + stat.lost
if sent:
loss = stat.lost/sent
loss = stat.lost / sent
else:
loss = 1
logger.info("Loss: %s/%s batches (%g %%)", stat.lost, sent, loss*1e2)
logger.info("Loss: %s/%s batches (%g %%)", stat.lost, sent, loss * 1e2)
return loss


async def main():
"""Test CLI"""
parser = argparse.ArgumentParser(description="Stabilizer streaming demo")
parser.add_argument("--port", type=int, default=9293,
help="Local port to listen on")
parser.add_argument("--host", default="0.0.0.0",
help="Local address to listen on")
parser.add_argument("--broker", default="mqtt",
help="The MQTT broker address")
parser.add_argument("--maxsize", type=int, default=1,
help="Frame queue size")
parser.add_argument("--duration", type=float, default=1.,
help="Test duration")
parser.add_argument(
"--port", type=int, default=9293, help="Local port to listen on"
)
parser.add_argument("--host", default="0.0.0.0", help="Local address to listen on")
parser.add_argument("--broker", default="mqtt", help="The MQTT broker address")
parser.add_argument("--maxsize", type=int, default=1, help="Frame queue size")
parser.add_argument("--duration", type=float, default=1.0, help="Test duration")
args = parser.parse_args()

logging.basicConfig(level=logging.INFO)
_transport, stream = await StabilizerStream.open(
args.port, args.host, args.broker, args.maxsize)
args.port, args.host, args.broker, args.maxsize
)
await measure(stream, args.duration)


Expand Down

0 comments on commit 83d47a9

Please sign in to comment.