fix LG connection issues, improve color temperature setting, add rBAR driver settings

This commit is contained in:
Vincent Maas committed 2023-01-19 19:08:59 +01:00
1 parent c85b33127b
commit 57a6a36d9b
21 files changed
+296 -64

No files matched your search

+3 -1
View File
@@ -7,11 +7,13 @@
public Config Config { get; private set; }
public StartUpParams StartUpParams { get; private set; }
public string DataPath { get; private set; }
public AppContext(Config config, StartUpParams startUpParams)
public AppContext(Config config, StartUpParams startUpParams, string dataPath)
{
Config = config;
StartUpParams = startUpParams;
DataPath = dataPath;
CurrentContext = this;
}
+2 -2
View File
@@ -19,8 +19,8 @@
<PublisherName>Maassoft</PublisherName>
<Company>Maassoft</Company>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>8.3.0.0</ApplicationVersion>
<Version>8.3.0.0</Version>
<ApplicationVersion>8.4.0.0</ApplicationVersion>
<Version>8.4.0.0</Version>
<UseApplicationTrust>false</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>false</BootstrapperEnabled>
+2 -2
View File
@@ -773,7 +773,6 @@
this.lvNvPresets.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.lvNvPresets.MultiSelect = false;
this.lvNvPresets.Name = "lvNvPresets";
this.lvNvPresets.ShowItemToolTips = true;
this.lvNvPresets.Size = new System.Drawing.Size(1098, 415);
this.lvNvPresets.TabIndex = 0;
this.lvNvPresets.UseCompatibleStateImageBehavior = false;
@@ -1836,7 +1835,8 @@
"Power on even after manual power off",
"Allow triggers to be fired for this device",
"Use Windows power settings to power on",
"Use Windows power settings to power off"});
"Use Windows power settings to power off",
"Use secure connection"});
this.clbLgPower.Location = new System.Drawing.Point(6, 70);
this.clbLgPower.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.clbLgPower.MultiColumn = true;
+29 -20
View File
@@ -9,6 +9,7 @@ using ColorControl.Services.LG;
using ColorControl.Services.NVIDIA;
using ColorControl.Svc;
using LgTv;
using Microsoft.Extensions.DependencyInjection;
using NLog;
using nspector;
using nspector.Common;
@@ -193,7 +194,8 @@ namespace ColorControl
{
//throw new Exception("bla");
Logger.Debug("Initializing NVIDIA...");
_nvService = new NvService(_dataDir);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
_nvService = new NvService(appContextProvider);
FillNvPresets();
Logger.Debug("Initializing NVIDIA...Done.");
@@ -220,7 +222,8 @@ namespace ColorControl
{
try
{
_amdService = new AmdService(_dataDir);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
_amdService = new AmdService(appContextProvider);
FillAmdPresets();
InitSortState(lvAmdPresets, _config.AmdPresetsSortState);
@@ -241,7 +244,8 @@ namespace ColorControl
{
try
{
_gameService = new GameService(_dataDir, HandleExternalServiceForLgDevice);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
_gameService = new GameService(appContextProvider, HandleExternalServiceForLgDevice);
FillGamePresets();
InitSortState(lvGamePresets, _config.GamePresetsSortState);
@@ -274,7 +278,9 @@ namespace ColorControl
{
try
{
_lgService = new LgService(_dataDir, StartUpParams.RunningFromScheduledTask);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
_lgService = new LgService(appContextProvider, StartUpParams.RunningFromScheduledTask);
_lgService.RefreshDevices(afterStartUp: true).ContinueWith((_) => BeginInvoke(() => AfterLgServiceRefreshDevices()));
_lgService.SelectedDeviceChangedEvent += _lgService_SelectedDeviceChangedEvent;
@@ -1933,7 +1939,8 @@ NOTE: installing the service may cause a User Account Control popup.");
clbLgPower.SetItemChecked(6, device?.PowerOnAfterManualPowerOff ?? false);
clbLgPower.SetItemChecked(7, device?.TriggersEnabled ?? true);
clbLgPower.SetItemChecked(8, device?.PowerOffByWindows ?? false);
clbLgPower.SetItemChecked(8, device?.PowerOnByWindows ?? false);
clbLgPower.SetItemChecked(9, device?.PowerOnByWindows ?? false);
clbLgPower.SetItemChecked(10, device?.UseSecureConnection ?? false);
}
finally
{
@@ -2123,7 +2130,7 @@ NOTE: installing the service may cause a User Account Control popup.");
}
try
{
var result = _nvService.ApplyPreset(preset, Program.AppContext);
var result = _nvService.ApplyPreset(preset);
if (!result)
{
throw new Exception("Error while applying NVIDIA preset. At least one setting could not be applied. Check the log for details.");
@@ -2476,8 +2483,14 @@ You can also activate this option by using the Expert-button and selecting Wake-
device.TriggersEnabled = clbLgPower.GetItemChecked(7);
device.PowerOffByWindows = clbLgPower.GetItemChecked(8);
device.PowerOnByWindows = clbLgPower.GetItemChecked(9);
device.UseSecureConnection = clbLgPower.GetItemChecked(10);
_lgService.InstallEventHandlers();
if (e.Index == 10)
{
_lgService.RefreshDevices().ContinueWith((_) => BeginInvoke(() => FillLgDevices()));
}
});
}
@@ -2550,10 +2563,15 @@ Do you want to continue?";
private void MainForm_Activated(object sender, EventArgs e)
{
UpdateDisplayInfoItems();
UpdateDisplayInfoItemsAmd();
if (tcMain.SelectedTab == tabLog)
if (tcMain.SelectedTab == tabNVIDIA)
{
UpdateDisplayInfoItems();
}
else if (tcMain.SelectedTab == tabAMD)
{
UpdateDisplayInfoItemsAmd();
}
else if (tcMain.SelectedTab == tabLog)
{
LoadLog();
}
@@ -4592,26 +4610,17 @@ Currently ColorControl is {(Utils.IsAdministrator() ? "" : "not ")}running as ad
point.X += 10;
point.Y += 0;
lvNvPresetsToolTip.Active = false;
if (index >= 0)
{
if (lvNvPresetsToolTip.Active)
{
lvNvPresetsToolTip.Active = false;
}
lvNvPresetsToolTip.Active = true;
lvNvPresetsToolTip.Show("", lvNvPresets, point);
lvNvPresetsToolTip.Show(text, lvNvPresets, point);
}
else
{
lvNvPresetsToolTip.Active = false;
}
}
private void lvNvPresets_MouseLeave(object sender, EventArgs e)
{
lvNvPresetsToolTip.Active = false;
}
}
}
+27 -5
View File
@@ -1,6 +1,7 @@
using ColorControl.Common;
using ColorControl.Forms;
using ColorControl.Services.AMD;
using ColorControl.Services.Common;
using ColorControl.Services.LG;
using ColorControl.Services.NVIDIA;
using ColorControl.Svc;
@@ -53,8 +54,13 @@ namespace ColorControl
Logger.Debug($"Using data path: {DataDir}");
//Logger.Debug("Parent process: " + Process.GetCurrentProcess().Parent()?.ProcessName);
var host = CreateHostBuilder().Build();
ServiceProvider = host.Services;
if (runAsService)
{
AppContext = new AppContext(null, new StartUpParams(), DataDir);
Utils.WaitForTask(RunService(args));
return;
}
@@ -76,7 +82,7 @@ namespace ColorControl
var startUpParams = StartUpParams.Parse(args);
AppContext = new AppContext(Config, startUpParams);
AppContext = new AppContext(Config, startUpParams, DataDir);
var existingProcess = Utils.GetProcessByName("ColorControl");
@@ -122,10 +128,10 @@ namespace ColorControl
_mainForm = new MainForm(AppContext);
Application.Run(_mainForm);
//if (Debugger.IsAttached && !IsRestarting)
//{
// Utils.StopService();
//}
if (Debugger.IsAttached && !IsRestarting)
{
Utils.StopService();
}
}
catch (Exception ex)
{
@@ -339,6 +345,16 @@ namespace ColorControl
}
}
public static IServiceProvider ServiceProvider { get; private set; }
private static IHostBuilder CreateHostBuilder()
{
return Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
//services.AddSingleton<NvService>();
services.RegisterSharedServices();
});
}
private static async Task RunService(string[] args)
{
Logger.Debug("RUNNING SERVICE");
@@ -350,6 +366,7 @@ namespace ColorControl
})
.ConfigureServices(services =>
{
services.RegisterSharedServices();
services.AddHostedService<ColorControlBackgroundService>();
})
.Build();
@@ -357,6 +374,11 @@ namespace ColorControl
await host.RunAsync();
}
private static void RegisterSharedServices(this IServiceCollection services)
{
services.AddSingleton<AppContextProvider>();
}
public static int EnumThreadWindows(IntPtr handle, IntPtr param)
{
NativeMethods.SendMessageW(handle, Utils.WM_BRINGTOFRONT, UIntPtr.Zero, IntPtr.Zero);
+6 -1
View File
@@ -139,6 +139,8 @@ namespace ATI.ADL
/// <summary> ADL Class</summary>
internal static class ADL
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
#region Internal Constant
/// <summary> Define the maximum path</summary>
internal const int ADL_MAX_PATH = 256;
@@ -380,7 +382,10 @@ namespace ATI.ADL
}
}
throw new InvalidProgramException("ADL-function not supported");
Logger.Error($"ADL-function not supported: {type.Name}");
return null;
//throw new InvalidProgramException("ADL-function not supported");
}
#endregion Export Functions
+7 -2
View File
@@ -1,6 +1,7 @@
using ATI.ADL;
using ColorControl.Common;
using ColorControl.Services.Common;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -14,9 +15,11 @@ namespace ColorControl.Services.AMD
public override string ServiceName => "AMD";
protected override string PresetsBaseFilename => "AmdPresets.json";
private ADLDisplayInfo _currentDisplay;
public AmdService(string dataPath) : base(dataPath, "AmdPresets.json")
public AmdService(AppContextProvider appContextProvider) : base(appContextProvider)
{
LoadPresets();
}
@@ -25,7 +28,9 @@ namespace ColorControl.Services.AMD
{
try
{
var service = new AmdService(Program.DataDir);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
var service = new AmdService(appContextProvider);
var result = service.ApplyPreset(idOrName);
@@ -0,0 +1,11 @@
namespace ColorControl.Services.Common
{
public class AppContextProvider
{
public AppContext GetAppContext()
{
return Program.AppContext;
}
}
}
@@ -14,7 +14,7 @@ namespace ColorControl.Services.Common
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
public GraphicsService(string dataPath, string presetsBaseFilename) : base(dataPath, presetsBaseFilename)
public GraphicsService(AppContextProvider appContextProvider) : base(appContextProvider)
{
}
+8 -6
View File
@@ -16,9 +16,9 @@ namespace ColorControl.Services.Common
{
get;
}
protected abstract string PresetsBaseFilename { get; }
protected string _dataPath;
protected string _presetsBaseFilename;
protected string _presetsFilename;
protected string _presetsBackupFilename;
protected bool _initialized = false;
@@ -26,12 +26,14 @@ namespace ColorControl.Services.Common
protected T _lastAppliedPreset;
protected string _loadPresetsError;
protected AppContextProvider _appContextProvider;
private List<JsonConverter> _jsonConverters;
public ServiceBase(string dataPath, string presetsBaseFilename)
public ServiceBase(AppContextProvider appContextProvider)
{
_dataPath = dataPath;
_presetsBaseFilename = presetsBaseFilename;
_appContextProvider = appContextProvider;
_dataPath = appContextProvider.GetAppContext().DataPath;
_jsonConverters = new List<JsonConverter>();
Initialize();
@@ -99,8 +101,8 @@ namespace ColorControl.Services.Common
protected void LoadPresets()
{
_presetsFilename = Path.Combine(_dataPath, _presetsBaseFilename);
_presetsBackupFilename = Path.Combine(_dataPath, $"{_presetsBaseFilename}.backup");
_presetsFilename = Path.Combine(_dataPath, PresetsBaseFilename);
_presetsBackupFilename = Path.Combine(_dataPath, $"{PresetsBaseFilename}.backup");
try
{
@@ -1,5 +1,6 @@
using ColorControl.Common;
using ColorControl.Services.Common;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -14,9 +15,11 @@ namespace ColorControl.Services.GameLauncher
public override string ServiceName => "Game";
protected override string PresetsBaseFilename => "GamePresets.json";
private Func<string, string[], bool> _externalServiceHandler;
public GameService(string dataPath, Func<string, string[], bool> externalServiceHandler = null) : base(dataPath, "GamePresets.json")
public GameService(AppContextProvider appContextProvider, Func<string, string[], bool> externalServiceHandler = null) : base(appContextProvider)
{
LoadPresets();
_externalServiceHandler = externalServiceHandler;
@@ -26,7 +29,9 @@ namespace ColorControl.Services.GameLauncher
{
try
{
var service = new GameService(Program.DataDir);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
var service = new GameService(appContextProvider);
var result = service.ApplyPreset(idOrName);
+4 -2
View File
@@ -87,6 +87,8 @@ namespace ColorControl.Services.LG
public bool TriggersEnabled { get; set; }
public int HDMIPortNumber { get; set; }
public bool UseSecureConnection { get; set; } = true;
private List<string> _actionsForGameBar;
public List<string> ActionsOnGameBar
@@ -165,7 +167,7 @@ namespace ColorControl.Services.LG
AddGenericPictureAction("colorGamut", typeof(ColorGamut), title: "Color Gamut");
AddGenericPictureAction("dynamicContrast", typeof(OffToHigh), title: "Dynamic Contrast");
AddGenericPictureAction("gamma", typeof(GammaExp));
AddGenericPictureAction("colorTemperature", minValue: 0, maxValue: 50, title: "Color Temperature");
AddGenericPictureAction("colorTemperature", minValue: -50, maxValue: 50, title: "Color Temperature");
AddGenericPictureAction("whiteBalanceColorTemperature", typeof(WhiteBalanceColorTemperature), title: "White Balance Color Temperature");
AddGenericPictureAction("eyeComfortMode", typeof(OffToOn), title: "Eye Comfort Mode");
//AddGenericPictureAction("dynamicColor", typeof(OffToAuto));
@@ -347,7 +349,7 @@ namespace ColorControl.Services.LG
try
{
DisposeConnection();
_lgTvApi = await LgTvApi.CreateLgTvApi(IpAddress, retries);
_lgTvApi = await LgTvApi.CreateLgTvApi(IpAddress, retries, UseSecureConnection);
//Test();
//_lgTvApi.Test3();
+7 -2
View File
@@ -3,6 +3,7 @@ using ColorControl.Forms;
using ColorControl.Services.Common;
using ColorControl.Svc;
using LgTv;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Win32;
using Newtonsoft.Json;
using NWin32;
@@ -71,6 +72,8 @@ namespace ColorControl.Services.LG
public LgServiceConfig Config { get; private set; }
public ProcessMonitorContext MonitorContext { get; private set; }
protected override string PresetsBaseFilename => "LgPresets.json";
private string _configFilename;
private bool _allowPowerOn;
private LgDevice _selectedDevice;
@@ -85,7 +88,7 @@ namespace ColorControl.Services.LG
private LgPreset _lastTriggeredPreset;
private RestartDetector _restartDetector;
public LgService(string dataPath, bool allowPowerOn) : base(dataPath, "LgPresets.json")
public LgService(AppContextProvider appContextProvider, bool allowPowerOn) : base(appContextProvider)
{
_allowPowerOn = allowPowerOn;
@@ -107,7 +110,9 @@ namespace ColorControl.Services.LG
{
try
{
var lgService = new LgService(Program.DataDir, true);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
var lgService = new LgService(appContextProvider, true);
await lgService.RefreshDevices(afterStartUp: true);
var result = await lgService.ApplyPreset(presetName);
+121 -10
View File
@@ -1,9 +1,13 @@
using ColorControl.Common;
using ColorControl.Forms;
using ColorControl.Services.Common;
using ColorControl.Svc;
using Microsoft.Extensions.DependencyInjection;
using nspector.Common;
using nspector.Common.Meta;
using NvAPIWrapper.Display;
using NvAPIWrapper.GPU;
using NvAPIWrapper.Native;
using NvAPIWrapper.Native.Display;
using NvAPIWrapper.Native.GPU.Structures;
using NWin32.NativeTypes;
@@ -13,6 +17,8 @@ using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using static NvAPIWrapper.Native.GPU.Structures.PerformanceStates20ClockEntryV1;
using static NvAPIWrapper.Native.GPU.Structures.PrivateClockBoostLockV2;
namespace ColorControl.Services.NVIDIA
{
@@ -83,6 +89,8 @@ namespace ColorControl.Services.NVIDIA
public override string ServiceName => "NVIDIA";
protected override string PresetsBaseFilename => "NvPresets.json";
private Display _currentDisplay;
private string _baseProfileName = "";
@@ -104,9 +112,29 @@ namespace ColorControl.Services.NVIDIA
public const uint DRS_TEXTURE_FILTERING_QUALITY = 0x00CE2691;
public const uint DRS_TEXTURE_FILTERING_NEGATIVE_LOD_BIAS = 0x0019BB68;
private static readonly List<uint> _driverSettingIds = new() { DRS_GSYNC_APPLICATION_MODE, DRS_VSYNC_CONTROL, DRS_PRERENDERED_FRAMES, DRS_FRAME_RATE_LIMITER_V3, DRS_ANISOTROPIC_FILTERING_SETTING, DRS_ANISOTROPIC_FILTER_OPTIMIZATION, DRS_TEXTURE_FILTERING_QUALITY, DRS_TEXTURE_FILTERING_NEGATIVE_LOD_BIAS, DRS_ANISOTROPIC_FILTER_SAMPLE_OPTIMIZATION };
public const uint DRS_RBAR_FEATURE = 0X000F00BA;
public const uint DRS_RBAR_OPTIONS = 0X000F00BB;
public const uint DRS_RBAR_SIZE_LIMIT = 0X000F00FF;
public NvService(string dataPath) : base(dataPath, "NvPresets.json")
private static readonly List<uint> _driverSettingIds = new()
{
DRS_GSYNC_APPLICATION_MODE,
DRS_VSYNC_CONTROL,
DRS_PRERENDERED_FRAMES,
DRS_FRAME_RATE_LIMITER_V3,
DRS_ANISOTROPIC_FILTERING_SETTING,
DRS_ANISOTROPIC_FILTER_OPTIMIZATION,
DRS_TEXTURE_FILTERING_QUALITY,
DRS_TEXTURE_FILTERING_NEGATIVE_LOD_BIAS,
DRS_ANISOTROPIC_FILTER_SAMPLE_OPTIMIZATION,
DRS_RBAR_FEATURE,
DRS_RBAR_OPTIONS,
DRS_RBAR_SIZE_LIMIT
};
private static NvService ServiceInstance;
public NvService(AppContextProvider appContextProvider) : base(appContextProvider)
{
NvPreset.NvService = this;
@@ -119,7 +147,9 @@ namespace ColorControl.Services.NVIDIA
{
try
{
var nvService = new NvService(Program.DataDir);
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
var nvService = new NvService(appContextProvider);
var result = nvService.ApplyPreset(idOrName);
@@ -216,7 +246,7 @@ namespace ColorControl.Services.NVIDIA
var preset = GetPresetByIdOrName(idOrName);
if (preset != null)
{
return ApplyPreset(preset, Program.AppContext);
return ApplyPreset(preset);
}
else
{
@@ -225,11 +255,6 @@ namespace ColorControl.Services.NVIDIA
}
public override bool ApplyPreset(NvPreset preset)
{
return ApplyPreset(preset, Program.AppContext);
}
public bool ApplyPreset(NvPreset preset, AppContext appContext)
{
var result = true;
@@ -278,6 +303,8 @@ namespace ColorControl.Services.NVIDIA
{
var colorData = preset.applyColorData ? preset.colorData : display.DisplayDevice.CurrentColorData;
var appContext = _appContextProvider.GetAppContext();
SetHDRState(display, newHdrEnabled, colorData, appContext.StartUpParams.NoGui);
}
@@ -309,6 +336,19 @@ namespace ColorControl.Services.NVIDIA
return result;
}
public static void ApplyDriverSettings(List<KeyValuePair<uint, string>> settings)
{
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
if (ServiceInstance == null)
{
ServiceInstance = new NvService(appContextProvider);
ServiceInstance.Initialize();
}
ServiceInstance._drs.StoreSettingsToProfile(ServiceInstance._baseProfileName, settings);
}
private void SetDriverSettings(NvPreset preset)
{
var settings = new List<KeyValuePair<uint, string>>();
@@ -601,7 +641,7 @@ namespace ColorControl.Services.NVIDIA
{
var settingMeta = GetSettingMeta(setting.SettingId);
var settingValue = settingMeta.DwordValues.FirstOrDefault(s => s.ValueName == setting.ValueText);
var settingValue = settingMeta.DwordValues?.FirstOrDefault(s => s.ValueName == setting.ValueText);
drsValues.Add($"{settingMeta.SettingName}: {settingValue?.ValueName ?? "Unknown"}");
}
@@ -676,6 +716,13 @@ namespace ColorControl.Services.NVIDIA
_drs.GetProfileNames(ref _baseProfileName, false);
if (!Utils.IsAdministrator())
{
_drs.ApplySettings += HandleDrsApplySettings;
}
//SetGpuClocks();
//Task.Run(() =>
//{
// RefreshProfileSettings();
@@ -701,6 +748,18 @@ namespace ColorControl.Services.NVIDIA
}
}
private void HandleDrsApplySettings(object sender, DrsEvent drsEvent)
{
if (Utils.IsAdministrator() || _appContextProvider.GetAppContext()?.Config.ElevationMethod != ElevationMethod.UseService)
{
return;
}
PipeUtils.SendMessage(new SvcNvDriverSettingsMessage { DriverSettings = drsEvent.Settings });
drsEvent.Handled = true;
}
protected override void Uninitialize()
{
if (_initialized)
@@ -708,5 +767,57 @@ namespace ColorControl.Services.NVIDIA
NvAPIWrapper.NVIDIA.Unload();
}
}
public void SetGpuClocks()
{
// TEST ONLY
var gpu = PhysicalGPU.GetPhysicalGPUs().FirstOrDefault();
if (gpu == null)
{
Logger.Debug("No GPU");
return;
}
var handle = gpu.Handle;
var perf = GPUApi.GetPerformanceStates20(handle);
var lockv2 = new PrivateClockBoostLockV2(new[] { new ClockBoostLock(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, NvAPIWrapper.Native.GPU.ClockLockMode.Manual, 1000000) });
var bla = GPUApi.GetClockBoostLock(handle);
//GPUApi.SetClockBoostLock(handle, lockv2);
//var curve = GPUApi.GetVFPCurve(handle);
var currentFreq = perf.Clocks.First().Value.First(v => v.DomainId == NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics).SingleFrequency;
var delta = new PerformanceStates20ParameterDelta(90000);
//var delta2 = new PerformanceStates20ParameterDelta(0);
//var delta3 = new PerformanceStates20ParameterDelta(0);
//var single1 = new PerformanceStates20ClockDependentSingleFrequency(2670000);
//var single2 = new PerformanceStates20ClockDependentSingleFrequency(2760000);
//var single3 = new PerformanceStates20ClockDependentSingleFrequency(2775000);
//var clockEntry1 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta, single1);
//var clockEntry2 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta2, single2);
//var clockEntry3 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta3, single3);
var range = new PerformanceStates20ClockDependentFrequencyRange(2400000, 3000000, NvAPIWrapper.Native.GPU.PerformanceVoltageDomain.Core, 950000, 1050000);
var clockEntry = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta, range);
//var range2 = new PerformanceStates20ClockDependentFrequencyRange(2800001, 3000000, NvAPIWrapper.Native.GPU.PerformanceVoltageDomain.Core, 1000000, 1000000);
//var clockEntry2 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta2, range2);
var deltaVoltage = new PerformanceStates20ParameterDelta(0);
var voltage = new PerformanceStates20BaseVoltageEntryV1(NvAPIWrapper.Native.GPU.PerformanceVoltageDomain.Core, deltaVoltage);
var state = new PerformanceStates20InfoV1.PerformanceState20(NvAPIWrapper.Native.GPU.PerformanceStateId.P0_3DPerformance, new[] { clockEntry }, new[] { voltage });
var newPerf = new PerformanceStates20InfoV3(new[] { state }, 1, 1);
//GPUApi.SetPerformanceStates20(handle, newPerf);
}
}
}
@@ -1,5 +1,6 @@
using ColorControl.Common;
using ColorControl.Services.LG;
using ColorControl.Services.NVIDIA;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using NLog;
@@ -107,6 +108,7 @@ namespace ColorControl.Svc
SvcMessageType.ExecuteRpc => HandleExecuteRpcCommand(message),
SvcMessageType.ExecuteUpdate => await HandleExecuteUpdateCommandAsync(JsonConvert.DeserializeObject<SvcInstallUpdateMessage>(json)),
SvcMessageType.RestartAfterUpdate => HandleRestartAfterUpdateMessage(),
SvcMessageType.ApplyNvidiaDriverSettings => HandleNvDriverSettingsMessage(JsonConvert.DeserializeObject<SvcNvDriverSettingsMessage>(json)),
_ => SvcResultMessage.FromResult(false, "Unexpected message type")
};
@@ -180,6 +182,13 @@ namespace ColorControl.Svc
return SvcResultMessage.FromResult(true);
}
private SvcResultMessage HandleNvDriverSettingsMessage(SvcNvDriverSettingsMessage message)
{
NvService.ApplyDriverSettings(message.DriverSettings);
return SvcResultMessage.FromResult(true);
}
private async Task WakeDevicesAsync()
{
if (!UserSessionInfo.UserLocalSession)
+13 -1
View File
@@ -1,4 +1,6 @@
namespace ColorControl.Svc
using System.Collections.Generic;
namespace ColorControl.Svc
{
public enum SvcMessageType
{
@@ -8,6 +10,7 @@
ExecuteRpc = 10,
ExecuteUpdate = 20,
RestartAfterUpdate = 21,
ApplyNvidiaDriverSettings = 101,
}
public class SvcMessage
@@ -28,4 +31,13 @@
public string ClientPath { get; set; }
}
public class SvcNvDriverSettingsMessage : SvcMessage
{
public SvcNvDriverSettingsMessage()
{
MessageType = SvcMessageType.ApplyNvidiaDriverSettings;
}
public List<KeyValuePair<uint, string>> DriverSettings { get; set; }
}
}
+9 -4
View File
@@ -282,9 +282,14 @@ namespace LgTv
private string _currentPairKey;
private string webSocketUri;
public static async Task<LgTvApi> CreateLgTvApi(string ip, int retries = 1)
protected static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
public static async Task<LgTvApi> CreateLgTvApi(string ip, int retries = 1, bool useSecureWs = true)
{
var instance = new LgTvApi(ip, new LgTvApiCore(), new ClientKeyStore(ip));
var instance = new LgTvApi(ip, new LgTvApiCore(), new ClientKeyStore(ip), useSecureWs);
Logger.Debug($"Trying to connect with websocket uri: {instance.webSocketUri}");
while (retries > 0)
{
var connected = await instance.Connect();
@@ -300,9 +305,9 @@ namespace LgTv
return null;
}
private LgTvApi(string ip, LgTvApiCore connection, ClientKeyStore keyStore)
private LgTvApi(string ip, LgTvApiCore connection, ClientKeyStore keyStore, bool useSecureWs)
{
webSocketUri = "ws://" + ip + ":3000";
webSocketUri = useSecureWs ? $"wss://{ip}:3001" : $"ws://{ip}:3000";
_ip = ip;
_connection = connection;
_keyStore = keyStore;
+7 -1
View File
@@ -7,6 +7,7 @@ using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using Windows.Networking.Sockets;
using Windows.Security.Cryptography.Certificates;
using Windows.Storage.Streams;
namespace LgTv
@@ -40,6 +41,8 @@ namespace LgTv
ConnectionClosed = false;
_commandCount = 0;
_connection = new MessageWebSocket();
_connection.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
_connection.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName);
_connection.Control.MessageType = SocketMessageType.Utf8;
_connection.MessageReceived += Connection_MessageReceived;
_connection.Closed += Connection_Closed;
@@ -53,8 +56,9 @@ namespace LgTv
IsConnected?.Invoke(true);
return true;
}
catch (TimeoutException)
catch (TimeoutException te)
{
Logger.Error($"Connect to {uri}: {te.Message}");
return false;
}
}
@@ -69,6 +73,8 @@ namespace LgTv
// Handle Unknown Error
break;
}
Logger.Error($"Connect to {uri}: {e.Message}");
return false;
}
}
+1 -1
View File
@@ -25,7 +25,7 @@ namespace nspector.Common
_customSettings = customSettings;
_referenceSettings = referenceSettings;
ResetMetaCache(true);
ResetMetaCache(false);
}
public void ResetMetaCache(bool initOnly = false)
+21
View File
@@ -7,8 +7,16 @@ using nvw = nspector.Native.NVAPI2.NvapiDrsWrapper;
namespace nspector.Common
{
public class DrsEvent : EventArgs
{
public List<KeyValuePair<uint, string>>? Settings { get; set; }
public bool Handled { get; set; }
}
public class DrsSettingsService : DrsSettingsServiceBase
{
public event EventHandler<DrsEvent>? ApplySettings;
public bool ExternalApplySettings => ApplySettings != null;
public DrsSettingsService(DrsSettingsMetaService metaService, DrsDecrypterService decrpterService)
: base(metaService, decrpterService)
@@ -300,6 +308,19 @@ namespace nspector.Common
public int StoreSettingsToProfile(string profileName, List<KeyValuePair<uint, string>> settings)
{
var drsEvent = new DrsEvent
{
Settings = settings,
Handled = false
};
ApplySettings?.Invoke(this, drsEvent);
if (drsEvent.Handled)
{
return 0;
}
DrsSessionScope.DestroyGlobalSession();
DrsSession((hSession) =>
+1 -1
View File
@@ -540,7 +540,7 @@ namespace nspector
private void frmDrvSettings_Load(object sender, EventArgs e)
{
_highlightUnexposedSettings = !IsAdministrator();
_highlightUnexposedSettings = !IsAdministrator() && !_drs.ExternalApplySettings;
SetupLayout();
SetTitleVersion();