diff --git a/AiQ_GUI.cs b/AiQ_GUI.cs index d5e84ba..15a5f64 100644 --- a/AiQ_GUI.cs +++ b/AiQ_GUI.cs @@ -635,8 +635,8 @@ namespace AiQ_GUI lblTrim.Text += "H: " + DiagsAPI.trim[0] + " V: " + DiagsAPI.trim[1]; // Offset accounted for in the SetTrim function, so value should be close to 0,0. - int HMax = 96; // 5% of 1920 each way = ±96 - int VMax = 54; // 5% of 1080 each way = ±54 + const int HMax = 96; // 5% of 1920 each way = ±96 + const int VMax = 54; // 5% of 1080 each way = ±54 if (Math.Abs(DiagsAPI.trim[0]) <= HMax && Math.Abs(DiagsAPI.trim[1]) <= VMax) lblTrim.ForeColor = Color.LightGreen; @@ -1000,9 +1000,8 @@ namespace AiQ_GUI PnlInputValue.Visible = true; while (Flags.Done == false) // Waiting for user input in RMA Num panel - { await Task.Delay(100); // Check every 100ms - } + Flags.Done = false; // Reset flag PnlInputValue.Visible = false; @@ -1654,78 +1653,14 @@ namespace AiQ_GUI BtnFactoryDefault.BackColor = Color.Green; } - // Constants - const double RealPlateWidthMeters = 0.52; // UK standard plate width - // const double FocalLengthPixels = (50 * 1280) / 14.111224; // focal mm * pixel width / sensor width for IQ - const double FocalLengthPixels = (35 * 1920) / 6.95; // focal mm * pixel width / sensor width for AiQ - const double FrameRate = 25.0; // Frames per second - - public class FrameData - { - public long FrameID; - public int PlatePosX; - public int PlatePosY; - public int PlateWidthPixels; - } - - public double EstimateSpeed(List frames) - { - double TimeElapsed = 0; - int frameCount = frames.Count; - - for (int i = 1; i < frameCount; i++) - { - double time = (frames[i].FrameID - frames[i - 1].FrameID) / FrameRate; - TimeElapsed += time; - } - - double FarDist = (FocalLengthPixels * RealPlateWidthMeters) / frames[0].PlateWidthPixels; - double CloseDist = (FocalLengthPixels * RealPlateWidthMeters) / frames[frameCount - 1].PlateWidthPixels; - - double speedMph = (Math.Abs(FarDist - CloseDist) / TimeElapsed) * 2.237; - return speedMph; - } - // ***** Test & Debug ***** private async void BtnTest_Click(object sender, EventArgs e) { Stopwatch stopWatchTest = Stopwatch.StartNew(); - //string[,] GOD_JSON = { { "propURI", "rtsp://ADMIN:1234@192.168.0.49:554/live/main" } }; - //string str = FlexiAPI.BuildJsonUpdate(GOD_JSON, "CameraA"); - //string OUT = await FlexiAPI.HTTP_Update("CameraA", "100.118.196.113:8080", GOD_JSON); - //AddToActionsList(OUT); - - string[,] TEST_JSON = { { "propSerialNumber", "1234567" }, { "propMavModelNumber", "XA45HF" } }; - string JSONResponse = await FlexiAPI.HTTP_Update("Internal Config", "100.118.196.113", TEST_JSON); - AddToActionsList(JSONResponse); - - //string OUT = await FlexiAPI.HTTP_Fetch("InternalConfig", "100.118.196.113"); - //AddToActionsList(OUT); - - // To estimate speed - //List frames = new List - //{ - // new FrameData { FrameID = 60192555, PlatePosX = 1172, PlatePosY = 393, PlateWidthPixels = 108 }, - // new FrameData { FrameID = 60192556, PlatePosX = 1103, PlatePosY = 361, PlateWidthPixels = 105 }, - // new FrameData { FrameID = 60192558, PlatePosX = 983, PlatePosY = 331, PlateWidthPixels = 99 }, - // new FrameData { FrameID = 60192559, PlatePosX = 930, PlatePosY = 301, PlateWidthPixels = 95 }, - // new FrameData { FrameID = 60192560, PlatePosX = 880, PlatePosY = 304, PlateWidthPixels = 93 }, - // new FrameData { FrameID = 60192561, PlatePosX = 834, PlatePosY = 278, PlateWidthPixels = 89 }, - // new FrameData { FrameID = 60192562, PlatePosX = 792, PlatePosY = 229, PlateWidthPixels = 87 }, - // new FrameData { FrameID = 60192563, PlatePosX = 752, PlatePosY = 208, PlateWidthPixels = 85 }, - // new FrameData { FrameID = 60192565, PlatePosX = 680, PlatePosY = 187, PlateWidthPixels = 81 }, - // new FrameData { FrameID = 60192566, PlatePosX = 648, PlatePosY = 167, PlateWidthPixels = 78 }, - // new FrameData { FrameID = 60192567, PlatePosX = 617, PlatePosY = 149, PlateWidthPixels = 76 }, - // new FrameData { FrameID = 60192568, PlatePosX = 588, PlatePosY = 132, PlateWidthPixels = 75 }, - // new FrameData { FrameID = 60192569, PlatePosX = 561, PlatePosY = 100, PlateWidthPixels = 70 }, - // new FrameData { FrameID = 60192570, PlatePosX = 535, PlatePosY = 85, PlateWidthPixels = 72 }, - // new FrameData { FrameID = 60192572, PlatePosX = 488, PlatePosY = 70, PlateWidthPixels = 69 }, - // new FrameData { FrameID = 60192573, PlatePosX = 466, PlatePosY = 55, PlateWidthPixels = 67 } - //}; - - //double Spd = EstimateSpeed(frames); - //AddToActionsList("Estimated Speed: " + Spd.ToString("F2") + " MPH"); + string[,] Vaxtor_JSON = { { "propMinCharHeight", "14" }, { "propMinGlobalConfidence", "30" } }; + string response = await FlexiAPI.HTTP_Update("RaptorOCR", "192.168.0.100", Vaxtor_JSON); + AddToActionsList(response); stopWatchTest.Stop(); AddToActionsList("RunTime " + stopWatchTest.Elapsed.ToString(@"hh\:mm\:ss\.ff")); diff --git a/AiQ_GUI_NET_Test.csproj b/AiQ_GUI_NET_Test.csproj index f43f6b9..49a3578 100644 --- a/AiQ_GUI_NET_Test.csproj +++ b/AiQ_GUI_NET_Test.csproj @@ -49,11 +49,11 @@ - - - + + + - + diff --git a/Camera/FlexiAPI.cs b/Camera/FlexiAPI.cs index 43d603e..8c27670 100644 --- a/Camera/FlexiAPI.cs +++ b/Camera/FlexiAPI.cs @@ -35,6 +35,8 @@ namespace AiQ_GUI try { string JSONdata = BuildJsonUpdate(jsonArrayData, ID); + JSONdata = JSONdata.Replace("\"14\"", "14").Replace("\"30\"", "30"); // Fixes & encoding issue + MainForm.Instance.AddToActionsList(JSONdata); string url = $"http://{IPAddress}/api/update-config"; return await Network.SendHttpRequest(url, HttpMethod.Post, 2, JSONdata); } diff --git a/Camera/ImageProcessing.cs b/Camera/ImageProcessing.cs index 9a63689..3acbc19 100644 --- a/Camera/ImageProcessing.cs +++ b/Camera/ImageProcessing.cs @@ -10,11 +10,11 @@ namespace AiQ_GUI internal class ImageProcessing { // API to get snapshot then downsize and downscale image to save size. - public static async Task GetProcessedImage(string suffix, string IPAddress, string DevPass, string? savePath = null, PictureBox? PcBx = null, bool SaveDisplay = false) + public static async Task GetProcessedImage(string Module, string IPAddress, string DevPass, string? savePath = null, PictureBox? PcBx = null, bool SaveDisplay = false) { try { - string requestUrl = $"http://{IPAddress}/{suffix}"; + string requestUrl = $"http://{IPAddress}/{Module}-snapshot"; HttpClientHandler handler = new() { @@ -85,7 +85,7 @@ namespace AiQ_GUI public static async Task ImageCheck(PictureBox PicBxOV, PictureBox PicBxF2, PictureBox PicBxF16, Label LblF2, Label LblF16, Camera CamOnTest) { // Take OV snapshot - Task Colour_Response = GetProcessedImage("Colour-snapshot", CamOnTest.IP, CamOnTest.DevPass, LDS.MAVPath + LDS.OVsavePath, PicBxOV, true); + Task Colour_Response = GetProcessedImage("Colour", CamOnTest.IP, CamOnTest.DevPass, LDS.MAVPath + LDS.OVsavePath, PicBxOV, true); // Change to wide iris F2.0 await FlexiAPI.APIHTTPVISCA(CamOnTest.IP, "8101044B00000100FF", true); @@ -93,7 +93,7 @@ namespace AiQ_GUI await Task.Delay(200); // Wait for iris to settle before taking IR image // Take IR bright light image - Image? F2_Response = await GetProcessedImage("Infrared-snapshot", CamOnTest.IP, CamOnTest.DevPass, LDS.MAVPath + LDS.IROpensavePath, PicBxF2, true); + Image? F2_Response = await GetProcessedImage("Infrared", CamOnTest.IP, CamOnTest.DevPass, LDS.MAVPath + LDS.IROpensavePath, PicBxF2, true); if (F2_Response == null) { MainForm.Instance.AddToActionsList("IR F2.0 image response is blank."); @@ -106,7 +106,7 @@ namespace AiQ_GUI await Task.Delay(200); // Wait for iris to settle before taking IR image // Take IR low light image - Image? F16_Response = await GetProcessedImage("Infrared-snapshot", CamOnTest.IP, CamOnTest.DevPass, LDS.MAVPath + LDS.IRTightsavePath, PicBxF16, true); + Image? F16_Response = await GetProcessedImage("Infrared", CamOnTest.IP, CamOnTest.DevPass, LDS.MAVPath + LDS.IRTightsavePath, PicBxF16, true); if (F16_Response == null) { MainForm.Instance.AddToActionsList("IR F16.0 image response is blank."); diff --git a/Camera/SSH.cs b/Camera/SSH.cs index 09d06dd..c29575b 100644 --- a/Camera/SSH.cs +++ b/Camera/SSH.cs @@ -1,4 +1,5 @@ using Renci.SshNet; +using Renci.SshNet.Common; namespace AiQ_GUI { @@ -6,6 +7,29 @@ namespace AiQ_GUI { public const string SSHUsername = "mav"; public const string SSHPassword = "mavPA$$"; + public const string SSHPasswordNEW = "#!mavsoftMESA19"; // New password for SSH after last one got leaked + + private static SshClient SshConnect(string IPAddress) + { + SshClient client = new(IPAddress, SSHUsername, SSHPasswordNEW); + try + { + client.Connect(); + return client; + } + catch (SshAuthenticationException) + { + client = new(IPAddress, SSHUsername, SSHPassword); + client.Connect(); + return client; + } + catch (Exception Ex) + { + MainForm.Instance.AddToActionsList($"SSH connection failed: {Ex.Message}. Check password or network."); + } + + return null; + } // Connects to camera over SSH and collects the Vaxtor packages, filesystem name, filesystem size, and tailscale status. public static SSHData CollectSSHData(string IPAddress) @@ -14,8 +38,7 @@ namespace AiQ_GUI try { - using SshClient client = new(IPAddress, SSHUsername, SSHPassword); - client.Connect(); + SshClient client = SshConnect(IPAddress); try { @@ -34,8 +57,7 @@ namespace AiQ_GUI catch (Exception ex) { MainForm.Instance.AddToActionsList($"Failed to get filesystem info: {ex.Message}"); - Data.FilesystemName = "Unknown"; - Data.FilesystemSize = "Unknown"; + Data.FilesystemName = Data.FilesystemSize = "Unknown"; } try @@ -49,6 +71,7 @@ namespace AiQ_GUI } client.Disconnect(); + client.Dispose(); } catch (Exception ex) { @@ -131,8 +154,7 @@ namespace AiQ_GUI { try { - using SshClient client = new SshClient(IPAddress, SSHUsername, SSHPassword); - client.Connect(); + SshClient client = SshConnect(IPAddress); try { @@ -144,6 +166,7 @@ namespace AiQ_GUI } client.Disconnect(); + client.Dispose(); } catch (Exception ex) { @@ -191,10 +214,10 @@ namespace AiQ_GUI { try { - using SshClient client = new(IPAddress, SSHUsername, SSHPassword); - client.Connect(); + SshClient client = SshConnect(IPAddress); (string FilesystemName, string FilesystemSize) = GetRootFilesystemInfo(client); client.Disconnect(); + client.Dispose(); return (FilesystemName, FilesystemSize); } catch (Exception ex) @@ -207,19 +230,19 @@ namespace AiQ_GUI // Checks the filesystem size and expands it if necessary, displays on the label how big the SD card is. public static async Task CheckFSSize(string IPAddress, Label LblFSSize, SSHData sshData) { - const double MinGoodSize = 100.0; // 100GB - const double MaxGoodSize = 150.0; // 150GB + const double GoodSize = 128.0; // 128GB + const double Deviation = 20.0; // ±20GB double currentSize = NormaliseFSSize(sshData.FilesystemSize); LblFSSize.Text = $"Filesystem Size = {currentSize}GB"; - if (currentSize >= MinGoodSize && currentSize <= MaxGoodSize) + if (Math.Abs(GoodSize - currentSize) < Deviation) { LblFSSize.ForeColor = Color.LightGreen; return sshData; } - if (currentSize < MinGoodSize) + if (currentSize < GoodSize - Deviation) { try { @@ -230,7 +253,7 @@ namespace AiQ_GUI double newSize = NormaliseFSSize(sshData.FilesystemSize); LblFSSize.Text = $"Filesystem Size = {newSize}GB"; - if (newSize >= MinGoodSize && newSize <= MaxGoodSize) + if (Math.Abs(GoodSize - newSize) < Deviation) { LblFSSize.ForeColor = Color.LightGreen; return sshData; @@ -261,10 +284,9 @@ namespace AiQ_GUI // Extract value & unit System.Text.RegularExpressions.Match match = RegexCache.FileSizeRegex().Match(rootSize.Trim()); - if (!match.Success) - return 0; - if (!double.TryParse(match.Groups["value"].Value, out double value)) + // Return 0 if no match or invalid number + if (!match.Success || !double.TryParse(match.Groups["value"].Value, out double value)) return 0; string unit = match.Groups["unit"].Value.ToUpperInvariant(); @@ -288,15 +310,14 @@ namespace AiQ_GUI return 0; } - // Expands the filesystem to max + // Expands the filesystem to max public async static Task ExpandFS(string device, string IPAddress) { try { - using SshClient ssh = new SshClient(IPAddress, SSHUsername, SSHPassword); - ssh.Connect(); + SshClient client = SshConnect(IPAddress); - SshCommand checkDevice = ssh.RunCommand($"[ -b {device} ] && echo OK || echo NOT_FOUND"); + SshCommand checkDevice = client.RunCommand($"[ -b {device} ] && echo OK || echo NOT_FOUND"); if (!string.IsNullOrWhiteSpace(checkDevice.Error)) throw new Exception(checkDevice.Error); @@ -306,7 +327,7 @@ namespace AiQ_GUI return false; } - SshCommand umountCmd = ssh.RunCommand($"sudo umount {device}"); + SshCommand umountCmd = client.RunCommand($"sudo umount {device}"); if (!string.IsNullOrWhiteSpace(umountCmd.Error) && !umountCmd.Error.Contains("not mounted")) { MainForm.Instance.AddToActionsList($"Unmount error: {umountCmd.Error}"); @@ -315,15 +336,16 @@ namespace AiQ_GUI await Task.Delay(1000); // Wait for mount to settle - SshCommand fsckCmd = ssh.RunCommand($"sudo e2fsck -f -y -v -C 0 {device}"); + SshCommand fsckCmd = client.RunCommand($"sudo e2fsck -f -y -v -C 0 {device}"); if (!string.IsNullOrWhiteSpace(fsckCmd.Error)) { MainForm.Instance.AddToActionsList($"e2fsck error: {fsckCmd.Error}"); return false; } - SshCommand resizeFs = ssh.RunCommand($"sudo resize2fs {device}"); - ssh.Disconnect(); + SshCommand resizeFs = client.RunCommand($"sudo resize2fs {device}"); + client.Disconnect(); + client.Dispose(); if (!string.IsNullOrWhiteSpace(resizeFs.Error)) { @@ -348,10 +370,9 @@ namespace AiQ_GUI { try { - using SshClient ssh = new SshClient(IPAddress, SSHUsername, SSHPassword); - ssh.Connect(); + SshClient client = SshConnect(IPAddress); - SshCommand checkDevice = ssh.RunCommand("sync"); + SshCommand checkDevice = client.RunCommand("sync"); if (!string.IsNullOrWhiteSpace(checkDevice.Error)) throw new Exception(checkDevice.Error); @@ -360,6 +381,9 @@ namespace AiQ_GUI MainForm.Instance.AddToActionsList($"Cannot sync files to disk. Replied: {checkDevice.Result}. DO NOT TURN OFF, GET SUPERVISOR"); return; } + + client.Disconnect(); + client.Dispose(); } catch (Exception ex) { diff --git a/GUIUpdate.cs b/GUIUpdate.cs index 184102c..2993439 100644 --- a/GUIUpdate.cs +++ b/GUIUpdate.cs @@ -15,9 +15,7 @@ namespace AiQ_GUI // If there is no dot in the version string, return the version as is if (dotLocation < 0) - { return GUIVersion; - } // Check if the next character after the dot is "0" if (dotLocation + 1 < GUIVersion.Length && GUIVersion[dotLocation + 1] == '0') @@ -48,7 +46,7 @@ namespace AiQ_GUI { if (ComapreVersions()) // Checks if the current version is older than the latest version { - string GUIPath = $"{GoogleAPI.DrivePath}AiQ\\GUI's\\AiQ_Final_Test\\AiQ_GUI.application"; + const string GUIPath = $"{GoogleAPI.DrivePath}AiQ\\GUI's\\AiQ_Final_Test\\AiQ_GUI.application"; // Check if path is real if (!File.Exists(GUIPath)) diff --git a/GoogleAPI.cs b/GoogleAPI.cs index c1d778d..b2f27e6 100644 --- a/GoogleAPI.cs +++ b/GoogleAPI.cs @@ -24,7 +24,7 @@ namespace AiQ_GUI { try { - string streamPath = $"{DrivePath}R50IQ\\client_secret.json"; + const string streamPath = $"{DrivePath}R50IQ\\client_secret.json"; string[] Scopes = [SheetsService.Scope.Spreadsheets]; FileStream stream = new(streamPath, FileMode.Open, FileAccess.Read); credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.FromStream(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result; @@ -231,7 +231,7 @@ namespace AiQ_GUI // Checks RMA control sheet for a model and serial that match current camera public static int CheckRMANum(string serial, string model) { - string spreadsheetId_RMAControl = "1tZhkYrqBQ3BcL7ZS4q3ghzCgHSJ8f5LVSj7nh6fIRC8"; + const string spreadsheetId_RMAControl = "1tZhkYrqBQ3BcL7ZS4q3ghzCgHSJ8f5LVSj7nh6fIRC8"; try { // Get all info in H and I columns diff --git a/Microsoft/Windows.cs b/Microsoft/Windows.cs index 90a4232..6ea9f43 100644 --- a/Microsoft/Windows.cs +++ b/Microsoft/Windows.cs @@ -1,6 +1,5 @@ using System.Diagnostics; using System.Reflection; -using System.Runtime.InteropServices; using System.Security.Principal; namespace AiQ_GUI @@ -16,14 +15,11 @@ namespace AiQ_GUI .Where(p => targetProcesses.Any(tp => p.ProcessName.Contains(tp))) .Select(clsProcess => { - using (clsProcess) + try { - try - { - clsProcess.CloseMainWindow(); - } - catch { } + clsProcess.CloseMainWindow(); } + catch { } return Task.CompletedTask; }); @@ -34,7 +30,7 @@ namespace AiQ_GUI { Logging.LogMessage($"Starting exe from {ExeLoc}"); - ProcessStartInfo processInfo = new ProcessStartInfo(ExeLoc) + ProcessStartInfo processInfo = new(ExeLoc) { UseShellExecute = true, Verb = "runas" @@ -97,43 +93,4 @@ namespace AiQ_GUI } } } - - [ComImport, Guid("AF230D27-BABA-4E42-ACED-F524F22CFCE2")] - public interface INetFwRule - { - string Name { get; set; } - string Description { get; set; } - string ApplicationName { get; set; } - string ServiceName { get; set; } - int Protocol { get; set; } - string LocalPorts { get; set; } - string RemotePorts { get; set; } - string LocalAddresses { get; set; } - string RemoteAddresses { get; set; } - string IcmpTypesAndCodes { get; set; } - int Direction { get; set; } - object Interfaces { get; set; } - string InterfaceTypes { get; set; } - bool Enabled { get; set; } - string Grouping { get; set; } - int Profiles { get; set; } - bool EdgeTraversal { get; set; } - int Action { get; set; } - } - - [ComImport, Guid("98325047-C671-4174-8D81-DEFCD3F03186")] - public interface INetFwPolicy2 - { - int CurrentProfileTypes { get; } - void get_FirewallEnabled(int profileType, out bool enabled); - void put_FirewallEnabled(int profileType, bool enabled); - void get_ExcludedInterfaces(int profileType, out object interfaces); - void put_ExcludedInterfaces(int profileType, object interfaces); - int BlockAllInboundTraffic { get; set; } - int NotificationsDisabled { get; set; } - int UnicastResponsesToMulticastBroadcastDisabled { get; set; } - object Rules { get; } - object ServiceRestriction { get; } - // ...other members omitted for brevity - } } diff --git a/Soak/Selenium.cs b/Soak/Selenium.cs index 57db5a3..9b8da07 100644 --- a/Soak/Selenium.cs +++ b/Soak/Selenium.cs @@ -39,14 +39,8 @@ namespace AiQ_GUI return elementID; } - // Clicks the element with the specified ID using Chromedriver - public static void ClickElementByID(string elementID, ChromeDriver driver) - { - ClickElementByID(elementID, true, driver); - } - // Attempts to click the web element with the specified ID; refreshes the page and retries once if the initial attempt fails - public static void ClickElementByID(string elementID, bool tryagain, ChromeDriver driver) + public static void ClickElementByID(string elementID, ChromeDriver driver, bool tryagain = true) { try { @@ -61,7 +55,7 @@ namespace AiQ_GUI driver.Navigate().Refresh(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds(10)); wait.Until(d => ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete")); - ClickElementByID(elementID, false, driver); + ClickElementByID(elementID, driver, false); } MainForm.Instance.AddToActionsList("Could not click " + elementID); diff --git a/Soak/SoakTest.cs b/Soak/SoakTest.cs index 5392848..6bdb6cd 100644 --- a/Soak/SoakTest.cs +++ b/Soak/SoakTest.cs @@ -138,7 +138,6 @@ namespace AiQ_GUI // Create Test report in the same directory as the final test reports. string soakLogPath = LDS.MAVPath + SoakLogFile; - string SoakTestPath = PDF.CreateSoakTestReport(CamInfo, MainForm.Instance.CbBxUserName.Text, DateTime.Now, soakLogPath); if (SoakTestPath != null) @@ -207,7 +206,7 @@ namespace AiQ_GUI await Task.Delay(500); // Take bright image - Image ImageBright = await ImageProcessing.GetProcessedImage("Infrared-snapshot", IP, DevPass); + Image ImageBright = await ImageProcessing.GetProcessedImage("Infrared", IP, DevPass); if (ImageBright == null) { Logging.LogWarningMessage($"Bright image is null for {controlType} at setting {SettingMinMax[0]}", SoakLogFile); @@ -221,7 +220,7 @@ namespace AiQ_GUI await Task.Delay(500); // Take dark image - Image ImageDark = await ImageProcessing.GetProcessedImage("Infrared-snapshot", IP, DevPass); + Image ImageDark = await ImageProcessing.GetProcessedImage("Infrared", IP, DevPass); if (ImageDark == null) { Logging.LogWarningMessage($"Dark image is null for {controlType} at setting {SettingMinMax[1]}", SoakLogFile); diff --git a/Test.json b/Test.json deleted file mode 100644 index a14fe51..0000000 --- a/Test.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "id": "GLOBAL--Device", - "configHash": "101478235", - "propHardwarePlatform": { - "value": "JETSON_NANO", - "datatype": "mav.flexi.web.pages.SystemConfig$HardwareConfigurationOption", - "accepted": "[NONE, JETSON_NANO, JETSON_XAVIER, RASPBERRY_PI_CM4, RASPBERRY_PI_CM5, DEVELOPER_WORKSTATION]" - }, - "propApplicationPlatform": { - "value": "CUSTOM", - "datatype": "mav.flexi.web.pages.SystemConfig$ApplicationConfigurationOption", - "accepted": "[NONE, CUSTOM, MONO_BASIC_ANPR, DUAL_CAMERA_BASIC_ANPR, SINGLE_SAF_DUAL_CAMERA_BASIC_ANPR, DUAL_CAMERA_STREAMING, BAYGUARD, SITE_ACCESS_CONTROL_WITH_MODBUS, WAPOL_IQ50_VRM_CORRECTION, BAYWATCH_MONO_CAM, BAYWATCH_DUAL_CAM, BAYWATCH_TRIPLE_CAM, BAYWATCH_QUADRUPLE_CAM, IN_CAR_ANPR]" - }, - "propDeviceName": { - "value": "Test Nano", - "datatype": "java.lang.String" - }, - "propLocalTimeZone": { - "value": "Europe/London (UTC+00)", - "datatype": "mav.util.TimeZoneEnum", - "accepted": "[Africa/Cairo (UTC+02), Africa/Johannesburg (UTC+02), Africa/Lagos (UTC+01), Africa/Monrousing (UTC+00), America/Anchorage (UTC-09), America/Chicago (UTC-06), America/Denver (UTC-07), America/Edmonton (UTC-07), America/Jamaica (UTC-05), America/Los Angeles (UTC-08), America/Mexico City (UTC-06), America/Montreal (UTC-05), America/New/York (UTC-05), America/Phoenix (UTC-07), America/Puerto Rico (UTC-04), America/Sao Paulo (UTC-03), America/Toronto (UTC-05), America/Vancouver (UTC-08), Asia/Hong Kong (UTC+08), Asia/Jerusalem (UTC+02), Asia/Manila (UTC+08), Asia/Seoul (UTC+09), Asia/Tokyo (UTC+09), Atlantic/Reykjavik (UTC+00), Australia/Perth (UTC+08), Australia/Sydney (UTC+10), Europe/Athens (UTC+02), Europe/Berlin (UTC+01), Europe/Brussels (UTC+01), Europe/Copenhagen (UTC+01), Europe/London (UTC+00), Europe/Madrid (UTC+01), Europe/Moscow (UTC+04), Europe/Paris (UTC+01), Europe/Prague (UTC+01), Europe/Rome (UTC+01), Europe/Warsaw (UTC+01), Pacific/Guam (UTC+10), Pacific/Honolulu (UTC-10), UTC (UTC-00)]" - }, - "propTimeSource": { - "value": "SNTP Only", - "datatype": "mav.flexi.web.pages.SystemConfig$TimeSourceEnum", - "accepted": "[SNTP Only, GPS Only, SNTP + Soft GPS]" - }, - "propSNTPServer": { - "value": "1.uk.pool.ntp.org", - "datatype": "java.lang.String" - }, - "propSNTPIntervalMinutes": { - "value": "public long mav.flexi.web.pages.SystemConfig$DeviceConfig.propSNTPIntervalMinutes", - "datatype": "long", - "range": { - "minimum": "1.000000", - "maximum": "99999.000000" - } - }, - "propOutputsMaxTimeSyncAge": { - "value": "24 hours", - "datatype": "mav.flexi.web.pages.SystemConfig$HoursEnum", - "accepted": "[NO LIMIT, 01 hours, 02 hours, 03 hours, 04 hours, 05 hours, 06 hours, 07 hours, 08 hours, 09 hours, 10 hours, 11 hours, 12 hours, 18 hours, 24 hours, 36 hours, 48 hours, 72 hours, 96 hours]" - }, - "propReservedMemoryMegabytes": { - "value": "public long mav.flexi.web.pages.SystemConfig$DeviceConfig.propReservedMemoryMegabytes", - "datatype": "long", - "range": { - "minimum": "1000.000000", - "maximum": "128000.000000" - } - }, - "propClientTrustStorePassword": { - "value": "", - "datatype": "java.lang.String" - }, - "propFlexiScriptPath": { - "value": "/home/mav/FlexiAI/bin/FlexiAI", - "datatype": "java.lang.String" - }, - "propVideo0Tee": { - "value": "video0tee", - "datatype": "java.lang.String" - }, - "propVideo1Tee": { - "value": "video1tee", - "datatype": "java.lang.String" - }, - "propRestartCameraModulesOnBoot": { - "value": "true", - "datatype": "boolean" - } -} \ No newline at end of file