Skip to main content

Python bindings for DSView's libsigrok4DSL — control DreamSourceLab logic analyzers and oscilloscopes

Project description

pydsview

PyPI version License: GPL v3

English | 中文


English

Python bindings for DSView's libsigrok4DSL — control DreamSourceLab logic analyzers and oscilloscopes (DSLogic, DSCope) from Python.

Installation

pip install pydsview

Features

  • Discover and activate DSLogic/DSCope/Demo devices
  • Configure samplerate, sample count, channels, triggers
  • Synchronous and asynchronous capture
  • NumPy array output
  • Export to CSV (with compressed mode), VCD, and DSView session (.dsl) format
  • Prebuilt Windows DLLs and firmware included — plug and play

Architecture

Python user code
    └── pydsview (Python package)
            ├── DSContext  — library lifecycle, device list
            ├── Device     — config, channels, capture
            ├── Capture    — sync/async data collection
            ├── Trigger    — trigger configuration
            └── Exporter   — CSV / VCD / session export
                    └── _binding.py (cffi ABI-mode)
                            └── libsigrok4dsl.dll/.so + shim.c
                                    └── libusb / glib / zlib

Quick Start (Windows)

Prebuilt DLLs and firmware are bundled. Just install and use:

pip install pydsview

For development:

git clone https://github.com/fankai777/pydsview.git
cd pydsview
pip install -e ".[dev]"
import pydsview

with pydsview.DSContext() as ctx:
    for info in ctx.list_devices():
        print(info.name, info.handle)

    dev = ctx.get_device(1)                        # DSLogic Plus
    dev.set_config(pydsview.Config.OPERATION_MODE, 1)  # stream mode
    dev.set_config(pydsview.Config.VTH, 1.0)           # threshold 1.0V
    dev.samplerate = pydsview.SR_MHZ(1)
    dev.sample_count = 1_000_000

    result = dev.capture(timeout=10.0)

    # NumPy data
    data = result.to_numpy()
    ch0 = result.channel_data(0)   # bool array

    # Export (compressed CSV — only writes rows where values change)
    pydsview.export.Exporter.to_csv(result, "data.csv")
    pydsview.export.Exporter.to_vcd(result, "data.vcd")

Building from Source (Linux / rebuild DLL)

If you need to rebuild the native library:

cd pydsview/csrc
mkdir build && cd build
cmake .. -G "MinGW Makefiles"   # Windows (MSYS2 mingw64)
# cmake .. -G "Unix Makefiles"  # Linux
cmake --build .
cmake --install .               # copies DLL/SO into pydsview/_libs/

Build dependencies (same as DSView):

  • glib-2.0 (via pkg-config)
  • libusb-1.0
  • zlib
  • pthreads

API Reference

DSContext(firmware_dir=None, user_data_dir=None)

Initialize the library. Use as a context manager. Firmware is bundled in pydsview/res/ and loaded automatically.

  • list_devices()list[DeviceInfo]
  • get_device(index)Device
  • load_session_file(path)Device
  • lib_versionstr

Device

Wraps the currently active device.

  • name, mode, device_type, channels
  • samplerate (get/set), sample_count (get/set)
  • get_config(key), set_config(key, value)
  • enable_channel(index, enabled), set_channel_name(index, name)
  • capture(timeout=None)CaptureResult (synchronous)
  • start_capture()CaptureSession (asynchronous)

CaptureResult

  • to_numpy()np.ndarray
  • to_channel_arrays()list[np.ndarray] (per-channel bool arrays)
  • channel_data(index)np.ndarray (bool, logic only)
  • dso_data()np.ndarray
  • analog_data()np.ndarray

TriggerConfig

  • reset(), set_enabled(bool), set_mode(TriggerMode)
  • set_position(percent), set_channel_trigger(ch, spec)

Exporter

  • Exporter.to_csv(result, path, channels=None, time_column=True, compressed=True)
  • Exporter.to_vcd(result, path, channels=None, timescale="1ns")
  • Exporter.save_session(result, path)

Windows Source Patches

To build libsigrok4DSL on Windows (without the Qt GUI event loop), two files in DSView/libsigrok4DSL/hardware/DSL/ require patching:

dslogic.c

  1. Dummy source pollinglibusb_get_pollfds() returns FDs that Windows g_poll() cannot monitor. Three #ifdef _WIN32 blocks replace real FD polling with a dummy source (fd=-1, timeout=10ms) so receive_data() is called via the freewheel/timeout path in sr_session_run():

    • hw_dev_acquisition_start(): use sr_source_add(-1, 0, 10, ...) instead of iterating libusb_get_pollfds()
    • remove_sources(): remove the single dummy fd instead of iterating devc->usbfd[]
    • receive_data(): set libusb_handle_events_timeout to 10ms (instead of 0) to drive Windows overlapped I/O
  2. Extra libusb_unref_device — Windows needs an additional libusb_unref_device() call after firmware upload to properly release the device handle before reconnect.

dsl.c

  1. logic.unitsize assignment — In receive_transfer(), added logic.unitsize = (dsl_en_ch_num(sdi) + 7) / 8; so the SR_DF_LOGIC packet carries the correct unit size for downstream data decoding.

Running Tests

pytest tests/

test_export.py works without hardware. test_context.py, test_device.py, and test_capture.py require the compiled library and use the Demo device.

License

GPL-3.0-or-later (same as DSView). Bundled firmware files are from DreamSourceLab/DSView under the same license.


中文

DSView libsigrok4DSL 的 Python 绑定 — 用 Python 控制 DreamSourceLab 逻辑分析仪和示波器(DSLogic、DSCope),无需 Qt GUI。

安装

pip install pydsview

功能

  • 发现并激活 DSLogic/DSCope/Demo 设备
  • 配置采样率、采样数、通道、触发器
  • 同步和异步采集
  • NumPy 数组输出
  • 导出 CSV(支持压缩模式)、VCD 和 DSView 会话文件(.dsl
  • 预编译 Windows DLL 和固件已内置 — 即装即用

架构

Python 用户代码
    └── pydsview (Python 包)
            ├── DSContext  — 库生命周期、设备列表
            ├── Device     — 配置、通道、采集
            ├── Capture    — 同步/异步数据采集
            ├── Trigger    — 触发器配置
            └── Exporter   — CSV / VCD / 会话导出
                    └── _binding.py (cffi ABI 模式)
                            └── libsigrok4dsl.dll/.so + shim.c
                                    └── libusb / glib / zlib

快速开始(Windows)

预编译 DLL 和固件已打包,直接安装即可使用:

pip install pydsview

开发模式:

git clone https://github.com/fankai777/pydsview.git
cd pydsview
pip install -e ".[dev]"
import pydsview

with pydsview.DSContext() as ctx:
    for info in ctx.list_devices():
        print(info.name, info.handle)

    dev = ctx.get_device(1)                            # DSLogic Plus
    dev.set_config(pydsview.Config.OPERATION_MODE, 1)  # 流模式
    dev.set_config(pydsview.Config.VTH, 1.0)           # 阈值电压 1.0V
    dev.samplerate = pydsview.SR_MHZ(1)
    dev.sample_count = 1_000_000

    result = dev.capture(timeout=10.0)

    # NumPy 数据
    data = result.to_numpy()
    ch0 = result.channel_data(0)   # bool 数组

    # 导出(压缩 CSV — 仅在信号变化时写入行)
    pydsview.export.Exporter.to_csv(result, "data.csv")
    pydsview.export.Exporter.to_vcd(result, "data.vcd")

从源码编译(Linux / 重新编译 DLL)

如需重新编译原生库:

cd pydsview/csrc
mkdir build && cd build
cmake .. -G "MinGW Makefiles"   # Windows (MSYS2 mingw64)
# cmake .. -G "Unix Makefiles"  # Linux
cmake --build .
cmake --install .               # 将 DLL/SO 复制到 pydsview/_libs/

编译依赖(与 DSView 相同):

  • glib-2.0(通过 pkg-config)
  • libusb-1.0
  • zlib
  • pthreads

API 参考

DSContext(firmware_dir=None, user_data_dir=None)

初始化库,作为上下文管理器使用。固件已打包在 pydsview/res/ 中,自动加载。

  • list_devices()list[DeviceInfo]
  • get_device(index)Device
  • load_session_file(path)Device
  • lib_versionstr

Device

封装当前激活的设备。

  • namemodedevice_typechannels
  • samplerate(读/写)、sample_count(读/写)
  • get_config(key)set_config(key, value)
  • enable_channel(index, enabled)set_channel_name(index, name)
  • capture(timeout=None)CaptureResult(同步采集)
  • start_capture()CaptureSession(异步采集)

CaptureResult

  • to_numpy()np.ndarray
  • to_channel_arrays()list[np.ndarray](逐通道 bool 数组)
  • channel_data(index)np.ndarray(bool,仅逻辑模式)
  • dso_data()np.ndarray
  • analog_data()np.ndarray

TriggerConfig

  • reset()set_enabled(bool)set_mode(TriggerMode)
  • set_position(percent)set_channel_trigger(ch, spec)

Exporter

  • Exporter.to_csv(result, path, channels=None, time_column=True, compressed=True)
  • Exporter.to_vcd(result, path, channels=None, timescale="1ns")
  • Exporter.save_session(result, path)

Windows 源码补丁

在 Windows 上编译 libsigrok4DSL(不依赖 Qt GUI 事件循环)需要修改 DSView/libsigrok4DSL/hardware/DSL/ 下的两个文件:

dslogic.c

  1. 虚拟源轮询 — Windows 上 libusb_get_pollfds() 返回的 FD 无法被 g_poll() 监听。通过三处 #ifdef _WIN32 替换为虚拟源(fd=-1, timeout=10ms),使 receive_data() 通过 sr_session_run() 的超时路径被调用:

    • hw_dev_acquisition_start():使用 sr_source_add(-1, 0, 10, ...) 替代遍历 libusb_get_pollfds()
    • remove_sources():移除单个虚拟 fd 替代遍历 devc->usbfd[]
    • receive_data()libusb_handle_events_timeout 设为 10ms(而非 0)以驱动 Windows overlapped I/O
  2. 额外的 libusb_unref_device — Windows 需要在固件上传后额外调用一次 libusb_unref_device() 以正确释放设备句柄。

dsl.c

  1. logic.unitsize 赋值 — 在 receive_transfer() 中添加 logic.unitsize = (dsl_en_ch_num(sdi) + 7) / 8;,使 SR_DF_LOGIC 数据包携带正确的单位大小,供下游数据解码使用。

运行测试

pytest tests/

test_export.py 无需硬件即可运行。test_context.pytest_device.pytest_capture.py 需要编译好的库并使用 Demo 设备。

许可证

GPL-3.0-or-later(与 DSView 一致)。内置的固件文件来自 DreamSourceLab/DSView,采用相同许可证。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pydsview-0.1.5.tar.gz (4.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pydsview-0.1.5-py3-none-any.whl (4.9 MB view details)

Uploaded Python 3

File details

Details for the file pydsview-0.1.5.tar.gz.

File metadata

  • Download URL: pydsview-0.1.5.tar.gz
  • Upload date:
  • Size: 4.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for pydsview-0.1.5.tar.gz
Algorithm Hash digest
SHA256 34a9cb6718d1ca6f10a40660cf5ad47ae0a8f393a5239cff66453fb1a5a85737
MD5 0127662c88f30eddb9f79df705509a0f
BLAKE2b-256 bad30eff62ac1a89fba39c824d65b84008a00e111ba9d3af14dc955a35eb228b

See more details on using hashes here.

File details

Details for the file pydsview-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: pydsview-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 4.9 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for pydsview-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 6d15e291c04de105ddc0a74bfcfb37436df1bb77aaa3d231359d1831106cd533
MD5 7ff58545275e3c8a5e7b86a8de523b98
BLAKE2b-256 856508b07b0cc28bd54159b281f5f87f14abacc81bd64f2355476c4dc50da4a0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page