LenovoLegionToolkit
72 строки · 2.5 Кб
1using System;
2using System.Threading.Tasks;
3using LenovoLegionToolkit.Lib.Extensions;
4using LenovoLegionToolkit.Lib.System.Management;
5using LenovoLegionToolkit.Lib.Utils;
6
7namespace LenovoLegionToolkit.Lib.Features.InstantBoot;
8
9public class InstantBootFeatureFlagsFeature : IFeature<InstantBootState>
10{
11private const int AC_INDEX = 5;
12private const int USB_POWER_DELIVERY_INDEX = 6;
13
14public async Task<bool> IsSupportedAsync()
15{
16try
17{
18var mi = await Compatibility.GetMachineInformationAsync().ConfigureAwait(false);
19return mi.Features is { Source: MachineInformation.FeatureData.SourceType.Flags, InstantBootAc: true, InstantBootUsbPowerDelivery: true };
20}
21catch
22{
23return false;
24}
25}
26
27public Task<InstantBootState[]> GetAllStatesAsync() => Task.FromResult(Enum.GetValues<InstantBootState>());
28
29public async Task<InstantBootState> GetStateAsync()
30{
31if (Log.Instance.IsTraceEnabled)
32Log.Instance.Trace($"Getting state...");
33
34var flags = await WMI.LenovoOtherMethod.GetDeviceCurrentSupportFeatureAsync().ConfigureAwait(false);
35
36var acAdapter = flags.IsBitSet(AC_INDEX);
37var usbPowerDelivery = flags.IsBitSet(USB_POWER_DELIVERY_INDEX);
38
39var result = (acAdapter, usbPowerDelivery) switch
40{
41(true, true) => InstantBootState.AcAdapterAndUsbPowerDelivery,
42(true, false) => InstantBootState.AcAdapter,
43(false, true) => InstantBootState.UsbPowerDelivery,
44_ => InstantBootState.Off
45};
46
47if (Log.Instance.IsTraceEnabled)
48Log.Instance.Trace($"State is {result}");
49
50return result;
51}
52
53public async Task SetStateAsync(InstantBootState state)
54{
55if (Log.Instance.IsTraceEnabled)
56Log.Instance.Trace($"Setting state to {state}...");
57
58var (acAdapter, usbPowerDelivery) = state switch
59{
60InstantBootState.AcAdapterAndUsbPowerDelivery => (1, 1),
61InstantBootState.AcAdapter => (1, 0),
62InstantBootState.UsbPowerDelivery => (0, 1),
63_ => (0, 0)
64};
65
66await WMI.LenovoOtherMethod.SetDeviceCurrentSupportFeatureAsync(AC_INDEX, acAdapter).ConfigureAwait(false);
67await WMI.LenovoOtherMethod.SetDeviceCurrentSupportFeatureAsync(USB_POWER_DELIVERY_INDEX, usbPowerDelivery).ConfigureAwait(false);
68
69if (Log.Instance.IsTraceEnabled)
70Log.Instance.Trace($"Set state to {state}");
71}
72}
73