7 个版本 (稳定)
3.2.0 | 2023年12月4日 |
---|---|
3.0.1 | 2023年6月9日 |
3.0.0 | 2023年5月2日 |
2.0.0 | 2023年3月15日 |
0.1.0 | 2022年12月14日 |
#1558 在 网络编程 中
每月32 次下载
135KB
3.5K SLoC
indi
此crate提供了对用于控制天文设备的网络接口的Instrument Neutral Distributed Interface (INDI)网络协议的支持。有关INDI的更多信息,请参阅项目网站 https://www.indilib.org/index.html。
有关文档,请参阅: https://docs.rs/indi/
贡献
欢迎贡献。
一般来说,我们遵循“分支和拉取”Git工作流程。
- 在GitHub上 分支repo
- 克隆 项目到您的机器上
- 提交 改变到您的分支
- 推送到 您的分支到您的分支
- 提交一个 拉取请求 以便我们可以审查您的更改
注意:在提交拉取请求之前,请务必合并“上游”的最新更改!
lib.rs
:
一个用于与INDI协议交互的通用库。
Instrument Neutral Distributed Interface (INDI,简称) 协议是一种类似于XML的通讯协议,在天文社区中用于控制和监控天文设备。有关INDI的更多信息,请参阅项目的网站 此处。
此crate的目的是提供一种方便的方式与设备使用INDI协议交互。有关协议的详细信息,请参阅 此处。
快速入门
先决条件
要编译此crate,您必须首先安装libcfitsio库。对于基于debian的Linux发行版,可以通过运行以下命令来满足此要求:
$ sudo apt install libcfitsio-dev
完成上述步骤后,您应能够使用cargo安装此crate。
简单用法。
使用此crate最简单的方法是打开一个 TcpStream 并读取/写入INDI 命令。
示例
use std::net::TcpStream;
use indi::client::ClientConnection;
fn main() {
// Connect to local INDI server.
let connection = TcpStream::connect("127.0.0.1:7624").expect("Connecting to INDI server");
// Write command to server instructing it to track all properties.
connection.write(&indi::serialization::GetProperties {
version: indi::INDI_PROTOCOL_VERSION.to_string(),
device: None,
name: None,
})
.expect("Sending GetProperties command");
// Loop through commands recieved from the INDI server
for command in connection.iter().expect("Creating iterator over commands") {
println!("Received from server: {:?}", command);
}
}
使用客户端接口
上述简单用法有其用途,但如果你想在INDI服务器上跟踪和修改设备状态,建议使用客户端接口。客户端允许你获取设备,当这些设备发生变化时通知你,并请求更改。
示例
use std::time::Duration;
use std::net::TcpStream;
#[tokio::main]
async fn main() {
// Create a client with a connection to localhost listening for all device properties.
let client = indi::client::new(
TcpStream::connect("127.0.0.1:7624").expect("Connecting to INDI server"),
None,
None).expect("Initializing connection");
// Get an specific camera device
let camera = client
.get_device::<()>("ZWO CCD ASI294MM Pro")
.await
.expect("Getting camera device");
// Setting the 'CONNECTION' parameter to `on` to ensure the indi device is connected.
camera
.change("CONNECTION", vec![("CONNECT", true)])
.await
.expect("Connecting to camera");
// Enabling blob transport for the camera.
camera
.enable_blob(Some("CCD1"), indi::BlobEnable::Also)
.await
.expect("Enabling image retrieval");
// Configuring a varienty of the camera's properties at the same time.
tokio::try_join!(
camera.change("CCD_CAPTURE_FORMAT", vec![("ASI_IMG_RAW16", true)]),
camera.change("CCD_TRANSFER_FORMAT", vec![("FORMAT_FITS", true)]),
camera.change("CCD_CONTROLS", vec![("Offset", 10.0), ("Gain", 240.0)]),
camera.change("FITS_HEADER", vec![("FITS_OBJECT", "")]),
camera.change("CCD_BINNING", vec![("HOR_BIN", 2.0), ("VER_BIN", 2.0)]),
camera.change("CCD_FRAME_TYPE", vec![("FRAME_FLAT", true)]),
)
.expect("Configuring camera");
// Capture a 5 second exposure from the camera
let fits = camera.capture_image(Duration::from_secs(5)).await.expect("Capturing image");
// Save the fits file to disk.
fits.save("flat.fits").expect("Saving image");
}
依赖项
~24–32MB
~461K SLoC