#运动 #串行 #解码器 #输出 #tokio #达科龙 #全运动-5000

达科龙-全运动-5000

达科龙全运动5000的串行输出的解码器Rust实现

6个版本

0.3.1 2024年7月11日
0.3.0 2024年7月10日
0.2.2 2024年7月9日
0.1.0 2024年7月6日

#174 in 异步

每月25次下载

MIT 许可证

365KB
17K SLoC

达科龙全运动5000 for Rust

Documentation Crates.io License Downloads

达科龙全运动5000的串行输出的解码器Rust实现。

请参阅文档

如果您使用此crate:请通过创建GitHub讨论告诉我您的使用案例!这也可以让我知道其他人是否对此crate感兴趣并认为它有用。

高级访问

使用 RTDStateRTDState::from_serial_stream 创建一个新的实例(在启用默认功能的情况下可用)。

如果您需要任何帮助,docs.rs 中每个项的详细文档应该更全面。如果有不清楚的地方,请不要犹豫,在创建GitHub问题

体育

此crate支持控制台支持的所有运动。有关它们的列表,请参阅sports模块文档。

示例

获取特定运动的场

use daktronics_allsport_5000::{
    RTDState,
    // there are lots of other sports available in their respective modules
    sports::basketball::BasketballSport
};
use tokio_serial::SerialPortBuilderExt; // for open_native_async
use crate::daktronics_allsport_5000::sports::Sport; // for rtd_state

#[tokio::main]
async fn main() {
    let serial_stream = tokio_serial::new("/dev/ttyUSB0", 19200)
        .parity(tokio_serial::Parity::None)
        .open_native_async()
        .unwrap();
    let rtd_state = RTDState::from_serial_stream(serial_stream, true).unwrap();
    let mut basketball = BasketballSport::new(rtd_state);

    loop {
        // get the underlying rtd_state to update it
        let update_result = basketball.rtd_state().update_async().await.unwrap();

        basketball.main_clock_time(); // -> Result<&str, ...>
    }
}

使用Serde

启用serde功能以启用运动的序列化。

use tokio;
use daktronics_allsport_5000::{
    RTDState,
    sports::basketball::BasketballSport
};
use tokio_serial::SerialPortBuilderExt; // for open_native_async
use crate::daktronics_allsport_5000::sports::Sport; // for rtd_state

#[tokio::main]
async fn main() {
    let serial_stream = tokio_serial::new("/dev/ttyUSB0", 19200)
        .parity(tokio_serial::Parity::None)
        .open_native_async()
        .unwrap();
    let rtd_state = RTDState::from_serial_stream(serial_stream, true).unwrap();
    let basketball = BasketballSport::new(rtd_state);

    loop {
        // get the underlying rtd_state to update it
        let update_result = basketball
            .rtd_state()
            .update_async()
            .await
            .unwrap();

        serde_json::to_string(&basketball); // -> Result<String, ...>
    }
}

获取原始数据缓冲区

use tokio;
use daktronics_allsport_5000::{RTDState, RTDFieldJustification};
use tokio_serial::SerialPortBuilderExt; // for open_native_async

#[tokio::main]
async fn main() {
    let serial_stream = tokio_serial::new("/dev/ttyUSB0", 19200)
        .parity(tokio_serial::Parity::None)
        .open_native_async()
        .unwrap();
    let mut rtd_state = RTDState::from_serial_stream(serial_stream, true).unwrap();

    loop {
        let update_result = rtd_state.update_async().await.unwrap();

        // do something with `rtd_state`
        rtd_state.field_str(1, 5, RTDFieldJustification::Left); // -> Result<&str, ...>
    }
}

在其他语言中...

此crate的相同概念也由@FlantasticDan在Python中实现,@JimThatcher在C#中实现,以及@fimion再次在Python中实现。实际上,此crate中的数据是从@fimion提供的PDF中提取的,所以谢谢!

如果您想将此软件包移植到另一种语言,请查看我整理的包含此软件包数据支持的Excel电子表格,位于./sports_data

低级访问

当与tokio功能一起使用时,此软件包提供了一种实现Decodertokio-util编解码器,用于从控制台串行流解码数据包。这被内部用于SerialStreamDataSource,将数据路由到RTDState

如果您不使用tokio,或者您不是使用串行流来传递数据(例如使用UDP),您必须以某种方式自己获取数据包,但在此之后,您可以使用daktronics_allsport_5000::packet::PacketTryFrom<bytes::Bytes>实现将数据包解析为可读格式。然后,您可以通过实现daktronics_allsport_5000::rtd_state::data_source::RTDStateDataSource,然后将它提供给主RTDState::new结构,提供给主RTDState结构。之后,一切工作正常。

依赖关系

~5-14MB
~159K SLoC