Files
GenericTeProgramLibrary/Source/Program/Actions/SendCoeAdnucMsgToUutAction.cs
2025-10-24 15:18:11 -07:00

131 lines
4.8 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.Threading;
using NLog;
using Raytheon.Common.Coe;
using Raytheon.Instruments;
namespace ProgramLib
{
/// <summary>
/// Send COE Message to UUT
/// </summary>
internal class SendCoeAdnucMsgToUutAction : BasicAction
{
#region PrivateClassMembers
private static NLog.ILogger _logger;
private string _coeDeviceName;
private string _msgName = "NgsriAdnucStateMsg";
public static Coe.MmgrState mMgrState = Coe.MmgrState.NOT_SET;
#endregion
/// <summary>
/// Constructor
/// </summary>
/// <param name="coeDeviceName">name of COE device</param>
/// <returns></returns>
public SendCoeAdnucMsgToUutAction(string coeDeviceName)
{
_logger = LogManager.GetCurrentClassLogger();
_coeDeviceName = coeDeviceName;
}
/// <summary>
/// Run the action
/// </summary>
/// <returns></returns>
public override void Run()
{
try
{
_logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
if (Program.Instance().IsUutPwrOn)
{
CoeResponseMsgData missionManagerMsg = null;
bool firstMissionManagerMsgReceived = false;
const int MAX_RETRIES = 5;
int retry = 0;
CoeFieldData val = null;
mMgrState = Coe.MmgrState.NOT_SET;
Coe.MmgrState desiredMmgrState = Coe.MmgrState.CALIBRATION;
string missionManagerMessageName = "MissionManagerMsgLL";
_logger.Info($"Waiting for message {missionManagerMessageName}");
do
{
Thread.Sleep(1000);
missionManagerMsg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.GetNextResponseInQueue(_coeDeviceName, missionManagerMessageName);
if (missionManagerMsg != null)
{
if (!firstMissionManagerMsgReceived)
firstMissionManagerMsgReceived = true;
val = missionManagerMsg.GetFieldData("data.mmgrState");
if (Enum.TryParse(val.FieldValue, out mMgrState))
{
_logger.Info($"Current mission state: {mMgrState.ToString()}");
if (mMgrState == desiredMmgrState)
break;
}
else
{
_logger.Warn($"Invalid mission state: {val.FieldValue}");
}
}
} while (retry++ < MAX_RETRIES && (missionManagerMsg == null || mMgrState != desiredMmgrState));
if (!firstMissionManagerMsgReceived)
{
throw new Exception($"Timed out waiting for Mission Manager's state message");
}
if (mMgrState != desiredMmgrState)
{
throw new Exception($"Timed out waiting for Mission Manager to transition to {desiredMmgrState}");
}
Thread.Sleep(1000);
Message msg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.CreateMessage(_coeDeviceName, _msgName);
string adnucState = "2";
msg.Set("data.adnucState", adnucState);
var parms = msg.GetParameters();
_logger.Info($"Sending {_msgName}, adnucState={adnucState}");
Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.SendMessage(_coeDeviceName, _msgName, parms);
}
else
{
throw new Exception("Cannot send message to UUT because UUT is not powered on.");
}
}
catch (Exception)
{
throw;
}
}
}
}