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);