3 Commits

Author SHA1 Message Date
f30c35c02a Changed set to 115200 command to be in line with Flexi. 2026-01-14 09:41:07 +00:00
62554d7fd6 God mode non optional on final test 2025-12-12 11:22:46 +00:00
03dfb3414b V4.7 2025-12-09 09:00:16 +00:00
10 changed files with 160 additions and 70 deletions

63
AiQ_GUI.Designer.cs generated
View File

@@ -141,9 +141,11 @@ namespace AiQ_GUI
groupBox3 = new GroupBox();
groupBox2 = new GroupBox();
groupBox1 = new GroupBox();
BtnBaudModules = new Button();
BtnZoom8000 = new Button();
BtnZoomWide = new Button();
TabSettings = new TabPage();
BtnOpenMoba = new Button();
BtnUploadWonwooSetIR = new Button();
BtnUploadWonwooSetOV = new Button();
BtnAdminStart = new Button();
@@ -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);
@@ -1850,6 +1871,22 @@ namespace AiQ_GUI
TabSettings.TabIndex = 3;
TabSettings.Text = "Settings";
//
// 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;
//
// BtnUploadWonwooSetIR
//
BtnUploadWonwooSetIR.BackColor = Color.FromArgb(70, 65, 80);
@@ -1878,7 +1915,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 +1931,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 +1947,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;
@@ -2251,5 +2288,7 @@ namespace AiQ_GUI
private Button BtnFactoryDefault;
private Button BtnUploadWonwooSetOV;
private Button BtnUploadWonwooSetIR;
private Button BtnBaudModules;
private Button BtnOpenMoba;
}
}

View File

@@ -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");
}
@@ -305,14 +304,14 @@ namespace AiQ_GUI
// Purge camera of all reads
await FlexiAPI.APIHTTPRequest("/api/purge-all", CamOnTest.IP);
if (await DisplayQuestion("Do you want to set this camera to 211 and God mode off?"))
{
// Turn off God mode
string[,] GOD_JSON = { { "propGodMode", "false" } };
string IntConf = await FlexiAPI.HTTP_Update("GLOBAL--FlexiApplication", CamOnTest.IP, GOD_JSON);
if (!IntConf.Contains("\"propGodMode\": {\"value\": \"false\", \"datatype\": \"boolean\"},"))
AddToActionsList("Could not turn off God mode", Level.WARNING);
if (await DisplayQuestion("Do you want to set this camera to 211?"))
{
Thread Thr211 = new(async () =>
{
if (!await FlexiAPI.ChangeNetwork211(CamOnTest.IP)) // Change camera IP to 192.168.1.211. Waits for camera to come back.
@@ -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);
@@ -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;
}
@@ -1594,14 +1617,16 @@ namespace AiQ_GUI
}
else
{
BtnSoak.BackColor = BtnColour; // Reset button colour
BtnSoak.Text = "Start Soak";
BtnSoak.BackColor = Color.Red;
BtnSoak.Text = "Please Wait";
foreach (CancellationTokenSource cts in soakCtsList)
cts.Cancel();
soakCtsList.Clear();
soakTasks.Clear();
int i = soakCameraList.Count + 1; // Add 1 for 211 itself staying in the list
RhTxBxActions.Clear();
string[,] Network_JSON = { { "propDHCP", "false" }, { "propHost", "192.168.1.211" }, { "propNetmask", "255.255.255.0" }, { "propGateway", "192.168.1.1" } };
string[,] GOD_JSON = { { "propGodMode", "false" } };
foreach (Camera SCL in soakCameraList.Where(c => c.IsChecked)) // only checked cameras
@@ -1618,8 +1643,8 @@ namespace AiQ_GUI
if (GOD.Contains("Error"))
throw new Exception("Could not set God mode off");
// Update GLOBAL--NetworkConfig with fixed IP and turn off DHCP
await FlexiAPI.HTTP_Update("GLOBAL--NetworkConfig", SCL.IP, Network_JSON);
// Update GLOBAL--NetworkConfig with fixed IP and turn off DHCP. Don't await to save time.
FlexiAPI.HTTP_Update("GLOBAL--NetworkConfig", SCL.IP, Network_JSON);
i--; // Decriment count becuase they will stack into 211
}
catch (Exception ex)
@@ -1646,6 +1671,9 @@ namespace AiQ_GUI
{
AddToActionsList($"Some cameras failed: Found {FoundCams.Count}, expected {i}.", Level.ERROR);
}
BtnSoak.BackColor = BtnColour; // Reset button colour
BtnSoak.Text = "Start Soak";
}
}
@@ -1712,7 +1740,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();

View File

@@ -16,7 +16,7 @@
<Product>AiQ GUI</Product>
<Authors>MAV Systems Ltd</Authors>
<PackageId>AiQ GUI</PackageId>
<Version>4.6.0</Version>
<Version>4.7.0</Version>
<Description>A GUI to control and test the AiQ</Description>
<Copyright>MAV Systems Ltd 2025</Copyright>
<PackageIcon>MAV - Plain - Blue.png</PackageIcon>
@@ -59,9 +59,9 @@
<PackageReference Include="Google.Apis.Sheets.v4" Version="1.72.0.3966" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="PDFsharp-MigraDoc-gdi" Version="6.2.3" />
<PackageReference Include="Selenium.Support" Version="4.38.0" />
<PackageReference Include="Selenium.WebDriver" Version="4.38.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="142.0.7444.17500" />
<PackageReference Include="Selenium.Support" Version="4.39.0" />
<PackageReference Include="Selenium.WebDriver" Version="4.39.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="143.0.7499.4000" />
<PackageReference Include="SSH.NET" Version="2025.1.0" />
<PackageReference Include="System.Data.OleDb" Version="10.0.0" />
</ItemGroup>

View File

@@ -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>(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)
{

View File

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

View File

@@ -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 raw -echo -echoe -echok -echoctl -echoke -iexten -onlcr ignbrk cs8 -cstopb -parenb; echo '81 01 04 01 04 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);
}
}
}

View File

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

View File

@@ -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(@"^(?<value>[\d\.]+)(?<unit>[KMGTP]?)(?<suffix>B?)$", RegexOptions.Compiled | RegexOptions.IgnoreCase)]

10
LDS.cs
View File

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

View File

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