Events, EventViewer, Common prjs, UI.EventLogs, UI.Calendar, EventTriggers, GetCalendarEvents() in WT/I.

This commit is contained in:
Milan Hanajik
2020-04-21 10:46:42 +02:00
parent 66631855bb
commit b1d692230e
161 changed files with 13377 additions and 933 deletions
@@ -0,0 +1,27 @@
///
/// Copyright (c) 2020 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using TBF.BenchControl.Generic;
namespace TBF.BenchControl.Output.EventTriggers.Standard
{
public class Factory : IComponentFactory
{
public string ClassName { get { return this.GetType().Namespace.Substring(17); } }
public void ResetStaticProperties() { Trigger.ResetStaticProperties(); }
public IComponent DummyComponent() { return new Trigger(); }
public IComponent GetComponent(IComponentCfg cfg, IList<IComponent> components) { return new Trigger(cfg); }
public IComponentCfg DefaultConfig() { return new TriggerCfg(this.GetType().Namespace.Substring(24), this); }
public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
{
return ComponentCfgBase.CreateFromDbEntity(TriggerCfg.Serializer, component, this);;
}
}
}
@@ -0,0 +1,251 @@
///
/// Copyright (c) 2020 Sensus Slovensko a.s.
///
using System;
using log4net;
using NHibernate;
using Events.Entities;
namespace TBF.BenchControl.Output.EventTriggers.Standard
{
public class Trigger : ComponentBase, IOperation, GenericDevices.IEventTrigger
{
private static readonly ILog log = LogManager.GetLogger(typeof(Trigger));
public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(1)); }
readonly TriggerCfg triggerCfg;
string src { get { return triggerCfg.EventSource; } }
Results.Entities.Batch batch;
public Trigger() {}
public Trigger(Generic.IComponentCfg cfg)
: base(cfg)
{
triggerCfg = cfg as TriggerCfg;
if (triggerCfg == null) throw new ArgumentException("triggerCfg");
log.Debug(this.ToString());
}
#region Configuration Change Handling
public static void OnCfgChange(object sender, CfgChangeArgs args)
{
if (CfgChangeHandler == null) return;
try { CfgChangeHandler(sender, args); }
catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); }
}
public static event EventHandler<CfgChangeArgs> CfgChangeHandler;
public override void StartChangeHandler()
{
CfgChangeHandler += delegate(object sender, CfgChangeArgs args)
{
TriggerCfg newCfg = args.Cfg as TriggerCfg;
if (newCfg != null && newCfg.Name.Equals(Name))
{
if (args.Command == CfgChangeCmd.CfgChange)
{
triggerCfg.EventSource = newCfg.EventSource;
triggerCfg.FailedWMsPct = newCfg.FailedWMsPct;
triggerCfg.Mid1Name = newCfg.Mid1Name;
triggerCfg.Mid1RelErr = newCfg.Mid1RelErr;
triggerCfg.Mid2Name = newCfg.Mid2Name;
triggerCfg.Mid2RelErr = newCfg.Mid2RelErr;
triggerCfg.Mid3Name = newCfg.Mid3Name;
triggerCfg.Mid3RelErr = newCfg.Mid3RelErr;
triggerCfg.Mid4Name = newCfg.Mid4Name;
triggerCfg.Mid4RelErr = newCfg.Mid4RelErr;
triggerCfg.Mid5Name = newCfg.Mid5Name;
triggerCfg.Mid5RelErr = newCfg.Mid5RelErr;
triggerCfg.E1 = newCfg.E1;
triggerCfg.E2 = newCfg.E2;
triggerCfg.E3 = newCfg.E3;
triggerCfg.E4 = newCfg.E4;
triggerCfg.E5 = newCfg.E5;
triggerCfg.E6 = newCfg.E6;
triggerCfg.E7 = newCfg.E7;
triggerCfg.E8 = newCfg.E8;
triggerCfg.E9 = newCfg.E9;
triggerCfg.E10 = newCfg.E10;
triggerCfg.E11 = newCfg.E11;
triggerCfg.E12 = newCfg.E12;
triggerCfg.E13 = newCfg.E13;
triggerCfg.E14 = newCfg.E14;
triggerCfg.E15 = newCfg.E15;
triggerCfg.E16 = newCfg.E16;
triggerCfg.E21 = newCfg.E21;
#if TURA_IPERL || TURA_SPECIAL
triggerCfg.E26 = newCfg.E26;
triggerCfg.E27 = newCfg.E27;
triggerCfg.E28 = newCfg.E28;
#endif
}
}
};
}
#endregion Configuration Change Handling
/// <summary>
/// Writes the test cycle results into a file
/// Events:
/// Event.ResultsWritten
/// Event.Busy
/// </summary>
/// <param name="batch">Results to write into a file</param>
/// <returns>Reference to the operation</returns>
public IOperation ProcessResultsOp(Results.Entities.Batch batch)
{
this.batch = batch;
return this;
}
/// <summary>Start this operation</summary>
public void Start()
{
Process(batch);
}
/// <summary>Run this operation</summary>
/// <returns>Event.ResultsProcessed</returns>
public Event Run()
{
return Event.ResultsProcessed;
}
/// <summary>Stop this operation</summary>
public void Stop()
{
}
void Process(Results.Entities.Batch batch)
{
if (batch == null || batch.WaterMeters == null || batch.WaterMeters.Count == 0)
{
return;
}
try
{
ISession session = Events.DB.CreateSession();
Events.DB.LoadSubscribers(session);
///
/// Event on high percentage of failed meters
///
if (triggerCfg.FailedWMsPct > 0)
{
/// Triggering this event is enabled
int failedWMs = batch.FailedMetersCount();
int passedWMs = batch.PassedMetersCount();
if (100 * failedWMs >= triggerCfg.FailedWMsPct * (failedWMs + passedWMs))
{
TBF.UiBridge.Bridge.TriggerEvent(session, src, EventClass.BadResults, Severity.Warning,
"Príliš veľa chybných kusov v jednej dávke",
string.Format("Číslo dávky: {0}\r\nspolu {1} kusov, dobrých {2} ks., chybných {3} ks.",
batch.BatchNr, passedWMs + failedWMs, passedWMs, failedWMs),
SubscriberGroup.Production);
}
}
///
/// Event MIDx relative error measured against a scale is too large
///
string[] midName = new string[] { triggerCfg.Mid1Name,
triggerCfg.Mid2Name,
triggerCfg.Mid3Name,
triggerCfg.Mid4Name,
triggerCfg.Mid5Name };
double[] maxMidRelErr = new double[] { triggerCfg.Mid1RelErr,
triggerCfg.Mid2RelErr,
triggerCfg.Mid3RelErr,
triggerCfg.Mid4RelErr,
triggerCfg.Mid5RelErr };
for (int i = 0; i < midName.Length; i++)
{
if (!string.IsNullOrEmpty(midName[i]))
{
/// MIDx enabled
foreach (var tr in batch.TestRslts)
{
if (tr.RefFlowmeter() == midName[i] && tr.ErrorMaster >= maxMidRelErr[i])
{
TBF.UiBridge.Bridge.TriggerEvent(session, src, EventClass.EquipmentHW, Severity.Error,
string.Format("Príliš veľká relatívna chyba merača prietoku {0} oproti váhe", midName[i]),
string.Format("Číslo dávky: {0}\r\nPrietokomer: {1}\r\nRelatívna chyba: {2}%\r\nMax. dovolená chyba: {3}%",
batch.BatchNr, midName[i], Utils.DoubleToStr(tr.ErrorMaster, 3), maxMidRelErr[i]),
SubscriberGroup.Metrology | SubscriberGroup.Maintenance | SubscriberGroup.Production);
break; /// For each MID just one event is triggered
}
}
}
}
///
/// Events on Ex flags
///
long eFlags = batch.ErrorFlags();
long iFlags = batch.InfoFlags();
///
if (triggerCfg.E1) OnExTriggerEvent(session, eFlags, iFlags, 1);
if (triggerCfg.E2) OnExTriggerEvent(session, eFlags, iFlags, 2);
if (triggerCfg.E3) OnExTriggerEvent(session, eFlags, iFlags, 3);
if (triggerCfg.E4) OnExTriggerEvent(session, eFlags, iFlags, 4);
if (triggerCfg.E5) OnExTriggerEvent(session, eFlags, iFlags, 5);
if (triggerCfg.E6) OnExTriggerEvent(session, eFlags, iFlags, 6);
if (triggerCfg.E7) OnExTriggerEvent(session, eFlags, iFlags, 7);
if (triggerCfg.E8) OnExTriggerEvent(session, eFlags, iFlags, 8);
if (triggerCfg.E9) OnExTriggerEvent(session, eFlags, iFlags, 9);
if (triggerCfg.E10) OnExTriggerEvent(session, eFlags, iFlags, 10);
if (triggerCfg.E11) OnExTriggerEvent(session, eFlags, iFlags, 11);
if (triggerCfg.E12) OnExTriggerEvent(session, eFlags, iFlags, 12);
if (triggerCfg.E13) OnExTriggerEvent(session, eFlags, iFlags, 13);
if (triggerCfg.E14) OnExTriggerEvent(session, eFlags, iFlags, 14);
if (triggerCfg.E15) OnExTriggerEvent(session, eFlags, iFlags, 15);
if (triggerCfg.E16) OnExTriggerEvent(session, eFlags, iFlags, 16);
if (triggerCfg.E21) OnExTriggerEvent(session, eFlags, iFlags, 21);
#if TURA_IPERL || TURA_SPECIAL
if (triggerCfg.E26) OnExTriggerEvent(session, eFlags, iFlags, 26);
if (triggerCfg.E27) OnExTriggerEvent(session, eFlags, iFlags, 27);
if (triggerCfg.E28) OnExTriggerEvent(session, eFlags, iFlags, 28);
#endif
}
catch (Exception exc)
{
log.ErrorFormat("Triggering event(s) failed: {0}", exc.Message);
}
}
void OnExTriggerEvent(ISession session, long eFlags, long iFlags, int x)
{
long mask = 1L << (x - 1);
Severity severity;
if ((eFlags & mask) != 0)
{
severity = Severity.Error;
}
else if ((iFlags & mask) != 0)
{
severity = Severity.Warning;
}
else
{
return;
}
string moreInfo = string.Format("E{0}", x);
TBF.UiBridge.Bridge.TriggerEvent(session, src, EventClass.TestingProcess, severity,
string.Format("Príznak chyby procesu E{0} je aktívny", x),
string.Format("Číslo dávky: {0}\r\n{1}", batch.BatchNr, moreInfo),
SubscriberGroup.Production);
}
}
}
@@ -0,0 +1,371 @@
///
/// Copyright (c) 2020 Sensus Slovensko a.s.
///
using System;
using System.Xml.Serialization;
using Config.Entities;
using TBF.BenchControl.Generic;
using TBF.Resources;
using System.Collections.Generic;
namespace TBF.BenchControl.Output.EventTriggers.Standard
{
/// <summary>
/// Serializable configuration of Output.EventTriggers.Standard component.
/// </summary>
public class TriggerCfg : ComponentCfgBase, Generic.IComponentCfg, Config.Entities.IParamsProvider
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(TriggerCfg) })[0];
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl() { return new Configs.ParamsProvider.ComponentCfgCtrl(this, null); }
///
/// Serialized parameters
///
public string EventSource;
public int FailedWMsPct; /// 0 = off, 1..100% event is triggered when percentage reaches this level
public string Mid1Name;
public double Mid1RelErr; /// [%] Event is triggered when relative error of reference flowmeter against a scale reaches this level
public string Mid2Name;
public double Mid2RelErr; /// [%] Event is triggered when relative error of reference flowmeter against a scale reaches this level
public string Mid3Name;
public double Mid3RelErr; /// [%] Event is triggered when relative error of reference flowmeter against a scale reaches this level
public string Mid4Name;
public double Mid4RelErr; /// [%] Event is triggered when relative error of reference flowmeter against a scale reaches this level
public string Mid5Name;
public double Mid5RelErr; /// [%] Event is triggered when relative error of reference flowmeter against a scale reaches this level
public bool E1;
public bool E2;
public bool E3;
public bool E4;
public bool E5;
public bool E6;
public bool E7;
public bool E8;
public bool E9;
public bool E10;
public bool E11;
public bool E12;
public bool E13;
public bool E14;
public bool E15;
public bool E16;
public bool E21;
#if TURA_IPERL || TURA_SPECIAL
public bool E26;
public bool E27;
public bool E28;
#endif
/// Private parameterless constructor invoked by all other (public) constructors
TriggerCfg() {}
public TriggerCfg(string name, IComponentFactory factory)
: this()
{
Name = name;
Factory = factory;
ParentName = string.Empty;
InitializeAll();
}
public string ComponentName { get { return Name; } }
public void InitializeAll()
{
EventSource = "Results"; /// 0
FailedWMsPct = 20; /// 1
Mid1Name = "I1"; /// 2
Mid1RelErr = 0.5; /// 3
Mid2Name = "I2"; /// 4
Mid2RelErr = 0.5; /// 5
Mid3Name = "I3"; /// 6
Mid3RelErr = 0.5; /// 7
Mid4Name = ""; /// 8
Mid4RelErr = 0.5; /// 9
Mid5Name = ""; /// 10
Mid5RelErr = 0.5; /// 11
E1 = false; /// 12
E2 = false; /// 13
E3 = false; /// 14
E4 = false; /// 15
E5 = false; /// 16
E6 = false; /// 17
E7 = false; /// 18
E8 = false; /// 19
E9 = false; /// 20
E10 = false; /// 21
E11 = false; /// 22
E12 = false; /// 23
E13 = false; /// 24
E14 = false; /// 25
E15 = false; /// 26
E16 = false; /// 27
E21 = false; /// 28
#if TURA_IPERL || TURA_SPECIAL
E26 = false; /// 29
E27 = false; /// 30
E28 = false; /// 31
#endif
}
string[] paramNames = new string[]
{
"Event source", /// 0
"Percentage of failed meters", /// 1
"MID 1 name", /// 2
"MID 1 rel. error", /// 3
"MID 2 name", /// 4
"MID 2 rel. error", /// 5
"MID 3 name", /// 6
"MID 3 rel. error", /// 7
"MID 4 name", /// 8
"MID 4 rel. error", /// 9
"MID 5 name", /// 10
"MID 5 rel. error", /// 11
"E1", /// 12
"E2", /// 13
"E3", /// 14
"E4", /// 15
"E5", /// 16
"E6", /// 17
"E7", /// 18
"E8", /// 19
"E9", /// 20
"E10", /// 21
"E11", /// 22
"E12", /// 23
"E13", /// 24
"E14", /// 25
"E15", /// 26
"E16", /// 27
"E21", /// 28
#if TURA_IPERL || TURA_SPECIAL
"E26", /// 29
"E27", /// 30
"E28", /// 31
#endif
};
public string ParamName(int i) { return paramNames[i]; }
public int ParamsCount() { return paramNames.Length; }
public IList<string> ParamValues(int i)
{
IList<string> listOfValues = new List<string>();
if (i >= 12)
{
listOfValues.Add(Strings.yes);
listOfValues.Add(Strings.no);
return listOfValues;
}
else
{
return null;
}
}
public string ToString(int i)
{
switch (i)
{
case -1: return string.Format("Name={0}, EventSource={1}, FailedWMsPct={2}, ...", Name, EventSource, FailedWMsPct);
case 0: return EventSource;
case 1: return FailedWMsPct.ToString();
case 2: return Mid1Name;
case 3: return Mid1RelErr.ToString();
case 4: return Mid2Name;
case 5: return Mid2RelErr.ToString();
case 6: return Mid3Name;
case 7: return Mid3RelErr.ToString();
case 8: return Mid4Name;
case 9: return Mid4RelErr.ToString();
case 10: return Mid5Name;
case 11: return Mid5RelErr.ToString();
case 12: return E1 ? Strings.yes : Strings.no;
case 13: return E2 ? Strings.yes : Strings.no;
case 14: return E3 ? Strings.yes : Strings.no;
case 15: return E4 ? Strings.yes : Strings.no;
case 16: return E5 ? Strings.yes : Strings.no;
case 17: return E6 ? Strings.yes : Strings.no;
case 18: return E7 ? Strings.yes : Strings.no;
case 19: return E8 ? Strings.yes : Strings.no;
case 20: return E9 ? Strings.yes : Strings.no;
case 21: return E10 ? Strings.yes : Strings.no;
case 22: return E11 ? Strings.yes : Strings.no;
case 23: return E12 ? Strings.yes : Strings.no;
case 24: return E13 ? Strings.yes : Strings.no;
case 25: return E14 ? Strings.yes : Strings.no;
case 26: return E15 ? Strings.yes : Strings.no;
case 27: return E16 ? Strings.yes : Strings.no;
case 28: return E21 ? Strings.yes : Strings.no;
#if TURA_IPERL || TURA_SPECIAL
case 29: return E26 ? Strings.yes : Strings.no;
case 30: return E27 ? Strings.yes : Strings.no;
case 31: return E28 ? Strings.yes : Strings.no;
#endif
default: return string.Empty;
}
}
public CfgUpdateFlags UpdateParam(int i, string strValue)
{
switch (i)
{
case 0: EventSource = strValue; return CfgUpdateFlags.AnyChange;
case 1: FailedWMsPct = int.Parse(strValue); return CfgUpdateFlags.AnyChange;
case 2: Mid1Name = strValue; return CfgUpdateFlags.AnyChange;
case 3: Mid1RelErr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 4: Mid2Name = strValue; return CfgUpdateFlags.AnyChange;
case 5: Mid2RelErr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 6: Mid3Name = strValue; return CfgUpdateFlags.AnyChange;
case 7: Mid3RelErr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 8: Mid4Name = strValue; return CfgUpdateFlags.AnyChange;
case 9: Mid4RelErr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 10: Mid5Name = strValue; return CfgUpdateFlags.AnyChange;
case 11: Mid5RelErr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 12: E1 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 13: E2 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 14: E3 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 15: E4 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 16: E5 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 17: E6 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 18: E7 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 19: E8 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 20: E9 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 21: E10 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 22: E11 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 23: E12 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 24: E12 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 25: E14 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 26: E15 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 27: E16 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 28: E21 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
#if TURA_IPERL || TURA_SPECIAL
case 29: E26 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 30: E27 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 31: E28 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
#endif
default: return CfgUpdateFlags.None;
}
}
/// <summary>
/// Validate string form of a parameter value
/// </summary>
/// <param name="i">Parameter index</param>
/// <param name="strValue">String form of a parameter</param>
/// <param name="message">Message in case value is not valid</param>
/// <returns>true when string form of a parameter is OK</returns>
public bool ValidateParam(int i, string strValue, out string message)
{
message = string.Empty;
int percentage;
double relError;
switch (i)
{
case 0:
case 2:
case 4:
case 6:
case 8:
case 10:
return true;
case 1:
if (int.TryParse(strValue, out percentage) && (0 <= percentage) && (percentage <= 100)) return true;
message = "Percentage of failed meters is invalid, should be 1..100, 0 = off";
return false;
case 3:
case 5:
case 7:
case 9:
case 11:
if (Utils.TryParseUDouble(strValue, out relError)) return true;
message = "relative error of MID is invalid or less then 0";
return false;
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
#if TURA_IPERL || TURA_SPECIAL
case 29:
case 30:
case 31:
#endif
if (strValue == Strings.yes || strValue == Strings.no) return true;
break;
default:
message = "Invalid index";
return false;
}
message = ParamName(i) + " is invalid";
return false;
}
void CopyContentTo(TriggerCfg prms)
{
prms.EventSource = this.EventSource; /// 0
prms.FailedWMsPct = this.FailedWMsPct; /// 1
prms.Mid1Name = this.Mid1Name; /// 2
prms.Mid1RelErr = this.Mid1RelErr; /// 3
prms.Mid2Name = this.Mid2Name; /// 4
prms.Mid2RelErr = this.Mid2RelErr; /// 5
prms.Mid3Name = this.Mid3Name; /// 6
prms.Mid3RelErr = this.Mid3RelErr; /// 7
prms.Mid4Name = this.Mid4Name; /// 8
prms.Mid4RelErr = this.Mid4RelErr; /// 9
prms.Mid5Name = this.Mid5Name; /// 10
prms.Mid5RelErr = this.Mid5RelErr; /// 11
prms.E1 = this.E1; /// 12
prms.E2 = this.E2; /// 13
prms.E3 = this.E3; /// 14
prms.E4 = this.E4; /// 15
prms.E5 = this.E5; /// 16
prms.E6 = this.E6; /// 17
prms.E7 = this.E7; /// 18
prms.E8 = this.E8; /// 19
prms.E9 = this.E9; /// 20
prms.E10 = this.E10; /// 21
prms.E11 = this.E11; /// 22
prms.E12 = this.E12; /// 23
prms.E13 = this.E13; /// 24
prms.E14 = this.E14; /// 25
prms.E15 = this.E15; /// 26
prms.E16 = this.E16; /// 27
prms.E21 = this.E21; /// 28
#if TURA_IPERL || TURA_SPECIAL
prms.E26 = this.E26; /// 29
prms.E27 = this.E27; /// 30
prms.E28 = this.E28; /// 31
#endif
}
public Config.Entities.IParamsProvider Clone()
{
TriggerCfg pars = new TriggerCfg();
CopyContentTo(pars);
return pars;
}
public bool UpdateEmbeddedDbEntity()
{
return true; /// =OK, do nothing
}
}
}