Skip to content

Commit

Permalink
chroma: detect service start/stop
Browse files Browse the repository at this point in the history
layouts: consider lightsync for CL LEDs, detect chroma and lightsync state changes
  • Loading branch information
Aytackydln committed May 3, 2024
1 parent b10fd76 commit 3db7abd
Show file tree
Hide file tree
Showing 17 changed files with 235 additions and 141 deletions.
2 changes: 1 addition & 1 deletion Project-Aurora/Project-Aurora/AuroraApp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public AuroraApp(bool isSilent)

_controlInterface = new AuroraControlInterface(IpcListenerModule.IpcListener);
_razerSdkModule = new RazerSdkModule(LightingStateManagerModule.LightningStateManager);
_devicesModule = new DevicesModule(_razerSdkModule.RzSdkManager, _controlInterface);
_devicesModule = new DevicesModule(_controlInterface);
var lightingStateManagerModule = new LightingStateManagerModule(
PluginsModule.PluginManager, IpcListenerModule.IpcListener, _httpListenerModule.HttpListener,
_devicesModule.DeviceManager, ProcessesModule.ActiveProcessMonitor, ProcessesModule.RunningProcessMonitor
Expand Down
4 changes: 2 additions & 2 deletions Project-Aurora/Project-Aurora/ConfigUi.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@
using AuroraRgb.Devices;
using AuroraRgb.Modules.GameStateListen;
using AuroraRgb.Modules.Layouts;
using AuroraRgb.Modules.Razer;
using AuroraRgb.Profiles;
using AuroraRgb.Settings;
using AuroraRgb.Settings.Controls;
using AuroraRgb.Settings.Layers;
using AuroraRgb.Utils;
using Common;
using PropertyChanged;
using RazerSdkReader;
using Application = AuroraRgb.Profiles.Application;
using Brushes = System.Windows.Media.Brushes;
using Timer = System.Timers.Timer;
Expand Down Expand Up @@ -80,7 +80,7 @@ public Application? FocusedApplication

private CancellationTokenSource _keyboardUpdateCancel = new();

public ConfigUi(Task<ChromaReader?> rzSdkManager, Task<PluginManager> pluginManager,
public ConfigUi(Task<ChromaSdkManager> rzSdkManager, Task<PluginManager> pluginManager,
Task<KeyboardLayoutManager> layoutManager, Task<AuroraHttpListener?> httpListener,
Task<IpcListener?> ipcListener, Task<DeviceManager> deviceManager, Task<LightingStateManager> lightingStateManager, AuroraControlInterface controlInterface)
{
Expand Down
9 changes: 3 additions & 6 deletions Project-Aurora/Project-Aurora/Devices/DeviceManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using Common;
using Common.Data;
using Common.Devices;
using RazerSdkReader;

namespace AuroraRgb.Devices;

Expand All @@ -31,7 +30,6 @@ public sealed class DeviceManager : IDisposable

public List<DeviceContainer> DeviceContainers { get; } = [];

private readonly Task<ChromaReader?> _rzSdkManager;
private readonly AuroraControlInterface _auroraControlInterface;
private readonly MemorySharedArray<SimpleColor> _sharedDeviceColor;

Expand All @@ -43,22 +41,21 @@ public sealed class DeviceManager : IDisposable

public DevicesPipe DevicesPipe { get; } = new();

public DeviceManager(Task<ChromaReader?> rzSdkManager, AuroraControlInterface auroraControlInterface)
public DeviceManager(AuroraControlInterface auroraControlInterface)
{
_rzSdkManager = rzSdkManager;
_auroraControlInterface = auroraControlInterface;
_sharedDeviceColor = new MemorySharedArray<SimpleColor>(Constants.DeviceLedMap, Constants.MaxKeyId);

_deviceManagerInfo = new MemorySharedStruct<DeviceManagerInfo>(Constants.DeviceInformations);
_deviceManagerInfo.Updated += OnDeviceManagerInfoOnUpdated;
}

public async Task InitializeDevices()
public Task InitializeDevices()
{
_dmStartCount = 0;
await _rzSdkManager;

AttachOrCreateProcess();
return Task.CompletedTask;
}

private void AttachOrCreateProcess()
Expand Down
2 changes: 0 additions & 2 deletions Project-Aurora/Project-Aurora/Global.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using AuroraRgb.Modules.Layouts;
using AuroraRgb.Profiles;
using AuroraRgb.Settings;
using RazerSdkReader;
using Serilog;
using Serilog.Core;
using Serilog.Events;
Expand Down Expand Up @@ -72,7 +71,6 @@ public static Configuration Configuration
public static KeyboardLayoutManager? kbLayout { get; set; } //TODO module access
public static Effects effengine { get; set; }
public static KeyRecorder? key_recorder { get; set; }
public static ChromaReader? razerSdkManager { get; set; } //TODO module access
public static AudioDeviceProxy? CaptureProxy { get; set; }
public static AudioDeviceProxy? RenderProxy { get; set; }

Expand Down
5 changes: 2 additions & 3 deletions Project-Aurora/Project-Aurora/Modules/DevicesModule.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using System.Threading.Tasks;
using AuroraRgb.Devices;
using RazerSdkReader;

namespace AuroraRgb.Modules;

public sealed class DevicesModule(Task<ChromaReader?> rzSdkManager, AuroraControlInterface auroraControlInterface) : AuroraModule
public sealed class DevicesModule(AuroraControlInterface auroraControlInterface) : AuroraModule
{
public Task<DeviceManager> DeviceManager => _taskSource.Task;

Expand All @@ -15,7 +14,7 @@ protected override async Task Initialize()
{
Global.logger.Information("Loading Device Manager...");

_deviceManager = new DeviceManager(rzSdkManager, auroraControlInterface);
_deviceManager = new DeviceManager(auroraControlInterface);
_taskSource.SetResult(_deviceManager);

await _deviceManager.InitializeDevices();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,20 @@
using System.Windows.Controls;
using System.Windows.Threading;
using AuroraRgb.EffectsEngine;
using AuroraRgb.Modules.Logitech;
using AuroraRgb.Modules.Razer;
using AuroraRgb.Settings;
using AuroraRgb.Settings.Controls.Keycaps;
using AuroraRgb.Settings.Layouts;
using AuroraRgb.Utils;
using Common;
using Common.Devices;
using RazerSdkReader;
using Application = System.Windows.Application;
using Color = System.Drawing.Color;

namespace AuroraRgb.Modules.Layouts;

public class KeyboardLayoutManager
public sealed class KeyboardLayoutManager : IDisposable
{
private const string CulturesFolder = "kb_layouts";

Expand All @@ -42,11 +43,13 @@ public class KeyboardLayoutManager

private readonly string _layoutsPath;

private readonly Task<ChromaReader?> _rzSdk;
private readonly Task<ChromaSdkManager> _rzSdk;

private CancellationTokenSource _cancellationTokenSource = new();
private bool _loadLinkLeds;
private ChromaSdkManager? _chromaSdkManager;

public KeyboardLayoutManager(Task<ChromaReader?> rzSdk)
public KeyboardLayoutManager(Task<ChromaSdkManager> rzSdk)
{
_rzSdk = rzSdk;
_layoutsPath = Path.Combine(Global.ExecutingDirectory, CulturesFolder);
Expand All @@ -61,11 +64,39 @@ public KeyboardLayoutManager(Task<ChromaReader?> rzSdk)

public async Task Initialize()
{
_chromaSdkManager = await _rzSdk;
_loadLinkLeds = _chromaSdkManager.ChromaReader is not null || LogitechSdkModule.LogitechSdkListener.State != LightsyncSdkState.Disabled;

_chromaSdkManager.StateChanged += ChromaSdkManagerOnStateChanged;
LogitechSdkModule.LogitechSdkListener.StateChanged += LogitechSdkListenerOnStateChanged;

await LoadBrandDefault();

//TODO listen for online layout load
Global.Configuration.PropertyChanged += Configuration_PropertyChanged;
}

private async void ChromaSdkManagerOnStateChanged(object? sender, ChromaSdkStateChangedEventArgs e)
{
await RefreshLinkLayout();
}

private async void LogitechSdkListenerOnStateChanged(object? sender, EventArgs e)
{
await RefreshLinkLayout();
}

private async Task RefreshLinkLayout()
{
var linksCurrentlyLoaded = _loadLinkLeds;
_loadLinkLeds = _chromaSdkManager?.ChromaReader is not null || LogitechSdkModule.LogitechSdkListener.State != LightsyncSdkState.Disabled;

if (linksCurrentlyLoaded != _loadLinkLeds)
{
await LoadBrandDefault();
}
}

private async Task LoadBrandDefault()
{
var cancellationTokenSource = _cancellationTokenSource;
Expand Down Expand Up @@ -108,7 +139,8 @@ private async Task LoadBrandDefault()
cancellationTokenSource.Dispose();
return;
}
var layoutLoad = new LayoutLoad(_layoutsPath, await _rzSdk is not null);

var layoutLoad = new LayoutLoad(_layoutsPath, _loadLinkLeds);
try
{
await layoutLoad.LoadBrand(
Expand Down Expand Up @@ -336,4 +368,14 @@ public void SetKeyboardColors(Dictionary<DeviceKeys, SimpleColor> keyLights, Can
value.SetColor(ColorUtils.DrawingColorToMediaColor(drawingColor));
}
}

public void Dispose()
{
if (_chromaSdkManager != null) _chromaSdkManager.StateChanged -= ChromaSdkManagerOnStateChanged;
LogitechSdkModule.LogitechSdkListener.StateChanged -= LogitechSdkListenerOnStateChanged;

_rzSdk.Dispose();
_cancellationTokenSource.Dispose();
VirtualKeyboard.Dispose();
}
}
2 changes: 0 additions & 2 deletions Project-Aurora/Project-Aurora/Modules/Layouts/LayoutLoad.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,6 @@ internal async Task LoadBrand(
await LoadGenericLayout(headsetFeaturePath, cancellationToken);
}

//TODO also check for Lightsync
//TODO check if rzSdk or Lightsync gets enabled after this
if (chromaLeds == PreferredChromaLeds.Automatic && loadLinkLeds)
{
chromaLeds = PreferredChromaLeds.Suggested;
Expand Down
5 changes: 3 additions & 2 deletions Project-Aurora/Project-Aurora/Modules/LayoutsModule.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
using System.Threading.Tasks;
using AuroraRgb.Modules.Layouts;
using RazerSdkReader;
using AuroraRgb.Modules.Razer;

namespace AuroraRgb.Modules;

public sealed class LayoutsModule(Task<ChromaReader?> rzSdk, Task onlineSettingsLayoutsUpdate) : AuroraModule
public sealed class LayoutsModule(Task<ChromaSdkManager> rzSdk, Task onlineSettingsLayoutsUpdate) : AuroraModule
{
private KeyboardLayoutManager? _layoutManager;
private readonly TaskCompletionSource<KeyboardLayoutManager> _taskCompletionSource = new(TaskCreationOptions.RunContinuationsAsynchronously);
Expand All @@ -24,6 +24,7 @@ protected override async Task Initialize()

public override ValueTask DisposeAsync()
{
_layoutManager?.Dispose();
return ValueTask.CompletedTask;
}
}
12 changes: 11 additions & 1 deletion Project-Aurora/Project-Aurora/Modules/PerformanceMonitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,21 @@ private async Task InitializeRazerStreamApi()

private void ProcessMonitorOnProcessStarted(object? sender, ProcessStarted e)
{
if (e.ProcessName != RazerChromeServerProcessName)
{
return;
}

_rzStreamCpuCounter = new PerformanceCounter("Process", "% Processor Time", RazerChromeServerProcessName, true);
}

private void ProcessMonitorOnProcessStopped(object? sender, ProcessStopped e)
{
if (e.ProcessName != RazerChromeServerProcessName)
{
return;
}

_rzStreamCpuCounter?.Dispose();
_rzStreamCpuCounter = null;
}
Expand All @@ -122,7 +132,7 @@ private void CheckRazerStreamApi()
var cpuUsage = _rzStreamCpuCounter.NextValue();
if (cpuUsage > 80)
{
RazerChromaUtils.DisableChromaBloat();
ChromaInstallationUtils.DisableChromaBloat();
}
}
catch { /* ignore */ }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public enum RazerChromaInstallerExitCode
RestartRequired = 3010
}

public static class RazerChromaUtils
public static class ChromaInstallationUtils
{
public static async Task<int> UninstallAsync() => await Task.Run(() =>
{
Expand Down Expand Up @@ -186,7 +186,7 @@ public static async Task DisableDeviceControlAsync()
}
}

if (tasks.Count > 0)
if (tasks.Count == 0)
{
return;
}
Expand Down
97 changes: 97 additions & 0 deletions Project-Aurora/Project-Aurora/Modules/Razer/ChromaSdkManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
using System;
using System.Threading.Tasks;
using AuroraRgb.Modules.ProcessMonitor;
using RazerSdkReader;

namespace AuroraRgb.Modules.Razer;

public class ChromaSdkStateChangedEventArgs(ChromaReader? chromaReader) : EventArgs
{
public ChromaReader? ChromaReader => chromaReader;
}

public sealed class ChromaSdkManager : IDisposable
{
private const string RzServiceProcessName = "rzsdkservice.exe";

public event EventHandler<ChromaSdkStateChangedEventArgs>? StateChanged;

public ChromaReader? ChromaReader { get; private set; }

internal async Task Initialize()
{
try
{
var chromaReader = TryLoadChroma();
ChromaReader = chromaReader;
StateChanged?.Invoke(this, new ChromaSdkStateChangedEventArgs(ChromaReader));
}
catch (Exception exc)
{
Global.logger.Fatal(exc, "RazerSdkManager failed to load!");
}

var runningProcessMonitor = await ProcessesModule.RunningProcessMonitor;
runningProcessMonitor.ProcessStarted += RunningProcessMonitorOnProcessStarted;
runningProcessMonitor.ProcessStopped += RunningProcessMonitorOnProcessStopped;
}

private void RunningProcessMonitorOnProcessStarted(object? sender, ProcessStarted e)
{
if (e.ProcessName != RzServiceProcessName)
{
return;
}

Global.logger.Information("Chroma service opened. Enabling Chroma integration...");

var chromaReader = TryLoadChroma();
ChromaReader = chromaReader;
StateChanged?.Invoke(this, new ChromaSdkStateChangedEventArgs(ChromaReader));
}

private void RunningProcessMonitorOnProcessStopped(object? sender, ProcessStopped e)
{
if (e.ProcessName != RzServiceProcessName)
{
return;
}

if (ChromaReader == null)
{
return;
}

Global.logger.Information("Chroma service is closed. Disabling Chroma integration...");

ChromaReader.Dispose();
ChromaReader = null;
StateChanged?.Invoke(this, new ChromaSdkStateChangedEventArgs(null));
}

private static ChromaReader TryLoadChroma()
{
var chromaReader = new ChromaReader();
chromaReader.Exception += RazerSdkReaderOnException;
RzHelper.Initialize(chromaReader);

chromaReader.Start();
return chromaReader;
}

private static void RazerSdkReaderOnException(object? sender, RazerSdkReaderException e)
{
Global.logger.Error(e, "Chroma Reader Error");
}

public void Dispose()
{
if (ChromaReader == null)
{
return;
}

ChromaReader.Dispose();
ChromaReader = null;
}
}
Loading

0 comments on commit 3db7abd

Please sign in to comment.