1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright (c) 2025-2026 (r)evolve - Revolve Team LLC
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Power Management for Peat-Lite
//!
//! Provides power-efficient radio scheduling and profile management
//! for battery-constrained BLE devices.
//!
//! ## Overview
//!
//! This module implements the power management layer that enables
//! Peat-Lite devices to achieve 20+ hour battery life on typical
//! smartwatch hardware (300mAh battery).
//!
//! ## Key Components
//!
//! - **Power Profiles**: Predefined configurations balancing latency vs battery
//! - **Radio Scheduler**: Coordinates scan, advertise, and sync activities
//! - **Battery Awareness**: Auto-adjusts profile based on battery state
//!
//! ## Architecture
//!
//! ```text
//! ┌────────────────────────────────────────────────────────┐
//! │ Application │
//! │ (sync requests, alerts) │
//! └─────────────────────┬──────────────────────────────────┘
//! │
//! ▼
//! ┌────────────────────────────────────────────────────────┐
//! │ RadioScheduler │
//! │ ┌──────────────┐ ┌────────────┐ ┌────────────────┐ │
//! │ │ PowerProfile │ │ Pending │ │ Battery │ │
//! │ │ Timing │──│ Syncs │──│ Monitor │ │
//! │ └──────────────┘ └────────────┘ └────────────────┘ │
//! └─────────────────────┬──────────────────────────────────┘
//! │
//! ▼
//! ┌────────────────────────────────────────────────────────┐
//! │ BLE Radio Hardware │
//! │ (scan, advertise, connect) │
//! └────────────────────────────────────────────────────────┘
//! ```
//!
//! ## Power Profiles
//!
//! | Profile | Duty Cycle | Battery Life | Use Case |
//! |---------|------------|--------------|----------|
//! | Aggressive | ~20% | ~6h | Emergency response |
//! | Balanced | ~10% | ~12h | Active tracking |
//! | **LowPower** | **~2%** | **~20h** | Normal operation |
//!
//! ## Usage
//!
//! ```ignore
//! use peat_btle::power::{RadioScheduler, PowerProfile, SyncPriority};
//! use peat_btle::NodeId;
//!
//! // Create scheduler with low-power profile
//! let mut scheduler = RadioScheduler::with_profile(PowerProfile::LowPower);
//!
//! // Queue a normal sync
//! scheduler.queue_sync(peer_id, SyncPriority::Normal, 100, current_time);
//!
//! // Main loop
//! loop {
//! if let Some((event, time)) = scheduler.next_event(current_time) {
//! match event {
//! SchedulerEvent::StartScan => {
//! radio.start_scan();
//! scheduler.process_event(event, current_time);
//! }
//! SchedulerEvent::SyncNow => {
//! if let Some(sync) = scheduler.next_pending_sync(current_time) {
//! perform_sync(&sync);
//! scheduler.complete_sync(current_time);
//! }
//! }
//! SchedulerEvent::EnterSleep => {
//! let sleep_time = scheduler.time_until_next_activity(current_time);
//! mcu.sleep_ms(sleep_time);
//! }
//! _ => scheduler.process_event(event, current_time),
//! }
//! }
//! }
//! ```
//!
//! ## Critical Sync
//!
//! For urgent data (SOS alerts, medical emergencies), use `SyncPriority::Critical`:
//!
//! ```ignore
//! // This bypasses normal scheduling and syncs immediately
//! scheduler.queue_sync(peer_id, SyncPriority::Critical, data_size, current_time);
//! ```
//!
//! ## Battery Auto-Adjustment
//!
//! The scheduler can automatically switch to lower power profiles as battery depletes:
//!
//! ```ignore
//! scheduler.set_auto_adjust(true);
//! scheduler.update_battery(BatteryState::new(15, false), current_time);
//! // Automatically switches from Aggressive/Balanced to LowPower
//! ```
pub use ;
pub use ;