/*------------------------------------------------------------------------- // UNCLASSIFIED /*------------------------------------------------------------------------- RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON COMPANY. THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S. GOVERNMENT. UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY. -------------------------------------------------------------------------*/ using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Threading; using ProgramLib.GUI.ViewModel; namespace ProgramLib.GUI.View { /// /// Interaction logic for MainWindow.xaml /// internal partial class LiveDataWindow : Window { private enum Events { GLOBAL_QUIT, QUIT, UUT_POWER_ON, UUT_POWER_OFF, // DO NOT change the name // This must be the last member in the enum EVENT_TIMED_OUT } internal LiveDataWindowViewModel LiveDataWindowViewModel { get; set; } private DispatcherTimer _oneSecTimer; private DateTime _testDateTime; private DateTime? _powerOnDateTime = null; EventGroup _eventGroup; public LiveDataWindow() { InitializeComponent(); Uri iconUri = new Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Icons/app.ico"); this.Icon = BitmapFrame.Create(iconUri); WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; DateTime assemblyBuildDateTime = File.GetLastWriteTime(GetType().Assembly.Location); string assemblyBuildDateTimeStr = assemblyBuildDateTime.ToString("MM/dd/yyyy"); Version appVersion = GetType().Assembly.GetName().Version; this.txtBlockAppTitle.Text += $" - {assemblyBuildDateTimeStr} - Version " + appVersion.Major.ToString() + "." + appVersion.Minor.ToString(); LiveDataWindowViewModel = new LiveDataWindowViewModel(this); DataContext = LiveDataWindowViewModel; LiveDataWindowViewModel.LabelGradientAppControlledOrUnControlled = "Controlled"; if (!Program.Instance().IsAppControlled) { LiveDataWindowViewModel.LabelGradientAppControlledOrUnControlled = "UnControlled"; } LiveDataWindowViewModel.UutPowerLedImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF]; LiveDataWindowViewModel.W1CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF]; LiveDataWindowViewModel.W2CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF]; LiveDataWindowViewModel.W3CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF]; LiveDataWindowViewModel.W4CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF]; LiveDataWindowViewModel.W5CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF]; if (Program.Instance().IsThereHardware) { LiveDataWindowViewModel.TePowerLedImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON]; } else { simModeBdr.BorderThickness = new Thickness(1); runModeTb.Margin = new Thickness(5, 0, 5, 0); runModeTb.Text = "Simulation Mode"; LiveDataWindowViewModel.TePowerLedImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF]; } Dictionary eventDict = new Dictionary(); eventDict = new Dictionary(); eventDict[Events.UUT_POWER_ON] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON]; eventDict[Events.UUT_POWER_OFF] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF]; eventDict[Events.EVENT_TIMED_OUT] = null; _eventGroup = new EventGroup(eventDict); _oneSecTimer = new DispatcherTimer(); _oneSecTimer.Interval = TimeSpan.FromMilliseconds(1000); _oneSecTimer.Tick += new EventHandler(Timer_Tick); _oneSecTimer.Start(); _testDateTime = DateTime.Now; CheckDriveCapacity(Program.Instance().FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST)); ShowConnecterdUut(); ShowConnecterdCable(); } ~LiveDataWindow() { _oneSecTimer?.Stop(); } /// /// Show drive capacity /// private void CheckDriveCapacity(string driveNameOrPath) { bDataDriveTotalCapacityBarGraph.Width = 190; tbDataDriveUsedCapacityBarGraph.Text = $"Can't get info for {driveNameOrPath}"; tbDataDriveUsedCapacityBarGraph.Foreground = new SolidColorBrush(Colors.Red); string freeSpaceColorCode = "#007AD7"; if (driveNameOrPath.Length < 3) { driveNameOrPath += "\\"; } foreach (DriveInfo drive in DriveInfo.GetDrives()) { if (drive.IsReady && Regex.IsMatch(driveNameOrPath, Regex.Escape(drive.Name), RegexOptions.IgnoreCase)) { // text color tbDataDriveUsedCapacityBarGraph.Foreground = new SolidColorBrush(Colors.White); long freeSpacePercentage = (long)(((double)drive.TotalFreeSpace / (double)drive.TotalSize) * 100.0); int freeSpaceThreadHoldPercent = 20; tbDataDriveUsedCapacityBarGraph.Width = ((double)(100 - freeSpacePercentage) / 100.0) * bDataDriveTotalCapacityBarGraph.Width; if (freeSpacePercentage >= freeSpaceThreadHoldPercent) { tbDataDriveUsedCapacityBarGraph.Background = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString(freeSpaceColorCode)); } else { tbDataDriveUsedCapacityBarGraph.Background = new SolidColorBrush(Colors.Red); } tbDataDriveUsedCapacityBarGraph.Text = driveNameOrPath.Substring(0, 2) + "\\"; tbDataDriveCapacityDetails.Text = $"{DescribeLargestDriveStorageSize(drive.TotalFreeSpace)} free of {DescribeLargestDriveStorageSize(drive.TotalSize)}"; break; } } } /// /// Describe largest unit size of drive storage /// private string DescribeLargestDriveStorageSize(long byteCount) { string size = ""; UInt64 oneKb = 1024; UInt64 oneMb = oneKb * oneKb; UInt64 oneGb = oneMb * oneKb; UInt64 oneTb = oneGb * oneKb; long kilobytes = (long)((double)((ulong)byteCount % oneMb) / (double)oneKb); long megabytes = (long)((double)((ulong)byteCount % oneGb) / (double)oneMb); long gigabytes = (long)((double)((ulong)byteCount % oneTb) / (double)oneGb); long terabytes = (long)((double)(ulong)byteCount / (double)oneTb); if (terabytes > 0) { size = $"{terabytes.ToString()} TB"; } else if (gigabytes > 0) { size = $"{gigabytes.ToString()} GB"; } else if (megabytes > 0) { size = $"{megabytes.ToString()} MB"; } else if (kilobytes > 0) { size = $"{kilobytes.ToString()} KB"; } else size = $"{byteCount.ToString()} B"; return size; } /// /// Show running test time and power on time /// private void Timer_Tick(object sender, EventArgs e) { TimeSpan ts = DateTime.Now - _testDateTime; LiveDataWindowViewModel.TestTimeStr = ProgramLib.Util.DescribeTimeElapsed(ts); Events id = _eventGroup.WaitAny(0); if (id == Events.UUT_POWER_ON) { if (_powerOnDateTime == null) { _powerOnDateTime = DateTime.Now; } ts = DateTime.Now - (DateTime)_powerOnDateTime; LiveDataWindowViewModel.PowerOnTimeStr = ProgramLib.Util.DescribeTimeElapsed(ts); } else if (id == Events.UUT_POWER_OFF && _powerOnDateTime != null) { _powerOnDateTime = null; LiveDataWindowViewModel.PowerOnTimeStr = "---"; } } /// /// Show which UUT is connected on th GUI /// private void ShowConnecterdUut() { string uutBuildLevel = "NO UUT"; if (Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.GMA) { uutBuildLevel = "Guided Missile Assem. (GMA)"; } else if (Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.AUR) { uutBuildLevel = "All-Up-Round (AUR)"; } else if (Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.SELF_TEST) { uutBuildLevel = "Self-Test Cable"; } TextBlock textBlock = new TextBlock(); textBlock.Text = uutBuildLevel; textBlock.FontWeight = FontWeights.Bold; textBlock.FontSize = 16; textBlock.HorizontalAlignment = HorizontalAlignment.Center; connectedUutSp.Children.Add(textBlock); if (Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.AUR || Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.GMA) { System.Windows.Controls.Image image = new System.Windows.Controls.Image(); BitmapImage myImageSource = new BitmapImage(); myImageSource.BeginInit(); textBlock.FontSize = 14; int imageWidth = 154; int imageHeight = 30; if (Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.GMA) { myImageSource.UriSource = new Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/gma.png"); imageWidth = 148; imageHeight = 20; } else myImageSource.UriSource = new Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/aur.png"); myImageSource.EndInit(); image.Source = myImageSource; image.Width = imageWidth; image.Height = imageHeight; image.Margin = new Thickness(0, 5, 0, 0); connectedUutSp.Children.Add(image); } } /// /// Show which cable is connected on th GUI /// private void ShowConnecterdCable() { var brushConverter = new BrushConverter(); missileModeBdr.BorderThickness = new Thickness(0, 1, 0, 0); if (Program.Instance().UutInfo.UniversalCableId == UutInfo.UniversalCable.W1) { LiveDataWindowViewModel.W1CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON]; missileModeBdr.BorderBrush = (System.Windows.Media.Brush)brushConverter.ConvertFrom("#DCC3AD"); missileModeBdr.Background = (System.Windows.Media.Brush)brushConverter.ConvertFrom("#FDE6AE"); missileModeTb.Foreground = (System.Windows.Media.Brush)brushConverter.ConvertFrom("#A4530D"); missileModeTb.Text = "Maintenance Mode"; } else if (Program.Instance().UutInfo.UniversalCableId == UutInfo.UniversalCable.W2) { LiveDataWindowViewModel.W2CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON]; missileModeBdr.BorderBrush = (System.Windows.Media.Brush)brushConverter.ConvertFrom("#94D487"); missileModeBdr.Background = (System.Windows.Media.Brush)brushConverter.ConvertFrom("#DBFFD7"); missileModeTb.Foreground = (System.Windows.Media.Brush)brushConverter.ConvertFrom("#1C7F08"); missileModeTb.Text = "Tactical Mode"; } if (Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.SELF_TEST) { LiveDataWindowViewModel.W5CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON]; } if (Program.Instance().UutInfo.SacrificialCableId == UutInfo.SacrificialCable.W3) { LiveDataWindowViewModel.W3CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON]; } else if (Program.Instance().UutInfo.SacrificialCableId == UutInfo.SacrificialCable.W4) { LiveDataWindowViewModel.W4CableImagePath = LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON]; } } private void btnClose_Click(object sender, RoutedEventArgs e) { this.Hide(); } private void btnMax_Click(object sender, RoutedEventArgs e) { if (this.WindowState == WindowState.Maximized) { this.WindowState = WindowState.Normal; imgMax.Source = new BitmapImage(new System.Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/Title_Bar_Buttons/maximize.png")); } else { this.WindowState = WindowState.Maximized; imgMax.Source = new BitmapImage(new System.Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/Title_Bar_Buttons/restore.png")); } } private void btnMin_Click(object sender, RoutedEventArgs e) { this.WindowState = WindowState.Minimized; } private void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { DragMove(); } private void dataLocationMi_Click(object sender, RoutedEventArgs e) { DataLocationWindow window = new DataLocationWindow(); window.ShowDialog(); } private void manualControlGuiMi_Click(object sender, RoutedEventArgs e) { this.Hide(); ((ManualControlWindow)Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.MANUAL_CONTROL]).LiveDataWindow = this; Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.MANUAL_CONTROL].Show(); } } }