Synthetic Trigger#
The synthetic_trigger
module provides functionality to apply trigger conditions to existing captures, allowing you to split a single capture into multiple segments based on trigger conditions.
Overview#
This module is particularly useful when you have a long capture and want to extract specific events based on signal characteristics. It allows you to:
Define trigger conditions after the capture has been made
Split a capture into multiple segments based on those triggers
Extract precise time windows around each trigger event
Apply holdoff periods between triggers
Functions#
split_capture
#
def split_capture(capture: Capture,
trigger: EdgeTrigger,
pre_trigger_seconds: float,
post_trigger_seconds: float) -> List[Capture]
Splits a capture into multiple captures based on a trigger condition.
Parameters:
capture
: The capture to splittrigger
: The trigger settings (e.g., EdgeTrigger)pre_trigger_seconds
: Time before the trigger to include (can be negative to delay the trigger)post_trigger_seconds
: Time after the trigger to include (positive value)
Returns:
A list of new captures, each spanning from a detected trigger - pre_trigger_seconds to the detected trigger + post_trigger_seconds
Note: Captures that aren’t long enough to include both pre- and post-trigger data are discarded.
Example:
from saleae.mso_api.capture import Capture
from saleae.mso_api.synthetic_trigger import split_capture
from saleae.mso_api.trigger import EdgeTrigger, EdgeTriggerDirection
from pathlib import Path
# Load a capture
cap_dir = Path("path/to/capture")
cap = Capture.from_dir(cap_dir)
# Define a trigger (rising edge on channel "data")
trigger = EdgeTrigger(
channel_name="data",
threshold_volts=0,
direction=EdgeTriggerDirection.RISING,
holdoff_seconds=0.001 # 1ms minimum between triggers
)
# Split the capture with 6µs before the trigger and 56µs after
caps = split_capture(cap, trigger, pre_trigger_seconds=-6e-6, post_trigger_seconds=56e-6)
print(f"Found {len(caps)} triggered segments")
find_trigger_indices
#
def find_trigger_indices(capture: Capture, trigger: EdgeTrigger) -> List[int]
Finds the indices in the capture where the trigger conditions are met.
Parameters:
capture
: The capture to analyzetrigger
: The trigger settings
Returns:
A list of indices where the trigger conditions are met
slice_capture
#
def slice_capture(capture: Capture, start_idx: int, end_idx: int) -> Capture
Creates a new capture containing only the data between the specified indices.
Parameters:
capture
: The capture to slicestart_idx
: Starting index (inclusive)end_idx
: Ending index (exclusive)
Returns:
A new Capture object containing only the specified range of data
Common Use Cases#
Protocol Analysis: Extract all instances of a specific protocol transaction
Fault Detection: Identify all occurrences of a fault condition in a long capture
Signal Processing: Pre-process data by extracting only relevant segments for further analysis
Error Handling#
The module will raise appropriate errors if:
The trigger channel is not found in the capture
The capture has no channels
The pre-trigger time is after the post-trigger time
The capture segments are too short to include the requested time windows