Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pslab/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
from pslab.instrument.oscilloscope import Oscilloscope
from pslab.instrument.power_supply import PowerSupply
from pslab.instrument.waveform_generator import PWMGenerator, WaveformGenerator
from pslab.pico import PicoDevice
from pslab.sciencelab import ScienceLab

__all__ = (
"LogicAnalyzer",
"Multimeter",
"Oscilloscope",
"PicoDevice",
"PowerSupply",
"PWMGenerator",
"WaveformGenerator",
Expand Down
21 changes: 21 additions & 0 deletions pslab/pico/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""PSLab Pico SCPI support."""

from pslab.pico.device import PicoDevice
from pslab.pico.transport import (
PicoTransport,
PicoUsbTransport,
PicoWifiTransport,
ScpiClient,
ScpiError,
ScpiTimeoutError,
)

__all__ = (
"PicoDevice",
"PicoTransport",
"PicoUsbTransport",
"PicoWifiTransport",
"ScpiClient",
"ScpiError",
"ScpiTimeoutError",
)
93 changes: 93 additions & 0 deletions pslab/pico/device.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
"""High-level PSLab Pico device entry point."""

from __future__ import annotations

from typing import Optional

from pslab.pico.transport import PicoTransport, PicoUsbTransport, PicoWifiTransport, ScpiClient


class PicoDevice:
"""Connected PSLab Pico firmware device.

The Pico firmware speaks SCPI over USB CDC or over the ESP32-C3 TCP bridge.
This object owns the shared SCPI client used by future Pico instruments.
"""

def __init__(self, client: ScpiClient) -> None:
self.scpi = client

@classmethod
def usb(
cls,
port: Optional[str] = None,
baudrate: int = 115200,
timeout: Optional[float] = 2.0,
) -> "PicoDevice":
"""Create a Pico device using USB CDC."""

return cls(ScpiClient(PicoUsbTransport(port, baudrate, timeout)))

@classmethod
def wifi(
cls,
host: str,
port: int = PicoWifiTransport.DEFAULT_PORT,
timeout: Optional[float] = 2.0,
) -> "PicoDevice":
"""Create a Pico device using the ESP TCP SCPI bridge."""

return cls(ScpiClient(PicoWifiTransport(host, port, timeout)))

@classmethod
def from_transport(cls, transport: PicoTransport) -> "PicoDevice":
"""Create a Pico device from a custom transport."""

return cls(ScpiClient(transport))

def connect(self) -> None:
"""Open the underlying transport."""

self.scpi.connect()

def close(self) -> None:
"""Close the underlying transport."""

self.scpi.close()

def identify(self) -> str:
"""Return the firmware identification string."""

return self.scpi.identify()

def reset(self) -> None:
"""Reset all instrument state in the firmware."""

self.scpi.reset()

def clear_status(self) -> None:
"""Clear the SCPI status and error queues."""

self.scpi.clear_status()

def set_transport(self, mode: str) -> None:
"""Select capture data transport: ``USB``, ``WIFI``, or ``AUTO``."""

self.scpi.set_transport(mode)

def get_transport(self) -> str:
"""Return the selected capture data transport."""

return self.scpi.get_transport()

def wifi_status(self):
"""Return Wi-Fi transport status counters."""

return self.scpi.wifi_status()

def __enter__(self) -> "PicoDevice":
self.connect()
return self

def __exit__(self, exc_type, exc, traceback) -> None:
self.close()
Loading
Loading