/*-------------------------------------------------------------------------
// 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
{
///
/// Class that manages anything to do with Special Test Equipment (STE)
///
internal class TestStation
{
#region PrivateClassMembers
private static NLog.ILogger _logger;
#endregion
public TestStation()
{
_logger = LogManager.GetCurrentClassLogger();
Program.Instance().InitializeSwitchMeasurementManager();
}
///
/// Perform cable checks
///
///
///
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;
}
}
///
/// Verify if cable self test has been run
///
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;
}
///
/// Verify cable id
///
///
///
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;
}
}
}