Skip to main content

peat_btle/mesh/
mod.rs

1// Copyright (c) 2025-2026 (r)evolve - Revolve Team LLC
2// SPDX-License-Identifier: Apache-2.0
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//     http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16//! Mesh Topology Management
17//!
18//! This module provides mesh topology management for PEAT-BTLE, including:
19//!
20//! - **Topology tracking**: Parent/child/peer relationships
21//! - **Connection management**: Connect, disconnect, failover
22//! - **Message routing**: Upward aggregation, downward dissemination
23//! - **RSSI-based selection**: Best parent/peer selection
24//!
25//! ## Architecture
26//!
27//! ```text
28//! ┌─────────────────────────────────────────────────────────┐
29//! │                    MeshManager                           │
30//! │  ┌─────────────┐  ┌─────────────┐  ┌─────────────────┐  │
31//! │  │  Topology   │  │   Router    │  │  Parent Failover │  │
32//! │  │   State     │  │             │  │                  │  │
33//! │  └─────────────┘  └─────────────┘  └─────────────────┘  │
34//! └─────────────────────────────────────────────────────────┘
35//!                          │
36//!                          ▼
37//!            ┌──────────────────────────────┐
38//!            │     TopologyEvents           │
39//!            │  • ParentConnected           │
40//!            │  • ChildConnected            │
41//!            │  • TopologyChanged           │
42//!            └──────────────────────────────┘
43//! ```
44//!
45//! ## Usage
46//!
47//! ```ignore
48//! use peat_btle::mesh::{MeshManager, TopologyConfig, TopologyEvent};
49//! use peat_btle::{NodeId, HierarchyLevel};
50//!
51//! // Create mesh manager
52//! let manager = MeshManager::new(
53//!     NodeId::new(0x12345678),
54//!     HierarchyLevel::Platform,
55//!     TopologyConfig::default(),
56//! );
57//!
58//! // Register for topology events
59//! manager.on_topology_event(Box::new(|event| {
60//!     match event {
61//!         TopologyEvent::ParentConnected { node_id, .. } => {
62//!             println!("Connected to parent: {}", node_id);
63//!         }
64//!         _ => {}
65//!     }
66//! }));
67//!
68//! // Start the manager
69//! manager.start()?;
70//!
71//! // Process discovered beacons
72//! manager.process_beacon(&beacon, rssi);
73//!
74//! // Select and connect to best parent
75//! if let Some(candidate) = manager.select_best_parent() {
76//!     manager.connect_parent(candidate.node_id, candidate.level, candidate.rssi)?;
77//! }
78//! ```
79//!
80//! ## Parent Failover
81//!
82//! When parent connection is lost:
83//!
84//! 1. `start_failover()` is called
85//! 2. Manager enters `Failover` state
86//! 3. `ParentFailoverStarted` event is emitted
87//! 4. Application scans for new parent candidates
88//! 5. `complete_failover()` connects to new parent (or gives up)
89//! 6. `ParentFailoverCompleted` event is emitted
90//!
91//! ## Message Routing
92//!
93//! The `MeshRouter` provides routing decisions:
94//!
95//! - **Upward**: To parent (aggregation)
96//! - **Downward**: To children (dissemination)
97//! - **Broadcast**: To all connected peers
98//! - **Targeted**: To a specific node
99//!
100//! ```ignore
101//! use peat_btle::mesh::{MeshRouter, RouteDirection};
102//!
103//! let router = MeshRouter::new(node_id, my_level);
104//! let topology = manager.topology();
105//!
106//! let decision = router.route(RouteDirection::Upward, &topology);
107//! if decision.routed {
108//!     for next_hop in decision.next_hops {
109//!         send_to(&next_hop, &message);
110//!     }
111//! }
112//! ```
113
114#[cfg(feature = "std")]
115mod manager;
116mod routing;
117mod topology;
118
119#[cfg(feature = "std")]
120pub use manager::{ManagerState, MeshManager, TopologyCallback};
121pub use routing::{HopTracker, MeshRouter, RouteDecision, RouteDirection, RouteFailure};
122pub use topology::{
123    ConnectionState, DisconnectReason, MeshTopology, ParentCandidate, PeerInfo, PeerRole,
124    TopologyConfig, TopologyEvent,
125};