From e94a1f1f5c8ced148a2d1f4d20577721be637b3c Mon Sep 17 00:00:00 2001 From: Bradley Relyea Date: Tue, 11 Nov 2025 13:49:42 +0000 Subject: [PATCH] Find cams timeout extended --- AiQ_GUI.Designer.cs | 72 ++++++++++++++++++++--------------------- AiQ_GUI.cs | 28 ++++++++++++---- AiQ_GUI.resx | 3 ++ AiQ_GUI_NET_Test.csproj | 4 +-- Camera/FlexiAPI.cs | 2 +- Network.cs | 5 +-- Soak/Selenium.cs | 68 ++++++++++++++++++++++++++++++++------ Soak/SoakTest.cs | 2 ++ 8 files changed, 127 insertions(+), 57 deletions(-) diff --git a/AiQ_GUI.Designer.cs b/AiQ_GUI.Designer.cs index 9d140da..9dedde3 100644 --- a/AiQ_GUI.Designer.cs +++ b/AiQ_GUI.Designer.cs @@ -144,8 +144,8 @@ namespace AiQ_GUI BtnZoom8000 = new Button(); BtnZoomWide = new Button(); TabSettings = new TabPage(); - UploadWonwooSetIR = new Button(); - UploadWonwooSetOV = new Button(); + BtnUploadWonwooSetIR = new Button(); + BtnUploadWonwooSetOV = new Button(); BtnAdminStart = new Button(); BtnFirewall = new Button(); TabImages = new TabPage(); @@ -1838,8 +1838,8 @@ namespace AiQ_GUI // TabSettings // TabSettings.BackColor = Color.FromArgb(39, 37, 55); - TabSettings.Controls.Add(UploadWonwooSetIR); - TabSettings.Controls.Add(UploadWonwooSetOV); + TabSettings.Controls.Add(BtnUploadWonwooSetIR); + TabSettings.Controls.Add(BtnUploadWonwooSetOV); TabSettings.Controls.Add(BtnAdminStart); TabSettings.Controls.Add(BtnFirewall); TabSettings.Controls.Add(PanelSettings); @@ -1850,39 +1850,39 @@ namespace AiQ_GUI TabSettings.TabIndex = 3; TabSettings.Text = "Settings"; // - // UploadWonwooSetIR + // BtnUploadWonwooSetIR // - UploadWonwooSetIR.BackColor = Color.FromArgb(70, 65, 80); - UploadWonwooSetIR.FlatAppearance.BorderColor = Color.FromArgb(70, 65, 80); - UploadWonwooSetIR.FlatAppearance.BorderSize = 0; - UploadWonwooSetIR.FlatStyle = FlatStyle.Flat; - UploadWonwooSetIR.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); - UploadWonwooSetIR.ForeColor = SystemColors.Control; - UploadWonwooSetIR.Location = new Point(210, 304); - UploadWonwooSetIR.Margin = new Padding(4, 3, 4, 3); - UploadWonwooSetIR.Name = "UploadWonwooSetIR"; - UploadWonwooSetIR.Size = new Size(180, 49); - UploadWonwooSetIR.TabIndex = 244; - UploadWonwooSetIR.Text = "Upload Wonwoo Settings IR"; - UploadWonwooSetIR.UseVisualStyleBackColor = false; - UploadWonwooSetIR.Click += UploadWonwooSetIR_Click; + BtnUploadWonwooSetIR.BackColor = Color.FromArgb(70, 65, 80); + BtnUploadWonwooSetIR.FlatAppearance.BorderColor = Color.FromArgb(70, 65, 80); + BtnUploadWonwooSetIR.FlatAppearance.BorderSize = 0; + BtnUploadWonwooSetIR.FlatStyle = FlatStyle.Flat; + BtnUploadWonwooSetIR.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); + BtnUploadWonwooSetIR.ForeColor = SystemColors.Control; + BtnUploadWonwooSetIR.Location = new Point(210, 304); + BtnUploadWonwooSetIR.Margin = new Padding(4, 3, 4, 3); + BtnUploadWonwooSetIR.Name = "BtnUploadWonwooSetIR"; + BtnUploadWonwooSetIR.Size = new Size(180, 49); + BtnUploadWonwooSetIR.TabIndex = 244; + BtnUploadWonwooSetIR.Text = "Upload Wonwoo Settings IR"; + BtnUploadWonwooSetIR.UseVisualStyleBackColor = false; + BtnUploadWonwooSetIR.Click += UploadWonwooSetIR_Click; // - // UploadWonwooSetOV + // BtnUploadWonwooSetOV // - UploadWonwooSetOV.BackColor = Color.FromArgb(70, 65, 80); - UploadWonwooSetOV.FlatAppearance.BorderColor = Color.FromArgb(70, 65, 80); - UploadWonwooSetOV.FlatAppearance.BorderSize = 0; - UploadWonwooSetOV.FlatStyle = FlatStyle.Flat; - UploadWonwooSetOV.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); - UploadWonwooSetOV.ForeColor = SystemColors.Control; - UploadWonwooSetOV.Location = new Point(19, 304); - UploadWonwooSetOV.Margin = new Padding(4, 3, 4, 3); - UploadWonwooSetOV.Name = "UploadWonwooSetOV"; - UploadWonwooSetOV.Size = new Size(181, 49); - UploadWonwooSetOV.TabIndex = 243; - UploadWonwooSetOV.Text = "Upload Wonwoo Settings OV"; - UploadWonwooSetOV.UseVisualStyleBackColor = false; - UploadWonwooSetOV.Click += UploadWonwooSetOV_Click; + BtnUploadWonwooSetOV.BackColor = Color.FromArgb(70, 65, 80); + BtnUploadWonwooSetOV.FlatAppearance.BorderColor = Color.FromArgb(70, 65, 80); + BtnUploadWonwooSetOV.FlatAppearance.BorderSize = 0; + BtnUploadWonwooSetOV.FlatStyle = FlatStyle.Flat; + BtnUploadWonwooSetOV.Font = new Font("Segoe UI Semibold", 10F, FontStyle.Bold); + BtnUploadWonwooSetOV.ForeColor = SystemColors.Control; + BtnUploadWonwooSetOV.Location = new Point(19, 304); + BtnUploadWonwooSetOV.Margin = new Padding(4, 3, 4, 3); + BtnUploadWonwooSetOV.Name = "BtnUploadWonwooSetOV"; + BtnUploadWonwooSetOV.Size = new Size(181, 49); + BtnUploadWonwooSetOV.TabIndex = 243; + BtnUploadWonwooSetOV.Text = "Upload Wonwoo Settings OV"; + BtnUploadWonwooSetOV.UseVisualStyleBackColor = false; + BtnUploadWonwooSetOV.Click += UploadWonwooSetOV_Click; // // BtnAdminStart // @@ -2249,7 +2249,7 @@ namespace AiQ_GUI private Button BtnAdminStart; private Button SetGodModeAll; private Button BtnFactoryDefault; - private Button UploadWonwooSetOV; - private Button UploadWonwooSetIR; + private Button BtnUploadWonwooSetOV; + private Button BtnUploadWonwooSetIR; } } diff --git a/AiQ_GUI.cs b/AiQ_GUI.cs index 94813c9..6f10471 100644 --- a/AiQ_GUI.cs +++ b/AiQ_GUI.cs @@ -771,7 +771,7 @@ namespace AiQ_GUI private async void BtnFindCams_Click(object sender, EventArgs e) { CbBxFoundCams.Text = "Searching"; - BtnFindCams.Enabled = BtnSetAll211.Enabled = BtnSoak.Enabled = BtnSet211.Enabled = BtnSetGodMode.Enabled = BtnUploadBlob.Enabled = SetGodModeAll.Enabled = BtnFactoryDefault.Enabled = false; + BtnFindCams.Enabled = BtnSetAll211.Enabled = BtnSoak.Enabled = BtnSet211.Enabled = BtnSetGodMode.Enabled = BtnUploadBlob.Enabled = SetGodModeAll.Enabled = BtnFactoryDefault.Enabled = BtnUploadWonwooSetIR.Enabled = BtnUploadWonwooSetOV.Enabled = false; BtnSetGodMode.BackColor = BtnUploadBlob.BackColor = BtnFactoryDefault.BackColor = BtnSetAll211.BackColor = BtnColour; CbBxFoundCams.Items.Clear(); soakCameraList.Clear(); @@ -887,7 +887,7 @@ namespace AiQ_GUI else { CbBxFoundCams.BackColor = Color.Red; - BtnSecret.Enabled = BtnOpenWebpage.Enabled = BtnSet211.Enabled = BtnSetGodMode.Enabled = false; + BtnSecret.Enabled = BtnOpenWebpage.Enabled = BtnSet211.Enabled = BtnSetGodMode.Enabled = BtnUploadWonwooSetIR.Enabled = BtnUploadWonwooSetOV.Enabled = false; } TestStartConditions(); @@ -972,7 +972,7 @@ namespace AiQ_GUI if (CbBxFoundCams.BackColor != BtnColour || CbBxFoundCams.Text.Contains("Found")) TSC = SetInvalid("Select camera IP address."); else - BtnOpenWebpage.Enabled = BtnSet211.Enabled = BtnSetGodMode.Enabled = BtnZoom8000.Enabled = BtnZoomWide.Enabled = true; // Allow user to go to camera webpage & change DHCP/211 + BtnOpenWebpage.Enabled = BtnSet211.Enabled = BtnSetGodMode.Enabled = BtnZoom8000.Enabled = BtnZoomWide.Enabled = BtnUploadWonwooSetIR.Enabled = BtnUploadWonwooSetOV.Enabled = true; // Allow user to go to camera webpage & change DHCP/211 // Name chosen if (CbBxUserName.Text == "Select Operator to Begin Test" || CbBxUserName.Text.Length < 2) @@ -1586,11 +1586,13 @@ namespace AiQ_GUI cts.Cancel(); soakCtsList.Clear(); soakTasks.Clear(); + int i = soakCameraList.Count + 1; // Add 1 for 211 itself staying in the list foreach (Camera SCL in soakCameraList) // Reset all cameras that were being soaked to default module settings { if (!SCL.IsChecked) continue; + try { Network.Initialize("developer", SCL.DevPass); // Ensure network is initialized to the right camera, cannot be done in soak test finally becuase of this. @@ -1601,15 +1603,28 @@ namespace AiQ_GUI if (GOD.Contains("Error")) throw new Exception("Could not set God mode off"); - bool Pass = await FlexiAPI.ChangeNetwork211(SCL.IP); // set camera to 211 - if (!Pass) - throw new Exception("Could not set camera to 211"); + // Update GLOBAL--NetworkConfig with fixed IP and turn off DHCP + string[,] TEST_JSON = { { "propDHCP", "false" }, { "propHost", "192.168.1.211" }, { "propNetmask", "255.255.255.0" }, { "propGateway", "192.168.1.1" } }; + await FlexiAPI.HTTP_Update("GLOBAL--NetworkConfig", SCL.IP, TEST_JSON); + i--; // Decriment count becuase they will stack into 211 } catch (Exception ex) { AddToActionsList("Failed to set God mode, reset camera modules or 211 for camera " + SCL.IP + ". Reason: " + ex.Message); } } + + await Task.Delay(5000); // Wait for 5 seconds to allow the camera to restart + IList FoundCams = await Network.SearchForCams(); // Have to check via broadcast becuase Ping sometimes fails across subnets + + if (FoundCams.Count == i && FoundCams.Contains("192.168.1.211")) // Check the right number of cameras are seen + { + // GOOD?? + } + else + { + // BAD?? + } } } @@ -1739,7 +1754,6 @@ namespace AiQ_GUI stopWatchTest.Stop(); AddToActionsList("RunTime " + stopWatchTest.Elapsed.ToString(@"hh\:mm\:ss\.ff")); - } } } diff --git a/AiQ_GUI.resx b/AiQ_GUI.resx index 2162dd7..d93c5df 100644 --- a/AiQ_GUI.resx +++ b/AiQ_GUI.resx @@ -123,6 +123,9 @@ 159, 17 + + 17, 17 + 690, 19 diff --git a/AiQ_GUI_NET_Test.csproj b/AiQ_GUI_NET_Test.csproj index 1865f5e..212d873 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.3.0 + 4.4.0 A GUI to control and test the AiQ MAV Systems Ltd 2025 MAV - Plain - Blue.png @@ -53,7 +53,7 @@ - + diff --git a/Camera/FlexiAPI.cs b/Camera/FlexiAPI.cs index 1c08728..aabf9f0 100644 --- a/Camera/FlexiAPI.cs +++ b/Camera/FlexiAPI.cs @@ -394,7 +394,7 @@ namespace AiQ_GUI //Filename validation string filename = Path.GetFileName(fileToUpload).ToUpper(); - if ((isIR && filename.Contains("IR")) || (!isIR && filename.Contains("OV"))) + if ((isIR && !filename.Contains("IR")) || (!isIR && !filename.Contains("OV"))) { MainForm.Instance.AddToActionsList($"Incorrect file selected. Expected {(isIR ? "IR" : "OV")} file", false); return; diff --git a/Network.cs b/Network.cs index 175e8ce..71f0110 100644 --- a/Network.cs +++ b/Network.cs @@ -89,6 +89,7 @@ namespace AiQ_GUI { const int sendPort = 6666; const int receivePort = 6667; + const int discoveryTimeoutMs = 1000; IList FoundCams = []; byte[] discoveryPacket = [0x50, 0x4f, 0x4c, 0x4c, 0xaf, 0xb0, 0xb3, 0xb3, 0xb6, 0x01, 0xa8, 0xc0, 0x0b, 0x1a, 0x00, 0x00]; @@ -103,9 +104,9 @@ namespace AiQ_GUI } using UdpClient receiver = new(receivePort); // Listen for replies on fixed port - receiver.Client.ReceiveTimeout = 750; + receiver.Client.ReceiveTimeout = discoveryTimeoutMs; - DateTime timeout = DateTime.Now.AddMilliseconds(750); + DateTime timeout = DateTime.Now.AddMilliseconds(discoveryTimeoutMs); try { while (DateTime.Now < timeout) diff --git a/Soak/Selenium.cs b/Soak/Selenium.cs index 9b8da07..17fb6e0 100644 --- a/Soak/Selenium.cs +++ b/Soak/Selenium.cs @@ -65,16 +65,66 @@ namespace AiQ_GUI // Initialises and opens a ChromeDriver with specific options public static ChromeDriver OpenDriver() { - ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService(); - chromeDriverService.HideCommandPromptWindow = true; - ChromeOptions options = new(); - options.AddArguments("--app=data:,", "--window-size=960,1040", "--window-position=0,0"); - options.AddExcludedArgument("enable-automation"); - options.AddAdditionalChromeOption("useAutomationExtension", false); + try + { + ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService(); + chromeDriverService.HideCommandPromptWindow = true; + ChromeOptions options = new(); + options.AddArguments("--app=data:,", "--window-size=960,1040", "--window-position=0,0"); + options.AddExcludedArgument("enable-automation"); + options.AddAdditionalChromeOption("useAutomationExtension", false); - ChromeDriver driver = new(chromeDriverService, options); - driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(5); - return driver; + ChromeDriver driver = new(chromeDriverService, options); + driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(5); + + return driver; + + } + catch (Exception ex) + { + MainForm.Instance.AddToActionsList("Error Creating ChromeDriver " + ex.Message); + throw; + } + } + + public static void SwitchUser(ChromeDriver driver) + { + try + { + WebDriverWait wait = new(driver, TimeSpan.FromSeconds(10)); + + // Click "Switch User" + IWebElement switchBtn = wait.Until(d => + d.FindElement(By.XPath("//*[contains(text(),'Switch User')]")) + ); + switchBtn.Click(); + + // Username + IWebElement userBox = wait.Until(d => d.FindElement(By.Id("username"))); + userBox.Clear(); + userBox.SendKeys("admin"); + + // Password + IWebElement passBox = wait.Until(d => d.FindElement(By.Id("password"))); + passBox.Clear(); + passBox.SendKeys("admin"); + + // Login button + IWebElement loginBtn = wait.Until(d => + d.FindElement(By.XPath("//button[contains(normalize-space(text()), 'Login')]")) + ); + + // Wait until it's clickable manually (no SeleniumExtras) + wait.Until(d => loginBtn.Displayed && loginBtn.Enabled); + + loginBtn.Click(); + + MainForm.Instance.AddToActionsList("Switched user and logged in."); + } + catch (Exception ex) + { + MainForm.Instance.AddToActionsList("SwitchUser failed: " + ex.Message); + } } // Changes the value of a dropdown element by ID, logs the action, and verifies the result using flashline feedback diff --git a/Soak/SoakTest.cs b/Soak/SoakTest.cs index 6bdb6cd..604efea 100644 --- a/Soak/SoakTest.cs +++ b/Soak/SoakTest.cs @@ -18,6 +18,7 @@ namespace AiQ_GUI try { driver = Selenium.OpenDriver(); + await Task.Delay(1000); // Small delay to ensure driver is ready // Keep retrying until connected or cancelled bool connected = false; @@ -27,6 +28,7 @@ namespace AiQ_GUI { // Attempt initial connection and navigation to setup tab Selenium.GoToUrl($"http://{CamInfo.IP}", driver); + Selenium.SwitchUser(driver); Selenium.ClickElementByID("tabSetup", driver); connected = true; }