#射电天文学 #望远镜 #协议 #天文学

psrdada

psrdada射电天文学库的Rust封装

9 个版本

0.4.0 2024年3月18日
0.3.0 2023年2月7日
0.2.4 2022年11月15日
0.2.0 2022年8月13日
0.1.1 2022年8月13日

#504 in 解析器实现

Apache-2.0 OR MIT

69KB
1K SLoC

psrdada-rs

license docs rustc build status Codecov

这是一个围绕在射电天文学中常用的psrdada库的Rust库。不幸的是,C库大部分没有文档,因此这个Rust库所展示的行为是作者通过阅读原始示例代码所能确定的。因此,这可能不是原始用例的1对1实现,并且只实现了C库中可用功能的一个子集。

安装

您需要手动构建和安装PSRDADA,请按照以下指南进行操作。或者,您可以使用以下nix flake 链接声明性地创建包含PSRDADA的环境(shell/docker容器/操作系统)。

安全性

原始库本质上是不可靠的,因为它是用C编写的,而且用户使用它的正确性检查非常少。这个库试图在编译时确保C库在运行时检查的一些事情。例如,如果您试图在另一个东西正在尝试读取时写入缓冲区,这通常会导致锁定失败。相反,在这个库中,我们使用Rust的借用系统来确保您不能同时构建两个。对于读写块也是如此。一旦您将它们标记为清除,就不能再引用这些块。

这比C库(以及在某种程度上C++库,因为它们尝试实现一些RAII模式)有巨大的用户体验改进。

以下代码为例

use psrdada::prelude::*;
use std::io::{Read, Write};

// Build the paired client
let key = 0xb0ba;
let mut client = DadaClientBuilder::new(key).build().unwrap();

// Split into individual clients
let (_, mut data_client) = client.split();

// Construct the writer (mutable borrow), panicking if a lock is not obtainable
let mut writer = data_client.writer().unwrap();

// Grab the next block in the ring (assuming we can)
let mut write_block = writer.next().unwrap();

// Write using std::io::Write so you can write chunks at a time
write_block.write_all(&[0u8; 10]).unwrap();

// Inform the backend that we've completed writing
write_block.commit();

// Drop the writer to unlock it (this would happen also when the writer leaves scope)
drop(writer);

// Construct the reader (mutable borrow), panicking if a lock is not obtainable
let mut reader = data_client.reader().unwrap();

// Grab the next read block in the ring
let mut read_block = reader.next().unwrap();

// Read using std::io::Read
let mut buf = [0u8; 10];
read_block.read_exact(&mut buf).unwrap();

如果没有那行 write_block.commit(),此代码将无法编译,因为仍然存在正在进行的写入。此外,您只能拆分一次,因此每种类型都只有一个读取器和写入器。

请参阅示例以获取更多用例。

谢谢

大部分实现灵感来自其他PSRDADA的“现代”封装,特别是PSRDADA_CPP

许可协议

psrdada-rs根据MIT许可协议和Apache许可协议(版本2.0)进行分发。

请参阅LICENSE-APACHELICENSE-MIT获取详细信息。

依赖关系

~1.2–3.5MB
~61K SLoC