/// /// Copyright (c) 2017 Sensus Metering Systems /// using System; using System.Collections.Generic; using Dirichlet.Numerics; using log4net; using TBF.BenchControl.GenericDevices; using TBF.Resources; namespace TBF.BenchControl.Elde.CoverTest { public class CoverTest : ComponentBase, IOperation, ISequenceCondition { private static readonly ILog log = LogManager.GetLogger(typeof(CoverTest)); private static readonly ILog bypassLog = LogManager.GetLogger("BypassLog"); public override string ToString() { return string.Format("CoverTest({0})", Cfg.ToString(1)); } readonly CoverTestCfg coverTestCfg; readonly ControlBoardDev controlBoard; readonly int bitPosition; /// 0 .. 63 readonly ulong mask; /// derived from bitPosition in the constructor readonly ulong target; readonly string message; readonly Users.Grp.GID bypassLevel; public CoverTest() { } public CoverTest(Generic.IComponentCfg cfg, IList components) : base(cfg) { coverTestCfg = cfg as CoverTestCfg; controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); bitPosition = coverTestCfg.BitPosition; mask = (((ulong)1) << coverTestCfg.BitPosition); target = coverTestCfg.Invert ? 0 : mask; message = coverTestCfg.Message; bypassLevel = coverTestCfg.BypassLevel; log.Debug(this.ToString()); } public int ConditionsCount { get { return 1; } } /// Strings are added to the combo-box for transition sequence condition selection public string ConditionName(int i) { if (i < 1 && i >= 0) return Name; else return string.Empty; } /// Operation to be executed as a part of a transition sequence public IOperation ConditionOp(int i) { if (i < 1 && i >= 0) return this; else return null; } CoverTestForm modelessDlg; bool completed = false; delegate void CoverTestFormDlgt(CoverTest myRef); /// void OpenFormDlg(CoverTest myRef) { myRef.modelessDlg = new CoverTestForm(message, bypassLevel, bypassLog); modelessDlg.Show(); } public IOperation CoverTestOp() { return this; } /// Start this operation public void Start() { log.DebugFormat("Start()"); completed = false; Program.MainWnd.Invoke(new CoverTestFormDlgt(OpenFormDlg), this); } /// Run this operation /// Event.ResultsPrinted public Event Run() { bool conditionMet = ((controlBoard.DigitalInputs & mask) == target); if (completed || conditionMet) { completed = true; } if (completed || modelessDlg.Completed) { completed = true; CloseModelessDlg(); log.DebugFormat("Run() ... conditionMet={0} completed={1} ... Event.ConditionMet", conditionMet, completed); return Event.ConditionMet; } log.DebugFormat("Run() ... conditionMet={0} completed={1} ... Event.ConditionNotMet", conditionMet, completed); return Event.ConditionNotMet; } /// Stop this operation public void Stop() { log.DebugFormat("Stop()"); CloseModelessDlg(); } void CloseModelessDlg() { if (modelessDlg is GenericDevices.IHasCompleted) { UiBridge.Bridge.OnCloseQandAForm(this, null); modelessDlg = null; } } } }