Skip to content

Commit 1f535c5

Browse files
committed
fix: update import for MockHandler and enhance ScienceLab mock handling
1 parent 55fdacc commit 1f535c5

4 files changed

Lines changed: 40 additions & 17 deletions

File tree

pslab/connection/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from .connection import ConnectionHandler
66
from ._serial import SerialHandler
77
from .wlan import WLANHandler
8-
from pslab.connection.mock import MockHandler
8+
from .mock import MockHandler
99

1010
__all__ = [
1111
"ConnectionHandler",

pslab/connection/mock.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ class MockHandler(ConnectionHandler):
1818
"""
1919

2020
def __init__(self, version: str = "PSLab V6 ", fw=(3, 0, 0)) -> None:
21+
"""Initialize MockHandler.
22+
23+
Parameters
24+
----------
25+
version : str, optional
26+
Version string to return when queried. Default is "PSLab V6 ".
27+
fw : tuple of int, optional
28+
Firmware version as a (major, minor, patch) tuple. Default is (3, 0, 0).
29+
"""
2130
self._rx = deque() # bytes to be read
2231
self._tx = bytearray() # bytes written by client
2332
self.version = version # convenient attribute for callers
@@ -89,7 +98,7 @@ def _maybe_respond(self) -> None:
8998
"""
9099
# Detect “CP.COMMON, <cmd>” patterns
91100
while len(self._tx) >= 2:
92-
if self._tx[0] != CP.COMMON:
101+
if self._tx[0] != CP.COMMON[0]:
93102
# Drop unknown leading bytes
94103
self._tx.pop(0)
95104
continue
@@ -98,13 +107,13 @@ def _maybe_respond(self) -> None:
98107

99108
# GET_VERSION: ConnectionHandler.get_version reads 9 bytes
100109
# and checks b"PSLab"
101-
if cmd == CP.GET_VERSION:
110+
if cmd == CP.GET_VERSION[0]:
102111
self._tx = self._tx[2:]
103112
self._queue(self.version.encode("utf-8")[:9].ljust(9, b" "))
104113
continue
105114

106115
# GET_FW_VERSION: reads 3 bytes (major, minor, patch)
107-
if cmd == CP.GET_FW_VERSION:
116+
if cmd == CP.GET_FW_VERSION[0]:
108117
self._tx = self._tx[2:]
109118
major, minor, patch = self._fw
110119
self._queue(bytes([major, minor, patch]))

pslab/sciencelab.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,32 @@
2222
class ScienceLab:
2323
"""Aggregate interface for the PSLab's instruments.
2424
25+
Parameters
26+
----------
27+
device : ConnectionHandler, optional
28+
Connection handler for communicating with the PSLab device. If not
29+
provided, a new one will be created via autoconnect. If both *device*
30+
and *mock* are provided, *device* takes precedence and *mock* is
31+
ignored.
32+
mock : bool, optional
33+
If True, use a MockHandler instead of connecting to physical hardware.
34+
Instruments will not be instantiated in mock mode. The default is
35+
False.
36+
2537
Attributes
2638
----------
27-
logic_analyzer : pslab.LogicAnalyzer
28-
oscilloscope : pslab.Oscilloscope
29-
waveform_generator : pslab.WaveformGenerator
30-
pwm_generator : pslab.PWMGenerator
31-
multimeter : pslab.Multimeter
32-
power_supply : pslab.PowerSupply
39+
logic_analyzer : pslab.LogicAnalyzer or None
40+
oscilloscope : pslab.Oscilloscope or None
41+
waveform_generator : pslab.WaveformGenerator or None
42+
pwm_generator : pslab.PWMGenerator or None
43+
multimeter : pslab.Multimeter or None
44+
power_supply : pslab.PowerSupply or None
3345
i2c : pslab.I2CMaster
3446
nrf : pslab.peripherals.NRF24L01
47+
48+
Notes
49+
-----
50+
Instrument attributes are None when initialized with mock=True.
3551
"""
3652

3753
def __init__(self, device: ConnectionHandler | None = None, mock: bool = False):
@@ -43,9 +59,7 @@ def __init__(self, device: ConnectionHandler | None = None, mock: bool = False):
4359
self.device = autoconnect()
4460
self.firmware = self.device.get_firmware_version()
4561

46-
# mock mode initializes without hardware; instruments are not initialized.
47-
48-
if not mock:
62+
if not mock: # In mock mode, skip instrument initialization to avoid hardware dependencies
4963
self.logic_analyzer = LogicAnalyzer(device=self.device)
5064
self.oscilloscope = Oscilloscope(device=self.device)
5165
self.waveform_generator = WaveformGenerator(device=self.device)

tests/test_sciencelab_mock.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ def test_sciencelab_mock_does_not_autoconnect():
1111
):
1212
psl = ScienceLab(mock=True)
1313

14-
# It should initialize and provide a firmware version object.
15-
assert psl.firmware.major >= 0
16-
assert psl.firmware.minor >= 0
17-
assert psl.firmware.patch >= 0
14+
# It should initialize and provide the expected mock firmware version object.
15+
assert psl.firmware.major == 3
16+
assert psl.firmware.minor == 0
17+
assert psl.firmware.patch == 0
1818

1919
# In mock mode, instruments should not be instantiated (no hardware required).
2020
assert psl.logic_analyzer is None

0 commit comments

Comments
 (0)