Skip to content

Commit

Permalink
Code refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
SebastianBecker2 committed May 25, 2024
1 parent 1d44933 commit cb3550f
Show file tree
Hide file tree
Showing 10 changed files with 556 additions and 549 deletions.
6 changes: 6 additions & 0 deletions PowerPlanSwitcher/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
<setting name="CycleOnlyVisible" serializeAs="String">
<value>False</value>
</setting>
<setting name="AcPowerSchemeGuid" serializeAs="String">
<value>00000000-0000-0000-0000-000000000000</value>
</setting>
<setting name="BatterPowerSchemeGuid" serializeAs="String">
<value>00000000-0000-0000-0000-000000000000</value>
</setting>
</PowerPlanSwitcher.Properties.Settings>
</userSettings>
</configuration>
138 changes: 64 additions & 74 deletions PowerPlanSwitcher/BatteryMonitor.cs
Original file line number Diff line number Diff line change
@@ -1,90 +1,80 @@
namespace PowerPlanSwitcher
namespace PowerPlanSwitcher
{
using System.Runtime.InteropServices;

using PowerPlanSwitcher.Properties;
using static Vanara.PInvoke.Kernel32;

public class BatteryMonitor
{
// 定义SYSTEM_POWER_STATUS结构体
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_POWER_STATUS
{
public byte ACLineStatus; // AC 电源线状态:0 表示离线(电池供电),1 表示在线(插电)
public byte BatteryFlag; // 电池标志
public byte BatteryLifePercent; // 电池剩余百分比
public byte Reserved1; // 保留
public int BatteryLifeTime; // 电池剩余时间(以秒为单位)
public int BatteryFullLifeTime; // 电池满电使用时间(以秒为单位)
}

// 引入GetSystemPowerStatus函数
[DllImport("kernel32.dll")] //和GetSystemPowerStatus有关
private static extern bool GetSystemPowerStatus(out SYSTEM_POWER_STATUS lpSystemPowerStatus);
private static bool ToggleMark = true; // 切换标记
// private static PowerRule ACListData;
// private static PowerRule BatteryListData;
private static Guid? BatteryGuid; // 电池供电时的电源计划GUID
private static Guid? AcPowerGuid; // 插电时的电源计划GUID
public static PowerStatus BatteryNull;
private static SYSTEM_POWER_STATUS powerStatus;

public static void PlanValue()
private static Guid AcPowerSchemeGuid =>
Settings.Default.AcPowerSchemeGuid;
private static Guid BatterPowerSchemeGuid =>
Settings.Default.BatterPowerSchemeGuid;

private static bool toggleMark = true;

public static bool HasSystemBattery() =>
SystemInformation.PowerStatus.BatteryChargeStatus
!= BatteryChargeStatus.NoSystemBattery;

public static void Initialize()
{
BatteryNull = SystemInformation.PowerStatus;
if (BatteryNull.BatteryChargeStatus != BatteryChargeStatus.NoSystemBattery)
{
// 调用SettingsHelper.GetGuidsWithVisibility()方法并解构返回的元组
var (_acGuid, _batteryGuid) = PowerSchemeSettings.GetGuidsWithVisibility();

// 将解构得到的GUID值赋给对应的静态字段
AcPowerGuid = _acGuid;
BatteryGuid = _batteryGuid;
if (!GetSystemPowerStatus(out var powerStatus))
{
return;
}
}

public static void BatteryMonitorInitialization()
{
PlanValue();
MonitorBatterySwitcInitialization();
}

private static void MonitorBatterySwitcInitialization()
{
if (!ToggleMark && BatteryGuid != Guid.Empty && AcPowerGuid == Guid.Empty && powerStatus.ACLineStatus == 1) // 插电状态 02

if (!toggleMark
&& BatterPowerSchemeGuid != Guid.Empty
&& AcPowerSchemeGuid == Guid.Empty
&& powerStatus.ACLineStatus == AC_STATUS.AC_ONLINE)
{
ToggleMark = true;
toggleMark = true;
}
else if (ToggleMark && AcPowerGuid != Guid.Empty && BatteryGuid == Guid.Empty && powerStatus.ACLineStatus == 0) //电池供电 01

if (toggleMark
&& AcPowerSchemeGuid != Guid.Empty
&& BatterPowerSchemeGuid == Guid.Empty
&& powerStatus.ACLineStatus == AC_STATUS.AC_OFFLINE)
{
ToggleMark = false;
}
toggleMark = false;
}
}

// 监测电池状态并切换电源计划的方法
public static void MonitorBatterySwitc()

public static Guid GetPowerPlanGuid()
{
if (BatteryNull.BatteryChargeStatus != BatteryChargeStatus.NoSystemBattery)
if (!HasSystemBattery())
{
GetSystemPowerStatus(out powerStatus);
var PMGAPSG = PowerManager.GetActivePowerSchemeGuid();

if (!ToggleMark && AcPowerGuid != Guid.Empty && powerStatus.ACLineStatus == 1 && PMGAPSG != AcPowerGuid) // 插电状态 01 03
{
PowerManager.SetActivePowerScheme(AcPowerGuid.Value); // 激活插电时的电源计划
ProcessMonitor.baselinePowerSchemeGuid = AcPowerGuid.Value; // 电池供电时的电源计划GUID
ToggleMark = true;
}
else if (ToggleMark && BatteryGuid != Guid.Empty && powerStatus.ACLineStatus == 0 && PMGAPSG != BatteryGuid) //电池供电 02 03
{
PowerManager.SetActivePowerScheme(BatteryGuid.Value); // 激活电池供电时的电源计划
ProcessMonitor.baselinePowerSchemeGuid = BatteryGuid.Value;
ToggleMark = false;
}
else
{
MonitorBatterySwitcInitialization();
}
return Guid.Empty;
}

if (!GetSystemPowerStatus(out var powerStatus))
{
return Guid.Empty;
}

var activePowerSchemeGuid = PowerManager.GetActivePowerSchemeGuid();

if (!toggleMark
&& AcPowerSchemeGuid != Guid.Empty
&& powerStatus.ACLineStatus == AC_STATUS.AC_ONLINE
&& activePowerSchemeGuid != AcPowerSchemeGuid)
{
toggleMark = true;
return AcPowerSchemeGuid;
}

if (toggleMark
&& BatterPowerSchemeGuid != Guid.Empty
&& powerStatus.ACLineStatus == AC_STATUS.AC_OFFLINE
&& activePowerSchemeGuid != BatterPowerSchemeGuid)
{
toggleMark = false;
return BatterPowerSchemeGuid;
}

Initialize();

return Guid.Empty;
}
}
}
24 changes: 5 additions & 19 deletions PowerPlanSwitcher/PowerSchemeSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ public override bool CanConvert(Type objectType) =>

public class Setting
{
public bool AcPowerVisible { get; set; } = false;
public bool BatteryVisible { get; set; } = false;
public bool Visible { get; set; } = true;
[JsonConverter(typeof(ImageConverter))]
public Image? Icon { get; set; }
Expand Down Expand Up @@ -95,26 +93,14 @@ public class Setting
}
return null;
}

public static (Guid? AcPowerGuid, Guid? BatteryGuid) GetGuidsWithVisibility()
{
LoadSettings(); // 确保设置已经被加载

Guid? acPowerGuid = settings
.Where(kvp => kvp.Value != null && kvp.Value.AcPowerVisible)
.Select(kvp => kvp.Key)
.FirstOrDefault();

Guid? batteryGuid = settings
.Where(kvp => kvp.Value != null && kvp.Value.BatteryVisible)
.Select(kvp => kvp.Key)
.FirstOrDefault();

return (acPowerGuid, batteryGuid);
}

public static void SetSetting(Guid schemaGuid, Setting setting)
{
if (schemaGuid == Guid.Empty)
{
return;
}

LoadSettings();
settings![schemaGuid] = setting;
}
Expand Down
6 changes: 3 additions & 3 deletions PowerPlanSwitcher/ProcessMonitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ internal class ProcessMonitor : IDisposable
private DateTime lastUpdate;
private readonly Timer? updateTimer;
private bool disposedValue;
public static Guid baselinePowerSchemeGuid;
private static Guid baselinePowerSchemeGuid;
private PowerRule? previouslyAppliedPowerRule;


Expand All @@ -32,8 +32,8 @@ private void HandleUpdateTimerTick(object? _)
{
try
{
BatteryMonitor.MonitorBatterySwitc();
baselinePowerSchemeGuid = BatteryMonitor.GetPowerPlanGuid();

if (DateTime.Now - lastUpdate <
TimeSpan.FromSeconds(Settings.Default.PowerRuleCheckInterval))
{
Expand Down
1 change: 0 additions & 1 deletion PowerPlanSwitcher/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ private static void Main()
RegisterHotkeys();

HotkeyManager.HotkeyPressed += HotkeyManager_HotkeyPressed;
BatteryMonitor.PlanValue();

using var trayIcon = new TrayIcon();
SystemEvents.EventsThreadShutdown += (s, e) => Application.Exit();
Expand Down
24 changes: 24 additions & 0 deletions PowerPlanSwitcher/Properties/Settings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions PowerPlanSwitcher/Properties/Settings.settings
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,11 @@
<Setting Name="CycleOnlyVisible" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="AcPowerSchemeGuid" Type="System.Guid" Scope="User">
<Value Profile="(Default)">00000000-0000-0000-0000-000000000000</Value>
</Setting>
<Setting Name="BatterPowerSchemeGuid" Type="System.Guid" Scope="User">
<Value Profile="(Default)">00000000-0000-0000-0000-000000000000</Value>
</Setting>
</Settings>
</SettingsFile>
Loading

0 comments on commit cb3550f

Please sign in to comment.