223 lines
10 KiB
C#
223 lines
10 KiB
C#
/*-------------------------------------------------------------------------
|
|
// UNCLASSIFIED
|
|
/*-------------------------------------------------------------------------
|
|
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
|
|
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
|
|
AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
|
|
UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
|
|
RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
|
|
CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
|
|
OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
|
|
COMPANY.
|
|
|
|
THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
|
|
GOVERNMENT.
|
|
|
|
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
|
|
-------------------------------------------------------------------------*/
|
|
using System;
|
|
using System.Text.RegularExpressions;
|
|
using System.Xml;
|
|
using NLog;
|
|
using static MeasurementManagerLib.SwitchMeasurementManager;
|
|
|
|
namespace ProgramLib
|
|
{
|
|
/// <summary>
|
|
/// Class that manages anything to do with Special Test Equipment (STE)
|
|
/// </summary>
|
|
internal class TestStation
|
|
{
|
|
#region PrivateClassMembers
|
|
private static NLog.ILogger _logger;
|
|
|
|
#endregion
|
|
|
|
public TestStation()
|
|
{
|
|
_logger = LogManager.GetCurrentClassLogger();
|
|
|
|
Program.Instance().InitializeSwitchMeasurementManager();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Perform cable checks
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <returns></returns>
|
|
public void PerformCableChecks()
|
|
{
|
|
try
|
|
{
|
|
if (Program.Instance().IsThereHardware)
|
|
{
|
|
if (Program.Instance().UutInfo.UniversalCableId == UutInfo.UniversalCable.NOT_SET)
|
|
{
|
|
if (CableCheck(ProgramSpecificConfigIni.W1_CABLE_PART_NUMBER.ToString()))
|
|
{
|
|
Program.Instance().UutInfo.UniversalCableId = UutInfo.UniversalCable.W1;
|
|
CableCheck(ProgramSpecificConfigIni.W1_CABLE_SERIAL_NUMBER.ToString());
|
|
}
|
|
}
|
|
|
|
if (Program.Instance().UutInfo.UniversalCableId == UutInfo.UniversalCable.NOT_SET)
|
|
{
|
|
if (CableCheck(ProgramSpecificConfigIni.W2_CABLE_PART_NUMBER.ToString()))
|
|
{
|
|
Program.Instance().UutInfo.UniversalCableId = UutInfo.UniversalCable.W2;
|
|
CableCheck(ProgramSpecificConfigIni.W2_CABLE_SERIAL_NUMBER.ToString());
|
|
}
|
|
}
|
|
|
|
if (Program.Instance().UutInfo.UniversalCableId == UutInfo.UniversalCable.NOT_SET)
|
|
{
|
|
throw new Exception($"Universal cable ({UutInfo.UniversalCable.W1.ToString()}/{UutInfo.UniversalCable.W2.ToString()}) is not connected.");
|
|
}
|
|
|
|
// check if UUT is SELF_TEST Cable
|
|
if (Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.NOT_SET)
|
|
{
|
|
if (CableCheck(ProgramSpecificConfigIni.W5_CABLE_PART_NUMBER.ToString()))
|
|
{
|
|
Program.Instance().UutInfo.UutBuildLevel = UutInfo.BuildLevel.SELF_TEST;
|
|
CableCheck(ProgramSpecificConfigIni.W5_CABLE_SERIAL_NUMBER.ToString());
|
|
}
|
|
}
|
|
|
|
// check for W3 Cable
|
|
if (CableCheck(ProgramSpecificConfigIni.W3_CABLE_PART_NUMBER.ToString()))
|
|
{
|
|
CableCheck(ProgramSpecificConfigIni.W3_CABLE_SERIAL_NUMBER.ToString());
|
|
if (Program.Instance().UutInfo.UutBuildLevel != UutInfo.BuildLevel.SELF_TEST)
|
|
{
|
|
Program.Instance().UutInfo.UutBuildLevel = UutInfo.BuildLevel.GMA;
|
|
}
|
|
Program.Instance().UutInfo.SacrificialCableId = UutInfo.SacrificialCable.W3;
|
|
}
|
|
|
|
// check for W4 Cable
|
|
if (Program.Instance().UutInfo.SacrificialCableId == UutInfo.SacrificialCable.NOT_SET)
|
|
{
|
|
if (CableCheck(ProgramSpecificConfigIni.W4_CABLE_PART_NUMBER.ToString()))
|
|
{
|
|
CableCheck(ProgramSpecificConfigIni.W4_CABLE_SERIAL_NUMBER.ToString());
|
|
if (Program.Instance().UutInfo.UutBuildLevel != UutInfo.BuildLevel.SELF_TEST)
|
|
{
|
|
Program.Instance().UutInfo.UutBuildLevel = UutInfo.BuildLevel.AUR;
|
|
}
|
|
Program.Instance().UutInfo.SacrificialCableId = UutInfo.SacrificialCable.W4;
|
|
}
|
|
}
|
|
|
|
if (Program.Instance().UutInfo.SacrificialCableId == UutInfo.SacrificialCable.NOT_SET)
|
|
{
|
|
throw new Exception($"Sacrificial cable ({UutInfo.SacrificialCable.W3.ToString()}/{UutInfo.SacrificialCable.W4.ToString()}) is not connected.");
|
|
}
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verify if cable self test has been run
|
|
/// </summary>
|
|
public bool VerifyCableSelfTestHasRun()
|
|
{
|
|
bool enforceSelfTestHasRun = false;
|
|
|
|
try
|
|
{
|
|
string val = Program.Instance().ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.ENFORCE_CABLE_SELF_TEST_IS_RUN.ToString());
|
|
|
|
if (String.Equals(val, "true", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
enforceSelfTestHasRun = true;
|
|
}
|
|
}
|
|
catch (Exception) { }
|
|
|
|
if (enforceSelfTestHasRun)
|
|
{
|
|
if (!Program.Instance().CableSelfTestHasRun && Program.Instance().IsThereHardware)
|
|
{
|
|
if (Program.Instance().UutInfo.UutBuildLevel != UutInfo.BuildLevel.SELF_TEST)
|
|
{
|
|
if (Program.Instance().UutInfo.UniversalCableId != UutInfo.UniversalCable.NOT_SET
|
|
&& Program.Instance().UutInfo.SacrificialCableId != UutInfo.SacrificialCable.NOT_SET)
|
|
{
|
|
XmlDocumentWrapper doc = new XmlDocumentWrapper(Program.Instance().FileAndFolderManager.GetFile(FileAndFolderManager.Files.CABLE_SELF_TEST_RUN_LOG));
|
|
XmlNode node = doc.GetNode(CableSelfTestConfigXml.SelfTestPath);
|
|
|
|
bool selfTestAlreadyRanToday = false;
|
|
while (node != null)
|
|
{
|
|
if (node.Attributes[CableSelfTestConfigXml.UniversalCableAttributeName] != null && String.Equals(node.Attributes[CableSelfTestConfigXml.UniversalCableAttributeName].Value, Program.Instance().UutInfo.UniversalCableId.ToString(), StringComparison.OrdinalIgnoreCase)
|
|
&& node.Attributes[CableSelfTestConfigXml.SacrificialCableAttributeName] != null && String.Equals(node.Attributes[CableSelfTestConfigXml.SacrificialCableAttributeName].Value, Program.Instance().UutInfo.SacrificialCableId.ToString(), StringComparison.OrdinalIgnoreCase)
|
|
&& node.Attributes[CableSelfTestConfigXml.LastRunDateAttributeName] != null)
|
|
{
|
|
|
|
string lastRunDateStr = node.Attributes[CableSelfTestConfigXml.LastRunDateAttributeName].Value;
|
|
|
|
DateTime lastRunDate = DateTime.Parse(lastRunDateStr);
|
|
|
|
if (lastRunDate == DateTime.Now.Date)
|
|
selfTestAlreadyRanToday = true;
|
|
|
|
break;
|
|
}
|
|
node = node.NextSibling;
|
|
}
|
|
|
|
if (!selfTestAlreadyRanToday)
|
|
{
|
|
throw new Exception($"Please run self-test on cables {Program.Instance().UutInfo.UniversalCableId} + {Program.Instance().UutInfo.SacrificialCableId}.");
|
|
}
|
|
}
|
|
else
|
|
throw new Exception("Please perform cable checks before cable self-test enforcement can begin.");
|
|
}
|
|
else
|
|
Program.Instance().CableSelfTestHasRun = true;
|
|
}
|
|
else
|
|
Program.Instance().CableSelfTestHasRun = true;
|
|
}
|
|
else
|
|
Program.Instance().CableSelfTestHasRun = true;
|
|
|
|
|
|
return Program.Instance().CableSelfTestHasRun;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Verify cable id
|
|
/// </summary>
|
|
/// <param name="name"></param>
|
|
/// <returns></returns>
|
|
private bool CableCheck(string iniRelayKeyName)
|
|
{
|
|
bool checkPass = false;
|
|
|
|
string relayName = Program.Instance().ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.CABLE_ID_RELAYS.ToString(), iniRelayKeyName);
|
|
|
|
DMMResistanceMeasurementFields dmmResistanceMeasurementInfo = Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.DmmResistanceMeasurements[relayName];
|
|
double testResult = Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.DmmReadResistance(relayName);
|
|
|
|
string cableAndPinId = dmmResistanceMeasurementInfo._cableAndPinId;
|
|
if (Program.Instance().UutInfo.UniversalCableId == UutInfo.UniversalCable.W2 || Regex.IsMatch(relayName, UutInfo.UniversalCable.W2.ToString() + @"_", RegexOptions.IgnoreCase))
|
|
cableAndPinId = Regex.Replace(cableAndPinId, UutInfo.UniversalCable.W1.ToString() + @"_", UutInfo.UniversalCable.W2.ToString() + @"_", RegexOptions.IgnoreCase);
|
|
string description = $"{relayName}, {cableAndPinId} Measured {Util.AutoFormatNumberToString(testResult)} Range [{Util.AutoFormatNumberToString(dmmResistanceMeasurementInfo._lowerLimit)}, {Util.AutoFormatNumberToString(dmmResistanceMeasurementInfo._upperLimit)}]";
|
|
_logger.Info(description);
|
|
if (testResult >= dmmResistanceMeasurementInfo._lowerLimit && testResult <= dmmResistanceMeasurementInfo._upperLimit)
|
|
{
|
|
checkPass = true;
|
|
}
|
|
|
|
return checkPass;
|
|
}
|
|
}
|
|
}
|