using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Logging;
using Tango.PMR.Common;
using Tango.Core.Commands;
using Tango.Transport;
using Tango.Core;
namespace Tango.Emulations
{
/// <summary>
/// Represents an <see cref="IEmulator"/> base class.
/// </summary>
/// <seealso cref="Tango.SharedUI.ExtendedObject" />
/// <seealso cref="Tango.Emulations.IEmulator" />
public abstract class EmulatorBase : ExtendedObject, IEmulator
{
#region Properties
private bool _isStarted;
/// <summary>
/// Gets or sets a value indicating whether the emulator is started.
/// </summary>
public bool IsStarted
{
get { return _isStarted; }
set { _isStarted = value; RaisePropertyChanged(nameof(IsStarted)); InvalidateRelayCommands(); }
}
private ITransporter _transporter;
/// <summary>
/// Gets or sets the transporter.
/// </summary>
public ITransporter Transporter
{
get { return _transporter; }
set
{
_transporter = value;
SetTransporter(_transporter);
}
}
#endregion
#region Commands
/// <summary>
/// Gets or sets the start command.
/// </summary>
public RelayCommand StartCommand { get; set; }
/// <summary>
/// Gets or sets the stop command.
/// </summary>
public RelayCommand StopCommand { get; set; }
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="EmulatorBase"/> class.
/// </summary>
public EmulatorBase()
{
StartCommand = new RelayCommand(async () => { await Start(); }, (x) => !IsStarted);
StopCommand = new RelayCommand(async () => { await Stop(); }, (x) => IsStarted);
}
/// <summary>
/// Initializes a new instance of the <see cref="EmulatorBase"/> class.
/// </summary>
/// <param name="transporter">The transporter.</param>
public EmulatorBase(ITransporter transporter) : this()
{
Transporter = transporter;
}
#endregion
#region Private Methods
/// <summary>
/// Sets the transporter.
/// </summary>
/// <param name="transporter">The transporter.</param>
private void SetTransporter(ITransporter transporter)
{
if (_transporter != null)
{
_transporter.StateChanged -= OnTransporterStateChanged;
}
_transporter = transporter;
_transporter.RequestReceived += OnTransporterRequestReceived;
_transporter.StateChanged += OnTransporterStateChanged;
}
#endregion
#region Public Methods
/// <summary>
/// Stops this instance.
/// </summary>
public virtual async Task Stop()
{
if (IsStarted)
{
await _transporter.Disconnect();
IsStarted = false;
}
}
/// <summary>
/// Starts this instance.
/// </summary>
public virtual async Task Start()
{
if (!IsStarted)
{
await _transporter.Connect();
IsStarted = true;
}
}
#endregion
#region Virtual Methods
/// <summary>
/// Called when transporter state has changed.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The e.</param>
protected virtual void OnTransporterStateChanged(object sender, TransportComponentState e)
{
LogManager.Log("Transporter state changed: " + e.ToString());
}
#endregion
#region Abstract Methods
/// <summary>
/// Called on new request message.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="container">The container.</param>
protected abstract void OnTransporterRequestReceived(object sender, RequestReceivedEventArgs e);
#endregion
#region Dispose
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
Stop().Wait();
if (Transporter != null) Transporter.Dispose();
}
#endregion
}
}