Skip to content

Commit 947d1cd

Browse files
chore: cleanup synapse
1 parent 467f70f commit 947d1cd

File tree

8 files changed

+136
-124
lines changed

8 files changed

+136
-124
lines changed

src/ChromaControl.SDK.Synapse.Sample/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
var builder = Host.CreateApplicationBuilder(args);
99

1010
builder.Services.AddSynapseSDK();
11+
1112
builder.Services.AddHostedService<Worker>();
1213

1314
await builder.Build().RunAsync();

src/ChromaControl.SDK.Synapse.Sample/Worker.cs

Lines changed: 34 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,86 +3,69 @@
33
// See the LICENSE file in the project root for more information.
44

55
using ChromaControl.SDK.Synapse.Enums;
6-
using ChromaControl.SDK.Synapse.Structs;
76
using System.Drawing;
87

98
namespace ChromaControl.SDK.Synapse.Sample;
109

1110
/// <summary>
1211
/// The worker.
1312
/// </summary>
14-
public partial class Worker : IHostedService
13+
public partial class Worker : BackgroundService
1514
{
16-
private readonly ILogger<Worker> _logger;
17-
private readonly ISynapseService _synapse;
18-
19-
private Color _colorCache;
20-
21-
[LoggerMessage(Level = LogLevel.Information, Message = "Starting Synapse Service...")]
22-
private static partial void LogStartMessage(ILogger logger);
15+
private bool _serviceReady;
16+
private Color _cachedColor;
2317

24-
[LoggerMessage(Level = LogLevel.Information, Message = "Stopping Synapse Service...")]
25-
private static partial void LogStopMessage(ILogger logger);
26-
27-
[LoggerMessage(Level = LogLevel.Information, Message = "Synapse Status Changed To {status}")]
28-
private static partial void LogStatusMessage(ILogger logger, SynapseStatus status);
18+
private readonly ILogger<Worker> _logger;
19+
private readonly ISynapseService _service;
2920

30-
[LoggerMessage(Level = LogLevel.Information, Message = "Synapse Color Set To [{r}, {g}, {b}]")]
31-
private static partial void LogEffectMessage(ILogger logger, byte r, byte g, byte b);
21+
[LoggerMessage(EventId = 0, Level = LogLevel.Information, Message = "Color changed to [R = {r}, G = {g}, B = {b}]")]
22+
private static partial void LogColorChangedMessage(ILogger logger, byte r, byte g, byte b);
3223

3324
/// <summary>
3425
/// Creates a <see cref="Worker"/> instance.
3526
/// </summary>
3627
/// <param name="logger">The <see cref="ILogger{TCategoryName}"/>.</param>
37-
/// <param name="synapse">The <see cref="ISynapseService"/>.</param>
38-
public Worker(ILogger<Worker> logger, ISynapseService synapse)
28+
/// <param name="service">The <see cref="ISynapseService"/>.</param>
29+
public Worker(ILogger<Worker> logger, ISynapseService service)
3930
{
4031
_logger = logger;
41-
_synapse = synapse;
42-
_synapse.StatusChanged += StatusChanged;
43-
_synapse.EffectReceived += EffectReceived;
32+
_service = service;
33+
34+
_service.StatusChanged += OnStatusChanged;
35+
_service.ColorsReceived += OnColorsReceived;
4436
}
4537

46-
/// <summary>
47-
/// Starts the worker.
48-
/// </summary>
49-
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
50-
/// <returns>A <see cref="Task"/> representing the worker starting.</returns>
51-
public Task StartAsync(CancellationToken cancellationToken)
38+
/// <inheritdoc/>
39+
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
5240
{
53-
LogStartMessage(_logger);
54-
55-
_synapse.StartService(new("00000000-0000-0000-0000-000000000000"));
41+
var currentColor = _cachedColor;
5642

57-
return Task.CompletedTask;
58-
}
43+
while (!stoppingToken.IsCancellationRequested)
44+
{
45+
if (!_serviceReady)
46+
{
47+
await Task.Delay(1000, stoppingToken);
48+
continue;
49+
}
5950

60-
/// <summary>
61-
/// Stops the worker.
62-
/// </summary>
63-
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
64-
/// <returns>A <see cref="Task"/> representing the worker stopping.</returns>
65-
public Task StopAsync(CancellationToken cancellationToken)
66-
{
67-
LogStopMessage(_logger);
51+
if (currentColor != _cachedColor)
52+
{
53+
currentColor = _cachedColor;
6854

69-
_synapse.StopService();
55+
LogColorChangedMessage(_logger, currentColor.R, currentColor.G, currentColor.B);
56+
}
7057

71-
return Task.CompletedTask;
58+
await Task.Delay(1000, stoppingToken);
59+
}
7260
}
7361

74-
private void StatusChanged(object? sender, SynapseStatus e)
62+
private void OnStatusChanged(object? sender, SynapseStatus e)
7563
{
76-
LogStatusMessage(_logger, e);
64+
_serviceReady = true;
7765
}
7866

79-
private void EffectReceived(object? sender, SynapseEffect e)
67+
private void OnColorsReceived(object? sender, Color[] e)
8068
{
81-
if (_colorCache != e.Color1)
82-
{
83-
_colorCache = e.Color1;
84-
85-
LogEffectMessage(_logger, e.Color1.R, e.Color1.G, e.Color1.B);
86-
}
69+
_cachedColor = e[0];
8770
}
8871
}

src/ChromaControl.SDK.Synapse/ChromaControl.SDK.Synapse.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
9+
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
1010
</ItemGroup>
1111

1212
</Project>

src/ChromaControl.SDK.Synapse/Extensions/ServiceCollectionSynapseExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The Chroma Control Contributors licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5+
using ChromaControl.SDK.OpenRGB.Hosting;
56
using Microsoft.Extensions.DependencyInjection;
67

78
namespace ChromaControl.SDK.Synapse.Extensions;
@@ -20,6 +21,8 @@ public static IServiceCollection AddSynapseSDK(this IServiceCollection services)
2021
{
2122
services.AddSingleton<ISynapseService, SynapseService>();
2223

24+
services.AddHostedService<SynapseHostService>();
25+
2326
return services;
2427
}
2528
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Licensed to the Chroma Control Contributors under one or more agreements.
2+
// The Chroma Control Contributors licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using ChromaControl.SDK.Synapse;
6+
using ChromaControl.SDK.Synapse.Enums;
7+
using Microsoft.Extensions.Configuration;
8+
using Microsoft.Extensions.Hosting;
9+
using Microsoft.Extensions.Logging;
10+
11+
namespace ChromaControl.SDK.OpenRGB.Hosting;
12+
13+
/// <summary>
14+
/// The host service for Synapse.
15+
/// </summary>
16+
public partial class SynapseHostService : IHostedService
17+
{
18+
private readonly ILogger<SynapseHostService> _logger;
19+
private readonly IConfiguration _configuration;
20+
private readonly SynapseService _synapse;
21+
22+
[LoggerMessage(EventId = 0, Level = LogLevel.Information, Message = "Synapse SDK is starting up...")]
23+
private static partial void LogStartMessage(ILogger logger);
24+
25+
[LoggerMessage(EventId = 1, Level = LogLevel.Error, Message = "Synapse SDK failed to start, invalid configuration.")]
26+
private static partial void LogStartErrorMessage(ILogger logger);
27+
28+
[LoggerMessage(EventId = 1, Level = LogLevel.Information, Message = "Synapse SDK is shutting down...")]
29+
private static partial void LogStopMessage(ILogger logger);
30+
31+
/// <summary>
32+
/// Creates a <see cref="SynapseHostService"/> instance.
33+
/// </summary>
34+
/// <param name="logger">The <see cref="ILogger{TCategoryName}"/>.</param>
35+
/// <param name="configuration">The <see cref="IConfiguration"/>.</param>
36+
/// <param name="synapse">The <see cref="SynapseService"/>.</param>
37+
public SynapseHostService(ILogger<SynapseHostService> logger, IConfiguration configuration, ISynapseService synapse)
38+
{
39+
_logger = logger;
40+
_configuration = configuration;
41+
_synapse = (SynapseService)synapse;
42+
}
43+
44+
/// <summary>
45+
/// Starts the service.
46+
/// </summary>
47+
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
48+
/// <returns>A <see cref="Task"/> representing the worker starting.</returns>
49+
public Task StartAsync(CancellationToken cancellationToken)
50+
{
51+
LogStartMessage(_logger);
52+
53+
var key = _configuration["CHROMACONTROL_KEY_SYNAPSE"];
54+
55+
var parseResult = Guid.TryParse(key, out var appId);
56+
57+
var startResult = parseResult
58+
? _synapse.StartService(appId)
59+
: _synapse.StartService(new());
60+
61+
if (startResult != SynapseResult.Success)
62+
{
63+
LogStartErrorMessage(_logger);
64+
}
65+
66+
return Task.CompletedTask;
67+
}
68+
69+
/// <summary>
70+
/// Stops the service.
71+
/// </summary>
72+
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
73+
/// <returns>A <see cref="Task"/> representing the worker stopping.</returns>
74+
public Task StopAsync(CancellationToken cancellationToken)
75+
{
76+
LogStopMessage(_logger);
77+
78+
_synapse.StopService();
79+
80+
return Task.CompletedTask;
81+
}
82+
}

src/ChromaControl.SDK.Synapse/ISynapseService.cs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using ChromaControl.SDK.Synapse.Enums;
6-
using ChromaControl.SDK.Synapse.Structs;
6+
using System.Drawing;
77

88
namespace ChromaControl.SDK.Synapse;
99

@@ -28,20 +28,7 @@ public interface ISynapseService
2828
event EventHandler<SynapseStatus>? StatusChanged;
2929

3030
/// <summary>
31-
/// Occurs when an effect is received.
31+
/// Occurs when color data is received.
3232
/// </summary>
33-
event EventHandler<SynapseEffect>? EffectReceived;
34-
35-
/// <summary>
36-
/// Starts the Synapse service.
37-
/// </summary>
38-
/// <param name="appId">Application Id for authentication.</param>
39-
/// <returns>A <see cref="SynapseResult"/>.</returns>
40-
SynapseResult StartService(in Guid appId);
41-
42-
/// <summary>
43-
/// Stops the Synapse service.
44-
/// </summary>
45-
/// <returns>A <see cref="SynapseResult"/>.</returns>
46-
SynapseResult StopService();
33+
event EventHandler<Color[]>? ColorsReceived;
4734
}

src/ChromaControl.SDK.Synapse/Structs/SynapseEffect.cs

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/ChromaControl.SDK.Synapse/SynapseService.cs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
using ChromaControl.SDK.Synapse.Enums;
66
using ChromaControl.SDK.Synapse.Internal;
77
using ChromaControl.SDK.Synapse.Internal.Enums;
8-
using ChromaControl.SDK.Synapse.Structs;
98
using System.Drawing;
10-
using System.Runtime.CompilerServices;
11-
using System.Runtime.InteropServices;
129

1310
namespace ChromaControl.SDK.Synapse;
1411

@@ -25,7 +22,7 @@ public partial class SynapseService : ISynapseService
2522
public event EventHandler<SynapseStatus>? StatusChanged;
2623

2724
/// <inheritdoc/>
28-
public event EventHandler<SynapseEffect>? EffectReceived;
25+
public event EventHandler<Color[]>? ColorsReceived;
2926

3027
private NativeSynapseService.RegisterEventNotificationCallback RegisterEventNotificationCallbackState { get; set; }
3128

@@ -37,8 +34,7 @@ public SynapseService()
3734
RegisterEventNotificationCallbackState = new(OnEventNotification);
3835
}
3936

40-
/// <inheritdoc/>
41-
public SynapseResult StartService(in Guid appId)
37+
internal SynapseResult StartService(in Guid appId)
4238
{
4339
var initResult = NativeSynapseService.Init(appId);
4440

@@ -57,8 +53,7 @@ public SynapseResult StartService(in Guid appId)
5753
return registerResult;
5854
}
5955

60-
/// <inheritdoc/>
61-
public SynapseResult StopService()
56+
internal SynapseResult StopService()
6257
{
6358
var unRegisterResult = NativeSynapseService.UnRegisterEventNotification();
6459

@@ -78,23 +73,22 @@ public SynapseResult StopService()
7873
return unInitResult;
7974
}
8075

81-
private SynapseResult OnEventNotification(SynapseEventType type, nint pData)
76+
private unsafe SynapseResult OnEventNotification(SynapseEventType type, nint pData)
8277
{
8378
if (type == SynapseEventType.Effect)
8479
{
85-
var effectDataPtr = Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), pData);
86-
var effectData = MemoryMarshal.CreateSpan(ref effectDataPtr, 5);
80+
var span = new ReadOnlySpan<byte>(pData.ToPointer(), 20);
8781

88-
var effect = new SynapseEffect
82+
var colors = new Color[]
8983
{
90-
Color1 = Color.FromArgb((effectData[0] >> 0) & 0xff, (effectData[0] >> 8) & 0xff, (effectData[0] >> 16) & 0xff),
91-
Color2 = Color.FromArgb((effectData[1] >> 0) & 0xff, (effectData[1] >> 8) & 0xff, (effectData[1] >> 16) & 0xff),
92-
Color3 = Color.FromArgb((effectData[2] >> 0) & 0xff, (effectData[2] >> 8) & 0xff, (effectData[2] >> 16) & 0xff),
93-
Color4 = Color.FromArgb((effectData[3] >> 0) & 0xff, (effectData[3] >> 8) & 0xff, (effectData[3] >> 16) & 0xff),
94-
Color5 = Color.FromArgb((effectData[4] >> 0) & 0xff, (effectData[4] >> 8) & 0xff, (effectData[4] >> 16) & 0xff)
84+
Color.FromArgb(span[3], span[0], span[1], span[2]),
85+
Color.FromArgb(span[7], span[4], span[5], span[6]),
86+
Color.FromArgb(span[11], span[8], span[9], span[10]),
87+
Color.FromArgb(span[15], span[12], span[13], span[14]),
88+
Color.FromArgb(span[10], span[16], span[17], span[18]),
9589
};
9690

97-
EffectReceived?.Invoke(this, effect);
91+
ColorsReceived?.Invoke(this, colors);
9892
}
9993
else if (type == SynapseEventType.Status)
10094
{

0 commit comments

Comments
 (0)