feat: mock run mode

extract IImageCapturerService interface from ImageCapturerService
add ImageCapturerMockService as implementation of IImageCapturerService
add --mock flag in command line interface and implement its usage
This commit is contained in:
2026-06-17 10:35:36 +03:00
parent 80856ba60d
commit 913805eb70
5 changed files with 107 additions and 25 deletions
@@ -0,0 +1,10 @@
using OpenCvSharp;
namespace GSS2.Core.Analysis.AmineContent;
public interface IImageCapturerService
{
public Task CaptureImages(Action<(int i, double visible, double uv365, double uv254, Mat image)> callback, CancellationToken cancellationToken);
public Task CaptureImages(Func<(int i, double visible, double uv365, double uv254, Mat image), Task> callback, CancellationToken cancellationToken);
}
@@ -0,0 +1,57 @@
using System.Collections.ObjectModel;
using Microsoft.Extensions.Logging;
using OpenCvSharp;
using GSS2.Core.Extensions;
namespace GSS2.Core.Analysis.AmineContent;
public class ImageCapturerMockService : IImageCapturerService
{
// Список интенсивностей освещения для каждого кадра
public static readonly ReadOnlyCollection<(double visible, double uv365, double uv254)> IlluminatorIntensities =
[
(0.02500, 0.0, 0.0),
(0.01250, 0.0, 0.0),
(0.00625, 0.0, 0.0),
(0.00000, 1.0, 0.0),
(0.00000, 0.0, 1.0),
(0.00000, 1.0, 1.0),
(0.01250, 1.0, 0.0),
(0.01250, 0.0, 1.0),
(0.01250, 1.0, 1.0),
(0.00625, 1.0, 0.0),
(0.00625, 0.0, 1.0),
(0.00625, 1.0, 1.0)
];
private readonly string _imagesDirectoryPath;
private readonly ILogger<ImageCapturerMockService> _logger;
public ImageCapturerMockService(string imagesDirectoryPath, ILogger<ImageCapturerMockService> logger)
{
_imagesDirectoryPath = imagesDirectoryPath;
_logger = logger;
}
public async Task CaptureImages(Action<(int i, double visible, double uv365, double uv254, Mat image)> callback, CancellationToken cancellationToken) =>
await CaptureImages(async (data) => callback(data), cancellationToken);
public async Task CaptureImages(Func<(int i, double visible, double uv365, double uv254, Mat image), Task> callback, CancellationToken cancellationToken)
{
foreach (var (i, (visible, uv365, uv254)) in IlluminatorIntensities.Enumerate())
{
cancellationToken.ThrowIfCancellationRequested();
_logger.LogInformation("Capturing images: {} / {} ({};{};{})", i + 1, IlluminatorIntensities.Count(), visible, uv365, uv254);
Mat? image = Cv2.ImRead(Path.Join(_imagesDirectoryPath, $"{visible}-{uv365}-{uv254}.png"));
if (image is null)
throw new Exception("Image capture failed");
await callback.Invoke((i, visible, uv365, uv254, image));
}
}
}
@@ -11,7 +11,7 @@ using OpenCvSharp;
namespace GSS2.Core.Analysis.AmineContent;
public class ImageCapturerService
public class ImageCapturerService : IImageCapturerService
{
// Список интенсивностей освещения для каждого кадра
public static readonly ReadOnlyCollection<(double visible, double uv365, double uv254)> IlluminatorIntensities =
+14 -4
View File
@@ -7,8 +7,7 @@ using Microsoft.Extensions.Logging.Console;
using GSS2.Core.Logging;
using GSS2.Core.Hardware;
using GSS2.Core.Analysis.AmineContent.Database.Calibration;
using GSS2.Core.Analysis.AmineContent.Database.Results;
using GSS2.Core.Analysis.AmineContent.Database;
using GSS2.Core.Analysis.AmineContent;
using ConsoleFormatter = GSS2.Core.Logging.ConsoleFormatter;
@@ -128,8 +127,19 @@ public static class DependencyInjectionHelper
ServiceLifetime.Singleton
);
public static IServiceCollection AddAmineContentImageCapturerService(this IServiceCollection services) => services
.AddSingleton<ImageCapturerService>();
public static IServiceCollection AddAmineContentImageCapturerService(this IServiceCollection services, bool mock = false)
{
if (!mock)
return services.AddSingleton<ImageCapturerService>();
return services.AddSingleton<ImageCapturerMockService>(serviceProvider =>
{
var logger = serviceProvider.GetService<ILogger<ImageCapturerMockService>>();
if (logger is null)
throw new Exception("Cannot get logger");
return new ImageCapturerMockService("./", logger);
});
}
public static IServiceCollection AddAmineContentAnalyzerService(this IServiceCollection services) => services
.AddSingleton<AnalyzerService>();