MSO#
The MSO
class is the main interface for interacting with a Saleae Logic MSO device. It provides methods for capturing data and managing device settings.
Overview#
The MSO
class handles:
Device connection and initialization
Analog capture operations
Device configuration and settings
Classes#
MSO
#
class MSO:
def __init__(self, serial_number: Optional[str] = None)
Parameters:
serial_number
: Optional serial number to connect to a specific device. If not provided, connects to the first available device.
Properties:
part_number
: The Saleae Part Number for the attached MSO. Supplies information like maximum sample rates and buffer sizes.
Methods#
MSO.capture()
#
def capture(self,
capture_config: mso_api.CaptureConfig,
save_dir: pathlib.Path,
timeout_secs: Optional[float] = None) -> mso_api.Capture
Captures data from the device according to the specified configuration.
Parameters:
capture_config
: Configuration for the capture (channels, sample rate, etc.)save_dir
: Directory to save capture datatimeout_secs
: Optional timeout for the capture operation
Returns:
A
Capture
object containing the captured data
Note: This method will:
Create the save directory if it doesn’t exist
Save the record options to
record_options.json
Execute the capture command
Save the record result to
record_result.json
Load the captured data into a
Capture
object
Example Usage:
from pathlib import Path
from saleae.mso_api import MSO, CaptureConfig, AnalogChannel, AnalogSettings, TimedCapture
# Initialize the MSO
mso = MSO()
# Configure the capture
config = CaptureConfig(
enabled_channels=[AnalogChannel(channel=0, name="clock")],
analog_settings=AnalogSettings(sample_rate=100e6),
capture_settings=TimedCapture(capture_length_seconds=0.1),
)
# Perform the capture
save_dir = Path("my-capture")
capture = mso.capture(config, save_dir=save_dir)
# Access the captured data and inspect the actual (effective) capture settings
print(f"Captured {capture.analog_data['clock'].num_samples} samples at a "
f"{capture.config.analog_settings.sample_rate/1e6:.1f} MHz sample rate")
Captured 12500224 samples at a 125.0 MHz sample rate
Error Handling#
The MSO
class can raise the following exceptions, which are all subclasses of MsoApiError
:
CaptureTimeoutError
when capture operations timeoutMsoCommandError
when device commands otherwise failSmartCableNotReadyError
when a digital capture is initiated on a Smart Cable that’s not plugged inSaleaeCommsProcessError
when something has broken in the low-level communications layer, or the device has been unplugged from USB during a capture.
If either of these conditions arise, the directory you requested your capture to be saved in
will contain a file called traceback.txt
with debug information from your own program
as well as the underlying capture executable.
CaptureTimeoutError
#
class CaptureTimeoutError(MsoApiError):
def __init__(self, timeout_seconds: Optional[float] = None):
self.timeout_seconds = timeout_seconds
Exception raised when a capture operation times out. This can occur in two scenarios:
No trigger condition was found during a triggered capture
The actual capturing and uploading did not complete within the specified timeout period
If you’re running into a lot of these, try the following:
check that your trigger condition is actually occurring on the channel you’ve configured within the trigger timeout
consider increasing (or dropping) the overall command timeout (
timeout_secs
), as that includes upload time from the device.
Attributes:
timeout_seconds
: The timeout duration that was exceeded
MsoCommandError
#
class MsoCommandError(MsoApiError):
def __init__(self, command: str, stdout: str):
self.command = command
self.stdout = stdout
super().__init__(f"Command {command} failed, stdout was: {stdout}")
Exception raised when device commands otherwise fail.
Attributes:
command
: The command that failedstdout
: The stdout output from the command
SmartCableNotReadyError
#
class SmartCableNotReadyError(MsoApiError):
def __init__(self, command: str, stdout: str):
self.command = command
self.stdout = stdout
super().__init__(f"Smart cable was not connected or initialized in time. {command} failed, stdout was: {stdout}")
Exception raised when a smart cable is not ready or not connected. This typically occurs when:
The smart cable is not properly connected to the MSO device
The smart cable has not been initialized in time for the capture operation
There are communication issues with the smart cable hardware
Attributes:
command
: The command that failedstdout
: The stdout output from the command
Common Solutions:
Ensure the smart cable is properly connected to the MSO device
Try unplugging and replugging the smart cable
Verify that the smart cable is being detected by the system by opening Logic2 and attempting to capture data from it
SaleaeCommsProcessError
#
class SaleaeCommsProcessError(MsoApiError):
def __init__(self, args: list[str], stdout: str, stderr: str, returncode: int, env: Optional[dict[str, str]] = None):
self.msoexe_args = args
self.stdout = stdout
self.stderr = stderr
self.returncode = returncode
self.env = env
Exception raised when there are low-level communication issues with the MSO device. This typically occurs when:
The device is disconnected from USB during a capture operation
There are fundamental communication problems with the device
Attributes:
msoexe_args
: The command arguments that were passed to the MSO executablestdout
: The stdout output from the commandstderr
: The stderr output from the commandreturncode
: The return code from the MSO executableenv
: The environment variables used during execution
Note: If you encounter this error outside of obvious scenarios like disconnecting the USB cable during capture, please contact Saleae support with the error details and your system information. We’d like to get the problem fixed as soon as possible.