From ead2cfca2afbd691ef88c7bf72813b4656153eee Mon Sep 17 00:00:00 2001 From: gil zhang Date: Wed, 23 Nov 2022 02:17:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E6=AD=A5=E5=8F=91?= =?UTF-8?q?=E9=80=81=E6=95=B0=E6=8D=AE=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ot.BraincasePreview.BgTaskComponent.csproj | 3 +- src/ElectronBot.BraincasePreview/App.xaml.cs | 3 + .../Helpers/EbHelper.cs | 15 +++-- .../Services/EmoticonActionFrameService.cs | 59 +++++++++++++++++++ 4 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 src/ElectronBot.BraincasePreview/Services/EmoticonActionFrameService.cs 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