非同期API

Rust版のライブラリでは非同期処理をサポートしている.

NOTE: C++, C#, Python版のライブラリでは, この機能は提供されていない.

Setup

非同期処理を行うには, autd3 crateのasync featureを有効にする必要がある.

cargo add autd3 --features "async"

また, 各Linkに対して, async featureを有効にする必要がある場合がある.

  • SOEM

    cargo add autd3-link-soem --features "async"
    
  • TwinCAT

    cargo add autd3-link-twincat --features "async"
    
  • RemoteTwinCAT

    cargo add autd3-link-twincat --features "remote async"
    
  • RemoteSOEM, Simulator

    • デフォルトで有効

非同期APIを使用するには, 通常のControllerの代わりに, autd3::r#async::Controllerを使用すればいい.

use autd3::prelude::*;
use autd3_link_soem::{SOEM, SOEMOption, Status};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut autd = autd3::r#async::Controller::open(
        [AUTD3 {
            pos: Point3::origin(),
            rot: UnitQuaternion::identity(),
        }],
        SOEM::new(
            |slave, status| {
                eprintln!("slave[{}]: {}", slave, status);
                if status == Status::Lost {
                    std::process::exit(-1);
                }
            },
            SOEMOption::default(),
        ),
    )
    .await?;

    autd.firmware_version().await?.iter().for_each(|firm_info| {
        println!("{}", firm_info);
    });

    autd.send(Silencer::default()).await?;

    let g = Focus {
        pos: autd.center() + Vector3::new(0., 0., 150.0 * mm),
        option: FocusOption::default(),
    };

    let m = Sine {
        freq: 150 * Hz,
        option: SineOption::default(),
    };

    autd.send((m, g)).await?;

    println!("press enter to quit...");
    let mut _s = String::new();
    std::io::stdin().read_line(&mut _s)?;

    autd.close().await?;

    Ok(())
}