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次下载
365KB
17K SLoC
达科龙全运动5000 for Rust
达科龙全运动5000的串行输出的解码器Rust实现。
请参阅文档。
如果您使用此crate:请通过创建GitHub讨论告诉我您的使用案例!这也可以让我知道其他人是否对此crate感兴趣并认为它有用。
高级访问
使用 RTDState
的 RTDState::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
功能一起使用时,此软件包提供了一种实现Decoder
的tokio-util
编解码器,用于从控制台串行流解码数据包。这被内部用于SerialStreamDataSource
,将数据路由到RTDState
。
如果您不使用tokio
,或者您不是使用串行流来传递数据(例如使用UDP),您必须以某种方式自己获取数据包,但在此之后,您可以使用daktronics_allsport_5000::packet::Packet
的TryFrom<bytes::Bytes>
实现将数据包解析为可读格式。然后,您可以通过实现daktronics_allsport_5000::rtd_state::data_source::RTDStateDataSource
,然后将它提供给主RTDState::new
结构,提供给主RTDState
结构。之后,一切工作正常。
依赖关系
~5-14MB
~159K SLoC