using System; using System.Reflection.PortableExecutable; namespace OpenMacroBoard.SDK { /// /// Wraps an and allows for hooks to implement "middle-ware" features. /// public abstract class MacroBoardAdapter : IMacroBoard { private readonly IMacroBoard macroBoard; private readonly Boolean leaveOpen; private Boolean disposed = false; /// /// Initializes a new instance of the class. /// /// /// When this instance is disposed, the underlying board is disposed as well. /// /// The macroBoard that is wrapped. protected MacroBoardAdapter(IMacroBoard macroBoard) : this(macroBoard, false) { } /// /// Initializes a new instance of the class. /// /// The macroBoard that is wrapped. /// When true, the underlying macroBoard will not be disposed with this instance. protected MacroBoardAdapter(IMacroBoard macroBoard, Boolean leaveOpen) { this.macroBoard = macroBoard ?? throw new ArgumentNullException(nameof(macroBoard)); this.leaveOpen = leaveOpen; macroBoard.ConnectionStateChanged += this.OnConnectionStateChanged; //macroBoard.KeyStateChanged += this.OnKeyStateChanged; macroBoard.ButtonPressed += this.MacroBoard_ButtonPressed; macroBoard.ButtonReleased += this.MacroBoard_ButtonReleased; macroBoard.TouchbarTouched += this.MacroBoard_TouchbarTouched; macroBoard.TouchbarPressed += this.MacroBoard_TouchbarPressed; macroBoard.TouchFlipEvent += this.MacroBoard_TouchFlipEvent; macroBoard.EncoderPressed += this.MacroBoard_EncoderPressed; macroBoard.EncoderReleased += this.MacroBoard_EncoderReleased; macroBoard.EncoderTurn += this.MacroBoard_EncoderTurn; } /// /// Finalizes an instance of the class. /// ~MacroBoardAdapter() { this.Dispose(false); } /// //public event EventHandler KeyStateChanged; public event EventHandler ButtonPressed; public event EventHandler ButtonReleased; public event EventHandler TouchbarTouched; public event EventHandler TouchbarPressed; public event EventHandler TouchFlipEvent; public event EventHandler EncoderPressed; public event EventHandler EncoderReleased; public event EventHandler EncoderTurn; /// public event EventHandler ConnectionStateChanged; /// public virtual IKeyLayout Keys => this.macroBoard.Keys; /// public virtual Boolean IsConnected => this.macroBoard.IsConnected; /// public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } /// public virtual void SetBrightness(Byte percent) => this.macroBoard.SetBrightness(percent); /// public virtual void SetButtonImage(Int32 keyId, KeyBitmap bitmapData) => this.macroBoard.SetButtonImage(keyId, bitmapData); /// public void SetFullScreenImage(KeyBitmap bitmapData) => throw new NotImplementedException(); /// public virtual void SetWindowImage(KeyBitmap bitmapData) => throw new NotImplementedException(); /// public virtual void SetPartialWindowImage(Int32 x_pos, Int32 y_pos, KeyBitmap bitmapData) => throw new NotImplementedException(); /// public virtual void ShowLogo() => this.macroBoard.ShowLogo(); /// public String GetFirmwareVersion() => this.macroBoard.GetFirmwareVersion(); /// public String GetSerialNumber() => this.macroBoard.GetFirmwareVersion(); // // Virtual KeyStateChanged event handler. // // The sender of the original event. // The event arguments. //protected virtual void OnKeyStateChanged(Object sender, KeyEventArgs e) => KeyStateChanged?.Invoke(this, e); private void MacroBoard_EncoderTurn(Object sender, KnobTurnEvent e) => this.EncoderTurn?.Invoke(this, e); private void MacroBoard_EncoderReleased(Object sender, KnobPressEvent e) => this.EncoderReleased?.Invoke(this, e); private void MacroBoard_EncoderPressed(Object sender, KnobPressEvent e) => this.EncoderPressed?.Invoke(this, e); private void MacroBoard_TouchFlipEvent(Object sender, TouchFlipEvent e) => this.TouchFlipEvent?.Invoke(this, e); private void MacroBoard_TouchbarPressed(Object sender, TouchTipEvent e) => this.TouchbarPressed?.Invoke(this, e); private void MacroBoard_TouchbarTouched(Object sender, TouchTipEvent e) => this.TouchbarTouched?.Invoke(this, e); private void MacroBoard_ButtonReleased(Object sender, KeyPressEvent e) => this.ButtonReleased?.Invoke(this, e); private void MacroBoard_ButtonPressed(Object sender, KeyPressEvent e) => this.ButtonPressed?.Invoke(this, e); /// /// Virtual ConnectionStateChanged event handler. /// /// The sender of the original event. /// The event arguments. protected virtual void OnConnectionStateChanged(Object sender, ConnectionEventArgs e) => ConnectionStateChanged?.Invoke(this, e); /// /// Protected implementation of Dispose pattern. /// /// True when called from and false when called from the finalizer. protected virtual void Dispose(Boolean disposing) { if(this.disposed) { return; } if(disposing && !this.leaveOpen) { this.macroBoard?.Dispose(); } this.disposed = true; } } }