Features added: - Onvif discoverable - New Camera Type combo box - Access has be changed to be more scalable and dynamic in preparation for more cameras
234 lines
8.9 KiB
C#
234 lines
8.9 KiB
C#
using System.Data.OleDb;
|
|
|
|
namespace AiQ_GUI
|
|
{
|
|
class Access
|
|
{
|
|
|
|
public const string connString =
|
|
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\Shared drives\MAV Production GUI's\AiQ\GUI's\AiQ_Final_Test.accdb;Persist Security Info=False;OLE DB Services=-1;";
|
|
|
|
// Allows Different Cam Types with different schemas to be handled safely
|
|
|
|
private static bool HasColumn(OleDbDataReader reader, string columnName)
|
|
{
|
|
for (int i = 0; i < reader.FieldCount; i++)
|
|
if (reader.GetName(i).Equals(columnName, StringComparison.OrdinalIgnoreCase))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
public static string[] ReadCamTypes(string camType)
|
|
{
|
|
// No camera type selected
|
|
if (string.IsNullOrWhiteSpace(camType))
|
|
return null;
|
|
|
|
// Preallocate list to reduce resizing
|
|
List<Tuple<string, string>> modelTuples = new(30);
|
|
|
|
using OleDbConnection conn = new(connString);
|
|
|
|
// Attempt to open the database
|
|
try
|
|
{
|
|
conn.Open();
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Could not access Access in google drive. Is it running?");
|
|
return null;
|
|
}
|
|
|
|
// Mobile table does not have MarkNumber
|
|
// AiQ and others might do ????? - TODO ask
|
|
string query = camType == "Mobile"
|
|
? "SELECT ModelNumber, Description FROM [Mobile]"
|
|
: $"SELECT ModelNumber, Description FROM [{camType}] WHERE MarkNumber > 1";
|
|
|
|
using OleDbCommand cmd = new(query, conn);
|
|
using OleDbDataReader reader = cmd.ExecuteReader();
|
|
|
|
// Read all models from the selected table
|
|
while (reader.Read())
|
|
{
|
|
string modelNumber = reader["ModelNumber"] as string ?? string.Empty;
|
|
string description = reader["Description"] as string ?? string.Empty;
|
|
|
|
modelTuples.Add(Tuple.Create(modelNumber.Trim(), description.Trim()));
|
|
}
|
|
|
|
// Sort models, pushing AB12CD to the bottom
|
|
var sorted = modelTuples
|
|
.OrderBy(t => t.Item1.Equals("AB12CD", StringComparison.OrdinalIgnoreCase) ? 1 : 0)
|
|
.ThenBy(t => t.Item1, StringComparer.OrdinalIgnoreCase);
|
|
|
|
// Format for combo box display
|
|
return sorted.Select(t => $"{t.Item1} - {t.Item2}").ToArray();
|
|
}
|
|
public static void ReadUniData()
|
|
{
|
|
using OleDbConnection conn = new(connString);
|
|
|
|
try
|
|
{
|
|
conn.Open();
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Could not access Access in google drive. Is it running?");
|
|
return;
|
|
}
|
|
|
|
const string query =
|
|
"SELECT FlexiVersion, FlexiRevision, WonwooFirmware, AiQGUIVersion, PowerConsumption, LicencingServerURL FROM UniversalData";
|
|
|
|
using OleDbCommand cmd = new(query, conn);
|
|
using OleDbDataReader reader = cmd.ExecuteReader();
|
|
|
|
// UniversalData is expected to contain a single row
|
|
reader.Read();
|
|
|
|
UniversalData.ExpFlexiVer = Convert.ToString(reader["FlexiVersion"]);
|
|
UniversalData.ExpFlexiRev = Convert.ToString(reader["FlexiRevision"]);
|
|
UniversalData.WonwooFirmware = Convert.ToString(reader["WonwooFirmware"]);
|
|
UniversalData.LatestVersion = Convert.ToString(reader["AiQGUIVersion"]);
|
|
UniversalData.PowerConsumption = Convert.ToInt16(reader["PowerConsumption"]);
|
|
UniversalData.LicencingServerURL = Convert.ToString(reader["LicencingServerURL"]);
|
|
}
|
|
// Populates CameraAccessInfo dynamically based on available columns
|
|
public static void ReadModelRow(string camType, string ModelOnTest)
|
|
{
|
|
using OleDbConnection conn = new(connString);
|
|
|
|
try
|
|
{
|
|
conn.Open();
|
|
}
|
|
catch
|
|
{
|
|
MessageBox.Show("Could not access Access in google drive. Is it running?");
|
|
return;
|
|
}
|
|
|
|
// Parameterised query to prevent injection
|
|
string query = $"SELECT * FROM [{camType}] WHERE ModelNumber = ?";
|
|
|
|
using OleDbCommand cmd = new(query, conn);
|
|
cmd.Parameters.AddWithValue("?", ModelOnTest);
|
|
|
|
using OleDbDataReader reader = cmd.ExecuteReader();
|
|
|
|
// No matching model found
|
|
if (!reader.Read())
|
|
return;
|
|
|
|
// Populate CameraAccessInfo only if columns exist
|
|
CameraAccessInfo.Processor =
|
|
HasColumn(reader, "Processor") ? Convert.ToString(reader["Processor"]) : string.Empty;
|
|
|
|
CameraAccessInfo.VaxtorLic =
|
|
HasColumn(reader, "Vaxtor") && Convert.ToString(reader["Vaxtor"]) == "Yes";
|
|
|
|
CameraAccessInfo.HardwareExtras =
|
|
HasColumn(reader, "HardwareExtras") ? Convert.ToString(reader["HardwareExtras"]) : string.Empty;
|
|
|
|
CameraAccessInfo.PowerType =
|
|
HasColumn(reader, "PowerType") ? Convert.ToString(reader["PowerType"]) : string.Empty;
|
|
|
|
CameraAccessInfo.LED_V =
|
|
HasColumn(reader, "LEDVoltage") ? Convert.ToDouble(reader["LEDVoltage"]) : 0;
|
|
|
|
CameraAccessInfo.LED_I =
|
|
HasColumn(reader, "LEDCurrent") ? Convert.ToInt32(reader["LEDCurrent"]) : 0;
|
|
|
|
CameraAccessInfo.SpreadsheetID =
|
|
HasColumn(reader, "SSID") ? Convert.ToString(reader["SSID"]) : string.Empty;
|
|
}
|
|
public static void Stats(string TypeOfTest, string modelNumber)
|
|
{
|
|
Stats([TypeOfTest], modelNumber);
|
|
}
|
|
public static void Stats(string[] TypeOfTest, string modelNumber)
|
|
{
|
|
using OleDbConnection conn = new(connString);
|
|
|
|
try
|
|
{
|
|
conn.Open();
|
|
|
|
foreach (string type in TypeOfTest)
|
|
{
|
|
string query =
|
|
$"UPDATE AiQ SET [{type}] = [{type}] + 1 WHERE [ModelNumber] = ?";
|
|
|
|
using OleDbCommand cmd = new(query, conn);
|
|
cmd.Parameters.AddWithValue("?", modelNumber);
|
|
|
|
int rowsAffected = cmd.ExecuteNonQuery();
|
|
|
|
if (rowsAffected == 0)
|
|
MainForm.Instance.AddToActionsList($"No rows affected for {modelNumber}", Level.ERROR);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
MainForm.Instance.AddToActionsList(
|
|
"Could not access Access in Google Drive. Is it running?", Level.WARNING);
|
|
}
|
|
}
|
|
public static void StatsDiags(string redDiagLabels, string RhTxBxActionsText, string ModelNumber)
|
|
{
|
|
using OleDbConnection conn = new(connString);
|
|
conn.Open();
|
|
|
|
// Replace null or empty values
|
|
string redVal = string.IsNullOrWhiteSpace(redDiagLabels) ? "-" : redDiagLabels;
|
|
string actVal = string.IsNullOrWhiteSpace(RhTxBxActionsText) ? "-" : RhTxBxActionsText;
|
|
string model = string.IsNullOrWhiteSpace(ModelNumber) ? "-" : ModelNumber;
|
|
|
|
const string sql =
|
|
@"INSERT INTO DiagsStats ([Date], [Model], [Red Diags Labels], [RhTxBxActions Contents])
|
|
VALUES (?, ?, ?, ?)";
|
|
|
|
using OleDbCommand cmd = new(sql, conn);
|
|
|
|
cmd.Parameters.Add(new OleDbParameter
|
|
{
|
|
OleDbType = OleDbType.Date,
|
|
Value = DateTime.Now
|
|
});
|
|
|
|
cmd.Parameters.AddWithValue("?", model);
|
|
cmd.Parameters.AddWithValue("?", redVal);
|
|
cmd.Parameters.AddWithValue("?", actVal);
|
|
|
|
int rows = cmd.ExecuteNonQuery();
|
|
|
|
if (rows == 0)
|
|
MainForm.Instance.AddToActionsList(
|
|
"No rows inserted into DiagsStats (unexpected).", Level.ERROR);
|
|
}
|
|
}
|
|
public class UniversalData
|
|
{
|
|
public static string ExpFlexiVer { get; set; } = string.Empty;
|
|
public static string ExpFlexiRev { get; set; } = string.Empty;
|
|
public static string WonwooFirmware { get; set; } = string.Empty;
|
|
public static string LatestVersion { get; set; } = string.Empty;
|
|
public static int PowerConsumption { get; set; } = 0;
|
|
public static string LicencingServerURL { get; set; } = string.Empty;
|
|
}
|
|
|
|
public class CameraAccessInfo
|
|
{
|
|
public static string Processor { get; set; } = string.Empty;
|
|
public static bool VaxtorLic { get; set; } = false;
|
|
public static string HardwareExtras { get; set; } = string.Empty;
|
|
public static string PowerType { get; set; } = string.Empty;
|
|
public static double LED_V { get; set; } = 0;
|
|
public static int LED_I { get; set; } = 0;
|
|
public static string SpreadsheetID { get; set; } = string.Empty;
|
|
}
|
|
}
|