Files
HawkeyeVision/VisionBuilder.UI.Statistics/VisionBuilderStatistics.cs
2025-09-16 10:42:43 +02:00

168 lines
6.3 KiB
C#

using Inspectron.Statistics;
using Lindt.Colorballs.Duo.Utils;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection.PortableExecutable;
using Ninject;
using Serilog;
using VisionBuilder.UI.Common;
using VisionBuilder.UI.Common.Commands;
using VisionBuilder.UI.Common.Processing;
namespace VisionBuilder.UI.Statistics
{
public class VisionBuilderStatistics:IVisionBuilderModule,IDisposable
{
private CsvStatistics? _csvStatistics;
private readonly VisionBuilderStatisticsSettings _settings;
private string _filePath;
private readonly IRecognitionControl _recognitionControl;
private readonly ILoadingService _loadingService;
private DateTime _startTime;
private string _currentRecipe;
private string _fileName;
private string _directoryPath;
private const string BY_EVENTS_FILE_NAME = "statistics_by_events.csv";
private const string MONTHLY_FILE_NAME = "statistics_month.csv";
private const string EMPTY_DATE = "";
private const string EMPTY_TIME = "";
public bool DoNotDeleteTempFiles { get; set; } = false;
public VisionBuilderStatistics(VisionBuilderStatisticsSettings settings, IRecognitionControl recognitionControl, ILoadingService loadingService)
{
_settings = settings;
_recognitionControl = recognitionControl;
_loadingService = loadingService;
}
public string Metadata { get; set; } = "";
private void _recognitionControl_SessionEnded(SessionEndedEvent obj)
{
var endedAt = obj.SessionEnded;
_endTime = endedAt;
Log.Information("Start processing statistics");
_loadingService.StartLoading("Writing statistics for " + _settings.CameraName);
try
{
_csvStatistics.WriteLine([_startTime.ToString("d"), _startTime.ToString("T"), endedAt.ToString("d"), endedAt.ToString("T"), "", "", ""]);
_csvStatistics.Dispose();
_csvStatistics = null;
WriteFinalStatistics();
}
finally
{
_loadingService.StopLoading("Writing statistics for " + _settings.CameraName);
Log.Information("End processing statistics");
}
}
private void _recognitionControl_ImageProcessed(ImageProcessedEvent obj)
{
var sw = Stopwatch.StartNew();
if (obj.HasError)
{
RecordBadImage(obj.ErrorNames[0]);
}
sw.Stop();
Console.WriteLine($"Recording statistics took {sw.ElapsedMilliseconds} ms");
}
private void _recognitionControl_SessionStarted(SessionStartedEvent obj)
{
_startTime = obj.SessionStarted;
_currentRecipe = obj.RecipeName;
_fileName = "tmp_"+Guid.NewGuid().ToString()+".csv";
_directoryPath = PathSettingsUtils.ConvertVariables(_settings.PathTemplate, _startTime, _startTime,
obj.RecipeName, cameraName: _settings.CameraName);
_filePath = Path.Combine(_directoryPath, _fileName);
var headers = new[] { _settings.StartDateColumnName, _settings.StartTimeColumnName, _settings.EndDateColumnName, _settings.EndTimeColumnName, _settings.ErrorTimeColumnName, _settings.ProductColumnName, _settings.ErrorColumnName, _settings.MetadataColumnName };
if (!Directory.Exists(Path.GetDirectoryName(_filePath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(_filePath));
}
_csvStatistics = new CsvStatistics(_filePath, headers);
_csvStatistics.WriteLine([_startTime.ToString("d"), _startTime.ToString("T")]); // session started
_defects = new ConcurrentDictionary<string, int>();
}
ConcurrentDictionary<string, int> _defects = new();
private DateTime _endTime;
private void RecordBadImage(string defectName)
{
_csvStatistics.WriteLine(
[_startTime.ToString("d"), _startTime.ToString("T"), EMPTY_DATE, EMPTY_TIME, DateTime.Now.ToString("T"), _currentRecipe, defectName, Metadata]
);
_defects.AddOrUpdate(defectName, 1, (key, oldValue) => oldValue + 1);
}
private void WriteMonthStatistics()
{
var startDate = _startTime.Date;
var startTime = _startTime;
var endDate = _endTime.Date;
var endTime = _endTime;
var monthFilePath = Path.Combine(_directoryPath, MONTHLY_FILE_NAME);
var monthStatistics = new CsvStatistics(monthFilePath, [
"Date start","Time start","Date end", "Time end" ,"Product","Error type","Error count"
]);
foreach (var defect in _defects)
{
monthStatistics.WriteLine(
[startDate.ToString("d"), startTime.ToString("T"), endDate.ToString("d"), endTime.ToString("T"), _currentRecipe, defect.Key, defect.Value.ToString()]
);
}
monthStatistics.Dispose();
}
private void WriteFinalStatistics()
{
try
{
Log.Debug("Writing month statistics");
WriteMonthStatistics();
}
catch (Exception e)
{
Log.Error("Error writing statistics for " + _settings.CameraName+ "\n"+ e);
}
_csvStatistics?.Dispose();
_csvStatistics = null;
}
public void InitializeModule()
{
_recognitionControl.SessionStarted += _recognitionControl_SessionStarted;
_recognitionControl.ImageProcessed += _recognitionControl_ImageProcessed;
_recognitionControl.SessionEnded += _recognitionControl_SessionEnded;
}
public void Dispose()
{
_csvStatistics?.Dispose();
_recognitionControl.SessionStarted -= _recognitionControl_SessionStarted;
_recognitionControl.ImageProcessed -= _recognitionControl_ImageProcessed;
_recognitionControl.SessionEnded -= _recognitionControl_SessionEnded;
}
}
}