From 04fd2234090e23ff2e648d997a1cc753c9354941 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Thu, 16 Aug 2018 15:59:12 +0300 Subject: Implemented full machine setup with connectivity and communication testing! Fixed an issue with auto reset event on transport and logging :/ --- .../Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs | 231 ++++++++++++++++++--- 1 file changed, 207 insertions(+), 24 deletions(-) (limited to 'Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels') diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs index a81db331c..57c2200c6 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs @@ -8,6 +8,9 @@ using System.Threading.Tasks; using Tango.Core; using Tango.Core.Commands; using Tango.Core.Helpers; +using Tango.Integration.Operation; +using Tango.Logging; +using Tango.PMR.Connection; using Tango.PPC.Common; using Tango.PPC.Common.Application; using Tango.PPC.Common.MachineSetup; @@ -16,6 +19,7 @@ using Tango.PPC.UI.ViewsContracts; using Tango.Settings; using Tango.SharedUI.Helpers; using Tango.SQLExaminer; +using Tango.Transport.Adapters; namespace Tango.PPC.UI.ViewModels { @@ -36,6 +40,19 @@ namespace Tango.PPC.UI.ViewModels Failed, } + public enum MachineSetupView + { + WelcomeView, + WiFiSelectionView, + WiFiTestView, + EmbeddedWelcomeView, + EmbeddedTestView, + SetupWelcomeView, + SetupProgressView, + SetupCompletedView, + SetupFailedView, + } + private MachineSetupResult _setup_result; #region Properties @@ -85,19 +102,46 @@ namespace Tango.PPC.UI.ViewModels set { _state = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } } + private String _machineConnectionStatus; + public String MachineConnectionStatus + { + get { return _machineConnectionStatus; } + set { _machineConnectionStatus = value; RaisePropertyChangedAuto(); } + } + #endregion #region Commands /// - /// Gets or sets the start command. + /// Gets or sets the complete command. + /// + public RelayCommand CompleteCommand { get; set; } + + /// + /// Gets or sets the navigate to WiFi command. /// - public RelayCommand StartCommand { get; set; } + public RelayCommand NavigateToWiFiCommand { get; set; } /// - /// Gets or sets the complete command. + /// Gets or sets the skip embedded test command. /// - public RelayCommand CompleteCommand { get; set; } + public RelayCommand SkipEmbeddedTestCommand { get; set; } + + /// + /// Gets or sets the perform embedded test command. + /// + public RelayCommand PerformEmbeddedTestCommand { get; set; } + + /// + /// Gets or sets the install command. + /// + public RelayCommand InstallCommand { get; set; } + + /// + /// Gets or sets the restart command. + /// + public RelayCommand RestartCommand { get; set; } #endregion @@ -111,16 +155,31 @@ namespace Tango.PPC.UI.ViewModels public MachineSetupViewVM(IPPCApplicationManager applicationManager, IMachineSetupManager machineSetupManager) { MachineSetupManager = machineSetupManager; - MachineSetupManager.ProgressLog += (x, msg) => AppendLog(msg); + //MachineSetupManager.ProgressLog += (x, msg) => AppendLog(msg); MachineSetupManager.ProgressStep += (x, step) => AppendLog(Environment.NewLine + "-----------" + step.ToDescription().ToUpper() + "-----------" + Environment.NewLine); HostAddress = "localhost\\SQLEXPRESS"; SerialNumber = "1111"; - StartCommand = new RelayCommand(StartSetup, () => !String.IsNullOrWhiteSpace(HostAddress) && !String.IsNullOrWhiteSpace(SerialNumber) && State == MachineSetupStates.None); CompleteCommand = new RelayCommand(CompleteSetup, () => State == MachineSetupStates.Completed); applicationManager.SetupRequired += ApplicationManager_SetupRequired; + + NavigateToWiFiCommand = new RelayCommand(EnsureWiFi); + + PerformEmbeddedTestCommand = new RelayCommand(PerformEmbeddedTest); + SkipEmbeddedTestCommand = new RelayCommand(SkipEmbeddedTest); + InstallCommand = new RelayCommand(Install); + RestartCommand = new RelayCommand(() => { NavigateTo(MachineSetupView.WelcomeView); }); + + if (!LogManager.Categories.Contains(LogCategory.Debug)) + { + LogManager.Categories.Add(LogCategory.Debug); + } + + var logger = new SimpleStringLogger(); + LogManager.RegisterLogger(logger); + logger.LogReceived += Logger_LogReceived; } #endregion @@ -138,6 +197,12 @@ namespace Tango.PPC.UI.ViewModels NavigationManager.NavigateTo(NavigationView.MachineSetupView); } + + private void Logger_LogReceived(object sender, LogItemBase e) + { + AppendLog(e.Message); + } + #endregion #region Private Methods @@ -158,10 +223,142 @@ namespace Tango.PPC.UI.ViewModels } /// - /// Starts the setup. + /// Completes the setup. + /// + private void CompleteSetup() + { + String updater_exe = AssemblyHelper.GetCurrentAssemblyFolder() + "\\Tango.PPC.Updater.exe"; + + LogManager.Log("Completing machine setup..."); + LogManager.Log($"Executing '{updater_exe}' with arguments '{_setup_result.UpdatePackagePath}'..."); + Process.Start(updater_exe, _setup_result.UpdatePackagePath); + LogManager.Log("Terminating application process!"); + Environment.Exit(0); + } + + /// + /// Navigates to the specified view. /// - private async void StartSetup() + /// The view. + private Task NavigateTo(MachineSetupView view) { + return View.NavigateTo(view); + } + + #endregion + + #region WiFi + + private async void EnsureWiFi() + { + await NavigateTo(MachineSetupView.WiFiTestView); + + await Task.Delay(2000); + + bool connected = await ConnectivityProvider.CheckInternetConnection(); + + if (connected) + { + await NavigateTo(MachineSetupView.EmbeddedWelcomeView); + } + else + { + await NavigateTo(MachineSetupView.WiFiSelectionView); + await ConnectivityProvider.RefreshAvailableWiFiNetworks(); + + ConnectivityProvider.ConnectionStateChanged += ConnectivityProvider_ConnectionStateChanged; + } + } + + private void ConnectivityProvider_ConnectionStateChanged(object sender, Common.Connectivity.ConnectionStateEventArgs e) + { + if (e.IsConnected) + { + ConnectivityProvider.ConnectionStateChanged -= ConnectivityProvider_ConnectionStateChanged; + EnsureWiFi(); + } + } + + #endregion + + #region Embedded + + private async void PerformEmbeddedTest() + { + await NavigateTo(MachineSetupView.EmbeddedTestView); + + try + { + MachineConnectionStatus = "Scanning for the machine..."; + + LogManager.Log("Starting machine connection procedure..."); + + TimeSpan timeout = TimeSpan.FromSeconds(SettingsManager.Default.GetOrCreate().MachineScanningTimeoutSeconds); + + LogManager.Log("Scanning for machine on available serial ports..."); + Transport.Discovery.UsbCommunicationScanner scanner = new Transport.Discovery.UsbCommunicationScanner(UsbSerialBaudRates.BR_9600); + + scanner.ScanningPort += (port) => + { + MachineConnectionStatus = $"Scanning for the machine on {port}..."; + }; + + var response = await scanner.Scan(new ConnectRequest() { Password = "1234" }, timeout); + + MachineConnectionStatus = "Machine discovered on port: " + response.Adapter.Address + ", trying to connect..."; + + LogManager.Log("Machine discovered on port: " + response.Adapter.Address); + LogManager.Log("Device Information:"); + LogManager.Log(response.Response.DeviceInformation.ToJsonString()); + + LogManager.Log("Disconnecting machine operator..."); + + IMachineOperator op = new MachineOperator(response.Adapter); + + op.EnableDiagnostics = false; + op.EnableEmbeddedDebugging = false; + op.EnableEventsNotification = false; + + LogManager.Log("Connecting machine operator..."); + await op.Connect(); + + MachineConnectionStatus = "Test completed successfully!"; + + await Task.Delay(1000); + + try + { + await op.Disconnect(); + } + catch { } + + await NavigateTo(MachineSetupView.SetupWelcomeView); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error while trying to scan and connect to the machine."); + MachineConnectionStatus = "Test Failed!"; + await Task.Delay(2000); + await NavigateTo(MachineSetupView.EmbeddedWelcomeView); + } + } + + private async void SkipEmbeddedTest() + { + if (await NotificationProvider.ShowQuestion("Are you sure you want to skip the machine communication test?")) + { + + } + } + + #endregion + + #region Setup + + private async void Install() + { + await NavigateTo(MachineSetupView.SetupProgressView); + LogManager.Log("Starting machine setup..."); State = MachineSetupStates.Working; @@ -172,31 +369,17 @@ namespace Tango.PPC.UI.ViewModels Settings.ApplicationState = ApplicationStates.SemiSetup; Settings.Save(); State = MachineSetupStates.Completed; - LogManager.Log("Machine setup completed."); + await NavigateTo(MachineSetupView.SetupCompletedView); } catch (Exception ex) { LogManager.Log(ex, "Machine setup failed."); State = MachineSetupStates.Failed; - await NotificationProvider.ShowInfo(ex.Message); + await NavigateTo(MachineSetupView.SetupFailedView); } } - /// - /// Completes the setup. - /// - private void CompleteSetup() - { - String updater_exe = AssemblyHelper.GetCurrentAssemblyFolder() + "\\Tango.PPC.Updater.exe"; - - LogManager.Log("Completing machine setup..."); - LogManager.Log($"Executing '{updater_exe}' with arguments '{_setup_result.UpdatePackagePath}'..."); - Process.Start(updater_exe, _setup_result.UpdatePackagePath); - LogManager.Log("Terminating application process!"); - Environment.Exit(0); - } - #endregion } } -- cgit v1.3.1