using Inspectron.Statistics; using Lindt.Colorballs.Duo.Utils; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Reflection.PortableExecutable; using Ninject; using Serilog; using VisionBuilder.UI.Common; using VisionBuilder.UI.Common.Commands; using VisionBuilder.UI.Common.RecipeProcessing; 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; } private void _recognitionControl_SessionEnded(SessionEndedEvent obj) { var endedAt = obj.SessionEnded; _endTime = endedAt; _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); } } private void _recognitionControl_ImageProcessed(ImageProcessedEvent obj) { if (obj.HasError) { RecordBadImage(obj.ErrorNames[0]); } } 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 }; 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(); } ConcurrentDictionary _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] ); _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; } } }