This commit is contained in:
Robin Appelman 2024-02-18 17:05:48 +01:00
commit 6f80d51daf
6 changed files with 599 additions and 13 deletions

436
Cargo.lock generated
View file

@ -2,6 +2,21 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "addr2line"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "1.1.2"
@ -11,6 +26,27 @@ dependencies = [
"memchr",
]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "backtrace"
version = "0.3.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "bitflags"
version = "1.3.2"
@ -43,6 +79,21 @@ dependencies = [
"syn",
]
[[package]]
name = "bytes"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
[[package]]
name = "cc"
version = "1.0.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
dependencies = [
"libc",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
@ -68,8 +119,120 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b03facd2b544d24916f312a6026c1b548b8af012f788a554d498afdc8ef9c775"
dependencies = [
"embedded-io",
"embedded-io-async",
"tokio",
]
[[package]]
name = "embedded-io-async"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f"
dependencies = [
"embedded-io",
]
[[package]]
name = "futures"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
dependencies = [
"futures-channel",
"futures-core",
"futures-executor",
"futures-io",
"futures-sink",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-channel"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
dependencies = [
"futures-core",
"futures-sink",
]
[[package]]
name = "futures-core"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
[[package]]
name = "futures-executor"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
dependencies = [
"futures-core",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-io"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
[[package]]
name = "futures-macro"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "futures-sink"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
[[package]]
name = "futures-task"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-util"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-macro",
"futures-sink",
"futures-task",
"memchr",
"pin-project-lite",
"pin-utils",
"slab",
]
[[package]]
name = "gimli"
version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "hermit-abi"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd"
[[package]]
name = "hlk_ld6002"
version = "0.1.0"
@ -77,9 +240,12 @@ dependencies = [
"bytemuck",
"embedded-io",
"embedded-io-adapters",
"embedded-io-async",
"num_enum",
"serialport",
"termion",
"tokio",
"tokio-serial",
]
[[package]]
@ -129,6 +295,22 @@ dependencies = [
"pkg-config",
]
[[package]]
name = "lock_api"
version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
dependencies = [
"autocfg",
"scopeguard",
]
[[package]]
name = "log"
version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
[[package]]
name = "mach2"
version = "0.4.1"
@ -144,6 +326,49 @@ version = "2.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
[[package]]
name = "memoffset"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
dependencies = [
"autocfg",
]
[[package]]
name = "miniz_oxide"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
dependencies = [
"adler",
]
[[package]]
name = "mio"
version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
dependencies = [
"libc",
"log",
"wasi",
"windows-sys",
]
[[package]]
name = "mio-serial"
version = "5.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20a4c60ca5c9c0e114b3bd66ff4aa5f9b2b175442be51ca6c4365d687a97a2ac"
dependencies = [
"log",
"mio",
"nix",
"serialport",
"winapi",
]
[[package]]
name = "nix"
version = "0.26.4"
@ -153,6 +378,18 @@ dependencies = [
"bitflags 1.3.2",
"cfg-if",
"libc",
"memoffset",
"pin-utils",
]
[[package]]
name = "num_cpus"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
@ -181,6 +418,50 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
[[package]]
name = "object"
version = "0.32.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
dependencies = [
"memchr",
]
[[package]]
name = "parking_lot"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-targets",
]
[[package]]
name = "pin-project-lite"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
[[package]]
name = "pin-utils"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
version = "0.3.27"
@ -249,6 +530,12 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "rustc-demangle"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "scopeguard"
version = "1.2.0"
@ -274,6 +561,40 @@ dependencies = [
"winapi",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
dependencies = [
"libc",
]
[[package]]
name = "slab"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
dependencies = [
"autocfg",
]
[[package]]
name = "smallvec"
version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
[[package]]
name = "socket2"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "syn"
version = "2.0.39"
@ -317,6 +638,49 @@ dependencies = [
"syn",
]
[[package]]
name = "tokio"
version = "1.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"num_cpus",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
"socket2",
"tokio-macros",
"windows-sys",
]
[[package]]
name = "tokio-macros"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tokio-serial"
version = "5.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa6e2e4cf0520a99c5f87d5abb24172b5bd220de57c3181baaaa5440540c64aa"
dependencies = [
"cfg-if",
"futures",
"log",
"mio-serial",
"tokio",
]
[[package]]
name = "unescaper"
version = "0.1.4"
@ -332,6 +696,12 @@ version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "winapi"
version = "0.3.9"
@ -353,3 +723,69 @@ name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"

View file

@ -7,9 +7,12 @@ description = "A library for interfacing with the HLK-LD6002 respiratory and hea
[dependencies]
bytemuck = { version = "1.14.3", features = ["derive"] }
embedded-io = "0.6.1"
embedded-io-async = "0.6.1"
num_enum = { version = "0.7.2", default-features = false }
[dev-dependencies]
embedded-io-adapters = { version = "0.6.1", features = ["std"] }
embedded-io-adapters = { version = "0.6.1", features = ["std", "tokio-1"] }
serialport = "4.3.0"
termion = "3.0.0"
tokio = { version = "1.36.0", features = ["full"] }
tokio-serial = "5.4.4"

35
examples/async.rs Normal file
View file

@ -0,0 +1,35 @@
use embedded_io_adapters::tokio_1::FromTokio;
use hlk_ld6002::{AsyncMessageStream, Data};
use serialport::SerialPort;
use std::env::args;
use std::time::{Duration, Instant};
use tokio_serial::{ClearBuffer, SerialPortBuilderExt};
#[tokio::main]
async fn main() {
let port = args().nth(1).expect("no port provided");
let port = tokio_serial::new(&port, 1_382_400)
.timeout(Duration::from_millis(50))
.open_native_async()
.expect("Failed to open port");
port.clear(ClearBuffer::All).unwrap();
let mut messages = AsyncMessageStream::new(FromTokio::new(port));
let mut data = Data::default();
let mut last = Instant::now();
print!("{}", termion::cursor::Save);
loop {
let message = messages.next().await;
if let Ok(message) = message {
data.update(message);
if last.elapsed() > Duration::from_millis(100) {
last = Instant::now();
print!("{:?}{}", data, termion::cursor::Restore);
}
}
}
}

26
flake.lock generated
View file

@ -36,7 +36,31 @@
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
"nixpkgs": "nixpkgs",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"flake-utils": [
"flake-utils"
],
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1708241671,
"narHash": "sha256-zSulX9tP4R35Y8A842dGSzaHMVP91W2Ry0SXvQKD2BQ=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "d500e370b26f9b14303cb39bf1509df0a920c8b0",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"systems": {

View file

@ -2,20 +2,28 @@
inputs = {
nixpkgs.url = "nixpkgs/nixos-23.11";
flake-utils.url = "github:numtide/flake-utils";
rust-overlay.url = "github:oxalica/rust-overlay";
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
rust-overlay.inputs.flake-utils.follows = "flake-utils";
};
outputs = {
self,
nixpkgs,
flake-utils,
rust-overlay,
}:
flake-utils.lib.eachDefaultSystem (
system: let
overlays = [
(import rust-overlay)
];
pkgs = (import nixpkgs) {
inherit system;
inherit system overlays;
};
toolchain = pkgs.rust-bin.stable.latest.default;
dependencies = with pkgs; [pkg-config udev];
tools = with pkgs; [rustc cargo bacon cargo-edit cargo-outdated clippy cargo-audit];
tools = with pkgs; [toolchain bacon cargo-edit cargo-outdated cargo-audit];
in rec {
devShell = pkgs.mkShell {
nativeBuildInputs = dependencies ++ tools;

View file

@ -2,6 +2,7 @@
use bytemuck::{cast, cast_slice};
use embedded_io::{Error, Read, ReadExactError};
use embedded_io_async::Read as AsyncRead;
use num_enum::TryFromPrimitive;
#[derive(Debug)]
@ -69,11 +70,8 @@ struct FrameHeader {
}
impl FrameHeader {
pub fn read<R: Read>(mut reader: R) -> Result<Self, LdError<R::Error>> {
let mut header_bytes = [0; 7];
reader.read_exact(&mut header_bytes)?;
let ty = u16::from_be_bytes([header_bytes[4], header_bytes[5]]);
pub fn parse<E>(data: [u8; 7]) -> Result<Self, LdError<E>> {
let ty = u16::from_be_bytes([data[4], data[5]]);
let ty = MessageType::try_from(ty).map_err(|e| LdError::InvalidMessageType(e.number))?;
// let checksum = checksum(&header_bytes);
@ -86,11 +84,25 @@ impl FrameHeader {
// }
Ok(FrameHeader {
_id: u16::from_be_bytes([header_bytes[0], header_bytes[1]]),
length: u16::from_be_bytes([header_bytes[2], header_bytes[3]]),
_id: u16::from_be_bytes([data[0], data[1]]),
length: u16::from_be_bytes([data[2], data[3]]),
ty,
})
}
pub fn read<R: Read>(mut reader: R) -> Result<Self, LdError<R::Error>> {
let mut header_bytes = [0; 7];
reader.read_exact(&mut header_bytes)?;
Self::parse(header_bytes)
}
pub async fn read_async<R: AsyncRead>(mut reader: R) -> Result<Self, LdError<R::Error>> {
let mut header_bytes = [0; 7];
reader.read_exact(&mut header_bytes).await?;
Self::parse(header_bytes)
}
}
#[derive(Clone, Debug)]
@ -125,6 +137,31 @@ impl Frame {
Ok(Frame { header, data })
}
pub async fn read_async<R: AsyncRead>(mut reader: R) -> Result<Self, LdError<R::Error>> {
let mut magic = [0];
reader.read_exact(&mut magic).await?;
if magic[0] != 1 {
return Err(LdError::InvalidFrameStart(magic[0]));
}
let header = FrameHeader::read_async(&mut reader).await?;
let data = FrameData::read_async(&mut reader, &header).await?;
let mut data_checksum = [0];
reader.read_exact(&mut data_checksum).await?;
let data_checksum = data_checksum[0];
let calculated_checksum = checksum(data.as_ref());
if data_checksum != calculated_checksum {
return Err(LdError::InvalidChecksum {
ty: "body",
got: calculated_checksum,
expected: data_checksum,
});
};
Ok(Frame { header, data })
}
}
#[derive(Debug, Clone)]
@ -139,14 +176,20 @@ impl<const N: usize> FrameData<N> {
self.len
}
pub fn read<R: Read>(mut reader: R, header: &FrameHeader) -> Result<Self, LdError<R::Error>> {
fn validate<E>(header: &FrameHeader) -> Result<(), LdError<E>> {
if header.length as usize > N || header.length != header.ty.expected_length() {
return Err(LdError::InvalidDataLength {
got: header.length,
expected: header.ty.expected_length(),
ty: header.ty,
});
} else {
Ok(())
}
}
pub fn read<R: Read>(mut reader: R, header: &FrameHeader) -> Result<Self, LdError<R::Error>> {
Self::validate(header)?;
let mut data = [0u8; N];
reader.read_exact(&mut data[0..header.length as usize])?;
@ -157,6 +200,24 @@ impl<const N: usize> FrameData<N> {
len: header.length,
})
}
pub async fn read_async<R: AsyncRead>(
mut reader: R,
header: &FrameHeader,
) -> Result<Self, LdError<R::Error>> {
Self::validate(header)?;
let mut data = [0u8; N];
reader
.read_exact(&mut data[0..header.length as usize])
.await?;
Ok(FrameData {
_align: 0,
data,
len: header.length,
})
}
}
impl<const N: usize> AsRef<[u8]> for FrameData<N> {
@ -231,6 +292,25 @@ impl<R: Read> Iterator for MessageStream<R> {
}
}
pub struct AsyncMessageStream<R> {
reader: R,
}
impl<R: AsyncRead> AsyncMessageStream<R> {
pub fn new(reader: R) -> Self {
Self { reader }
}
async fn read(&mut self) -> Result<Frame, LdError<R::Error>> {
Frame::read_async(&mut self.reader).await
}
pub async fn next(&mut self) -> Result<MessageBody, LdError<R::Error>> {
let frame = self.read().await?;
frame.body()
}
}
#[derive(Default, Debug, Copy, Clone)]
pub struct Data {
respiratory: f32,