using System; using System.Collections.Generic; using System.Linq; using System.Text; using Crestron.SimplSharp; using Crestron.SimplSharpPro; namespace PepperDash.Essentials.Core { public abstract class Feedback { public event EventHandler OutputChange; public virtual bool BoolValue { get { return false; } } public virtual int IntValue { get { return 0; } } public virtual string StringValue { get { return ""; } } public Cue Cue { get; private set; } public abstract eCueType Type { get; } protected Feedback() { } protected Feedback(Cue cue) { Cue = cue; } public abstract void FireUpdate(); protected void OnOutputChange() { if (OutputChange != null) OutputChange(this, EventArgs.Empty); } } /// /// A Feedback whose output is derived from the return value of a provided Func. /// public class BoolFeedback : Feedback { /// /// Returns the current value of the feedback, derived from the ValueFunc /// public override bool BoolValue { get { return _BoolValue; } } bool _BoolValue; public override eCueType Type { get { return eCueType.Bool; } } public Func ValueFunc { get; private set; } /// /// The last value delivered on FireUpdate /// //public bool PreviousValue { get; private set; } List LinkedInputSigs = new List(); List LinkedComplementInputSigs = new List(); public BoolFeedback(Func valueFunc) : this(Cue.DefaultBoolCue, valueFunc) { } public BoolFeedback(Cue cue, Func valueFunc) : base(cue) { if (cue == null) throw new ArgumentNullException("cue"); ValueFunc = valueFunc; } public override void FireUpdate() { var newValue = ValueFunc.Invoke(); if (newValue != _BoolValue) { _BoolValue = newValue; LinkedInputSigs.ForEach(s => UpdateSig(s)); LinkedComplementInputSigs.ForEach(s => UpdateComplementSig(s)); OnOutputChange(); } } public void LinkInputSig(BoolInputSig sig) { LinkedInputSigs.Add(sig); UpdateSig(sig); } public void UnlinkInputSig(BoolInputSig sig) { LinkedInputSigs.Remove(sig); } public void LinkComplementInputSig(BoolInputSig sig) { LinkedComplementInputSigs.Add(sig); UpdateComplementSig(sig); } public void UnlinkComplementInputSig(BoolInputSig sig) { LinkedComplementInputSigs.Remove(sig); } public override string ToString() { return BoolValue.ToString(); } void UpdateSig(BoolInputSig sig) { sig.BoolValue = _BoolValue; } void UpdateComplementSig(BoolInputSig sig) { sig.BoolValue = !_BoolValue; } } //****************************************************************************** public class IntFeedback : Feedback { public override int IntValue { get { return _IntValue; } } // ValueFunc.Invoke(); } } int _IntValue; public ushort UShortValue { get { return (ushort)_IntValue; } } public override eCueType Type { get { return eCueType.Int; } } //public int PreviousValue { get; private set; } Func ValueFunc; List LinkedInputSigs = new List(); public IntFeedback(Func valueFunc) : this(Cue.DefaultIntCue, valueFunc) { } public IntFeedback(Cue cue, Func valueFunc) : base(cue) { if (cue == null) throw new ArgumentNullException("cue"); ValueFunc = valueFunc; } public override void FireUpdate() { var newValue = ValueFunc.Invoke(); if (newValue != _IntValue) { _IntValue = newValue; LinkedInputSigs.ForEach(s => UpdateSig(s)); OnOutputChange(); } } public void LinkInputSig(UShortInputSig sig) { LinkedInputSigs.Add(sig); UpdateSig(sig); } public void UnlinkInputSig(UShortInputSig sig) { LinkedInputSigs.Remove(sig); } public override string ToString() { return IntValue.ToString(); } void UpdateSig(UShortInputSig sig) { sig.UShortValue = UShortValue; } } //****************************************************************************** public class StringFeedback : Feedback { public override string StringValue { get { return _StringValue; } } // ValueFunc.Invoke(); } } string _StringValue; public override eCueType Type { get { return eCueType.String; } } //public string PreviousValue { get; private set; } public Func ValueFunc { get; private set; } List LinkedInputSigs = new List(); public StringFeedback(Func valueFunc) : this(Cue.DefaultStringCue, valueFunc) { } public StringFeedback(Cue cue, Func valueFunc) : base(cue) { if (cue == null) throw new ArgumentNullException("cue"); ValueFunc = valueFunc; } public override void FireUpdate() { var newValue = ValueFunc.Invoke(); if (newValue != _StringValue) { _StringValue = newValue; LinkedInputSigs.ForEach(s => UpdateSig(s)); OnOutputChange(); } } public void LinkInputSig(StringInputSig sig) { LinkedInputSigs.Add(sig); UpdateSig(sig); } public void UnlinkInputSig(StringInputSig sig) { LinkedInputSigs.Remove(sig); } public override string ToString() { return StringValue; } void UpdateSig(StringInputSig sig) { sig.StringValue = _StringValue; } } }