long candy ready to test

This commit is contained in:
meelstorm
2025-09-05 11:11:23 +02:00
parent d52c844b5d
commit e5746ef766
39 changed files with 904 additions and 168 deletions

View File

@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<EnableDynamicLoading>true</EnableDynamicLoading>
<Nullable>enable</Nullable>
<OutDir>..\..\VisionBuilder.UI.Windows.Test\bin\Debug\Data\Plugins\CandyboxPlugin</OutDir>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.6.0.20220608" >
<Private>False</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
<ProjectReference Include="..\..\framework\Inspectron.Settings\Inspectron.Settings.csproj">
<Private>False</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
<ProjectReference Include="..\..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj">
<Private>false</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,7 @@
namespace CandyboxPlugin
{
public class Class1
{
}
}

View File

@@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableDynamicLoading>true</EnableDynamicLoading>
<OutDir>..\..\..\VisionBuilder.UI.Windows.Test\bin\Debug\Data\Plugins\PackstrasseBarcodeReader</OutDir>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.IO.Ports" Version="7.0.0">
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Inspectron.Settings\Inspectron.Settings.csproj">
<Private>False</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
<ProjectReference Include="..\..\..\VisionBuilder.UI.Common\VisionBuilder.UI.Common.csproj">
<Private>False</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</ProjectReference>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,63 @@
using System.IO.Ports;
using System.Security.AccessControl;
using System.Text;
using Serilog;
using VisionBuilder.UI.Common;
using VisionBuilder.UI.Common.RecipeProcessing;
namespace PackstrasseBarcodeReader
{
public class PackstrasseBarcodeReaderModule : IVisionBuilderModule
{
private readonly PackstrasseBarcodeReaderSettings _settings;
private readonly IRecognitionControl _recognitionControl;
private SerialPort _port;
public PackstrasseBarcodeReaderModule(PackstrasseBarcodeReaderSettings settings, IRecognitionControl recognitionControl)
{
_settings = settings;
_recognitionControl = recognitionControl;
}
private void _port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(100);
byte[] buffer = new byte[_port.BytesToRead];
_port.Read(buffer, 0, _port.BytesToRead);
var data = Encoding.ASCII.GetString(buffer).Trim();
var recipes = _recognitionControl.GetRecipesData();
string searchString = data;
if (_settings.BarcodeRecipeMappings.Any(x=>x.Barcode==searchString))
{
searchString = _settings.BarcodeRecipeMappings.First(x => x.Barcode == searchString).RecipeName;
}
var existingRecipe=recipes.FirstOrDefault(x => x.RecipeName == searchString);
if (existingRecipe == null)
{
Log.Warning("No matching recipe found for data: {Data}", data);
return;
}
_recognitionControl.SetRecipe(existingRecipe);
}
public void InitializeModule()
{
try
{
_port = new SerialPort(_settings.ComPort, 9600);
_port.Open();
_port.DataReceived += _port_DataReceived;
}
catch (Exception e)
{
Log.Warning(e, "Failed to open com-port");
}
}
}
}

View File

@@ -0,0 +1,63 @@
using Inspectron.Settings;
using System.Text.Json;
using System.Text.Json.Serialization;
using VisionBuilder.UI.Common;
namespace PackstrasseBarcodeReader;
public class PackstrasseBarcodeReaderSettings(string CameraName):ISettings
{
public string ComPort { get; set; }="COM3";
public List<BarcodeRecipeMapping> BarcodeRecipeMappings { get; set; } = new List<BarcodeRecipeMapping>();
public void RegisterSettings(InspectronSettings settings)
{
settings.RegisterSimple(this, () => ComPort, CameraName+"/Barcode reader", nameof(ComPort));
settings.RegisterSimple(this, () => BarcodeRecipeMappings, CameraName+"/Barcode reader", nameof(BarcodeRecipeMappings));
}
}
public class BarcodeRecipeMapping
{
public string Barcode { get; set; }
public string RecipeName { get; set; }
}
public class ListBarcodeRecipeMappingConverter: ITypeConverter
{
public object ConvertFrom(object value)
{
if (value is string json)
{
try
{
return JsonSerializer.Deserialize<List<BarcodeRecipeMapping>>(json, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
Converters = { new JsonStringEnumConverter() }
});
}
catch (JsonException)
{
throw new InvalidOperationException("Failed to deserialize BarcodeRecipeMapping list from JSON.");
}
}
throw new InvalidOperationException("Value must be a JSON string.");
}
public object ConvertTo(object value, Type destinationType)
{
if (value is List<BarcodeRecipeMapping> list && destinationType == typeof(string))
{
return JsonSerializer.Serialize(list, new JsonSerializerOptions
{
WriteIndented = false,
Converters = { new JsonStringEnumConverter() }
});
}
throw new InvalidOperationException("Value must be a List<BarcodeRecipeMapping> and destinationType must be string.");
}
}

View File

@@ -0,0 +1,21 @@
using Inspectron.Settings;
using Ninject;
using VisionBuilder.UI.Common;
using VisionBuilder.UI.Common.Plugins;
namespace PackstrasseBarcodeReader;
public class Plugin : IPlugin
{
public void RegisterGlobalModules(IKernel kernel)
{
TypeConverterRegistry.Register<List<BarcodeRecipeMapping>>(new ListBarcodeRecipeMappingConverter());
}
public void RegisterCameraModules(IKernel kernel, string cameraName)
{
kernel.Bind<PackstrasseBarcodeReaderSettings, ISettings>()
.ToConstant(new PackstrasseBarcodeReaderSettings(cameraName));
kernel.RegisterModule<PackstrasseBarcodeReaderModule>();
}
}

View File

@@ -5,7 +5,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableDynamicLoading>true</EnableDynamicLoading>
<OutDir>D:\Inspectron\Hawkeye\code\VisionBuilder5\VisionBuilder.UI\VisionBuilder.UI.Windows.Test\bin\Debug\Data\Plugins\B24SiemensPlugin</OutDir>
<OutDir>..\..\..\VisionBuilder.UI.Windows.Test\bin\Debug\Data\Plugins\B24SiemensPlugin</OutDir>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\framework\Inspectron.Settings\Inspectron.Settings.csproj">