aprs/
lib.rs

1//! APRS (Automatic Packet Reporting System) protocol stack.
2//!
3//! This crate provides a std-only, sans-io implementation of the APRS
4//! protocol over AX.25, including the core stateful algorithms used by
5//! real APRS clients: digipeater path handling, `SmartBeaconing`, messaging
6//! ack/rej tracking, and heard-station lists.
7//!
8//! # Scope
9//!
10//! - APRS 1.0.1 / 1.2 info-field parsing: position (compressed and
11//!   uncompressed), Mic-E, messages, status, weather, telemetry,
12//!   items, objects, queries.
13//! - Builders for constructing outgoing info fields.
14//! - Stateful algorithms: [`DigipeaterConfig`] (with 30s dup cache and
15//!   viscous delay), [`SmartBeaconing`] (`HamHUD` formula), [`AprsMessenger`]
16//!   (ack/rej + retry), [`StationList`] (heard-station DB with expiry).
17//!
18//! # Time handling
19//!
20//! This crate is sans-io and never calls `std::time::Instant::now()`.
21//! Every stateful method accepts a `now: Instant` parameter; callers
22//! in the tokio shell layer (e.g. `kenwood-thd75::aprs::AprsClient`)
23//! read the wall clock once per iteration and thread it down.
24//!
25//! # References
26//!
27//! - APRS 1.0.1: <http://www.aprs.org/doc/APRS101.PDF>
28//! - APRS 1.2: <http://www.aprs.org/aprs12.html>
29
30mod build;
31mod digipeater;
32mod error;
33mod item;
34mod message;
35mod messenger;
36mod mic_e;
37mod packet;
38mod position;
39mod smart_beaconing;
40mod station_list;
41mod status;
42mod telemetry;
43mod units;
44mod weather;
45
46pub use build::{
47    build_aprs_item, build_aprs_item_packet, build_aprs_message, build_aprs_message_checked,
48    build_aprs_message_packet, build_aprs_mice, build_aprs_mice_with_message,
49    build_aprs_mice_with_message_packet, build_aprs_object, build_aprs_object_with_timestamp,
50    build_aprs_object_with_timestamp_packet, build_aprs_position_compressed,
51    build_aprs_position_compressed_packet, build_aprs_position_report,
52    build_aprs_position_report_packet, build_aprs_position_weather,
53    build_aprs_position_weather_packet, build_aprs_status, build_aprs_status_packet,
54    build_aprs_weather, build_aprs_weather_packet, build_query_response_position,
55};
56pub use digipeater::{
57    DEFAULT_DEDUP_TTL, DEFAULT_VISCOUS_DELAY, DigiAction, DigipeaterAlias, DigipeaterConfig,
58};
59pub use error::AprsError;
60pub use item::{
61    AprsItem, AprsObject, AprsQuery, parse_aprs_item, parse_aprs_object, parse_aprs_query,
62};
63pub use message::{AprsMessage, MAX_APRS_MESSAGE_TEXT_LEN, classify_ack_rej, parse_aprs_message};
64pub use messenger::{
65    AprsMessenger, INCOMING_DEDUP_WINDOW, MAX_RETRIES, MessengerConfig, RETRY_INTERVAL,
66};
67pub use mic_e::{MiceMessage, mice_message_bits, parse_aprs_data_full, parse_mice_position};
68pub use packet::{
69    AprsData, AprsDataExtension, AprsPacket, AprsTimestamp, MessageKind, ParseContext, Phg,
70    PositionAmbiguity, TelemetryDefinition, TelemetryParameters, parse_aprs_data,
71    parse_aprs_extensions,
72};
73pub use position::{
74    AprsPosition, decode_base91_4, parse_aprs_position, parse_compressed_body,
75    parse_uncompressed_body,
76};
77pub use smart_beaconing::{BeaconReason, BeaconState, SmartBeaconing, SmartBeaconingConfig};
78pub use station_list::{StationEntry, StationList};
79pub use status::{AprsStatus, parse_aprs_status};
80pub use telemetry::{AprsTelemetry, parse_aprs_telemetry};
81pub use units::{
82    AprsSymbol, Course, Fahrenheit, Latitude, Longitude, MessageId, Speed, SymbolTable, Tocall,
83};
84pub use weather::{AprsWeather, extract_position_weather, parse_aprs_weather_positionless};
85
86// `proptest` is a dev-dependency used only in the integration test
87// suites. Acknowledge it here to keep `-D unused-crate-dependencies`
88// happy when the lib test crate compiles with dev-deps in scope.
89#[cfg(test)]
90use proptest as _;