Files
feanor/Maser.Feanor.Biz/Calibrations.cs
Martijn Dijkstra 6a44bd4fd2 Add project files.
2025-05-08 09:10:15 +02:00

270 lines
8.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Maser.Feanor.Model;
using System.Data.SqlClient;
using System.Globalization;
namespace Maser.Feanor.Biz
{
public class Calibrations
{
public Calibration GetByPK(Int32 PK)
{
string query = String.Format("Select * from Calibrations where PK = {0}", PK);
try
{
return GetByQuery(query);
}
catch (Exception e)
{
throw e;
}
}
public List<Calibration> GetBySensorPK(Int32 SensorPK)
{
// Return all calibrations of sensor
string query = String.Format("Select * from Calibrations where SensorPK = {0} order by Creation desc", SensorPK);
try
{
return GetListByQuery(query);
}
catch (Exception e)
{
throw e;
}
}
public Calibration GetLastCreatedBySensorPK(Int32 SensorPK)
{
string query = String.Format("Select top 1 * from Calibrations where SensorPK = {0} order by Creation desc", SensorPK);
try
{
return GetByQuery(query);
}
catch (Exception e)
{
throw e;
}
}
public bool Equal(Calibration A, Calibration B)
{
// Not equal when values, release or expiry differs
// Values can differ 0.01% and still be equal
if (A.Release != B.Release)
return false;
if (A.Expiry != B.Expiry)
return false;
if (A.Coefficients.Length != B.Coefficients.Length)
return false;
for (int i = 0; i < A.Coefficients.Length; i++)
{
if (B.Coefficients[i] != 0)
{
double d = Math.Abs(A.Coefficients[i] / B.Coefficients[i] - 1);
if (Math.Abs(A.Coefficients[i] / B.Coefficients[i] - 1) > 0.0000001)
return false;
}
else
if (A.Coefficients[i] != 0)
return false;
}
return true;
}
public Int32 Add(Calibration calibration)
{
double c0 = calibration.Coefficients[0];
double c1 = calibration.Coefficients[1];
double c2 = calibration.Coefficients[2];
double c3 = calibration.Coefficients[3];
double X1 = calibration.Xvalues[0];
double X2 = calibration.Xvalues[1];
double X3 = calibration.Xvalues[2];
double X4 = calibration.Xvalues[3];
//string query = String.Format("INSERT INTO Calibrations (SensorPK, Release, Expiry, Creation, c0, c1, c2, c3, U) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}');", calibration.SensorPK, calibration.Release.FormatSQL(),calibration.Expiry.FormatSQL(), calibration.Creation.FormatSQL(), c0,c1,c2,c3, calibration.Uncertainty);
string query = String.Format("INSERT INTO Calibrations (SensorPK, Release, Expiry, Creation, c0, c1, c2, c3, U, X1, X2, X3, X4) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}', '{11}', '{12}');", calibration.SensorPK, calibration.Release.FormatSQL(), calibration.Expiry.FormatSQL(), calibration.Creation.FormatSQL(), c0, c1, c2, c3, calibration.Uncertainty,X1,X2,X3,X4);
query += "SELECT SCOPE_IDENTITY();";
SqlConnection myConnection = new SqlConnection(Properties.Settings.Default.FeanorConnStr);
myConnection.Open();
try
{
SqlCommand myCommand = new SqlCommand(query, myConnection);
return Int32.Parse(myCommand.ExecuteScalar().ToString());
}
catch (Exception e)
{
throw e;
}
finally
{
myConnection.Close();
}
}
private Calibration GetByQuery(string query)
{
Calibration result = null;
SqlConnection myConnection = new SqlConnection(Properties.Settings.Default.FeanorConnStr);
SqlDataReader myReader = null;
try
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(query, myConnection);
myReader = myCommand.ExecuteReader();
if (myReader.HasRows)
{
myReader.Read();
result = FromSqlDataReader(myReader);
//Console.WriteLine(result);
}
// Console.WriteLine(myReader.FieldCount);
myReader.Close();
}
catch (Exception e)
{
// Console.WriteLine(e);
throw e;
}
finally
{
myConnection.Close(); // Martijn
/*
https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx
Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class.
In a finalizer, only release unmanaged resources that your class owns directly.
If your class does not own any unmanaged resources, do not include a Finalize method in your class definition.
For more information, see Garbage Collection.
*/
}
return result;
}
private List<Calibration> GetListByQuery(string query)
{
List<Calibration> result = new List<Calibration>();
SqlDataReader myReader = null;
SqlConnection myConnection = new SqlConnection(Properties.Settings.Default.FeanorConnStr);
try
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand(query, myConnection);
myReader = myCommand.ExecuteReader();
if (myReader.HasRows)
{
while (myReader.Read())
{
result.Add(FromSqlDataReader(myReader));
}
}
}
catch (Exception e)
{
throw e;
}
finally
{
myReader.Close();
myConnection.Close(); // Martijn
/*
https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx
Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class.
In a finalizer, only release unmanaged resources that your class owns directly.
If your class does not own any unmanaged resources, do not include a Finalize method in your class definition.
For more information, see Garbage Collection.
*/
}
return result;
}
private Calibration FromSqlDataReader(SqlDataReader myReader)
{
double c0 = (double)myReader.GetFloat(5);
double c1 = (double)myReader.GetFloat(6);
double c2 = (double)myReader.GetFloat(7);
double c3 = (double)myReader.GetFloat(8);
double U = (double)myReader.GetFloat(9);
double X1 = (double)myReader.GetFloat(10);
double X2 = (double)myReader.GetFloat(11);
double X3 = (double)myReader.GetFloat(12);
double X4 = (double)myReader.GetFloat(13);
double[] c = new double[4] { c0, c1, c2, c3 };
double[] Xvalues = new double[4] { X1, X2, X3, X4 };
Calibration result = new Calibration(
myReader.GetInt32(0),
myReader.GetInt32(1),
myReader.GetDateTime(2),
myReader.GetDateTime(3),
myReader.GetDateTime(4),
c,
U,
Xvalues
);
return result;
}
}
public static class StringExtenions
{
public static bool TryParseToDouble(this String s, out double value)
{
value = 0;
try
{
NumberStyles styles = NumberStyles.AllowExponent | NumberStyles.Number;
value = double.Parse(s, styles);
}
catch
{
return false;
}
return true;
}
}
}