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;
}
}
}