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