diff --git a/ElectronBot.BraincasePreview.BgTaskComponent/ElectronBot.BraincasePreview.BgTaskComponent.csproj b/ElectronBot.BraincasePreview.BgTaskComponent/ElectronBot.BraincasePreview.BgTaskComponent.csproj
index 6e7a7f5..3dfbe6d 100644
--- a/ElectronBot.BraincasePreview.BgTaskComponent/ElectronBot.BraincasePreview.BgTaskComponent.csproj
+++ b/ElectronBot.BraincasePreview.BgTaskComponent/ElectronBot.BraincasePreview.BgTaskComponent.csproj
@@ -10,11 +10,10 @@
-
+
- true
10.0.19041.0
AnyCPU
False
diff --git a/src/ElectronBot.BraincasePreview/App.xaml.cs b/src/ElectronBot.BraincasePreview/App.xaml.cs
index a9a6689..2d7cf52 100644
--- a/src/ElectronBot.BraincasePreview/App.xaml.cs
+++ b/src/ElectronBot.BraincasePreview/App.xaml.cs
@@ -20,6 +20,7 @@ using Microsoft.UI.Xaml.Media.Imaging;
using Verdure.ElectronBot.GrpcService;
using Windows.Media.Playback;
using Windows.ApplicationModel.Background;
+using Services;
namespace ElectronBot.BraincasePreview;
@@ -147,6 +148,8 @@ public partial class App : Application
services.AddSingleton();
+ services.AddSingleton();
+
services.AddGrpcClient(o =>
{
diff --git a/src/ElectronBot.BraincasePreview/Helpers/EbHelper.cs b/src/ElectronBot.BraincasePreview/Helpers/EbHelper.cs
index 8f075df..145c56b 100644
--- a/src/ElectronBot.BraincasePreview/Helpers/EbHelper.cs
+++ b/src/ElectronBot.BraincasePreview/Helpers/EbHelper.cs
@@ -1,17 +1,13 @@
-using System;
-using System.Collections.Generic;
-using System.Drawing;
-using System.IO;
-using System.Linq;
+using System.Drawing;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text.Json;
-using System.Threading.Tasks;
-using Verdure.ElectronBot.Core.Models;
using ElectronBot.BraincasePreview.Models;
using Microsoft.Graphics.Canvas;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Media.Imaging;
+using Services;
+using Verdure.ElectronBot.Core.Models;
using Windows.Devices.Enumeration;
using Windows.Graphics.Imaging;
using Windows.Media.Devices;
@@ -237,7 +233,7 @@ public class EbHelper
var dataMeta = mat2.Data;
- Marshal.Copy(dataMeta, data, 0, 240 * 240 * 3);
+ Marshal.Copy(dataMeta, data, 0, 240 * 240 * 3);
}
var frame = new EmoticonActionFrame(
data, true, action.J1, action.J2, action.J3, action.J4, action.J5, action.J6);
@@ -338,6 +334,9 @@ public class EbHelper
Marshal.Copy(dataMeta, data, 0, 240 * 240 * 3);
EmojiPlayHelper.Current.Enqueue(new EmoticonActionFrame(data));
+
+ var service = App.GetService();
+ _ = await service.SendToUsbDeviceAsync(new EmoticonActionFrame(data));
}
catch (Exception)
{
diff --git a/src/ElectronBot.BraincasePreview/Services/EmoticonActionFrameService.cs b/src/ElectronBot.BraincasePreview/Services/EmoticonActionFrameService.cs
new file mode 100644
index 0000000..98bae35
--- /dev/null
+++ b/src/ElectronBot.BraincasePreview/Services/EmoticonActionFrameService.cs
@@ -0,0 +1,59 @@
+using System.Collections.Concurrent;
+using ElectronBot.BraincasePreview.Helpers;
+using Verdure.ElectronBot.Core.Models;
+
+namespace Services;
+public class EmoticonActionFrameService
+{
+ private readonly ConcurrentQueue<(EmoticonActionFrame Data, TaskCompletionSource Tcs, CancellationToken Ct)> _queue = new();
+
+ private int _isSending;
+
+ public async Task SendToUsbDeviceAsync(EmoticonActionFrame data, CancellationToken cancellationToken = default)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var tcs = new TaskCompletionSource();
+
+ _queue.Enqueue((data, tcs, cancellationToken));
+
+ if (Interlocked.CompareExchange(ref _isSending, 1, 0) == 0)
+ {
+ _ = Task.Run(SendDataAsync, CancellationToken.None);
+ }
+
+ return await tcs.Task.WaitAsync(cancellationToken).ConfigureAwait(false);
+ }
+
+ private async Task SendDataAsync()
+ {
+ while (_queue.TryDequeue(out var item))
+ {
+ var (data, tcs, cancellationToken) = item;
+
+ if (cancellationToken.IsCancellationRequested)
+ {
+ tcs.TrySetCanceled(cancellationToken);
+ continue;
+ }
+
+ await Task.Delay(100).ConfigureAwait(false);
+
+ try
+ {
+ if (data != null)
+ {
+ ElectronBotHelper.Instance.PlayEmoticonActionFrame(data);
+ tcs.TrySetResult(true);
+ }
+ //todo:
+ }
+ catch (Exception e)
+ {
+ tcs.TrySetException(e);
+ }
+ }
+
+ Interlocked.Exchange(ref _isSending, 0);
+ }
+}
\ No newline at end of file