2025-09-02 15:32:24 +01:00
using System.Data.OleDb ;
namespace AiQ_GUI
{
class Access
{
2025-10-21 15:46:28 +01:00
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;" ;
2025-09-02 15:32:24 +01:00
// Reads camera model numbers and descriptions from the database, sorts them alphabetically by model number (except "AB12CD", which appears last), and formats each entry as "ModelNumber - Description".
public static string [ ] ReadCamTypes ( )
{
2025-10-17 14:26:33 +01:00
List < Tuple < string , string > > modelTuples = new ( 30 ) ; // Preallocate list with estimated capacity to reduce internal resizing
2025-09-02 15:32:24 +01:00
using OleDbConnection conn = new ( connString ) ;
try
{
conn . Open ( ) ;
}
catch
{
MessageBox . Show ( "Could not access Access in google drive. Is it running?" ) ;
return null ;
}
const string query = "SELECT ModelNumber, Description FROM AiQ WHERE MarkNumber > 1" ;
using OleDbCommand cmd = new ( query , conn ) ;
using OleDbDataReader reader = cmd . ExecuteReader ( ) ;
while ( reader . Read ( ) )
{
// Extract each model number and description, using empty string if null
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: push "AB12CD" to the bottom, then sort remaining items alphabetically
IOrderedEnumerable < Tuple < string , string > > sorted = modelTuples . OrderBy ( t = > t . Item1 . Equals ( "AB12CD" , StringComparison . OrdinalIgnoreCase ) ? 1 : 0 )
. ThenBy ( t = > t . Item1 , StringComparer . OrdinalIgnoreCase ) ;
2025-10-17 14:26:33 +01:00
conn . Close ( ) ;
2025-09-02 15:32:24 +01:00
// Format the sorted tuples as "ModelNumber - Description" strings and return as array
return sorted . Select ( t = > $"{t.Item1} - {t.Item2}" ) . ToArray ( ) ;
}
// Read the universal data table from the database and populate the UniversalData class with the values.
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" ; // Grab the universal data
using OleDbCommand cmd = new ( query , conn ) ;
using OleDbDataReader reader = cmd . ExecuteReader ( ) ;
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" ] ) ;
2025-10-17 14:26:33 +01:00
conn . Close ( ) ;
2025-09-02 15:32:24 +01:00
}
// Knowing the model number on test, this function reads the database and populates the Camera class with the values.
public static void ReadModelRow ( string ModelOnTest )
{
using OleDbConnection conn = new ( connString ) ;
try
{
conn . Open ( ) ;
}
catch
{
MessageBox . Show ( "Could not access Access in google drive. Is it running?" ) ;
return ;
}
string query = $"SELECT * FROM AiQ WHERE ModelNumber = '{ModelOnTest}';" ; // Grab all the info for specified model
using OleDbCommand cmd = new ( query , conn ) ;
using OleDbDataReader reader = cmd . ExecuteReader ( ) ;
reader . Read ( ) ;
// Populate the CameraAccessInfo class with the values from the database
CameraAccessInfo . Processor = Convert . ToString ( reader [ "Processor" ] ) ;
CameraAccessInfo . VaxtorLic = Convert . ToBoolean ( reader [ "Vaxtor" ] ) ;
CameraAccessInfo . HardwareExtras = Convert . ToString ( reader [ "HardwareExtras" ] ) ;
CameraAccessInfo . PowerType = Convert . ToString ( reader [ "PowerType" ] ) ;
CameraAccessInfo . LED_V = Convert . ToDouble ( reader [ "LEDVoltage" ] ) ;
CameraAccessInfo . LED_I = Convert . ToInt32 ( reader [ "LEDCurrent" ] ) ;
CameraAccessInfo . SpreadsheetID = Convert . ToString ( reader [ "SSID" ] ) ;
2025-10-17 14:26:33 +01:00
conn . Close ( ) ;
2025-09-02 15:32:24 +01:00
}
2025-10-21 15:46:28 +01:00
public static void Stats ( string TypeOfTest , string modelNumber )
{
Stats ( [ TypeOfTest ] , modelNumber ) ;
}
2025-10-17 12:06:36 +01:00
2025-10-21 15:46:28 +01:00
public static void Stats ( string [ ] TypeOfTest , string modelNumber )
{
using OleDbConnection conn = new ( connString ) ; // Opens connection to Access database
try
{
conn . Open ( ) ; // Opens DB
foreach ( string type in TypeOfTest )
{
string query = $"UPDATE AiQ SET [{type}] = [{type}] + 1 WHERE [ModelNumber] = ?" ; // Add one for every test ran of this type for this model number
using OleDbCommand cmd = new ( query , conn ) ; // Create command
cmd . Parameters . AddWithValue ( "?" , modelNumber ) ; // Add model number to prevent injection
int rowsAffected = cmd . ExecuteNonQuery ( ) ;
// Execute the command and get the number of rows affected
//if (rowsAffected > 0) // If one or more rows were updated
// AddToActionsList($"Updated {TypeOfTest} for {modelNumber}");
//else
// AddToActionsList($"No rows found for {modelNumber}");
}
conn . Close ( ) ;
}
catch
{
MainForm . Instance . AddToActionsList ( "Could not access Access in Google Drive. Is it running?" ) ;
return ;
}
}
2025-10-17 12:06:36 +01:00
2025-10-21 15:46:28 +01:00
public static void StatsDiags ( string redDiagLabels , string RhTxBxActionsText , string ModelNumber )
{
using OleDbConnection conn = new ( connString ) ;
conn . Open ( ) ;
// Null checks
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 ( ) ;
conn . Close ( ) ;
//if (rows > 0)
// AddToActionsList($"DiagsStats inserted ({rows} row) for model '{model}' on {DateTime.Now:yyyy-MM-dd}");
//else
// AddToActionsList("No rows inserted into DiagsStats (unexpected).");
}
}
2025-10-17 12:06:36 +01:00
2025-09-02 15:32:24 +01:00
// Expected universal data for the GUI, read from the database
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 ;
}
// One object to contain all the camera info from the model info access database
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 ;
}
}