Skip to main content

Module power

Module power 

Source
Expand description

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

┌────────────────────────────────────────────────────────┐
│                    Application                          │
│              (sync requests, alerts)                    │
└─────────────────────┬──────────────────────────────────┘
                      │
                      ▼
┌────────────────────────────────────────────────────────┐
│                 RadioScheduler                          │
│  ┌──────────────┐  ┌────────────┐  ┌────────────────┐  │
│  │ PowerProfile │  │   Pending  │  │   Battery      │  │
│  │   Timing     │──│   Syncs    │──│   Monitor      │  │
│  └──────────────┘  └────────────┘  └────────────────┘  │
└─────────────────────┬──────────────────────────────────┘
                      │
                      ▼
┌────────────────────────────────────────────────────────┐
│              BLE Radio Hardware                         │
│         (scan, advertise, connect)                      │
└────────────────────────────────────────────────────────┘

§Power Profiles

ProfileDuty CycleBattery LifeUse Case
Aggressive~20%~6hEmergency response
Balanced~10%~12hActive tracking
LowPower~2%~20hNormal operation

§Usage

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:

// 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:

scheduler.set_auto_adjust(true);
scheduler.update_battery(BatteryState::new(15, false), current_time);
// Automatically switches from Aggressive/Balanced to LowPower

Re-exports§

pub use profile::BatteryState;
pub use profile::PowerProfile;
pub use profile::RadioTiming;
pub use scheduler::PendingSync;
pub use scheduler::RadioScheduler;
pub use scheduler::RadioState;
pub use scheduler::SchedulerConfig;
pub use scheduler::SchedulerEvent;
pub use scheduler::SchedulerStats;
pub use scheduler::SyncPriority;

Modules§

profile
Power Profiles for Peat-Lite
scheduler
Radio Scheduler for Peat-Lite