tbf/TBF/Rig/TbfComponents.cs

332 lines
19 KiB
C#

///
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
///
using System.Collections.Generic;
using Common;
using TBF.Rig.Generic;
namespace TBF.Rig
{
public static class TbfComponents
{
public readonly static IList<IComponentFactory> Factories;
static TbfComponents()
{
Factories = new List<IComponentFactory>();
Factories.Add(new DataContainers.BackupAndSecurityOptions.ComponentFactory());
Factories.Add(new DataContainers.BenchInfo.Extended.ComponentFactory());
Factories.Add(new DataContainers.BenchInfo.iPerl.ComponentFactory());
Factories.Add(new DataContainers.Buoyancy.ComponentFactory());
Factories.Add(new DataContainers.Density.ComponentFactory());
Factories.Add(new DataContainers.Evaporation.Factory());
Factories.Add(new Elde.ControlBoardFactory());
Factories.Add(new Elde.CoverTest.Factory());
Factories.Add(new DataEntry.Combined.EntryFormFactory());
Factories.Add(new DataEntry.DataStream.Factory());
Factories.Add(new DataEntry.Double24.Factory());
Factories.Add(new DataEntry.Double24.FactoryNoStartEnd());
Factories.Add(new DataEntry.HeatMeters6.Factory());
Factories.Add(new DataEntry.HeatMeters12.Factory());
Factories.Add(new DataEntry.Munich3.EntryFormFactory());
Factories.Add(new DataEntry.Munich.EntryFormFactory());
Factories.Add(new DataEntry.iPerl.Factory());
Factories.Add(new DataEntry.S620.Factory());
Factories.Add(new DataEntry.Single.Factory());
Factories.Add(new DataEntry.Single.FactoryNoStartEnd());
Factories.Add(new DataEntry.Standard6.Factory());
Factories.Add(new DataEntry.Standard6.FactoryNoStartEnd());
Factories.Add(new DataEntry.Standard12.Factory());
Factories.Add(new DataEntry.Standard12.FactoryNoStartEnd());
Factories.Add(new DataEntry.Standard24.Factory());
Factories.Add(new DataEntry.Standard24.FactoryNoStartEnd());
Factories.Add(new DataEntry.Standard48.Factory());
Factories.Add(new DataEntry.Standard48.FactoryNoStartEnd());
Factories.Add(new DataEntry.StandardCamera.Factory());
Factories.Add(new DataEntry.WMStates.EntryFormFactory());
Factories.Add(new RegisterReaders.KPackE.DataEntryForRadio.Factory()); /// DataEntry for KPackE radio
Factories.Add(new Dummy.Balance.Factory());
Factories.Add(new Dummy.Diverter.Factory());
Factories.Add(new Dummy.FlowMeter.Factory());
Factories.Add(new Dummy.RegulValve.Factory());
Factories.Add(new Dummy.TempControl.Factory());
Factories.Add(new Dummy.Valve.Factory());
Factories.Add(new Elde.Diverter.DiverterFactory());
Factories.Add(new Elde.FlowMeter.FlowMeterFactory());
Factories.Add(new Elde.FlowMeterDewa.Factory());
Factories.Add(new Elde.FlowMeterTwins.FlowMeterFactory());
Factories.Add(new Elde.FlowMeterTriplet.FlowMeterFactory());
Factories.Add(new TestMethods.Adjustment.Factory());
Factories.Add(new TestMethods.ChangeFlowDirection.Factory());
Factories.Add(new TestMethods.CombinedWithDetection.TestMethodFactory());
Factories.Add(new TestMethods.Counter.Factory());
Factories.Add(new TestMethods.DiverterTest.Factory());
Factories.Add(new TestMethods.Dummy.Factory());
Factories.Add(new TestMethods.Endurance.Factory());
Factories.Add(new TestMethods.Evacuation.Factory());
Factories.Add(new TestMethods.FixedStart.Single.Factory());
Factories.Add(new TestMethods.FixedStart.Compound.Factory());
Factories.Add(new TestMethods.FixedStart.HeatMeters.Factory());
Factories.Add(new TestMethods.FixedStartDeferredEval.Single.Factory());
Factories.Add(new TestMethods.FixedStartDeferredEval.Compound.Factory());
Factories.Add(new TestMethods.FixedStartDeferredEval.HeatMeters.Factory());
Factories.Add(new TestMethods.FixedStartMassCollection.Single.Factory());
Factories.Add(new TestMethods.FixedStartMassCollection.Compound.Factory());
Factories.Add(new TestMethods.FixedStartMassCollection.HeatMeters.Factory());
Factories.Add(new TestMethods.FixedStartMassCollDeferredEval.Single.Factory());
Factories.Add(new TestMethods.FixedStartMassCollDeferredEval.Compound.Factory());
Factories.Add(new TestMethods.FixedStartMassCollDeferredEval.HeatMeters.Factory());
Factories.Add(new TestMethods.FixedStartTankCollection.Single.Factory());
Factories.Add(new TestMethods.FixedStartTankCollection.Compound.Factory());
Factories.Add(new TestMethods.FlyingStart.Single.Factory());
Factories.Add(new TestMethods.FlyingStart.Compound.Factory());
Factories.Add(new TestMethods.FlyingStart.HeatMeters.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollection.Single.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollection.Compound.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollection.HeatMeters.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollComparative.Single.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollComparative.Compound.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollComparative.HeatMeters.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollProlonged.Single.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollProlonged.Compound.Factory());
Factories.Add(new TestMethods.FlyingStartMassCollProlonged.HeatMeters.Factory());
Factories.Add(new TestMethods.FlyingStartFirstRepetWithMassColl.Single.Factory());
Factories.Add(new TestMethods.FlyingStartFirstRepetWithMassColl.Compound.Factory());
Factories.Add(new TestMethods.FlyingStartFirstRepetWithMassColl.HeatMeters.Factory());
Factories.Add(new TestMethods.FlyingStartTankCollection.Single.Factory());
Factories.Add(new TestMethods.FlyingStartTankCollection.Compound.Factory());
Factories.Add(new TestMethods.GrabImage.Factory());
Factories.Add(new TestMethods.LeakTest.Factory());
Factories.Add(new TestMethods.LiveStream.Factory());
Factories.Add(new TestMethods.ManualEntry.Factory());
Factories.Add(new TestMethods.Message.Factory());
Factories.Add(new TestMethods.OuterLoop.Start.Factory());
Factories.Add(new TestMethods.OuterLoop.End.Factory());
Factories.Add(new TestMethods.PMaxTest.Factory());
Factories.Add(new TestMethods.PulsesTest.Factory());
Factories.Add(new TestMethods.PulsesTestManual.Factory());
Factories.Add(new TestMethods.Q2CorrectionFromHistory.Factory());
Factories.Add(new TestMethods.S640Communication.S640StartFactory());
Factories.Add(new TestMethods.S640Communication.S640EndFactory());
Factories.Add(new TestMethods.SensitivityTest.Factory());
Factories.Add(new TestMethods.iPerlCommunication.TestMethodFactory()); /// iPerlCommunication
Factories.Add(new TestMethods.RoiDetection.RoiDetectionFactory());
Factories.Add(new Ambient.Comet.Factory());
Factories.Add(new Ambient.Greco.Factory());
Factories.Add(new Hart.Common.Factory());
Factories.Add(new Hart.Nivotrack.Factory());
Factories.Add(new Keithley.Multimeter_2010_RS232.Factory()); /// Keithley.Multimeter_2010_RS232
Factories.Add(new Keithley.TempMeter.Factory()); /// Keithley.TempMeter
Factories.Add(new MettlerToledo.Standard.BalanceFactory()); /// MettlerToledo Balance
Factories.Add(new MettlerToledo.Standard.BalanceOldFactory()); /// MettlerToledoBalanceOld
Factories.Add(new MettlerToledo.Standard.BalanceNewFactory()); /// MettlerToledoBalanceSN
Factories.Add(new MettlerToledo.Multi.BalanceFactory()); /// MettlerToledo-Multi
Factories.Add(new Modbus.CometAmbient.Factory()); /// Modbus.CometAmbient.Ambient
Factories.Add(new Modbus.Common.Factory()); /// Modbus
Factories.Add(new Modbus.PressureMeter.Meret.Factory()); /// Modbus.PressureMeter.Meret - Meret pressure meter connected via modbus
Factories.Add(new Modbus.QuidoRS.Factory()); /// Modbus.QuidoRS
Factories.Add(new Modbus.TankSelector.Factory()); /// Modbus.TankSelector
Factories.Add(new Modbus.TempControl.Easytherm.Factory()); /// Modbus.TempControl.Easytherm
Factories.Add(new Modbus.TempControl.Novus.Factory()); /// Modbus.TempControl.Novus
Factories.Add(new Modbus.UltrasoundLevelMeter.Factory());
Factories.Add(new Modbus.WaterAnalyzer.Factory());
Factories.Add(new Modbus.WaterAnalyzer2.Factory());
Factories.Add(new Network.Adapter.Factory());
Factories.Add(new Network.Camera.CLP1611.Factory());
Factories.Add(new Network.Camera.Display.Factory());
Factories.Add(new Network.Camera.Roi.Factory());
Factories.Add(new Network.Camera.RoiForFixedStart.Factory());
Factories.Add(new Network.Comet.Ambient.Factory());
Factories.Add(new Output.DB.ProductionTracing.Factory());
Factories.Add(new Output.DB.SaveDiverterCorrections.Factory());
Factories.Add(new Output.DB.SaveFlowmeterCorrections.Factory());
Factories.Add(new Output.DB.SensusOracle.Factory());
Factories.Add(new Output.EventTriggers.Iperl.Factory());
Factories.Add(new Output.EventTriggers.Standard.Factory());
Factories.Add(new Output.FileWriters.Basic.FactorySingle());
Factories.Add(new Output.FileWriters.Basic.FactoryCompound());
Factories.Add(new Output.FileWriters.Basic.FactoryHeatMeters());
Factories.Add(new Output.FileWriters.Elde.FactorySingle());
Factories.Add(new Output.FileWriters.Enhanced.FactorySingle());
Factories.Add(new Output.FileWriters.Enhanced.FactoryCompound());
Factories.Add(new Output.FileWriters.Enhanced.FactoryHeatMeters());
Factories.Add(new Output.FileWriters.ImageArchiver.Factory());
Factories.Add(new Output.FileWriters.IperlLogger.Factory());
Factories.Add(new Output.FileWriters.OneFilePerMeter.FactorySingle());
Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryCompound());
Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryHeatMeters());
Factories.Add(new Output.FileWriters.Xml.FactorySingle());
Factories.Add(new Output.FileWriters.Xml.FactoryCompound());
Factories.Add(new Output.FileWriters.Xml.FactoryHeatMeters());
Factories.Add(new Output.FileWriters.XmlBatch.FactorySingle());
Factories.Add(new Output.FlexFlow.Factory());
Factories.Add(new Output.Printers.Enhanced.FactorySingle());
Factories.Add(new Output.Printers.Enhanced.FactoryCompound());
Factories.Add(new Output.Printers.Enhanced.FactoryHeatMeters());
Factories.Add(new Output.Printers.Label.Factory());
Factories.Add(new Output.Printers.MultiLabel.Factory());
Factories.Add(new Output.Printers.Munich.PrinterFactory());
Factories.Add(new Output.Printers.OnePerBatch.Factory());
Factories.Add(new Output.Printers.OnePerMeter.FactorySingle());
Factories.Add(new Output.Printers.OnePerMeter.FactoryCompound());
Factories.Add(new Output.Printers.OnePerMeter.FactoryHeatMeters());
Factories.Add(new Output.Printers.Zapiska.FactorySingle());
Factories.Add(new Output.Printers.Zapiska.FactoryCompound());
Factories.Add(new Output.Printers.Zapiska.FactoryHeatMeters());
Factories.Add(new Elde.PressureMeter.PressureMeterFactory());
Factories.Add(new Elde.PressureMeterInternal.PressureMeterFactory());
Factories.Add(new Elde.Pump.PumpFactory());
Factories.Add(new Danfoss.VLT2800.PumpFactory());
Factories.Add(new Elde.PumpWithFM.PumpFactory());
Factories.Add(new Elde.PumpTandem.PumpFactory());
Factories.Add(new RegisterReaders.PulsesFromEldeCB.Factory()); /// 'RegisterReader'
Factories.Add(new Elde.FixedStartRegisterReader.RegisterReaderFactory()); /// 'RegisterReader for standing start/stop'
Factories.Add(new TestMethods.iPerlCommunication.iPerlHead.Factory()); /// 'RegisterReader for iPerl'
Factories.Add(new RegisterReaders.DataStream.MefImport.Factory()); /// 'Interface for data stream stream via MEF'
Factories.Add(new RegisterReaders.DataStream.Reader.Factory()); /// 'RegisterReader for data stream stream via MEF'
Factories.Add(new RegisterReaders.S640Stream.Factory()); /// 'RegisterReader for S640 data stream'
Factories.Add(new RegisterReaders.SerialStream.Factory()); /// 'RegisterReader for generic serial stream'
Factories.Add(new RegisterReaders.KPackE.RegisterReader.Factory()); /// KPackE register reader
Factories.Add(new RegisterReaders.KPackE.Radio.Factory()); /// Radio for KPackE register readers
Factories.Add(new Elde.RegulValve.RegulValveFactory());
Factories.Add(new Elde.RegulValveCoax.Factory());
Factories.Add(new Elde.RegulValveMilwaukee.Factory());
Factories.Add(new Elde.RegulValveTandem.RegulValveTandemFactory());
Factories.Add(new Sirt.V2012_433MHz.Factory());
Factories.Add(new Elde.TempMeter.TempMeterFactory());
Factories.Add(new Elde.TempMeterInternal.TempMeterFactory());
Factories.Add(new Elde.TempMeterMeret.Factory()); /// Meret temp. meter connected to control board Modbus
Factories.Add(new Elde.Valve.ValveFactory());
Factories.Add(new Elde.ValveEx.ValveFactory());
Factories.Add(new Various.ErrorFlags.Factory());
Factories.Add(new Various.StatisticsMonitoring.Factory());
Factories.Add(new Various.TankWithLevelMsrmnt.Factory());
Factories.Add(new WaterMeters.Munich.WaterMeterFactory()); /// 'WaterMeters.Munich'
Factories.Add(new WaterMeters.WaterMeter.WaterMeterFactory()); /// 'WaterMeter'
}
/// <summary>
/// Get a component factory given the component name
/// </summary>
/// <param name="className">Component class name</param>
/// <returns>Component factory instance</returns>
public static IComponentFactory CmpntFactoryFromClassName(string className)
{
foreach (var factory in Factories)
{
if (factory.ClassName.Equals(className)) return factory;
}
return null;
}
/// <summary>
/// Get a component configuration given a component DB entity
/// </summary>
/// <param name="entity">DB entity</param>
/// <returns>An appropriate component configuration or null if factory was not found</returns>
public static IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component entity)
{
IComponentFactory cmpntFactory = CmpntFactoryFromClassName(entity.ClassName);
if (cmpntFactory == null) return null;
try { return cmpntFactory.CmpntCfgFromCmpntEntity(entity); }
catch { return null; }
}
public static string CurrentlyLoadedComponentName;
/// <summary>
/// Load component entities from the database and convert them to TBF components
/// derived from IComponent with mutual references.
/// </summary>
/// <param name="session">NHibernate DB session</param>
/// <returns>A list of TBF Components</returns>
public static IList<IComponent> LoadComponentsFromDB(NHibernate.ISession session)
{
CurrentlyLoadedComponentName = string.Empty;
if (session == null) return new List<IComponent>(); /// Handle case when session == null
/// Load the list of components from the database
var cmptnEntities = session.QueryOver<Config.Entities.Component>()
.OrderBy(x => x.ItemNr).Asc
.List();
/// Convert database entities to TBF components
IList<IComponent> components = new List<Rig.Generic.IComponent>();
foreach (var entity in cmptnEntities)
{
CurrentlyLoadedComponentName = entity.Name;
IComponentFactory cmpntFactory = Rig.TbfComponents.CmpntFactoryFromClassName(entity.ClassName);
if (cmpntFactory == null) continue;
IComponent cmpnt = cmpntFactory.GetComponent(cmpntFactory.CmpntCfgFromCmpntEntity(entity), components);
///
/// Enforce loading Corrections and Uncertainties from the database
///
double dummy = 0;
cmpnt.Corrections = entity.Corrections;
foreach (var corr in cmpnt.Corrections) dummy += corr.Correction;
cmpnt.Uncertainties = entity.Uncertainties;
foreach (var unc in cmpnt.Uncertainties) dummy += unc.MainUncertainty;
///
/// Inherit DebugMode from the parent (if any)
///
if ((cmpnt.Cfg.DebugLevel == DebugMode.Inherit) &&
(cmpnt.Cfg is IChildComponentCfg) &&
!string.IsNullOrEmpty(cmpnt.Cfg.ParentName))
{
bool inherited = false;
foreach (var par in components)
{
if (par.Cfg.Name.Equals(cmpnt.Cfg.ParentName))
{
/// Parent found, inherit the debug mode
cmpnt.Cfg.DebugLevel = par.Cfg.DebugLevel;
inherited = true;
break;
}
}
if (!inherited)
{
/// Applied when the parent is (most likely) in DebugMode.Off
cmpnt.Cfg.DebugLevel = DebugMode.Off;
}
}
if (cmpnt.Cfg.DebugLevel != DebugMode.Off) components.Add(cmpnt);
}
CurrentlyLoadedComponentName = string.Empty;
return components;
}
/// <summary>
/// Get a reference to a component with a given name from a list of components.
/// </summary>
/// <param name="name">Component name</param>
/// <param name="components">A list of components</param>
/// <returns>Matching component or null</returns>
public static IComponent FindComponent(string name, IList<IComponent> components)
{
if (string.IsNullOrEmpty(name)) return null;
foreach (var cmpnt in components)
{
if (cmpnt.Cfg.Name.Equals(name)) return cmpnt;
}
return null;
}
public static IComponent FindComponent(string name)
{
return FindComponent(name, StateMachine.Components);
}
}
}