6 个版本

使用旧的 Rust 2015

0.1.0-beta02018年5月25日
0.1.0-alpha42018年5月21日

#1151 in 硬件支持

Apache-2.0/MIT

49KB
1K SLoC

TMCL.rs

在 Rust 中使用 Trinamic 运动控制语言 (TMCL)

许可协议

根据您的选择,许可协议为以下之一:

贡献

除非您明确声明,否则根据 Apache-2.0 许可协议定义的,任何有意提交以包含在工作中的贡献,都应如上所述双重许可,不附加任何额外条款或条件。


lib.rs:

TMCL - Trinamic 运动控制语言

TMCL 参考中所述

示例

Socketcan

要使用此示例,必须启用 socketcan 功能。并且必须存在名为 vcan0 的 socketcan 接口。

extern crate tmcl;
extern crate socketcan;

use std::cell::RefCell;

use tmcl::modules::tmcm::instructions::*;
use tmcl::modules::tmcm::axis_parameters::*;
use tmcl::modules::tmcm::TmcmModule as Module;
fn main() {
    # std::process::Command::new("sudo ip link add dev vcan0 type vcan").output();
    # std::process::Command::new("sudo ip link set up vcan0").output();
    let interface = RefCell::new(socketcan::CANSocket::open("vcan0").unwrap());

    let module1 = Module::new(&interface, 1);
    let module2 = Module::new(&interface, 2);

    module1.write_command(ROR::new(0, 250)).unwrap();
    module2.write_command(ROL::new(0, 250)).unwrap();
}

Socketcan 和多线程

要使用此示例,必须启用 socketcan 功能。并且必须存在名为 vcan0 的 socketcan 接口。

extern crate tmcl;
extern crate socketcan;

use std::sync::Mutex;
use std::sync::Arc;

use tmcl::modules::tmcm::instructions::*;
use tmcl::modules::tmcm::axis_parameters::*;
use tmcl::modules::tmcm::TmcmModule as Module;

fn main() {
    # std::process::Command::new("sudo ip link add dev vcan0 type vcan").output();
    # std::process::Command::new("sudo ip link set up vcan0").output();

    let interface = Arc::new(Mutex::new(socketcan::CANSocket::open("vcan0").unwrap()));

    let module1 = Module::new(interface.clone(), 1);
    let module2 = Module::new(interface, 2);

    std::thread::spawn(move || {
        module1.write_command(ROR::new(0, 250)).unwrap();
    });

    std::thread::spawn(move || {
        module2.write_command(ROL::new(0, 250)).unwrap();
    });
}

无需std

当使用无std时,您可以在要使用的接口上实现 Interface

# // TODO: change ignore to no_run once panic_implementation is stabilized
#![no_std]

extern crate tmcl;

use core::cell::RefCell;

use tmcl::Interface;
use tmcl::Reply;
use tmcl::Command;
use tmcl::Instruction;
use tmcl::modules::tmcm::instructions::*;
use tmcl::modules::tmcm::axis_parameters::*;
use tmcl::modules::tmcm::TmcmModule as Module;

# struct MyInterface();
# struct MyInterfaceError();

# impl MyInterface { fn new() -> Self {unimplemented!()} }

impl Interface for MyInterface {
   type Error = MyInterfaceError;

   fn transmit_command<T: Instruction>(&mut self, command: &Command<T>) -> Result<(), Self::Error> {
       // Implement transmit_command for your interface
       # unimplemented!()
   }

   fn receive_reply(&mut self) -> Result<Reply, Self::Error> {
       // Implement receive_reply for your interface
       # unimplemented!()
   }
}

fn main() {

    let interface = RefCell::new(MyInterface::new());

    let module1 = Module::new(&interface, 1);
    let module2 = Module::new(&interface, 2);

    module1.write_command(ROR::new(0, 250)).unwrap();
    module2.write_command(ROL::new(0, 250)).unwrap();
}

依赖项

~6–370KB