Rust硬件仿真库autd3-firmware-emulator的使用,实现AUTD3固件的高效模拟与测试

autd3-firmware-emulator

这个库提供了AUTD3的固件仿真功能。

作者

Shun Suzuki, 2022-2025

安装

在项目目录中运行以下Cargo命令:

cargo add autd3-firmware-emulator

或者在Cargo.toml中添加以下行:

autd3-firmware-emulator = "35.0.1"

示例代码

以下是一个使用autd3-firmware-emulator进行AUTD3固件模拟的完整示例:

use autd3_firmware_emulator::FirmwareEmulator;

fn main() {
    // 创建固件仿真器实例
    let mut emulator = FirmwareEmulator::new();

    // 初始化仿真器
    emulator.init().expect("Failed to initialize firmware emulator");

    // 模拟发送数据到设备
    let data = vec![0x01, 0x02, 0x03, 0x04];
    emulator.send(&data).expect("Failed to send data");

    // 模拟从设备接收数据
    let received = emulator.receive().expect("Failed to receive data");
    println!("Received data: {:?}", received);

    // 检查设备状态
    let status = emulator.status();
    println!("Device status: {:?}", status);

    // 重置仿真器
    emulator.reset().expect("Failed to reset firmware emulator");
}

完整示例代码

以下是一个更完整的示例,展示了如何使用autd3-firmware-emulator进行更复杂的固件模拟:

use autd3_firmware_emulator::FirmwareEmulator;
use std::thread;
use std::time::Duration;

fn main() {
    // 创建固件仿真器实例
    let mut emulator = FirmwareEmulator::new();

    // 初始化仿真器
    emulator.init().expect("初始化固件仿真器失败");

    // 模拟设备启动过程
    println!("模拟设备启动...");
    thread::sleep(Duration::from_secs(1));

    // 发送配置数据
    let config_data = vec![0x10, 0x20, 0x30, 0x40];
    println!("发送配置数据: {:?}", config_data);
    emulator.send(&config_data).expect("发送数据失败");

    // 模拟处理延迟
    thread::sleep(Duration::from_millis(500));

    // 接收响应
    match emulator.receive() {
        Ok(response) => println!("收到设备响应: {:?}", response),
        Err(e) => println!("接收数据错误: {}", e),
    }

    // 检查详细状态
    println!("检查设备状态...");
    let status = emulator.status();
    println!("当前设备状态: {:?}", status);

    // 模拟异常情况
    println!("模拟异常情况...");
    let invalid_data = vec![0x99, 0x88];
    if let Err(e) = emulator.send(&invalid_data) {
        println!("发送无效数据错误: {}", e);
    }

    // 重置仿真器
    println!("重置仿真器...");
    emulator.reset().expect("重置仿真器失败");

    // 验证重置后状态
    let post_reset_status = emulator.status();
    println!("重置后设备状态: {:?}", post_reset_status);

    println!("模拟过程完成");
}

文档

更多详细使用说明请参考文档

许可证

MIT


1 回复

Rust硬件仿真库autd3-firmware-emulator的使用指南

概述

autd3-firmware-emulator是一个用于AUTD3固件高效模拟与测试的Rust库。它允许开发者在没有实际硬件的情况下,对AUTD3设备的行为进行仿真和测试,显著提高了开发效率。

主要特性

  • 完全模拟AUTD3硬件行为
  • 支持多种仿真模式
  • 提供详细的调试信息
  • 与真实硬件API兼容

安装方法

在Cargo.toml中添加依赖:

[dependencies]
autd3-firmware-emulator = "0.1"

基本使用方法

1. 创建仿真器实例

use autd3_firmware_emulator::Emulator;

fn main() {
    // 创建一个新的仿真器实例
    let emulator = Emulator::new();
    
    // 配置仿真参数
    let emulator = emulator
        .with_sample_rate(40000)  // 设置采样率
        .with_debug(true);       // 启用调试模式
}

2. 模拟设备通信

use autd3_firmware_emulator::{Emulator, Command};

let mut emulator = Emulator::new();

// 发送命令到仿真设备
emulator.send(Command::Modulation(0, vec![0x12, 0x34]));

// 从设备接收响应
if let Some(response) = emulator.receive() {
    println!("收到响应: {:?}", response);
}

3. 高级仿真场景

use autd3_firmware_emulator::{Emulator, Scenario};

let scenario = Scenario::builder()
    .add_step(100, Command::Silent(true))  // 100ms后发送静音命令
    .add_step(500, Command::Modulation(0, vec![0x56, 0x78])) // 500ms后发送调制数据
    .build();

let mut emulator = Emulator::new()
    .with_scenario(scenario);

// 运行仿真
emulator.run();

调试与日志

use autd3_firmware_emulator::Emulator;
use std::fs::File;

let emulator = Emulator::new()
    .with_debug(true)
    .with_logger(Box::new(File::create("emulator.log").unwrap()));

性能优化技巧

  1. 对于大规模测试,可以禁用调试输出提高性能:

    let emulator = Emulator::new().with_debug(false);
    
  2. 使用预先生成的测试场景而不是实时生成命令

  3. 批量处理命令而不是单个发送

示例:完整测试流程

use autd3_firmware_emulator::{Emulator, Command, Scenario};

fn main() {
    // 创建测试场景
    let scenario = Scenario::builder()
        .add_step(0, Command::Initialize)
        .add_step(100, Command::Modulation(0, vec![0x11, 0x22, 0x33]))
        .add_step(200, Command::Silent(true))
        .build();

    // 创建并配置仿真器
    let mut emulator = Emulator::new()
        .with_scenario(scenario)
        .with_debug(true);

    // 运行仿真
    emulator.run();

    // 验证结果
    let stats = emulator.statistics();
    println!("测试统计: {:?}", stats);
    
    assert!(stats.commands_processed() == 3);
    assert!(stats.errors() == 0);
}

完整示例demo

下面是一个更完整的示例,展示了如何使用autd3-firmware-emulator进行复杂的仿真测试:

use autd3_firmware_emulator::{Emulator, Command, Scenario};
use std::time::Duration;
use std::thread;

fn main() {
    // 创建复杂测试场景
    let scenario = Scenario::builder()
        // 初始化设备
        .add_step(0, Command::Initialize)
        // 50ms后设置调制参数
        .add_step(50, Command::Modulation(0, vec![0xAA, 0xBB, 0xCC]))
        // 150ms后启用静音模式
        .add_step(150, Command::Silent(true))
        // 250ms后禁用静音模式
        .add_step(250, Command::Silent(false))
        // 350ms后更新调制参数
        .add_step(350, Command::Modulation(0, vec![0xDD, 0xEE, 0xFF]))
        .build();

    // 创建并配置仿真器
    let mut emulator = Emulator::new()
        .with_sample_rate(48000)  // 设置更高的采样率
        .with_scenario(scenario)
        .with_debug(true)        // 启用调试输出
        .with_time_scale(1.0);   // 设置时间缩放因子

    // 启动仿真线程
    let handle = thread::spawn(move || {
        println!("仿真线程启动...");
        emulator.run();
        println!("仿真线程完成");
    });

    // 模拟主线程其他工作
    for i in 0..5 {
        thread::sleep(Duration::from_millis(100));
        println!("主线程工作: {}", i);
    }

    // 等待仿真完成
    handle.join().unwrap();

    // 获取仿真统计信息
    let stats = emulator.statistics();
    println!("最终统计:");
    println!("处理的命令数: {}", stats.commands_processed());
    println!("错误数: {}", stats.errors());
    println!("执行时间: {:?}", stats.execution_time());
    println!("峰值内存: {} KB", stats.peak_memory_kb());

    // 验证结果
    assert!(stats.commands_processed() == 5);
    assert!(stats.errors() == 0);
    assert!(stats.peak_memory_kb() < 1024); // 内存使用应小于1MB
}

注意事项

  1. 仿真器不能完全替代真实硬件测试,最终应在真实设备上验证
  2. 复杂场景可能需要调整仿真参数以获得准确结果
  3. 定期检查库的更新以获取新功能和改进

通过使用autd3-firmware-emulator,开发者可以显著提高AUTD3固件的开发效率,减少对物理硬件的依赖,并实现更全面的测试覆盖。

回到顶部