diff --git a/AiQ_GUI.Designer.cs b/AiQ_GUI.Designer.cs index 9dedde3..bcdf465 100644 --- a/AiQ_GUI.Designer.cs +++ b/AiQ_GUI.Designer.cs @@ -141,6 +141,7 @@ namespace AiQ_GUI groupBox3 = new GroupBox(); groupBox2 = new GroupBox(); groupBox1 = new GroupBox(); + BtnBaudModules = new Button(); BtnZoom8000 = new Button(); BtnZoomWide = new Button(); TabSettings = new TabPage(); @@ -160,6 +161,7 @@ namespace AiQ_GUI LblGUIVers = new Label(); timerTypeIP = new System.Windows.Forms.Timer(components); TimerFlash = new System.Windows.Forms.Timer(components); + BtnOpenMoba = new Button(); ((System.ComponentModel.ISupportInitialize)PicBxMAV).BeginInit(); ((System.ComponentModel.ISupportInitialize)PicBxAiQ).BeginInit(); ((System.ComponentModel.ISupportInitialize)PicBxIRF2).BeginInit(); @@ -820,7 +822,7 @@ namespace AiQ_GUI BtnCancel.Location = new Point(201, 185); BtnCancel.Margin = new Padding(4, 3, 4, 3); BtnCancel.Name = "BtnCancel"; - BtnCancel.Size = new Size(181, 37); + BtnCancel.Size = new Size(180, 37); BtnCancel.TabIndex = 174; BtnCancel.Text = "Cancel"; BtnCancel.UseVisualStyleBackColor = false; @@ -836,7 +838,7 @@ namespace AiQ_GUI BtnSave.Location = new Point(10, 185); BtnSave.Margin = new Padding(4, 3, 4, 3); BtnSave.Name = "BtnSave"; - BtnSave.Size = new Size(181, 37); + BtnSave.Size = new Size(180, 37); BtnSave.TabIndex = 173; BtnSave.Text = "Save && Check"; BtnSave.UseVisualStyleBackColor = false; @@ -1254,7 +1256,7 @@ namespace AiQ_GUI CbBxType.ForeColor = SystemColors.Control; CbBxType.FormattingEnabled = true; CbBxType.IntegralHeight = false; - CbBxType.Items.AddRange(new object[] { "Store & Forward", "Streaming", "Audit" }); + CbBxType.Items.AddRange(new object[] { "Store & Forward", "Streaming", "Audit", "XML Server" }); CbBxType.Location = new Point(177, 62); CbBxType.Margin = new Padding(4, 3, 4, 3); CbBxType.MaxDropDownItems = 30; @@ -1781,6 +1783,7 @@ namespace AiQ_GUI // // groupBox1 // + groupBox1.Controls.Add(BtnBaudModules); groupBox1.Controls.Add(BtnZoom8000); groupBox1.Controls.Add(BtnZoomWide); groupBox1.Controls.Add(BtnLicVaxtor); @@ -1801,18 +1804,35 @@ namespace AiQ_GUI groupBox1.TabStop = false; groupBox1.Text = "Controls"; // + // BtnBaudModules + // + BtnBaudModules.BackColor = Color.FromArgb(70, 65, 80); + BtnBaudModules.Enabled = false; + BtnBaudModules.FlatAppearance.BorderSize = 0; + BtnBaudModules.FlatStyle = FlatStyle.Flat; + BtnBaudModules.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); + BtnBaudModules.ForeColor = SystemColors.Control; + BtnBaudModules.Location = new Point(12, 155); + BtnBaudModules.Margin = new Padding(4, 3, 4, 3); + BtnBaudModules.Name = "BtnBaudModules"; + BtnBaudModules.Size = new Size(180, 37); + BtnBaudModules.TabIndex = 237; + BtnBaudModules.Text = "Set baudrate to 115200"; + BtnBaudModules.UseVisualStyleBackColor = false; + BtnBaudModules.Click += BtnBaudModules_Click; + // // BtnZoom8000 // BtnZoom8000.BackColor = Color.FromArgb(70, 65, 80); BtnZoom8000.Enabled = false; BtnZoom8000.FlatAppearance.BorderSize = 0; BtnZoom8000.FlatStyle = FlatStyle.Flat; - BtnZoom8000.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); + BtnZoom8000.Font = new Font("Segoe UI Semibold", 8F, FontStyle.Bold); BtnZoom8000.ForeColor = SystemColors.Control; - BtnZoom8000.Location = new Point(204, 155); + BtnZoom8000.Location = new Point(299, 155); BtnZoom8000.Margin = new Padding(4, 3, 4, 3); BtnZoom8000.Name = "BtnZoom8000"; - BtnZoom8000.Size = new Size(180, 37); + BtnZoom8000.Size = new Size(85, 37); BtnZoom8000.TabIndex = 236; BtnZoom8000.Text = "Zoom to 8000"; BtnZoom8000.UseVisualStyleBackColor = false; @@ -1824,12 +1844,12 @@ namespace AiQ_GUI BtnZoomWide.Enabled = false; BtnZoomWide.FlatAppearance.BorderSize = 0; BtnZoomWide.FlatStyle = FlatStyle.Flat; - BtnZoomWide.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); + BtnZoomWide.Font = new Font("Segoe UI Semibold", 8F, FontStyle.Bold); BtnZoomWide.ForeColor = SystemColors.Control; - BtnZoomWide.Location = new Point(12, 154); + BtnZoomWide.Location = new Point(204, 155); BtnZoomWide.Margin = new Padding(4, 3, 4, 3); BtnZoomWide.Name = "BtnZoomWide"; - BtnZoomWide.Size = new Size(180, 37); + BtnZoomWide.Size = new Size(85, 37); BtnZoomWide.TabIndex = 235; BtnZoomWide.Text = "Zoom Full Wide"; BtnZoomWide.UseVisualStyleBackColor = false; @@ -1838,6 +1858,7 @@ namespace AiQ_GUI // TabSettings // TabSettings.BackColor = Color.FromArgb(39, 37, 55); + TabSettings.Controls.Add(BtnOpenMoba); TabSettings.Controls.Add(BtnUploadWonwooSetIR); TabSettings.Controls.Add(BtnUploadWonwooSetOV); TabSettings.Controls.Add(BtnAdminStart); @@ -1878,7 +1899,7 @@ namespace AiQ_GUI BtnUploadWonwooSetOV.Location = new Point(19, 304); BtnUploadWonwooSetOV.Margin = new Padding(4, 3, 4, 3); BtnUploadWonwooSetOV.Name = "BtnUploadWonwooSetOV"; - BtnUploadWonwooSetOV.Size = new Size(181, 49); + BtnUploadWonwooSetOV.Size = new Size(180, 49); BtnUploadWonwooSetOV.TabIndex = 243; BtnUploadWonwooSetOV.Text = "Upload Wonwoo Settings OV"; BtnUploadWonwooSetOV.UseVisualStyleBackColor = false; @@ -1894,7 +1915,7 @@ namespace AiQ_GUI BtnAdminStart.Location = new Point(210, 261); BtnAdminStart.Margin = new Padding(4, 3, 4, 3); BtnAdminStart.Name = "BtnAdminStart"; - BtnAdminStart.Size = new Size(181, 37); + BtnAdminStart.Size = new Size(180, 37); BtnAdminStart.TabIndex = 241; BtnAdminStart.Text = "Start in admin mode"; BtnAdminStart.UseVisualStyleBackColor = false; @@ -1910,7 +1931,7 @@ namespace AiQ_GUI BtnFirewall.Location = new Point(19, 261); BtnFirewall.Margin = new Padding(4, 3, 4, 3); BtnFirewall.Name = "BtnFirewall"; - BtnFirewall.Size = new Size(181, 37); + BtnFirewall.Size = new Size(180, 37); BtnFirewall.TabIndex = 240; BtnFirewall.Text = "Update Firewall"; BtnFirewall.UseVisualStyleBackColor = false; @@ -2057,6 +2078,22 @@ namespace AiQ_GUI timerTypeIP.Interval = 2000; timerTypeIP.Tick += timerTypeIP_Tick; // + // BtnOpenMoba + // + BtnOpenMoba.BackColor = Color.FromArgb(70, 65, 80); + BtnOpenMoba.FlatAppearance.BorderSize = 0; + BtnOpenMoba.FlatStyle = FlatStyle.Flat; + BtnOpenMoba.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); + BtnOpenMoba.ForeColor = SystemColors.Control; + BtnOpenMoba.Location = new Point(210, 359); + BtnOpenMoba.Margin = new Padding(4, 3, 4, 3); + BtnOpenMoba.Name = "BtnOpenMoba"; + BtnOpenMoba.Size = new Size(180, 37); + BtnOpenMoba.TabIndex = 245; + BtnOpenMoba.Text = "Open Moba"; + BtnOpenMoba.UseVisualStyleBackColor = false; + BtnOpenMoba.Click += BtnOpenMoba_Click; + // // MainForm // AutoScaleDimensions = new SizeF(7F, 15F); @@ -2251,5 +2288,7 @@ namespace AiQ_GUI private Button BtnFactoryDefault; private Button BtnUploadWonwooSetOV; private Button BtnUploadWonwooSetIR; + private Button BtnBaudModules; + private Button BtnOpenMoba; } } diff --git a/AiQ_GUI.cs b/AiQ_GUI.cs index 4d23046..43ea983 100644 --- a/AiQ_GUI.cs +++ b/AiQ_GUI.cs @@ -74,7 +74,6 @@ namespace AiQ_GUI // Load local data store localDataStore = await LDSWAIT; - Logging.LogMessage("Opening GUI"); // Done after LDS to make sure directory exists. if (localDataStore == null) { @@ -82,6 +81,9 @@ namespace AiQ_GUI return; } + Logging.LogMessage("Opening GUI"); // Done after LDS to make sure directory exists. + this.Location = new Point(localDataStore.GUIPosX, localDataStore.GUIPosY); + Task CheckHWOnline = PingCheck(); // Async check all hardware is online PopulateUIWithLDS(localDataStore); // Update fields that depend on LDS CbBxCameraType.Text = localDataStore.LastModel; // Set last model that was tested into combobox @@ -158,7 +160,7 @@ namespace AiQ_GUI string VISCAReply = await FlexiAPI.APIHTTPVISCA(CamOnTest.IP, "8101043903FF", true); // Manual mode to be able to manipulate the SIG settings. if (VISCAReply != "9041FF9051FF") - AddToActionsList("Couldn't set to manual mode",Level.ERROR); + AddToActionsList("Couldn't set to manual mode", Level.ERROR); await CameraModules.SetSIG(CbBxShutter, CbBxIris, CbBxGain, CamOnTest.IP); // Set SIG according to the drop downs in settings for a good picture ready for image check await ImageProcessing.ImageCheck(PicBxOV, PicBxIRF2, PicBxIRF16, LblIRImageF2, LblIRImageF16, CamOnTest); // Populates the picture boxes and checks iris changes @@ -170,9 +172,6 @@ namespace AiQ_GUI // TODO - Force expire sighting. Task Wait = Task.Delay(5000); // Wait for 5 seconds to allow the camera to zoom in, set settings and capture some plates before auto trim - if (CameraAccessInfo.HardwareExtras.Contains("GPS")) // Check GPS if the hardware has it - await FlexiAPI.GPSFix(CamOnTest.IP); - // While waiting do the SSH tasks. sshData = SSH.CollectSSHData(CamOnTest.IP); // SSH into camera to get Vaxtor packages, filesystem size and if tailscale is installed. await SSH.CheckFSSize(CamOnTest.IP, LblFilesystemSize, sshData); // Check Filesystem size is between 100GB & 150GB @@ -277,7 +276,7 @@ namespace AiQ_GUI if (await DisplayQuestion($"Would you like to allocate a serial number to this camera?")) await AllocateSerial(); else if (GoogleAPI.UpdateSpreadSheetRePreTest(CameraAccessInfo.SpreadsheetID, Vers) != "OK") // If rerun might be different values so update SS - AddToActionsList("Failed to write to spreadsheet, please check manually",Level.WARNING); + AddToActionsList("Failed to write to spreadsheet, please check manually", Level.WARNING); // else if (Excel.UpdateSpreadSheetPreTest(CameraAccessInfo.SpreadsheetID, Vers, CamOnTest.GetCamDesc(), CamOnTest.Model) != "OK") // AddToActionsList("Failed to write to spreadsheet, please check manually"); } @@ -712,7 +711,7 @@ namespace AiQ_GUI if (!JSONResponse.Contains(NewSerial) || !JSONResponse.Contains(CamOnTest.Model)) { - AddToActionsList("Could not set model or serial numbers into camera.",Level.ERROR); + AddToActionsList("Could not set model or serial numbers into camera.", Level.ERROR); await PreTestFailed("Failed To Set Model Or Serial Number"); } @@ -733,6 +732,8 @@ namespace AiQ_GUI // Save user settings in LDS for next time if values are valid if (CbBxUserName.Text.Length > 2 && CbBxCameraType.Text.Length > 6) { + localDataStore.GUIPosX = this.Location.X; + localDataStore.GUIPosY = this.Location.Y; localDataStore.User = CbBxUserName.Text; localDataStore.LastModel = CbBxCameraType.Text; LDS.SetLDS(localDataStore); @@ -957,7 +958,7 @@ namespace AiQ_GUI RhTxBxActions.SelectionColor = Color.LightGreen; } - RhTxBxActions.AppendText(Mssg + Environment.NewLine); + RhTxBxActions.AppendText(Mssg + Environment.NewLine); RhTxBxActions.SelectionStart = RhTxBxActions.Text.Length; RhTxBxActions.SelectionColor = SystemColors.Control; RhTxBxActions.ScrollToCaret(); @@ -1127,6 +1128,26 @@ namespace AiQ_GUI Windows.StartAsAdmin(ExeLoc); } + private void BtnBaudModules_Click(object sender, EventArgs e) + { + SSH.SetTo115200(CamOnTest.IP); + } + + private void BtnOpenMoba_Click(object sender, EventArgs e) + { + const string mobaPath = @"C:\Program Files (x86)\Mobatek\MobaXterm\MobaXterm.exe"; + string sshCommand = $"ssh -o StrictHostKeyChecking=no -p 22 mav@{CamOnTest.IP}"; // optional: skip host check + + var psi = new ProcessStartInfo + { + FileName = mobaPath, + Arguments = $"-newtab \"{sshCommand}\"", + UseShellExecute = false, + }; + + Process.Start(psi); + } + // Flips between setting camera to 211 and DHCP private async void BtnSet211_Click(object sender, EventArgs e) { @@ -1285,6 +1306,8 @@ namespace AiQ_GUI CbBxType.SelectedIndex = 1; else if (type == "A") // Audit CbBxType.SelectedIndex = 2; + else if (type == "X") // XML Server + CbBxType.SelectedIndex = 3; BtnGenerate.Enabled = true; } @@ -1712,7 +1735,7 @@ namespace AiQ_GUI } // ***** Test & Debug ***** - private void BtnTest_Click(object sender, EventArgs e) + private async void BtnTest_Click(object sender, EventArgs e) { Stopwatch stopWatchTest = Stopwatch.StartNew(); diff --git a/AiQ_GUI_NET_Test.csproj b/AiQ_GUI_NET_Test.csproj index 058f3d1..7e41fb3 100644 --- a/AiQ_GUI_NET_Test.csproj +++ b/AiQ_GUI_NET_Test.csproj @@ -16,7 +16,7 @@ AiQ GUI MAV Systems Ltd AiQ GUI - 4.6.0 + 4.7.0 A GUI to control and test the AiQ MAV Systems Ltd 2025 MAV - Plain - Blue.png @@ -61,7 +61,7 @@ - + diff --git a/Camera/FlexiAPI.cs b/Camera/FlexiAPI.cs index 5c735ff..547e0ef 100644 --- a/Camera/FlexiAPI.cs +++ b/Camera/FlexiAPI.cs @@ -174,13 +174,13 @@ namespace AiQ_GUI // Treat "operation was canceled" as a successful apply if (response.Contains("The operation was canceled", StringComparison.OrdinalIgnoreCase)) { - Logging.LogMessage($"SetVaxtorMinMaxPlate: Camera applied config but closed connection early (safe to ignore).{Level.WARNING}"); + Logging.LogMessage($"SetVaxtorMinMaxPlate: Camera applied config but closed connection early (safe to ignore)."); return true; } if (response.Contains("error", StringComparison.OrdinalIgnoreCase)) { - MainForm.Instance.DisplayQuestion($"SetVaxtorMinMaxPlate: failed - Please set manually{Level.WARNING}"); + MainForm.Instance.DisplayQuestion($"SetVaxtorMinMaxPlate: failed - Please set manually"); return false; } @@ -188,23 +188,11 @@ namespace AiQ_GUI } catch (Exception ex) { - MainForm.Instance.AddToActionsList($"Could not set Vaxtor Plate height and min confidence: {ex.Message}{Level.ERROR}"); + MainForm.Instance.AddToActionsList($"Could not set Vaxtor Plate height and min confidence: {ex.Message}", Level.ERROR); return false; } } - public static async Task GPSFix(string IPAddress) - { - string sysstatus = await APIHTTPRequest("/sysstatus", IPAddress, 5); - SysStatus status = JsonConvert.DeserializeObject(sysstatus); - - if (status.gpsState == 0 || status.gpsPresent == "Not Fitted") - { - MainForm.Instance.AddToActionsList($"GPS not present in camera. State: {status.gpsState} & Status: {status.gpsPresent}"); - return; - } - } - public static async Task SetTrim(string IPAddress, string LblTxt, int RetryCount = 0) // Sets trim by getting plate postion as metric { Trim trim; @@ -254,7 +242,7 @@ namespace AiQ_GUI } else // Ask user to centre the plate in the field of view { - await MainForm.Instance.DisplayOK($"Please centralise plate in view THEN press OK {Level.WARNING}"); // Awaited till OK has been clicked + await MainForm.Instance.DisplayOK($"Please centralise plate in view THEN press OK"); // Awaited till OK has been clicked if (RetryCount >= 3) { diff --git a/Camera/Licences.cs b/Camera/Licences.cs index 5f7af89..2847c8f 100644 --- a/Camera/Licences.cs +++ b/Camera/Licences.cs @@ -11,20 +11,22 @@ namespace AiQ_GUI const string SAFsalt = "F7W?wbD#'[+:v44]tA<:_iK4hQ}+$R{U"; const string Streamsalt = "*;5WPsR5i/$8s1I(M)K5=z3fms{_8x4U"; const string Auditsalt = "4t5e[E06:dXWf:C09Z[h)}V*n>}t0POP"; + const string XMLsalt = "ap(r]oN?t V@WvI=IX=[+$n(<5J,&Ygd"; const string PasswordSalt = "eP@4^4T2@e@^h12oqf!590"; // Generates the license response based on the challenge and type of license public static string GenerateLicCode(string challenge, string Type) { - string salt; // Different salts for differnet licenses + string? salt = Type switch + { + "Store & Forward" => SAFsalt, + "Streaming" => Streamsalt, + "Audit" => Auditsalt, + "XML Server" => XMLsalt, + _ => null + }; - if (Type == "Store & Forward") - salt = SAFsalt; - else if (Type == "Streaming") - salt = Streamsalt; - else if (Type == "Audit") - salt = Auditsalt; - else + if (salt == null) return $"Unrecognised challenge type:{Level.ERROR}" + Type; if (string.IsNullOrEmpty(challenge) || challenge.Length != 6) // Check challenge format diff --git a/Camera/SSH.cs b/Camera/SSH.cs index e8c8c08..41b5ab5 100644 --- a/Camera/SSH.cs +++ b/Camera/SSH.cs @@ -323,7 +323,7 @@ namespace AiQ_GUI if (checkDevice.Result.Trim() != "OK") // Device not found { - MainForm.Instance.AddToActionsList($"Block device {device} not found. {Level.WARNING}"); + MainForm.Instance.AddToActionsList($"Block device {device} not found.", Level.WARNING); return false; } @@ -378,7 +378,7 @@ namespace AiQ_GUI if (checkDevice.Result.Trim().Length > 1) // Device not found { - MainForm.Instance.AddToActionsList($"Cannot sync files to disk. Replied: {checkDevice.Result}. DO NOT TURN OFF, GET SUPERVISOR {Level.ERROR}"); + MainForm.Instance.AddToActionsList($"Cannot sync files to disk. Replied: {checkDevice.Result}. DO NOT TURN OFF, GET SUPERVISOR", Level.ERROR); return; } @@ -387,7 +387,33 @@ namespace AiQ_GUI } catch (Exception ex) { - MainForm.Instance.AddToActionsList($"Cannot sync becuase: {ex.Message}. DO NOT TURN OFF, GET SUPERVISOR {Level.ERROR}"); + MainForm.Instance.AddToActionsList($"Cannot sync becuase: {ex.Message}. DO NOT TURN OFF, GET SUPERVISOR", Level.ERROR); + } + } + + public static void SetTo115200(string IPAddress) + { + try + { + string Cmd = "sudo sh -c \"stty -F /dev/ttyInfrared 9600 cs8 -cstopb -parenb -ixon -ixoff -crtscts -icanon -echo -opost; echo '81 01 04 01 03 FF' | xxd -r -p > /dev/ttyInfrared\""; + SshClient client = SshConnect(IPAddress); + + SshCommand checkDevice = client.RunCommand(Cmd); + if (!string.IsNullOrWhiteSpace(checkDevice.Error)) + throw new Exception(checkDevice.Error); + + Cmd = Cmd.Replace("Infrared", "Colour"); + + checkDevice = client.RunCommand(Cmd); + if (!string.IsNullOrWhiteSpace(checkDevice.Error)) + throw new Exception(checkDevice.Error); + + client.Disconnect(); + client.Dispose(); + } + catch (Exception ex) + { + MainForm.Instance.AddToActionsList($"Cannot set cameras to 115200 becuase: {ex.Message}", Level.ERROR); } } } @@ -399,4 +425,4 @@ namespace AiQ_GUI public string FilesystemSize { get; set; } = string.Empty; public bool tailscale { get; set; } } -} \ No newline at end of file +} diff --git a/GUIUpdate.cs b/GUIUpdate.cs index 2993439..91d417d 100644 --- a/GUIUpdate.cs +++ b/GUIUpdate.cs @@ -46,7 +46,7 @@ namespace AiQ_GUI { if (ComapreVersions()) // Checks if the current version is older than the latest version { - const string GUIPath = $"{GoogleAPI.DrivePath}AiQ\\GUI's\\AiQ_Final_Test\\AiQ_GUI.application"; + const string GUIPath = $"{GoogleAPI.DrivePath}AiQ\\GUI's\\AiQ_Final_Test\\setup.exe"; // Check if path is real if (!File.Exists(GUIPath)) diff --git a/Helper.cs b/Helper.cs index b9a1542..405952d 100644 --- a/Helper.cs +++ b/Helper.cs @@ -220,7 +220,7 @@ namespace AiQ_GUI [GeneratedRegex(@"^[A-Z]{2}\d{2}[A-Z]{2}$", RegexOptions.Compiled)] internal static partial Regex ModelRegex(); - [GeneratedRegex(@"^(?:[FSA])?\d{6}$", RegexOptions.Compiled)] + [GeneratedRegex(@"^(?:[FSAX])?\d{6}$", RegexOptions.Compiled)] internal static partial Regex LicCodeRegex(); [GeneratedRegex(@"^(?[\d\.]+)(?[KMGTP]?)(?B?)$", RegexOptions.Compiled | RegexOptions.IgnoreCase)] diff --git a/LDS.cs b/LDS.cs index 52f583d..e4c2738 100644 --- a/LDS.cs +++ b/LDS.cs @@ -10,7 +10,7 @@ namespace AiQ_GUI public const string IROpensavePath = "IR_Open_image.jpg"; // Path to save the downloaded image public const string IRTightsavePath = "IR_Tight_image.jpg"; // Path to save the downloaded image public const string LDSFileName = "LDS.json"; // Local Data Store file name - const string DefaultJSON = "{\r\n \"User\": \"\",\r\n \"LastModel\": \"\",\r\n \"PSUIP\": \"\",\r\n \"EzIP\": \"\",\r\n \"ZebraIP\": \"\",\r\n \"TestTubeIP\": \"\",\r\n \"Shutter\": 0,\r\n \"Iris\": 0,\r\n \"Gain\": 0\r\n}"; + const string DefaultJSON = "{\r\n \"User\": \"\",\r\n \"LastModel\": \"\",\r\n \"PSUIP\": \"\",\r\n \"EzIP\": \"\",\r\n \"ZebraIP\": \"\",\r\n \"TestTubeIP\": \"\",\r\n \"Shutter\": 0,\r\n \"Iris\": 0,\r\n \"Gain\": 0\r\n \"GUIPosX\": 0\r\n \"GUIPosY\": 0\r\n}"; public static LocalDataStore GetLDS() { @@ -58,8 +58,10 @@ namespace AiQ_GUI public string EzIP { get; set; } = string.Empty; public string ZebraIP { get; set; } = string.Empty; public string TestTubeIP { get; set; } = string.Empty; - public int Shutter { get; set; } - public int Iris { get; set; } - public int Gain { get; set; } + public int Shutter { get; set; } = 0; + public int Iris { get; set; } = 0; + public int Gain { get; set; } = 0; + public int GUIPosX { get; set; } = 0; + public int GUIPosY { get; set; } = 0; } } diff --git a/Logging.cs b/Logging.cs index 1c39aea..9349f19 100644 --- a/Logging.cs +++ b/Logging.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Security.Principal; namespace AiQ_GUI { @@ -25,6 +26,10 @@ namespace AiQ_GUI { try { + WindowsPrincipal wp = new(WindowsIdentity.GetCurrent()); // Log in a seperate file when admin + if (wp.IsInRole(WindowsBuiltInRole.Administrator)) + FileName = FileName.Replace(".log", "_ADMIN.log"); + string logFilePath = LDS.MAVPath + FileName; FileInfo fi = new(logFilePath);