LenovoLegionToolkit

Форк
0
72 строки · 2.5 Кб
1
using System;
2
using System.Threading.Tasks;
3
using LenovoLegionToolkit.Lib.Extensions;
4
using LenovoLegionToolkit.Lib.System.Management;
5
using LenovoLegionToolkit.Lib.Utils;
6

7
namespace LenovoLegionToolkit.Lib.Features.InstantBoot;
8

9
public class InstantBootFeatureFlagsFeature : IFeature<InstantBootState>
10
{
11
    private const int AC_INDEX = 5;
12
    private const int USB_POWER_DELIVERY_INDEX = 6;
13

14
    public async Task<bool> IsSupportedAsync()
15
    {
16
        try
17
        {
18
            var mi = await Compatibility.GetMachineInformationAsync().ConfigureAwait(false);
19
            return mi.Features is { Source: MachineInformation.FeatureData.SourceType.Flags, InstantBootAc: true, InstantBootUsbPowerDelivery: true };
20
        }
21
        catch
22
        {
23
            return false;
24
        }
25
    }
26

27
    public Task<InstantBootState[]> GetAllStatesAsync() => Task.FromResult(Enum.GetValues<InstantBootState>());
28

29
    public async Task<InstantBootState> GetStateAsync()
30
    {
31
        if (Log.Instance.IsTraceEnabled)
32
            Log.Instance.Trace($"Getting state...");
33

34
        var flags = await WMI.LenovoOtherMethod.GetDeviceCurrentSupportFeatureAsync().ConfigureAwait(false);
35

36
        var acAdapter = flags.IsBitSet(AC_INDEX);
37
        var usbPowerDelivery = flags.IsBitSet(USB_POWER_DELIVERY_INDEX);
38

39
        var 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

47
        if (Log.Instance.IsTraceEnabled)
48
            Log.Instance.Trace($"State is {result}");
49

50
        return result;
51
    }
52

53
    public async Task SetStateAsync(InstantBootState state)
54
    {
55
        if (Log.Instance.IsTraceEnabled)
56
            Log.Instance.Trace($"Setting state to {state}...");
57

58
        var (acAdapter, usbPowerDelivery) = state switch
59
        {
60
            InstantBootState.AcAdapterAndUsbPowerDelivery => (1, 1),
61
            InstantBootState.AcAdapter => (1, 0),
62
            InstantBootState.UsbPowerDelivery => (0, 1),
63
            _ => (0, 0)
64
        };
65

66
        await WMI.LenovoOtherMethod.SetDeviceCurrentSupportFeatureAsync(AC_INDEX, acAdapter).ConfigureAwait(false);
67
        await WMI.LenovoOtherMethod.SetDeviceCurrentSupportFeatureAsync(USB_POWER_DELIVERY_INDEX, usbPowerDelivery).ConfigureAwait(false);
68

69
        if (Log.Instance.IsTraceEnabled)
70
            Log.Instance.Trace($"Set state to {state}");
71
    }
72
}
73

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.