using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Emulations.Emulators;
using Tango.Logging;
using Tango.SharedUI;
using Tango.Core.Commands;
using Tango.Transport.Adapters;
using Tango.Transport.Servers;
using Tango.Transport.Transporters;
using Tango.Core;
using Tango.Settings;
namespace Tango.MachineEM.UI.ViewModels
{
public class MainViewVM : ExtendedObject
{
private TcpServer TcpServer;
private bool _running;
private LogManager logManager = LogManager.Default;
#region Properties
private MachineEmulator _emulator;
///
/// Gets or sets the machine emulator.
///
public MachineEmulator Emulator
{
get { return _emulator; }
set { _emulator = value; RaisePropertyChanged(nameof(Emulator)); }
}
private String _log;
///
/// Gets or sets the log.
///
public String Log
{
get { return _log; }
set { _log = value; RaisePropertyChanged(nameof(Log)); }
}
private List _ports;
///
/// Gets or sets the ports.
///
public List Ports
{
get { return _ports; }
set { _ports = value; RaisePropertyChanged(nameof(Ports)); }
}
private String _selectedPort;
///
/// Gets or sets the selected port.
///
public String SelectedPort
{
get { return _selectedPort; }
set { _selectedPort = value; RaisePropertyChanged(nameof(SelectedPort)); }
}
#endregion
#region Private Methods
#endregion
#region Commands
///
/// Gets or sets the start command.
///
public RelayCommand StartCommand { get; set; }
///
/// Gets or sets the stop command.
///
public RelayCommand StopCommand { get; set; }
///
/// Gets or sets the run command.
///
public RelayCommand RunCommand { get; set; }
///
/// Gets or sets the cancel command.
///
public RelayCommand CancelCommand { get; set; }
///
/// Gets or sets the clear command.
///
public RelayCommand ClearCommand { get; set; }
///
/// Gets or sets the validate cartridge command.
///
public RelayCommand ValidateCartridgeCommand { get; set; }
#endregion
#region Constructors
///
/// Initializes a new instance of the class.
///
public MainViewVM()
{
CoreSettings settings = SettingsManager.Default.GetOrCreate();
settings.Save();
SimpleStringLogger logger = new SimpleStringLogger(LogCategory.Critical, LogCategory.Error, LogCategory.Info, LogCategory.Warning);
logger.LogReceived += (sedner, log) =>
{
Log += log.ToString() + Environment.NewLine;
};
logManager.RegisterLogger(logger);
logManager.Log("Embedded Emulator Started...");
Emulator = new MachineEmulator(new BasicTransporter());
StartCommand = new RelayCommand(Start, (x) => !Emulator.IsStarted);
StopCommand = new RelayCommand(Stop, (x) => Emulator.IsStarted);
CancelCommand = new RelayCommand(Cancel, (x) => _running);
ClearCommand = new RelayCommand(() => Log = String.Empty);
ValidateCartridgeCommand = new RelayCommand(ValidateCartridge, (x) => Emulator.IsStarted);
Ports = new List()
{
"TCP",
"COM1",
"COM2",
"COM3",
"COM4",
"COM5",
"COM6",
"COM7",
"COM8",
"COM9",
};
SelectedPort = Ports.First();
}
#endregion
#region Event Handlers
///
/// Handles the ClientConnected event of the TcpServer control.
///
/// The source of the event.
/// The instance containing the event data.
private void TcpServer_ClientConnected(object sender, ClientConnectedEventArgs e)
{
Emulator.Transporter.Adapter = new TcpTransportAdapter(e.Socket);
}
#endregion
#region Command Handlers
///
/// Stops the TCP server and emulator.
///
private async void Start()
{
if (SelectedPort == Ports.First())
{
TcpServer = new TcpServer(9999);
TcpServer.ClientConnected += TcpServer_ClientConnected;
TcpServer.Start();
}
else
{
Emulator.Transporter.Adapter = new UsbTransportAdapter(SelectedPort);
}
await Emulator.Start();
InvalidateRelayCommands();
}
///
/// Starts the TCP server/USB and emulator.
///
private async void Stop()
{
if (TcpServer != null)
{
TcpServer.Stop();
}
await Emulator.Stop();
InvalidateRelayCommands();
}
private void Cancel()
{
}
private async void ValidateCartridge()
{
LogManager.Log("Sending cartridge validation request...");
try
{
var index = await Emulator.ValidateCartridge();
LogManager.Log($"Cartridge validation response received: '{index}'.");
}
catch (Exception ex)
{
LogManager.Log(ex, "Cartridge validation request failed.");
}
}
#endregion
}
}