///
/// 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
{
///
/// Serializable configuration of Output.EventTriggers.Standard component.
///
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 Mid1ErrAfterCorr; /// [%] Event triggered when rel. error of MID1 against a scale after a correction reached this level
public double Mid1Err; /// [%] Event triggered when rel. error of MID1 against a scale reached this level
public string Mid2Name;
public double Mid2ErrAfterCorr; /// [%] Event triggered when rel. error of MID2 against a scale after a correction reached this level
public double Mid2Err; /// [%] Event triggered when rel. error of MID2 against a scale reached this level
public string Mid3Name;
public double Mid3ErrAfterCorr; /// [%] Event triggered when rel. error of MID3 against a scale after a correction reached this level
public double Mid3Err; /// [%] Event triggered when rel. error of MID3 against a scale reached this level
public string Mid4Name;
public double Mid4ErrAfterCorr; /// [%] Event triggered when rel. error of MID4 against a scale after a correction reached this level
public double Mid4Err; /// [%] Event triggered when rel. error of MID4 against a scale reached this level
public string Mid5Name;
public double Mid5ErrAfterCorr; /// [%] Event triggered when rel. error of MID5 against a scale after a correction reached this level
public double Mid5Err; /// [%] Event triggered when rel. error of MID5 against a scale reached 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;
public bool E36;
#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
Mid1ErrAfterCorr = 0.3; /// 3
Mid1Err = 0.6; /// 4
Mid2Name = "I2"; /// 5
Mid2ErrAfterCorr = 0.3; /// 6
Mid2Err = 0.6; /// 7
Mid3Name = "I3"; /// 8
Mid3ErrAfterCorr = 0.3; /// 9
Mid3Err = 0.6; /// 10
Mid4Name = ""; /// 11
Mid4ErrAfterCorr = 0.3; /// 12
Mid4Err = 0.6; /// 13
Mid5Name = ""; /// 14
Mid5ErrAfterCorr = 0.3; /// 15
Mid5Err = 0.6; /// 16
E1 = false; /// 17
E2 = false; /// 18
E3 = false; /// 19
E4 = false; /// 20
E5 = false; /// 21
E6 = false; /// 22
E7 = false; /// 23
E8 = false; /// 24
E9 = false; /// 25
E10 = false; /// 26
E11 = false; /// 27
E12 = false; /// 28
E13 = false; /// 29
E14 = false; /// 30
E15 = false; /// 31
E16 = false; /// 32
E21 = false; /// 33
E36 = true; /// 34
#if TURA_IPERL || TURA_SPECIAL
E26 = false; /// 35
E27 = false; /// 36
E28 = false; /// 37
#endif
}
string[] paramNames = new string[]
{
"Event source", /// 0
"Percentage of failed meters", /// 1
"MID 1 name", /// 2
"MID 1 rel.err.after corr.", /// 3
"MID 1 rel.error", /// 4
"MID 2 name", /// 5
"MID 2 rel.err.after corr.", /// 6
"MID 2 rel.error", /// 7
"MID 3 name", /// 8
"MID 3 rel.err.after corr.", /// 9
"MID 3 rel.error", /// 10
"MID 4 name", /// 11
"MID 4 rel.err.after corr.", /// 12
"MID 4 rel.error", /// 13
"MID 5 name", /// 14
"MID 5 rel.err.after corr.", /// 15
"MID 5 rel.error", /// 16
"E1", /// 17
"E2", /// 18
"E3", /// 19
"E4", /// 20
"E5", /// 21
"E6", /// 22
"E7", /// 23
"E8", /// 24
"E9", /// 25
"E10", /// 26
"E11", /// 27
"E12", /// 28
"E13", /// 29
"E14", /// 30
"E15", /// 31
"E16", /// 32
"E21", /// 33
"E36", /// 34
#if TURA_IPERL || TURA_SPECIAL
"E26", /// 35
"E27", /// 36
"E28", /// 37
#endif
};
public string ParamName(int i) { return paramNames[i]; }
public int ParamsCount() { return paramNames.Length; }
public IList ParamValues(int i)
{
IList listOfValues = new List();
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 Mid1ErrAfterCorr.ToString();
case 4: return Mid1Err.ToString();
case 5: return Mid2Name;
case 6: return Mid2ErrAfterCorr.ToString();
case 7: return Mid2Err.ToString();
case 8: return Mid3Name;
case 9: return Mid3ErrAfterCorr.ToString();
case 10: return Mid3Err.ToString();
case 11: return Mid4Name;
case 12: return Mid4ErrAfterCorr.ToString();
case 13: return Mid4Err.ToString();
case 14: return Mid5Name;
case 15: return Mid5ErrAfterCorr.ToString();
case 16: return Mid5Err.ToString();
case 17: return E1 ? Strings.yes : Strings.no;
case 18: return E2 ? Strings.yes : Strings.no;
case 19: return E3 ? Strings.yes : Strings.no;
case 20: return E4 ? Strings.yes : Strings.no;
case 21: return E5 ? Strings.yes : Strings.no;
case 22: return E6 ? Strings.yes : Strings.no;
case 23: return E7 ? Strings.yes : Strings.no;
case 24: return E8 ? Strings.yes : Strings.no;
case 25: return E9 ? Strings.yes : Strings.no;
case 26: return E10 ? Strings.yes : Strings.no;
case 27: return E11 ? Strings.yes : Strings.no;
case 28: return E12 ? Strings.yes : Strings.no;
case 29: return E13 ? Strings.yes : Strings.no;
case 30: return E14 ? Strings.yes : Strings.no;
case 31: return E15 ? Strings.yes : Strings.no;
case 32: return E16 ? Strings.yes : Strings.no;
case 33: return E21 ? Strings.yes : Strings.no;
case 34: return E36 ? Strings.yes : Strings.no;
#if TURA_IPERL || TURA_SPECIAL
case 35: return E26 ? Strings.yes : Strings.no;
case 36: return E27 ? Strings.yes : Strings.no;
case 37: 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: Mid1ErrAfterCorr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 4: Mid1Err = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 5: Mid2Name = strValue; return CfgUpdateFlags.AnyChange;
case 6: Mid2ErrAfterCorr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 7: Mid2Err = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 8: Mid3Name = strValue; return CfgUpdateFlags.AnyChange;
case 9: Mid3ErrAfterCorr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 10: Mid3Err = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 11: Mid4Name = strValue; return CfgUpdateFlags.AnyChange;
case 12: Mid4ErrAfterCorr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 13: Mid4Err = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 14: Mid5Name = strValue; return CfgUpdateFlags.AnyChange;
case 15: Mid5ErrAfterCorr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 16: Mid5Err = Utils.ParseUDouble(strValue); return CfgUpdateFlags.AnyChange;
case 17: E1 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 18: E2 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 19: E3 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 20: E4 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 21: E5 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 22: E6 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 23: E7 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 24: E8 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 25: E9 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 26: E10 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 27: E11 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 28: E12 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 29: E12 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 30: E14 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 31: E15 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 32: E16 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 33: E21 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 34: E36 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
#if TURA_IPERL || TURA_SPECIAL
case 35: E26 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 36: E27 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
case 37: E28 = (strValue == Strings.yes); return CfgUpdateFlags.AnyChange;
#endif
default: return CfgUpdateFlags.None;
}
}
///
/// Validate string form of a parameter value
///
/// Parameter index
/// String form of a parameter
/// Message in case value is not valid
/// true when string form of a parameter is OK
public bool ValidateParam(int i, string strValue, out string message)
{
message = string.Empty;
int percentage;
double relError;
switch (i)
{
case 0:
case 2:
case 5:
case 8:
case 11:
case 14:
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 4:
case 6:
case 7:
case 9:
case 10:
case 12:
case 13:
case 15:
case 16:
if (Utils.TryParseUDouble(strValue, out relError)) return true;
message = "relative error of MID is invalid or less then 0";
return false;
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
#if TURA_IPERL || TURA_SPECIAL
case 35:
case 36:
case 37:
#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.Mid1ErrAfterCorr = this.Mid1ErrAfterCorr; /// 3
prms.Mid1Err = this.Mid1Err; /// 4
prms.Mid2Name = this.Mid2Name; /// 5
prms.Mid2ErrAfterCorr = this.Mid2ErrAfterCorr; /// 6
prms.Mid2Err = this.Mid2Err; /// 7
prms.Mid3Name = this.Mid3Name; /// 8
prms.Mid3ErrAfterCorr = this.Mid3ErrAfterCorr; /// 9
prms.Mid3Err = this.Mid3Err; /// 10
prms.Mid4Name = this.Mid4Name; /// 11
prms.Mid4ErrAfterCorr = this.Mid4ErrAfterCorr; /// 12
prms.Mid4Err = this.Mid4Err; /// 13
prms.Mid5Name = this.Mid5Name; /// 14
prms.Mid5ErrAfterCorr = this.Mid5ErrAfterCorr; /// 15
prms.Mid5Err = this.Mid5Err; /// 16
prms.E1 = this.E1; /// 17
prms.E2 = this.E2; /// 18
prms.E3 = this.E3; /// 19
prms.E4 = this.E4; /// 20
prms.E5 = this.E5; /// 21
prms.E6 = this.E6; /// 22
prms.E7 = this.E7; /// 23
prms.E8 = this.E8; /// 24
prms.E9 = this.E9; /// 25
prms.E10 = this.E10; /// 26
prms.E11 = this.E11; /// 27
prms.E12 = this.E12; /// 28
prms.E13 = this.E13; /// 29
prms.E14 = this.E14; /// 30
prms.E15 = this.E15; /// 31
prms.E16 = this.E16; /// 32
prms.E21 = this.E21; /// 33
prms.E36 = this.E36; /// 34
#if TURA_IPERL || TURA_SPECIAL
prms.E26 = this.E26; /// 35
prms.E27 = this.E27; /// 36
prms.E28 = this.E28; /// 37
#endif
}
public Config.Entities.IParamsProvider Clone()
{
TriggerCfg pars = new TriggerCfg();
CopyContentTo(pars);
return pars;
}
public bool UpdateEmbeddedDbEntity()
{
return true; /// =OK, do nothing
}
}
}