/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using log4net; namespace TBF.BenchControl.Elde.Diverter { public class Diverter : ComponentBase, GenericDevices.IDiverter { private static readonly ILog log = LogManager.GetLogger(typeof(Diverter)); public override string ToString() { return string.Format("Diverter({0})", Cfg.ToString(1)); } /// /// Enumeration of balances via static fields and methods /// static int nextIdx = 0; public static new void ResetStaticProperties() { nextIdx = 0; } public static int DivertersCount { get { return nextIdx; } } public static GenericDevices.IDiverter[] Diverters; public static int[] DiverterLevelsPct; protected int diverterNr; /// 0-based diverter number readonly DiverterCfg diverterCfg; readonly ControlBoardDev controlBoard; readonly ulong mask; /// derived from bitPosition in the constructor public int AdcNr { get { return diverterCfg.AdcNr; } } public bool State { get { return (controlBoard.Route & mask) != 0; } } public Diverter() { } public Diverter(DiverterCfg cfg, IList components) : base(cfg) { diverterCfg = cfg; controlBoard = (ControlBoardDev)TbfComponents.FindComponent(cfg.ParentName, components); if (controlBoard == null) throw new Exception("Cannot find " + Name + " parent"); if (cfg.BitPosition < 0 || cfg.BitPosition >= 64) throw new ArgumentOutOfRangeException("position"); this.mask = (((ulong)1) << cfg.BitPosition); diverterNr = nextIdx++; /// if (Diverters == null || Diverters.Length < nextIdx) { GenericDevices.IDiverter[] divertersSoFar = Diverters; int[] levelsSoFar = DiverterLevelsPct; Diverters = new GenericDevices.IDiverter[nextIdx]; DiverterLevelsPct = new int[nextIdx]; if (divertersSoFar != null) { for (int i = 0; i < divertersSoFar.Length; i++) { Diverters[i] = divertersSoFar[i]; DiverterLevelsPct[i] = levelsSoFar[i]; } } Diverters[nextIdx - 1] = this; DiverterLevelsPct[nextIdx - 1] = diverterCfg.StartingLevel; } /// Prepare arguments of SendCalibData() if (diverterNr >= 0 && diverterNr < 3) { controlBoard.RegValveCalib[5 + diverterNr, 0] = (uint)diverterCfg.AdcValueToSink; controlBoard.RegValveCalib[5 + diverterNr, 1] = (uint)diverterCfg.AdcValueToTank; } 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 CfgChangeHandler; public override void StartChangeHandler() { CfgChangeHandler += delegate(object sender, CfgChangeArgs args) { DiverterCfg tmpcfg = args.Cfg as DiverterCfg; if (tmpcfg != null && tmpcfg.Name.Equals(Name)) { if (args.Command == CfgChangeCmd.CfgChange) { } else if (args.Command == CfgChangeCmd.GetAdc1 || args.Command == CfgChangeCmd.GetAdc2) { int adc = (int)controlBoard.AnalogInputRaw(diverterCfg.AdcNr, 0); // TOTEST DiverterCfgCtrl.OnCmdResponse(this, new CmdResponseArgs(args.Command, diverterCfg.BitPosition, adc)); } else if (args.Command == CfgChangeCmd.DivToTank) { if (Name.Contains("1")) /// TODO: Put flowmeter# into config { controlBoard.DiverterToTank(1); } else { controlBoard.DiverterToTank(3); } } else if (args.Command == CfgChangeCmd.DivToSink) { if (Name.Contains("1")) /// TODO: Put flowmeter# into config { controlBoard.DiverterToSink(1); } else { controlBoard.DiverterToSink(3); } } else if (args.Command == CfgChangeCmd.ReadDivTransition) { if (Name.Contains("1")) /// TODO: Put flowmeter# into config { controlBoard.ReadDiverterTransition(1); } else { controlBoard.ReadDiverterTransition(3); } } } }; } #endregion Configuration Change Handling } }