Files
DP44/DataPRO/Reports/DiagnosticsReport.cs
2026-04-17 14:55:32 -04:00

460 lines
21 KiB
C#

using System;
using System.Linq;
using System.Data;
using System.IO;
namespace DTS.Reports
{
public class DiagnosticsReport : ReportBase
{
private enum DASFields
{
DAS,
FW,
CalDate,
DueDate,
Connection,
Input,
Battery
}
private enum AnalogFields
{
ExportNum,
DAS,
Module,
Channel,
Object,
Sens,
Desc,
Exc,
Offset,
Shunt,
Range,
Noise
}
private enum SquibFields
{
DAS,
Module,
Channel,
Desc,
ISO,
FireMode,
Delay,
Duration
}
public class AnalogHelper
{
public enum ResultStatus
{
Passed,
Failed,
NotTested
}
public int ExportNum { get; set; }
public string DAS { get; set; }
public string Module { get; set; }
public string Channel { get; set; }
public string Object { get; set; }
public string SensorSerialNumber { get; set; }
public string SerialNumberWithAxis { get; set; }
public string Desc { get; set; }
public double ScalefactorMilliVoltsPerADC { get; set; }
public double ActualRangeMv { get; set; }
public double Exc { get; set; }
public ResultStatus ExcStatus { get; set; }
public double Offset { get; set; }
public ResultStatus OffStatus { get; set; }
public double Shunt { get; set; }
public ResultStatus ShuntStatus { get; set; }
public double Range { get; set; }
public ResultStatus RangeStatus { get; set; }
public double Noise { get; set; }
public ResultStatus NoiseStatus { get; set; }
}
public class DASHelper
{
public string DAS { get; set; }
public string Firmware { get; set; }
public DateTime CalDate { get; set; }
public DateTime DueDate { get; set; }
public string Connection { get; set; }
public string Input { get; set; }
public string Battery { get; set; }
}
public class SquibHelper
{
public enum ResultStatus
{
Passed,
Failed,
NotTested
}
public string DAS { get; set; }
public string Module { get; set; }
public string Channel { get; set; }
public string Desc { get; set; }
public string ISO { get; set; }
public string FireMode { get; set; }
public double Delay { get; set; }
public ResultStatus DelayStatus { get; set; }
public double Duration { get; set; }
public ResultStatus DurationStatus { get; set; }
public double Resistance { get; set; }
}
public DiagnosticsReport()
{
}
public static string GetReportFilename(bool isPreTest, string testId)
{
if (false == string.IsNullOrEmpty(testId))
{
return isPreTest
? $"{testId} Pretest Diagnostics {GetFilenameTimeStamp()}.xlsx"
: $"{testId} Post-Test Diagnostics {GetFilenameTimeStamp()}.xlsx";
}
else
{
// Return the template filename
return "Diagnostic Results.xlsx";
}
}
public static string GetReportFilenamePath(bool isPreTest, string reportPath, string testId)
{
var filename = GetReportFilename(isPreTest, testId);
return Path.Combine(reportPath, filename);
}
public void DoReport(DASHelper[] das, AnalogHelper[] analog, SquibHelper[] squib, string outputFileName, string folderNameId, string sensitivityDisplayFormat,
bool generateExcelReports, bool generatePDFReports)
{
var dtDAS = new DataTable();
var dtAnalog = new DataTable();
var dtSquib = new DataTable();
var dtAnalogStyles = new DataTable();
var dtSquibStyles = new DataTable();
var minDate = new DateTime(1970, 1, 1);
try
{
dtAnalog.TableName = "Analog";
dtDAS.TableName = "DAS";
dtSquib.TableName = "Squibs";
var analogFields = Enum.GetValues(typeof(AnalogFields)).Cast<AnalogFields>().ToArray();
foreach (var field in analogFields)
{
var c = dtAnalog.Columns.Add(field.ToString());
var c2 = dtAnalogStyles.Columns.Add(field.ToString(), typeof(int));
switch (field)
{
case AnalogFields.Channel: c.DataType = typeof(string); break;
case AnalogFields.DAS: c.DataType = typeof(string); break;
case AnalogFields.Desc: c.DataType = typeof(string); break;
case AnalogFields.Exc: c.DataType = typeof(double); break;
case AnalogFields.ExportNum: c.DataType = typeof(int); break;
case AnalogFields.Module: c.DataType = typeof(string); break;
case AnalogFields.Noise: c.DataType = typeof(double); break;
case AnalogFields.Object: c.DataType = typeof(string); break;
case AnalogFields.Offset: c.DataType = typeof(double); break;
case AnalogFields.Range: c.DataType = typeof(string); break;
case AnalogFields.Sens: c.DataType = typeof(string); break;
case AnalogFields.Shunt: c.DataType = typeof(double); break;
}
}
var dasFields = Enum.GetValues(typeof(DASFields)).Cast<DASFields>().ToArray();
foreach (var field in dasFields)
{
var c = dtDAS.Columns.Add(field.ToString());
switch (field)
{
case DASFields.Battery: c.DataType = typeof(string); break;
case DASFields.CalDate: c.DataType = typeof(string); break;
case DASFields.Connection: c.DataType = typeof(string); break;
case DASFields.DAS: c.DataType = typeof(string); break;
case DASFields.DueDate: c.DataType = typeof(string); break;
case DASFields.FW: c.DataType = typeof(string); break;
case DASFields.Input: c.DataType = typeof(string); break;
}
}
var squibFields = Enum.GetValues(typeof(SquibFields)).Cast<SquibFields>().ToArray();
foreach (var field in squibFields)
{
var c = dtSquib.Columns.Add(field.ToString());
var c2 = dtSquibStyles.Columns.Add(field.ToString(), typeof(int));
switch (field)
{
case SquibFields.Channel: c.DataType = typeof(string); break;
case SquibFields.DAS: c.DataType = typeof(string); break;
case SquibFields.Delay: c.DataType = typeof(double); break;
case SquibFields.Desc: c.DataType = typeof(string); break;
case SquibFields.Duration: c.DataType = typeof(double); break;
case SquibFields.FireMode: c.DataType = typeof(string); break;
case SquibFields.ISO: c.DataType = typeof(string); break;
case SquibFields.Module: c.DataType = typeof(string); break;
}
}
foreach (var ch in squib)
{
var row = dtSquib.NewRow();
var row2 = dtSquibStyles.NewRow();
foreach (var field in squibFields)
{
object o = null;
row2[field.ToString()] = -1;
switch (field)
{
case SquibFields.Channel: o = ch.Channel; break;
case SquibFields.DAS: o = ch.DAS; break;
case SquibFields.Delay:
o = ch.Delay;
switch (ch.DelayStatus)
{
case SquibHelper.ResultStatus.Failed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Fail;
break;
case SquibHelper.ResultStatus.NotTested:
row2[field.ToString()] = (int)ReportBase.FillStyles.NotTested;
break;
case SquibHelper.ResultStatus.Passed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Pass;
break;
}
break;
case SquibFields.Desc: o = ch.Desc; break;
case SquibFields.Duration:
o = ch.Duration;
switch (ch.DurationStatus)
{
case SquibHelper.ResultStatus.Failed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Fail;
break;
case SquibHelper.ResultStatus.NotTested:
row2[field.ToString()] = (int)ReportBase.FillStyles.NotTested;
break;
case SquibHelper.ResultStatus.Passed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Pass;
break;
}
break;
case SquibFields.FireMode: o = ch.FireMode; break;
case SquibFields.ISO: o = ch.ISO; break;
case SquibFields.Module: o = ch.Module; break;
}
row[field.ToString()] = o;
}
dtSquib.Rows.Add(row);
dtSquibStyles.Rows.Add(row2);
}
foreach (var ch in analog)
{
var row = dtAnalog.NewRow();
var row2 = dtAnalogStyles.NewRow();
foreach (var field in analogFields)
{
object o = null;
row2[field.ToString()] = -1;
switch (field)
{
case AnalogFields.Channel:
o = ch.Channel;
break;
case AnalogFields.DAS: o = ch.DAS; break;
case AnalogFields.Desc: o = ch.Desc; break;
case AnalogFields.Exc:
o = ch.Exc / 1000D;
switch (ch.ExcStatus)
{
case AnalogHelper.ResultStatus.Passed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Pass;
break;
case AnalogHelper.ResultStatus.NotTested:
row2[field.ToString()] = (int)ReportBase.FillStyles.NotTested;
break;
case AnalogHelper.ResultStatus.Failed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Fail;
break;
}
break;
case AnalogFields.ExportNum: o = ch.ExportNum; break;
case AnalogFields.Module: o = ch.Module; break;
case AnalogFields.Noise:
o = ch.Noise;
switch (ch.NoiseStatus)
{
case AnalogHelper.ResultStatus.Failed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Fail;
break;
case AnalogHelper.ResultStatus.NotTested:
row2[field.ToString()] = (int)ReportBase.FillStyles.NotTested;
break;
case AnalogHelper.ResultStatus.Passed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Pass;
break;
}
break;
case AnalogFields.Object: o = ch.Object; break;
case AnalogFields.Offset:
o = ch.Offset;
switch (ch.OffStatus)
{
case AnalogHelper.ResultStatus.Failed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Fail;
break;
case AnalogHelper.ResultStatus.NotTested:
row2[field.ToString()] = (int)ReportBase.FillStyles.NotTested;
break;
case AnalogHelper.ResultStatus.Passed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Pass;
break;
}
break;
case AnalogFields.Range:
if (double.IsInfinity(ch.Range))
{
o = "Infinity";
}
else if (double.IsNaN(ch.Range))
{
o = "---";
}
else
{
o = string.Format("{0:0.00}", ch.Range);
}
switch (ch.RangeStatus)
{
case AnalogHelper.ResultStatus.Failed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Fail;
break;
case AnalogHelper.ResultStatus.NotTested:
row2[field.ToString()] = (int)ReportBase.FillStyles.NotTested;
break;
case AnalogHelper.ResultStatus.Passed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Pass;
break;
}
break;
case AnalogFields.Sens: o = ch.SensorSerialNumber; break;
case AnalogFields.Shunt:
o = ch.Shunt;
switch (ch.ShuntStatus)
{
case AnalogHelper.ResultStatus.Failed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Fail;
break;
case AnalogHelper.ResultStatus.NotTested:
row2[field.ToString()] = (int)ReportBase.FillStyles.NotTested;
break;
case AnalogHelper.ResultStatus.Passed:
row2[field.ToString()] = (int)ReportBase.FillStyles.Pass;
break;
}
break;
}
row[field.ToString()] = o;
}
dtAnalog.Rows.Add(row);
dtAnalogStyles.Rows.Add(row2);
}
foreach (var d in das)
{
var row = dtDAS.NewRow();
foreach (var field in dasFields)
{
object o = null;
switch (field)
{
case DASFields.Battery: o = d.Battery; break;
case DASFields.CalDate:
if (d.CalDate.Year < 1970)
{
o = "";
}
else
{
if (d.CalDate == minDate)
{
o = "--";
}
else
{
o = d.CalDate.ToShortDateString();
}
}
break;
case DASFields.Connection: o = d.Connection; break;
case DASFields.DAS: o = d.DAS; break;
case DASFields.DueDate:
if (d.DueDate.Year < 1970)
{
o = "";
}
else
{
if (d.CalDate == minDate)
{
o = "--";
}
else
{
o = d.DueDate.ToShortDateString();
}
}
break;
case DASFields.FW: o = d.Firmware; break;
case DASFields.Input: o = d.Input; break;
}
row[field.ToString()] = o;
}
dtDAS.Rows.Add(row);
}
TemplateFilename = GetReportFilenamePath(false, GetTemplateReportPath(), string.Empty);
OutputFilename = outputFileName;
if (File.Exists(outputFileName))
{
ReportFileWillBeOverwritten(outputFileName);
try
{
File.Delete(outputFileName);
}
catch (Exception)
{
ReportFileInUse(outputFileName);
}
}
if (generateExcelReports)
{
OutputReport(new DataTable[] { dtDAS, dtAnalog, dtSquib }, new DataTable[] { null, dtAnalogStyles, dtSquibStyles });
CopyReportIfNeeded(folderNameId, outputFileName);
}
if (generatePDFReports)
{
//Make a PDF with the same name
outputFileName = outputFileName.Replace(".xlsx", ".pdf");
//Don't overwrite the Excel file that may be the filled-in template.
DestinationTemplateFilename = OutputFilename.Replace(".xlsx", Common.Constants.TEMP_FILE_EXTENSION);
OutputFilename = outputFileName;
OutputReportPDF(new DataTable[] { dtDAS, dtAnalog, dtSquib }, new DataTable[] { null, dtAnalogStyles, dtSquibStyles }, sensitivityDisplayFormat);
CopyReportIfNeeded(folderNameId, outputFileName);
}
}
finally
{
dtDAS.Dispose();
dtAnalog.Dispose();
dtSquib.Dispose();
}
}
}
}