namespace MinicsConsole; class HostLifetime( HardwareFileLoader hardwareFileLoader, HardwareDBLoader hardwareDBLoader, ConfigFileLoader configFileLoader, AddressFileLoader addressFileLoader, HardWareMonitor hardWareMonitor, ConfigUpdater configUpdater, BasicInfo basicInfo, OrmCollections ormCollections, DataBaseCleaner dataBaseCleaner, UISender uiNotifier, RTNotifier rtNotifer, PLCNotifier plcNotifier, KanbanNotifier kanbanNotifier, Mini8DataDispatcher dataDispatcher, DailyRoutinHelper dailyRoutinHelper, ITlvProvider tlvProvider, ILog log) : IHostedService { //Do all Module Initializations here async Task IHostedService.StartAsync(CancellationToken cancellationToken) { log.Initialize("General"); //Connect to DataBase Server ormCollections.MainORM = new SqlSugarCustom(); if (string.IsNullOrEmpty(basicInfo.DBConnectionString) || !ormCollections.MainORM.Initialize() || !ormCollections.MainORM.Open(basicInfo.DBConnectionString, DbType.PostgreSQL)) { log.Fatal($"Connect DB Failed"); Environment.Exit(0); } if (!hardwareDBLoader.Load()) { hardwareFileLoader.Load(); hardwareDBLoader.Save(); } configFileLoader.Load(); addressFileLoader.Load(); addressFileLoader.LoadPLC(); //Perparing for data receiver if (!plcNotifier.StartService()) { log.Fatal($"PLC configFile Not Exist"); Environment.Exit(0); } dataDispatcher.TryAddNotifier("PLC", plcNotifier); dataDispatcher.TryAddNotifier("UI", uiNotifier); //Start RT Server if (string.IsNullOrEmpty(basicInfo.RTServerAddress) || !rtNotifer.Initialize(tlvProvider) || !rtNotifer.Open(basicInfo.RTServerAddress, basicInfo.RTServerPort)) { log.Fatal($"Open RT Server {basicInfo.RTServerAddress}:{basicInfo.RTServerPort} Failed"); Environment.Exit(0); } dataDispatcher.TryAddNotifier("RT", rtNotifer); dataDispatcher.TryAddNotifier("Kanban", kanbanNotifier); log.Info($"Start RT Server {basicInfo.RTServerAddress}:{basicInfo.RTServerPort} success"); //Connect to Mini8s if (!hardWareMonitor.ParallelCreateConnections()) log.Warning($"Mini8 Addresses error Unable to connect to mini8s"); //Read Realtime data from mini8 & Read ChannelMode from hareware configruation if (configUpdater.ReadConfigFromMini8(out TemperatureConfig? temperatureConfig) && temperatureConfig is not null) configUpdater.SetConfigFile(temperatureConfig, false, out _); //Start Collecting Mini8s Realtime Data hardWareMonitor.ParallelStartDataCollecion(); //Start Daily Routine Work dailyRoutinHelper.AddorUpdateRoutinWork("CleanDataBase", dataBaseCleaner.CleanDB); dailyRoutinHelper.AddorUpdateRoutinWork("CleanLogFile", ((LogSender)log).CleanLog); dailyRoutinHelper.StartService(TimeSpan.FromDays(1)); await Task.CompletedTask; } private AutoResetEvent _AutoResetEvent = new(true); async Task IHostedService.StopAsync(CancellationToken cancellationToken) { if (!_AutoResetEvent.WaitOne(0)) await Task.CompletedTask; log.Info("Minics Console has been shutted down by UI request"); //log.Info("Saving setting files.."); //hardwareFileLoader.Save(); //configFileLoader.Save(); //addressFileLoader.Save(); //BaseConfigFileLoader.Save(basicInfo); log.Info("Closing all mini8 connections.."); hardWareMonitor.CloseConnections(); log.Info("Closing RT server connections.."); rtNotifer?.Dispose(); log.Info("Closing PLC connections.."); plcNotifier?.Dispose(); log.Info("Closing Database connections.."); ormCollections?.MainORM?.Dispose(); dailyRoutinHelper?.Dispose(); log.Info("Finish Stopping.."); log.Dispose(); await Task.CompletedTask; } }