ラップトップやタブレットのバッテリー残量や充電状態を取得します。battery クレートを使用します。
1. 依存関係の追加
src-tauri ディレクトリで以下を実行します。
cargo add battery
2. 実装コード
use battery::units::time::second;
use battery::Manager;
#[derive(serde::Serialize)]
struct BatteryStatus {
state: String, // Charging, Discharging, Full, etc
percentage: f32, // 0.0 - 100.0
time_to_full: Option<u64>, // 秒
time_to_empty: Option<u64>, // 秒
}
#[tauri::command]
fn get_battery_info() -> Result<Vec<BatteryStatus>, String> {
let manager = Manager::new().map_err(|e| e.to_string())?;
let mut results = Vec::new();
for maybe_battery in manager.batteries().map_err(|e| e.to_string())? {
if let Ok(battery) = maybe_battery {
results.push(BatteryStatus {
state: format!("{:?}", battery.state()),
percentage: battery.state_of_charge().value * 100.0,
time_to_full: battery.time_to_full().map(|t| t.get::<second>() as u64),
time_to_empty: battery.time_to_empty().map(|t| t.get::<second>() as u64),
});
}
}
Ok(results)
}
3. 変化の監視
バッテリーの状態はそれほど頻繁には変化しないため、イベントリスナで監視するよりも、定期的に(例えば 1分ごとに)ポーリングしてフロントエンドにemit するアプローチが効率的で一般的です。