From 3c0cd0c13628affa3bfaeadd3d44cc8ea66f2a43 Mon Sep 17 00:00:00 2001 From: gil zhang Date: Sat, 15 Oct 2022 21:44:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0GRPC=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=94=A8=E6=9D=A5=E9=83=A8=E7=BD=B2=E5=88=B0linux=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=A6=82=E6=A0=91=E8=8E=93=E6=B4=BE=EF=BC=8C=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E8=BF=99=E4=BA=9B=E8=AE=BE=E5=A4=87=E5=92=8C=E6=A0=91?= =?UTF-8?q?=E8=8E=93=E6=B4=BE=E8=BF=9E=E6=8E=A5=E8=BF=9B=E8=A1=8Cweb?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=EF=BC=8C=E4=BB=A5=E4=BE=BF=E4=BA=8E=E7=94=B5?= =?UTF-8?q?=E5=AD=90=E8=84=B1=E7=A6=BBpc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ElectronBot.BraincasePreview.sln | 23 ++++++ Verdure.ElectronBot.sln | 61 +++++++++++++++ .../ElectronBot.BraincasePreview.Core.csproj | 12 +++ .../Protos/electronbotaction.proto | 28 +++++++ .../Protos/greet.proto | 21 ++++++ .../Services/EbotGrpcService/EbGrpcService.cs | 33 +++++++++ src/ElectronBot.BraincasePreview/App.xaml.cs | 8 ++ .../ElectronBot.BraincasePreview.csproj | 1 - .../DefaultActionExpressionProvider.cs | 10 ++- .../.config/dotnet-tools.json | 12 +++ .../EmojiPlayHelper.cs | 74 +++++++++++++++++++ .../Models/EmoticonActionFrame.cs | 55 ++++++++++++++ .../Program.cs | 26 +++++++ .../Properties/launchSettings.json | 13 ++++ .../Protos/electronbotaction.proto | 28 +++++++ .../Protos/greet.proto | 21 ++++++ .../Services/ElectronBotActionService.cs | 36 +++++++++ .../Services/GreeterService.cs | 20 +++++ .../Verdure.ElectronBot.GrpcService.csproj | 22 ++++++ .../appsettings.Development.json | 8 ++ .../appsettings.json | 14 ++++ 21 files changed, 522 insertions(+), 4 deletions(-) create mode 100644 Verdure.ElectronBot.sln create mode 100644 src/ElectronBot.BraincasePreview.Core/Protos/electronbotaction.proto create mode 100644 src/ElectronBot.BraincasePreview.Core/Protos/greet.proto create mode 100644 src/ElectronBot.BraincasePreview.Core/Services/EbotGrpcService/EbGrpcService.cs create mode 100644 src/Verdure.ElectronBot.GrpcService/.config/dotnet-tools.json create mode 100644 src/Verdure.ElectronBot.GrpcService/EmojiPlayHelper.cs create mode 100644 src/Verdure.ElectronBot.GrpcService/Models/EmoticonActionFrame.cs create mode 100644 src/Verdure.ElectronBot.GrpcService/Program.cs create mode 100644 src/Verdure.ElectronBot.GrpcService/Properties/launchSettings.json create mode 100644 src/Verdure.ElectronBot.GrpcService/Protos/electronbotaction.proto create mode 100644 src/Verdure.ElectronBot.GrpcService/Protos/greet.proto create mode 100644 src/Verdure.ElectronBot.GrpcService/Services/ElectronBotActionService.cs create mode 100644 src/Verdure.ElectronBot.GrpcService/Services/GreeterService.cs create mode 100644 src/Verdure.ElectronBot.GrpcService/Verdure.ElectronBot.GrpcService.csproj create mode 100644 src/Verdure.ElectronBot.GrpcService/appsettings.Development.json create mode 100644 src/Verdure.ElectronBot.GrpcService/appsettings.json diff --git a/ElectronBot.BraincasePreview.sln b/ElectronBot.BraincasePreview.sln index 3e222ab..1d3f755 100644 --- a/ElectronBot.BraincasePreview.sln +++ b/ElectronBot.BraincasePreview.sln @@ -11,6 +11,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElectronBot.BraincasePrevie EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElectronBot.BraincasePreview.Tests.MSTest", "src\ElectronBot.BraincasePreview.Tests.MSTest\ElectronBot.BraincasePreview.Tests.MSTest.csproj", "{BE221B1D-5216-4592-90CE-C5B854BF4A33}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebService", "WebService", "{713E0140-982E-4FBF-8F3B-F22093A865CD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Verdure.ElectronBot.GrpcService", "src\Verdure.ElectronBot.GrpcService\Verdure.ElectronBot.GrpcService.csproj", "{FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -95,10 +99,29 @@ Global {BE221B1D-5216-4592-90CE-C5B854BF4A33}.Release|x64.Build.0 = Release|x64 {BE221B1D-5216-4592-90CE-C5B854BF4A33}.Release|x86.ActiveCfg = Release|x86 {BE221B1D-5216-4592-90CE-C5B854BF4A33}.Release|x86.Build.0 = Release|x86 + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|arm64.ActiveCfg = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|arm64.Build.0 = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|x64.ActiveCfg = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|x64.Build.0 = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|x86.ActiveCfg = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Debug|x86.Build.0 = Debug|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|Any CPU.Build.0 = Release|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|arm64.ActiveCfg = Release|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|arm64.Build.0 = Release|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|x64.ActiveCfg = Release|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|x64.Build.0 = Release|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|x86.ActiveCfg = Release|Any CPU + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {FF25CC1E-90B8-449A-AE9C-20F1504DDAC2} = {713E0140-982E-4FBF-8F3B-F22093A865CD} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0EBF82F3-30A6-4BCC-950A-360C126FC118} EndGlobalSection diff --git a/Verdure.ElectronBot.sln b/Verdure.ElectronBot.sln new file mode 100644 index 0000000..b097432 --- /dev/null +++ b/Verdure.ElectronBot.sln @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32819.101 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElectronBot.DotNet", "src\ElectronBot.DotNet\ElectronBot.DotNet.csproj", "{8FD16BB5-D953-44CB-8709-A79998337A1C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Verdure.ElectronBot.GrpcService", "src\Verdure.ElectronBot.GrpcService\Verdure.ElectronBot.GrpcService.csproj", "{9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|arm64 = Debug|arm64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|arm64 = Release|arm64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|arm64.ActiveCfg = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|arm64.Build.0 = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|x64.ActiveCfg = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|x64.Build.0 = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|x86.ActiveCfg = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Debug|x86.Build.0 = Debug|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|Any CPU.Build.0 = Release|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|arm64.ActiveCfg = Release|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|arm64.Build.0 = Release|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|x64.ActiveCfg = Release|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|x64.Build.0 = Release|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|x86.ActiveCfg = Release|Any CPU + {8FD16BB5-D953-44CB-8709-A79998337A1C}.Release|x86.Build.0 = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|arm64.ActiveCfg = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|arm64.Build.0 = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|x64.ActiveCfg = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|x64.Build.0 = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|x86.ActiveCfg = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Debug|x86.Build.0 = Debug|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|Any CPU.Build.0 = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|arm64.ActiveCfg = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|arm64.Build.0 = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|x64.ActiveCfg = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|x64.Build.0 = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|x86.ActiveCfg = Release|Any CPU + {9FE05D7A-FA55-4C77-8CE7-F1EEF3765999}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0EBF82F3-30A6-4BCC-950A-360C126FC118} + EndGlobalSection +EndGlobal diff --git a/src/ElectronBot.BraincasePreview.Core/ElectronBot.BraincasePreview.Core.csproj b/src/ElectronBot.BraincasePreview.Core/ElectronBot.BraincasePreview.Core.csproj index 7a0f3d0..d9bf52b 100644 --- a/src/ElectronBot.BraincasePreview.Core/ElectronBot.BraincasePreview.Core.csproj +++ b/src/ElectronBot.BraincasePreview.Core/ElectronBot.BraincasePreview.Core.csproj @@ -11,5 +11,17 @@ + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + diff --git a/src/ElectronBot.BraincasePreview.Core/Protos/electronbotaction.proto b/src/ElectronBot.BraincasePreview.Core/Protos/electronbotaction.proto new file mode 100644 index 0000000..e02293e --- /dev/null +++ b/src/ElectronBot.BraincasePreview.Core/Protos/electronbotaction.proto @@ -0,0 +1,28 @@ +syntax = "proto3"; + +option csharp_namespace = "Verdure.ElectronBot.GrpcService"; + +package electronbotactionGrpc; + +// The electronbotaction service definition. +service ElectronBotActionGrpc { + // Sends a greeting + rpc PlayEmoticonAction (EmoticonActionFrameRequest) returns (EbHelloReply); +} + +// The request message containing the user's name. +message EmoticonActionFrameRequest { + float J1 = 1; + float J2 = 2; + float J3 = 3; + float J4 = 4; + float J5 = 5; + float J6 = 6; + bool Enable = 7; + bytes FrameBuffer = 8; +} + +// The response message containing the greetings. +message EbHelloReply { + string message = 9; +} diff --git a/src/ElectronBot.BraincasePreview.Core/Protos/greet.proto b/src/ElectronBot.BraincasePreview.Core/Protos/greet.proto new file mode 100644 index 0000000..cf68662 --- /dev/null +++ b/src/ElectronBot.BraincasePreview.Core/Protos/greet.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +option csharp_namespace = "Verdure.ElectronBot.GrpcService"; + +package greet; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply); +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings. +message HelloReply { + string message = 1; +} diff --git a/src/ElectronBot.BraincasePreview.Core/Services/EbotGrpcService/EbGrpcService.cs b/src/ElectronBot.BraincasePreview.Core/Services/EbotGrpcService/EbGrpcService.cs new file mode 100644 index 0000000..18a4aa2 --- /dev/null +++ b/src/ElectronBot.BraincasePreview.Core/Services/EbotGrpcService/EbGrpcService.cs @@ -0,0 +1,33 @@ +using ElectronBot.BraincasePreview.Core.Models; +using Google.Protobuf; +using Verdure.ElectronBot.GrpcService; + +namespace ElectronBot.BraincasePreview.Services.EbotGrpcService; +public class EbGrpcService +{ + private readonly ElectronBotActionGrpc.ElectronBotActionGrpcClient _client; + public EbGrpcService(ElectronBotActionGrpc.ElectronBotActionGrpcClient client) + { + _client = client; + } + + public async Task PlayEmoticonActionFrameAsync(EmoticonActionFrame frame) + { + var data = new EmoticonActionFrameRequest + { + FrameBuffer = ByteString.CopyFrom(frame.FrameBuffer), + + Enable = frame.Enable, + J1 = frame.J1, + J2 = frame.J2, + J3 = frame.J3, + J4 = frame.J4, + J5 = frame.J5, + J6 = frame.J6 + }; + var result = await _client.PlayEmoticonActionAsync(data); + + return result.Message; + } +} + diff --git a/src/ElectronBot.BraincasePreview/App.xaml.cs b/src/ElectronBot.BraincasePreview/App.xaml.cs index ec1c3b6..71bee15 100644 --- a/src/ElectronBot.BraincasePreview/App.xaml.cs +++ b/src/ElectronBot.BraincasePreview/App.xaml.cs @@ -17,6 +17,7 @@ using Microsoft.Graphics.Canvas; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media.Imaging; +using Verdure.ElectronBot.GrpcService; using Windows.Media.Playback; namespace ElectronBot.BraincasePreview; @@ -138,6 +139,13 @@ public partial class App : Application services.AddSingleton(); + + services.AddGrpcClient(o => + { + o.Address = new Uri("http://192.168.3.236:5241"); + }); + + services.AddSingleton(); // Configuration services.Configure(context.Configuration.GetSection(nameof(LocalSettingsOptions))); }). diff --git a/src/ElectronBot.BraincasePreview/ElectronBot.BraincasePreview.csproj b/src/ElectronBot.BraincasePreview/ElectronBot.BraincasePreview.csproj index efffa09..1668b12 100644 --- a/src/ElectronBot.BraincasePreview/ElectronBot.BraincasePreview.csproj +++ b/src/ElectronBot.BraincasePreview/ElectronBot.BraincasePreview.csproj @@ -44,7 +44,6 @@ - diff --git a/src/ElectronBot.BraincasePreview/Services/ActionExpression/DefaultActionExpressionProvider.cs b/src/ElectronBot.BraincasePreview/Services/ActionExpression/DefaultActionExpressionProvider.cs index 822a68c..5ff0e5c 100644 --- a/src/ElectronBot.BraincasePreview/Services/ActionExpression/DefaultActionExpressionProvider.cs +++ b/src/ElectronBot.BraincasePreview/Services/ActionExpression/DefaultActionExpressionProvider.cs @@ -3,6 +3,7 @@ using ElectronBot.BraincasePreview.Contracts.Services; using ElectronBot.BraincasePreview.Core.Models; using ElectronBot.BraincasePreview.Helpers; using ElectronBot.BraincasePreview.Models; +using ElectronBot.BraincasePreview.Services.EbotGrpcService; using OpenCvSharp; using Windows.ApplicationModel; @@ -49,7 +50,7 @@ public class DefaultActionExpressionProvider : IActionExpressionProvider return Task.CompletedTask; } - public Task PlayActionExpressionAsync(string actionName, List actions) + public async Task PlayActionExpressionAsync(string actionName, List actions) { Mat image = new(); @@ -108,9 +109,12 @@ public class DefaultActionExpressionProvider : IActionExpressionProvider currentAction.J6); EmojiPlayHelper.Current.Enqueue(frameData); + + //通过grpc通讯和树莓派传输数据 + var grpcClient = App.GetService(); + + await grpcClient.PlayEmoticonActionFrameAsync(frameData); } } - - return Task.CompletedTask; } } diff --git a/src/Verdure.ElectronBot.GrpcService/.config/dotnet-tools.json b/src/Verdure.ElectronBot.GrpcService/.config/dotnet-tools.json new file mode 100644 index 0000000..53c8226 --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "6.0.10", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/src/Verdure.ElectronBot.GrpcService/EmojiPlayHelper.cs b/src/Verdure.ElectronBot.GrpcService/EmojiPlayHelper.cs new file mode 100644 index 0000000..b6725b0 --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/EmojiPlayHelper.cs @@ -0,0 +1,74 @@ +using ElectronBot.DotNet; +using Verdure.ElectronBot.GrpcService.Models; + +namespace Verdure.ElectronBot.GrpcService; +public class EmojiPlayHelper +{ + private static EmojiPlayHelper _current; + public static EmojiPlayHelper Current => _current ??= new EmojiPlayHelper(); + + private readonly Queue _actonFrame = new(); + + private readonly object _actonFrameLock = new(); + + public IElectronLowLevel ElectronLowLevel + { + get; set; + } + + public int Interval + { + get; set; + } + + public void Start() + { + var thread = new Thread(RunPlayAsync); + + ElectronLowLevel.Connect(); + //thread.IsBackground = true; + thread.Start(); + } + + public void Clear() + { + _actonFrame.Clear(); + } + + private void RunPlayAsync() + { + while (true) + { + try + { + lock (_actonFrameLock) + { + if (_actonFrame.Count > 10) + { + var frame = _actonFrame.Dequeue(); + + + if (ElectronLowLevel.IsConnected) + { + ElectronLowLevel.SetImageSrc(frame.FrameBuffer); + ElectronLowLevel.SetJointAngles(frame.J1, frame.J2, frame.J3, frame.J4, frame.J5, frame.J6, frame.Enable); + ElectronLowLevel.Sync(); + } + + Thread.Sleep(Interval); + } + } + + } + catch (Exception ex) + { + + } + } + } + + public void Enqueue(EmoticonActionFrame frame) + { + _actonFrame.Enqueue(frame); + } +} diff --git a/src/Verdure.ElectronBot.GrpcService/Models/EmoticonActionFrame.cs b/src/Verdure.ElectronBot.GrpcService/Models/EmoticonActionFrame.cs new file mode 100644 index 0000000..c7c422f --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Models/EmoticonActionFrame.cs @@ -0,0 +1,55 @@ +namespace Verdure.ElectronBot.GrpcService.Models; +public class EmoticonActionFrame +{ + public byte[] FrameBuffer + { + get; set; + } + public float J1 + { + get; set; + } + public float J2 + { + get; set; + } + public float J3 + { + get; set; + } + public float J4 + { + get; set; + } + public float J5 + { + get; set; + } + public float J6 + { + get; set; + } + public bool Enable + { + get; set; + } + public EmoticonActionFrame( + byte[] imgData, + bool enable = false, + float j1 = 0, + float j2 = 0, + float j3 = 0, + float j4 = 0, + float j5 = 0, + float j6 = 0) + { + FrameBuffer = imgData; + J1 = j1; + J2 = j2; + J3 = j3; + J4 = j4; + J5 = j5; + J6 = j6; + Enable = enable; + } +} diff --git a/src/Verdure.ElectronBot.GrpcService/Program.cs b/src/Verdure.ElectronBot.GrpcService/Program.cs new file mode 100644 index 0000000..96d7de6 --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Program.cs @@ -0,0 +1,26 @@ +using ElectronBot.DotNet; +using Verdure.ElectronBot.GrpcService; +using Verdure.ElectronBot.GrpcService.Services; + +var builder = WebApplication.CreateBuilder(args); + +// Additional configuration is required to successfully run gRPC on macOS. +// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 + +// Add services to the container. +builder.Services.AddGrpc(); + +builder.Services.AddSingleton(); + +var app = builder.Build(); + +EmojiPlayHelper.Current.ElectronLowLevel = app.Services.GetRequiredService(); + +EmojiPlayHelper.Current.Start(); + +// Configure the HTTP request pipeline. +app.MapGrpcService(); +app.MapGrpcService(); +app.MapGet("/abc", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); + +app.Run(); diff --git a/src/Verdure.ElectronBot.GrpcService/Properties/launchSettings.json b/src/Verdure.ElectronBot.GrpcService/Properties/launchSettings.json new file mode 100644 index 0000000..138faea --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "Verdure.ElectronBot.GrpcService": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5191", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/Verdure.ElectronBot.GrpcService/Protos/electronbotaction.proto b/src/Verdure.ElectronBot.GrpcService/Protos/electronbotaction.proto new file mode 100644 index 0000000..2dcb014 --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Protos/electronbotaction.proto @@ -0,0 +1,28 @@ +syntax = "proto3"; + +option csharp_namespace = "Verdure.ElectronBot.GrpcService"; + +package electronbotactiongrpc; + +// The electronbotaction service definition. +service ElectronBotActionGrpc { + // Sends a greeting + rpc PlayEmoticonAction (EmoticonActionFrameRequest) returns (EbHelloReply); +} + +// The request message containing the user's name. +message EmoticonActionFrameRequest { + float J1 = 1; + float J2 = 2; + float J3 = 3; + float J4 = 4; + float J5 = 5; + float J6 = 6; + bool Enable = 7; + bytes FrameBuffer = 8; +} + +// The response message containing the greetings. +message EbHelloReply { + string message = 9; +} diff --git a/src/Verdure.ElectronBot.GrpcService/Protos/greet.proto b/src/Verdure.ElectronBot.GrpcService/Protos/greet.proto new file mode 100644 index 0000000..cf68662 --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Protos/greet.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +option csharp_namespace = "Verdure.ElectronBot.GrpcService"; + +package greet; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply); +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings. +message HelloReply { + string message = 1; +} diff --git a/src/Verdure.ElectronBot.GrpcService/Services/ElectronBotActionService.cs b/src/Verdure.ElectronBot.GrpcService/Services/ElectronBotActionService.cs new file mode 100644 index 0000000..f35b889 --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Services/ElectronBotActionService.cs @@ -0,0 +1,36 @@ +using ElectronBot.DotNet; +using Grpc.Core; +using Verdure.ElectronBot.GrpcService.Models; + +namespace Verdure.ElectronBot.GrpcService.Services; +public class ElectronBotActionService : ElectronBotActionGrpc.ElectronBotActionGrpcBase +{ + private readonly ILogger _logger; + + private readonly IElectronLowLevel _electronLowLevel; + public ElectronBotActionService(ILogger logger, IElectronLowLevel electronLowLevel) + { + _logger = logger; + _electronLowLevel = electronLowLevel; + } + + public override Task PlayEmoticonAction( + EmoticonActionFrameRequest request, ServerCallContext context) + { + var frameAction = request.FrameBuffer.ToByteArray(); + + var actionData = new EmoticonActionFrame(frameAction, request.Enable, + request.J1, + request.J2, + request.J3, + request.J4, + request.J5, + request.J6); + + EmojiPlayHelper.Current.Enqueue(actionData); + + var result = new EbHelloReply() { Message = "ok" }; + + return Task.FromResult(result); + } +} diff --git a/src/Verdure.ElectronBot.GrpcService/Services/GreeterService.cs b/src/Verdure.ElectronBot.GrpcService/Services/GreeterService.cs new file mode 100644 index 0000000..7764e2b --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Services/GreeterService.cs @@ -0,0 +1,20 @@ +using Grpc.Core; +using Verdure.ElectronBot.GrpcService; + +namespace Verdure.ElectronBot.GrpcService.Services; +public class GreeterService : Greeter.GreeterBase +{ + private readonly ILogger _logger; + public GreeterService(ILogger logger) + { + _logger = logger; + } + + public override Task SayHello(HelloRequest request, ServerCallContext context) + { + return Task.FromResult(new HelloReply + { + Message = "Hello " + request.Name + }); + } +} diff --git a/src/Verdure.ElectronBot.GrpcService/Verdure.ElectronBot.GrpcService.csproj b/src/Verdure.ElectronBot.GrpcService/Verdure.ElectronBot.GrpcService.csproj new file mode 100644 index 0000000..f82e15f --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/Verdure.ElectronBot.GrpcService.csproj @@ -0,0 +1,22 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/src/Verdure.ElectronBot.GrpcService/appsettings.Development.json b/src/Verdure.ElectronBot.GrpcService/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/Verdure.ElectronBot.GrpcService/appsettings.json b/src/Verdure.ElectronBot.GrpcService/appsettings.json new file mode 100644 index 0000000..1aef507 --- /dev/null +++ b/src/Verdure.ElectronBot.GrpcService/appsettings.json @@ -0,0 +1,14 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Kestrel": { + "EndpointDefaults": { + "Protocols": "Http2" + } + } +}