Skip to main content

donglora_client/
lib.rs

1//! DongLoRa host library — connect, configure, send/receive LoRa packets.
2//!
3//! Implements the DongLoRa Protocol v2 on top of the
4//! [`donglora-protocol`](donglora_protocol) wire crate. All I/O is
5//! async via tokio; the public surface mirrors the Python client in
6//! `client-py/`.
7//!
8//! # Quick start
9//!
10//! ```no_run
11//! # async fn demo() -> Result<(), donglora_client::ClientError> {
12//! use donglora_client::{
13//!     connect, LoRaBandwidth, LoRaCodingRate, LoRaConfig, LoRaHeaderMode, Modulation,
14//! };
15//!
16//! let dongle = connect().await?;
17//! dongle.set_config(Modulation::LoRa(LoRaConfig {
18//!     freq_hz: 910_525_000,
19//!     sf: 7,
20//!     bw: LoRaBandwidth::Khz62,
21//!     cr: LoRaCodingRate::Cr4_5,
22//!     preamble_len: 16,
23//!     sync_word: 0x1424,
24//!     tx_power_dbm: 20,
25//!     header_mode: LoRaHeaderMode::Explicit,
26//!     payload_crc: true,
27//!     iq_invert: false,
28//! })).await?;
29//! dongle.tx(b"hello world").await?;
30//! # Ok(()) }
31//! ```
32//!
33//! # Module layout
34//!
35//! - [`connect`] — auto-discovery + [`ConnectOptions`] builder.
36//! - [`dongle`] — public [`Dongle`] radio session type.
37//! - [`session`] — internal async plumbing (not public).
38//! - [`transport`] — tokio-based byte-stream transports.
39//! - [`errors`] — [`ClientError`] taxonomy.
40//! - [`retry`] — [`RetryPolicy`] + [`TxOutcome`] for `tx_with_retry`.
41//! - [`discovery`] — USB VID/PID scan + async `wait_for_device`.
42
43#![forbid(unsafe_code)]
44
45pub mod connect;
46pub mod discovery;
47pub mod dongle;
48pub mod errors;
49pub mod retry;
50pub mod session;
51pub mod transport;
52
53// ── Flat re-exports for convenience ─────────────────────────────────
54
55#[cfg(unix)]
56pub use connect::mux_unix_connect;
57pub use connect::{
58    ConnectOptions, connect, connect_mux_auto, connect_mux_auto_with, connect_with, default_socket_path,
59    find_mux_socket, mux_tcp_connect, try_connect, try_connect_with,
60};
61pub use discovery::{USB_PID, USB_VID, find_port, wait_for_device};
62pub use dongle::{Dongle, KEEPALIVE_INTERVAL, TransportKind};
63pub use errors::{ClientError, ClientResult};
64pub use retry::{RetryPolicy, TxAttempt, TxOutcome};
65#[cfg(unix)]
66pub use transport::UnixSocketTransport;
67pub use transport::{AnyTransport, SerialTransport, TcpTransport, Transport};
68
69// Re-export the protocol crate's user-facing types so callers don't need
70// to add `donglora-protocol` as a direct dep.
71pub use donglora_protocol::{
72    Command, DeviceMessage, ErrorCode, FlrcBitrate, FlrcBt, FlrcCodingRate, FlrcConfig, FlrcPreambleLen, FskConfig,
73    Info, LoRaBandwidth, LoRaCodingRate, LoRaConfig, LoRaHeaderMode, LrFhssBandwidth, LrFhssCodingRate, LrFhssConfig,
74    LrFhssGrid, Modulation, ModulationId, OkPayload, Owner, RadioChipId, RxOrigin, RxPayload, SetConfigResult,
75    SetConfigResultCode, TxDonePayload, TxFlags, TxResult, cap,
76};