Compare commits
3 Commits
760987fa75
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f30c35c02a | |||
| 62554d7fd6 | |||
| 03dfb3414b |
63
AiQ_GUI.Designer.cs
generated
63
AiQ_GUI.Designer.cs
generated
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
68
AiQ_GUI.cs
68
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");
|
||||
}
|
||||
@@ -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);
|
||||
// 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);
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -399,4 +425,4 @@ namespace AiQ_GUI
|
||||
public string FilesystemSize { get; set; } = string.Empty;
|
||||
public bool tailscale { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
10
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user