[feat] power plan get and set completed

This commit is contained in:
Purp1e
2025-03-22 21:06:20 +08:00
parent ff6113085a
commit 446b26f186
5 changed files with 93 additions and 54 deletions

View File

@@ -49,7 +49,7 @@ pub fn open_path(path: &str) -> Result<(), String> {
}
#[tauri::command]
pub fn get_powerplan() -> Result<String, String> {
pub fn get_powerplan() -> Result<i32, String> {
#[cfg(target_os = "windows")]
let powerplan = powerplan::get_powerplan()?;
@@ -57,11 +57,11 @@ pub fn get_powerplan() -> Result<String, String> {
}
#[tauri::command]
pub fn set_powerplan(plan: &str) -> Result<String, String> {
pub fn set_powerplan(plan: i32) -> Result<(), String> {
#[cfg(target_os = "windows")]
powerplan::set_powerplan(plan)?;
Ok(format!("Set powerplan to {}", plan))
Ok(())
}
// TODO watch_steam_users

View File

@@ -8,16 +8,31 @@ pub struct PowerPlan {
impl PowerPlan {
pub fn new() -> Self {
let mut power_plan_map = HashMap::new();
power_plan_map.insert(PowerPlanMode::PowerSaving as i32, "a1841308-3541-4fab-bc81-f71556f20b4a".to_string());
power_plan_map.insert(PowerPlanMode::Balanced as i32, "381b4222-f694-41f0-9685-ff5bb260df2e".to_string());
power_plan_map.insert(PowerPlanMode::HighPerformance as i32, "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c".to_string());
power_plan_map.insert(PowerPlanMode::Extreme as i32, "e9a42b02-d5df-448d-aa00-03f14749eb61".to_string());
power_plan_map.insert(
PowerPlanMode::PowerSaving as i32,
"a1841308-3541-4fab-bc81-f71556f20b4a".to_string(),
);
power_plan_map.insert(
PowerPlanMode::Balanced as i32,
"381b4222-f694-41f0-9685-ff5bb260df2e".to_string(),
);
power_plan_map.insert(
PowerPlanMode::HighPerformance as i32,
"8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c".to_string(),
);
power_plan_map.insert(
PowerPlanMode::Extreme as i32,
"e9a42b02-d5df-448d-aa00-03f14749eb61".to_string(),
);
PowerPlan { power_plan_map }
}
pub fn set(&self, mode: i32) -> Result<(), String> {
let guid = self.power_plan_map.get(&mode).ok_or("Invalid power plan number (expect from 1 to 4)")?;
let guid = self
.power_plan_map
.get(&mode)
.ok_or("Invalid power plan number (expect from 1 to 4)")?;
let output = Command::new("powercfg")
.arg("/S")
@@ -26,7 +41,10 @@ impl PowerPlan {
.map_err(|e| format!("Failed to execute powercfg command: {}", e))?;
if !output.status.success() {
return Err(format!("Powercfg command failed: {}", String::from_utf8_lossy(&output.stderr)));
return Err(format!(
"Powercfg command failed: {}",
String::from_utf8_lossy(&output.stderr)
));
}
Ok(())
@@ -42,8 +60,13 @@ impl PowerPlan {
let re = regex::Regex::new(r"GUID:\s+(\S+)\s+\(\S+\)\s+\*")
.map_err(|e| format!("Failed to compile regex: {}", e))?;
let res = re.captures(&output_str).ok_or("No matching power plan found")?;
let guid = res.get(1).ok_or("No GUID found in power plan output")?.as_str();
let res = re
.captures(&output_str)
.ok_or("No matching power plan found")?;
let guid = res
.get(1)
.ok_or("No GUID found in power plan output")?
.as_str();
for (k, v) in &self.power_plan_map {
if guid == v {
@@ -64,17 +87,19 @@ pub enum PowerPlanMode {
Extreme = 4,
}
pub fn get_powerplan() -> Result<String, String> {
pub fn get_powerplan() -> Result<i32, String> {
let power_plan = PowerPlan::new();
let mode = power_plan.get()?;
Ok(mode.to_string())
Ok(mode)
}
pub fn set_powerplan(plan: &str) -> Result<String, String> {
let mode: i32 = plan.parse().map_err(|_| "Invalid power plan number")?;
pub fn set_powerplan(plan: i32) -> Result<(), String> {
if plan < 0 || plan > 4 {
return Err("Invalid power plan mode".to_string());
}
let power_plan = PowerPlan::new();
power_plan.set(mode)?;
Ok("Power plan set successfully".to_string())
power_plan.set(plan)?;
Ok(())
}
#[cfg(test)]
@@ -103,7 +128,10 @@ mod tests {
// 验证返回的模式是否在有效范围内
let mode = result.unwrap();
assert!((1..=4).contains(&mode), "Invalid power plan mode returned");
println!("Mode: {} - {}", mode, PowerPlan::new().power_plan_map[&mode]);
println!(
"Mode: {} - {}",
mode,
PowerPlan::new().power_plan_map[&mode]
);
}
}
}