/// /// 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)); } readonly DiverterCfg diverterCfg; readonly ControlBoardDev controlBoard; readonly ulong mask; /// derived from bitPosition in the constructor public bool State { get { return (controlBoard.Route & mask) != 0; } } 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); /// Prepare data for SendCalibData() control board component method controlBoard.DiverterEdge[0] = (uint)diverterCfg.StartingLevel; controlBoard.DiverterEdge[1] = (uint)diverterCfg.StoppingLevel; 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) { //diverterCfg.StableTimeMs = tmpcfg.StableTimeMs; //diverterCfg.FlowStableSec = tmpcfg.FlowStableSec; } //else if (args.Command == CfgChangeCmd.RVOpenStep) //{ // controlBoard.ValveMove(Idx1, RegulValveMode.PulseWidth, new float[2] { 2.0f, 2.0f }, StableTime); // // TODO: avoid conflicts // // TOTEST //} //else if (args.Command == CfgChangeCmd.RVCloseStep) //{ // controlBoard.ValveMove(Idx1, RegulValveMode.PulseWidth, new float[2] { -2.0f, -2.0f }, StableTime); // // TODO: avoid conflicts // // TOTEST //} //else if (args.Command == CfgChangeCmd.GetRVAdc1 || args.Command == CfgChangeCmd.GetRVAdc2) //{ // int adc = (int)controlBoard.AnalogInputRaw(Idx1 - 1, 0); // // TOTEST // DiverterCfgCtrl.OnCmdResponse(this, new CmdResponseArgs(args.Command, adc)); //} } }; } #endregion Configuration Change Handling } }