#streaming #oscilloscope #pico-technology #pico-scope

pico-sdk

为 Pico Technology 示波器驱动程序提供非官方的 Rust 绑定和包装

7 个版本

0.3.1 2021 年 5 月 12 日
0.3.0 2021 年 4 月 14 日
0.2.1 2021 年 3 月 26 日
0.1.4 2020 年 11 月 18 日

#415硬件支持

38 每月下载量

MIT 许可证

1MB
28K SLoC

pico-sdk

Crates.io docs.rs

为 Pico Technology 示波器驱动程序提供非官方的 Rust 绑定和包装

这是一个元 crate,重新导出多个子 crate 的功能。这些子 crate 提供了常见的、高性能的、高级 API,隐藏了多个 Pico 驱动程序之间的差异。

子 crate

  • pico-common Crates.io

    常见的枚举、结构体和特质。
  • pico-sys-dynamic Crates.io

    为每个 Pico 示波器驱动程序提供动态加载的不安全绑定。 此 crate 包含不安全代码。
  • pico-driver Crates.io

    实现 PicoDriver 特质的常见、安全的包装。 此 crate 包含不安全代码。
  • pico-download Crates.io

    在任意平台上下载缺少的驱动程序。
  • pico-device Crates.io

    PicoDriver 特质之上提供设备抽象。检测可用通道和有效范围。
  • pico-enumeration Crates.io

    跨驱动程序设备枚举。通过 USB 厂商 ID 检测设备,仅加载所需的驱动程序。
  • pico-streaming Crates.io

    PicoDevice 之上实现连续的无间隙流。

先决条件

在 Linux 上,pico-enumeration 需要 libudev-dev 被安装。

测试

一些测试打开并从设备流式传输数据,如果设备不可用(例如在 CI 中运行时),这些测试将失败。要运行这些测试,请确保也运行了忽略的测试

cargo测试 ----已忽略

示例

有许多示例演示了如何使用包装器

cargo运行 --示例streaming_cli

显示一个交互式命令行界面,允许选择设备、通道配置和采样率。一旦开始捕获,流速率将显示,并显示通道值。

cargo运行 --示例enumerate

尝试枚举设备,并从缓存位置未找到的驱动程序下载。

cargo运行 --示例open<driver> <serial>

加载指定的驱动程序并尝试打开可选指定的设备串行。

用法示例

PicoDevice 的形式打开和配置特定的 ps2000 设备

use std::sync::Arc;
use pico_sdk::prelude::*;

let driver = Driver::PS2000.try_load()?;
let device = PicoDevice::try_open(&driver, Some("ABC/123"))?;

枚举所有必需的 Pico 示波器驱动程序,配置返回的第一个设备并从它那里流式传输无缝数据

use std::sync::Arc;
use pico_sdk::prelude::*;

let enumerator = DeviceEnumerator::new();
// Enumerate, ignore all failures and get the first device
let enum_device = enumerator
                .enumerate()
                .into_iter()
                .flatten()
                .next()
                .expect("No device found");

let device = enum_device.open()?;

// Get a streaming device
let stream_device = device.into_streaming_device();

// Enable and configure 2 channels
stream_device.enable_channel(PicoChannel::A, PicoRange::X1_PROBE_2V, PicoCoupling::DC);
stream_device.enable_channel(PicoChannel::B, PicoRange::X1_PROBE_1V, PicoCoupling::AC);

struct StdoutHandler;

impl NewDataHandler for StdoutHandler {
    fn handle_event(&self, event: &StreamingEvent) {
        println!("Sample count: {}", event.length);
    }
}

// When handler goes out of scope, the subscription is dropped
let handler = Arc::new(StdoutHandler);

// Subscribe to streaming events
stream_device.new_data.subscribe(handler.clone());

// Start streaming with 1k sample rate
stream_device.start(1_000)?;

枚举所有必需的 Pico 示波器驱动程序。如果找到设备但没有匹配的驱动程序,尝试下载缺少的驱动程序并再次枚举

use pico_sdk::prelude::*;

let enumerator = DeviceEnumerator::with_resolution(cache_resolution());

loop {
    let results = enumerator.enumerate();

    println!("{:#?}", results);

    let missing_drivers = results.missing_drivers();

    if !missing_drivers.is_empty() {
        download_drivers_to_cache(&missing_drivers)?;
    } else {
        break;
    }
}

许可:MIT

依赖项

~9–21MB
~397K SLoC