Big changes

This commit is contained in:
Duc
2025-03-13 12:04:22 -07:00
parent c689fcb7f9
commit ffa9905494
748 changed files with 199255 additions and 3743 deletions

View File

@@ -0,0 +1,53 @@
// **********************************************************************************************************
// ChamberException.cs
// 1/8/2024
// NGI - Next Generation Interceptor
//
// Contract No. HQ0856-21-C-0003/1022000209
//
// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
//
// 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.
//
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
//
// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
//
// CONTROLLED BY: MISSILE DEFENSE AGENCY
// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
// CUI CATEGORY: CTI
// DISTRIBUTION/DISSEMINATION CONTROL: F
// POC: Alex Kravchenko (1118268)
// **********************************************************************************************************
using System;
namespace Raytheon.Instruments.Lib
{
public class ChamberException : Exception
{
public ChamberException()
{
}
public ChamberException(string message)
: base(message)
{
}
public ChamberException(string message, Exception inner)
: base(message, inner)
{
}
}
}

View File

@@ -0,0 +1,101 @@
// **********************************************************************************************************
// Constants.cs
// 6/8/2023
// NGI - Next Generation Interceptor
//
// Contract No. HQ0856-21-C-0003/1022000209
//
// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
//
// 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.
//
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
//
// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
//
// CONTROLLED BY: MISSILE DEFENSE AGENCY
// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
// CUI CATEGORY: CTI
// DISTRIBUTION/DISSEMINATION CONTROL: F
// POC: Alex Kravchenko (1118268)
// **********************************************************************************************************
namespace Raytheon.Instruments.Lib
{
public static class Constants
{
// LSPS (ATK) Constants
public const int LSPS_AUTOFILL_STATE_OFF = 0;
public const int LSPS_AUTOFILL_STATE_COOLING = 1;
public const int LSPS_AUTOFILL_STATE_WARMING = 2;
public const int LSPS_BB_CSTATE_LN2_COOLING = 0;
public const int LSPS_BB_CSTATE_CONTROLLING = 1;
public const int LSPS_BB_CSTATE_NOT_CONTROLLING = 2;
public const int LSPS_CHOPPER_STATE_OFF = 10;
public const int LSPS_CHOPPER_STATE_ON = 11;
public const int LSPS_CHOPPER_STATE_MOVING = 12;
public const int LSPS_CHOPPER_STATE_STOP_OPEN = 13;
public const int LSPS_CHOPPER_STATE_STOP_CLOSED = 14;
public const int LSPS_CHOPPER_STATE_FIND_ERROR = 15;
public const int LSPS_CHOPPER_STATE_MOVE_ERROR = 16;
public const int LSPS_CHOPPER_STATE_CHANGE_DIR = 17;
public const int LSPS_CHOPPER_STATE_CHANGE_SPEED = 18;
public const int LSPS_CHOPPER_STATE_LOOKING_FOR_STOP_OPEN = 19;
public const int LSPS_CHOPPER_STATE_LOOKING_FOR_STOP_CLOSED = 20;
public const int LSPS_GALIL_WSTATUS_NEEDS_HOME = 0;
public const int LSPS_GALIL_WSTATUS_HOMING = 1;
public const int LSPS_GALIL_WSTATUS_MOVING = 2;
public const int LSPS_GALIL_WSTATUS_HOME_SWITCH_ERR = 3;
public const int LSPS_GALIL_WSTATUS_POS_SWITCH_ERR = 4;
public const int LSPS_GALIL_WSTATUS_FIND_POS_ERR = 5;
public const int LSPS_GALIL_WSTATUS_FIND_HOME_ERR = 6;
public const int LSPS_GALIL_WSTATUS_IN_POSITION = 7;
public const int LSPS_GALIL_WSTATUS_TIMEOUT = 8;
public const int LSPS_GALIL_SM_STATUS_LIMIT_SWITCH_ERR = -3;
public const int LSPS_GALIL_SM_STATUS_NEEDS_HOME = -2;
public const int LSPS_GALIL_SM_STATUS_MOVING = -1;
public const int LSPS_GALIL_SM_STATUS_IN_POSITION = 0;
public const int LSPS_GALIL_SM_STATUS_VELOCITY = 1;
public const int LSPS_GALIL_SM_CSTATUS_BEGINNING_OF_ROUTINE = -1;
public const int LSPS_GALIL_SM_CSTATUS_COMPLETED_ROUTINE = 1;
public const int LSPS_GALIL_SM_PSTATUS_PROFILE_ITT_ERR = -1;
public const int LSPS_GALIL_SM_PSTATUS_NO_PROFILE_LOADED = 0;
public const int LSPS_GALIL_SM_PSTATUS_LOADING_PROFILE = 1;
public const int LSPS_GALIL_SM_PSTATUS_FINISHED_LOADING_PROFILE = 2;
public const int LSPS_GALIL_SM_PSTATUS_MOVING_TO_START = 3;
public const int LSPS_GALIL_SM_PSTATUS_FINISHED_MOVING_TO_START = 4;
public const int LSPS_GALIL_SM_PSTATUS_RUNNING_PROFILE = 5;
public const int LSPS_NEEDS_HOME = 0;
public const int LSPS_TW_POS_HOME = 1;
public const int LSPS_TW_STATUS_HOMING = 1;
public const int LSPS_TW_STATUS_MOVING = 2;
public const int LSPS_TW_STATUS_HOME_SWITCH_ERR = 3;
public const int LSPS_TW_STATUS_POS_SWITCH_ERR = 4;
public const int LSPS_TW_STATUS_FIND_POS_ERR = 5;
public const int LSPS_TW_STATUS_FIND_HOME_ERR = 6;
public const int LSPS_TW_STATUS_IN_POSITION = 7;
public const int LSPS_FW_POS_MOVING = -1;
public const int LSPS_FW_POS_NEEDS_HOME = -2;
public const int LSPS_FW_POS_LIMIT_SW_ERR = -3;
public const int LSPS_FW_POS_HOME = 1;
public const int LSPS_FW_STATUS_HOMING = 1;
public const int LSPS_FW_STATUS_MOVING = 2;
public const int LSPS_FW_STATUS_HOME_SW_ERR = 3;
public const int LSPS_FW_STATUS_POS_SW_ERR = 4;
public const int LSPS_FW_STATUS_FIND_POS_ERR = 5;
public const int LSPS_FW_STATUS_FIND_HOME_ERR = 6;
public const int LSPS_FW_STATUS_IN_POSITION = 7;
public const int LSPS_FW_STATUS_TIMEOUT = 8;
}
}

View File

@@ -0,0 +1,273 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
/// <summary>
/// Class for TCP client communication
/// </summary>
internal class TcpClientSock
{
private Socket sock_;
private string remoteAddress_;
private int remotePort_;
IPEndPoint remoteEP_;
IPAddress ipAddress_ = null;
private static object _syncObj = new object();
/// <summary>
/// Constructor
/// </summary>
/// <param name="remoteAddress"></param>
/// <param name="remotePort"></param>
public TcpClientSock(string remoteAddress, int remotePort)
{
remoteAddress_ = remoteAddress;
remotePort_ = remotePort;
// if remoteAddress is a hostname
if (!IPAddress.TryParse(remoteAddress_, out ipAddress_))
{
string preferredSubnet = "";
IPHostEntry host = Dns.GetHostEntry(remoteAddress_);
foreach (IPAddress ip in host.AddressList)
{
AddressFamily af = ip.AddressFamily;
if (af == AddressFamily.InterNetwork)
{
if (preferredSubnet != String.Empty)
{
if (Regex.IsMatch(ip.ToString(), preferredSubnet, RegexOptions.IgnoreCase))
ipAddress_ = ip;
}
else
ipAddress_ = ip;
if (ipAddress_ != null)
break;
}
}
}
if (ipAddress_ != null)
{
remoteEP_ = new IPEndPoint(ipAddress_, remotePort_);
}
else
throw new Exception("Unable to connect to " + remoteAddress_);
sock_ = new Socket(ipAddress_.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
}
/// <summary>
/// Connect to remote host
/// </summary>
/// <returns></returns>
public void Connect()
{
lock (_syncObj)
{
try
{
if (!sock_.Connected && IsRemoteHostAlive())
sock_.Connect(remoteEP_);
}
catch (ObjectDisposedException)
{
sock_ = new Socket(ipAddress_.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
if (IsRemoteHostAlive())
sock_.Connect(remoteEP_);
}
catch (Exception) { throw; }
}
}
/// <summary>
/// Disconnect from remote host
/// </summary>
/// <returns></returns>
public void Disconnect()
{
lock (_syncObj)
{
if (sock_.Connected)
{
sock_.Shutdown(SocketShutdown.Both);
sock_.Disconnect(true);
sock_.Close();
}
}
}
/// <summary>
/// Ping if remote host is alive
/// </summary>
/// <returns>true/false</returns>
bool IsRemoteHostAlive()
{
bool isRemoteHostAlive = true;
//Do a ping test to see if the server is reachable
try
{
Ping pingTest = new Ping();
PingReply reply = pingTest.Send(ipAddress_);
if (reply.Status != IPStatus.Success)
isRemoteHostAlive = false;
}
catch (PingException)
{
isRemoteHostAlive = false;
}
//See if the tcp state is ok
if (sock_.Poll(5000, SelectMode.SelectRead) && (sock_.Available == 0))
{
isRemoteHostAlive = false;
}
return isRemoteHostAlive;
}
/// <summary>
/// Send Command and Get Response
/// </summary>
/// <param name="command"></param>
/// <param name="responseTimeOutMs"></param>
/// <param name="responseBufSize"></param>
/// <returns>response in ASCII format</returns>
public string SendCommandAndGetResponse(string command, int responseTimeOutMs = 5000, int responseBufSize = 1024)
{
byte[] bytes = new byte[responseBufSize];
sock_.ReceiveTimeout = responseTimeOutMs;
int bytesRec = 0;
byte[] msg = Encoding.ASCII.GetBytes(command);
lock (_syncObj)
{
sock_.Send(msg);
try
{
bytesRec = sock_.Receive(bytes);
}
catch (SocketException ex)
{
throw new Exception("SocketException Error Code: " + ex.ErrorCode + $" ({((SocketError)ex.ErrorCode).ToString()})");
}
}
return Encoding.ASCII.GetString(bytes, 0, bytesRec);
}
/// <summary>
/// Read data from the device.
/// </summary>
/// <param name="dataBuf"></param>
/// <param name="responseTimeOutMs"></param>
/// <returns>The number of bytes read</returns>
public int Read(ref byte[] dataBuf, int responseTimeOutMs = 5000)
{
int bytesRec = 0;
sock_.ReceiveTimeout = responseTimeOutMs;
lock (_syncObj)
{
try
{
bytesRec = sock_.Receive(dataBuf);
}
catch (SocketException)
{
bytesRec = 0;
}
}
return bytesRec;
}
/// <summary>
/// Write data to device.
/// </summary>
/// <param name="dataBuf"></param>
/// <returns>The number of bytes written</returns>
public int Write(byte[] dataBuf)
{
int bytesWritten = 0;
lock (_syncObj)
{
try
{
bytesWritten = sock_.Send(dataBuf);
}
catch (SocketException)
{
bytesWritten = 0;
}
}
return bytesWritten;
}
/// <summary>
/// Write data to device.
/// </summary>
/// <param name="data"></param>
/// <returns>The number of bytes written</returns>
public int Write(string data)
{
int bytesWritten = 0;
byte[] msg = Encoding.ASCII.GetBytes(data);
lock (_syncObj)
{
try
{
bytesWritten = sock_.Send(msg);
}
catch (SocketException)
{
bytesWritten = 0;
}
}
return bytesWritten;
}
/// <summary>
/// Clear Hardware Receiver Buffer of residual data
/// </summary>
/// <returns>none</returns>
public void ClearReceiveBuffer()
{
byte[] bytes = new byte[1024];
sock_.ReceiveTimeout = 100;
int bytesRec = 0;
lock (_syncObj)
{
do
{
try
{
bytesRec = sock_.Receive(bytes);
}
catch (SocketException)
{
bytesRec = 0;
}
} while (bytesRec > 0);
}
}
}
}

View File

@@ -0,0 +1,137 @@
// **********************************************************************************************************
// LSPSMotionFactory.cs
// 1/8/2024
// NGI - Next Generation Interceptor
//
// Contract No. HQ0856-21-C-0003/1022000209
//
// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
//
// 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.
//
// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
//
// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
//
// CONTROLLED BY: MISSILE DEFENSE AGENCY
// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
// CUI CATEGORY: CTI
// DISTRIBUTION/DISSEMINATION CONTROL: F
// POC: Alex Kravchenko (1118268)
// **********************************************************************************************************
using NLog;
using Raytheon.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.Reflection;
namespace Raytheon.Instruments
{
[ExportInstrumentFactory(ModelNumber = "LspsChamberFactory")]
public class LpspChamberFactory : IInstrumentFactory
{
/// <summary>
/// The supported interfaces
/// </summary>
private readonly List<Type> _supportedInterfaces = new List<Type>();
private static ILogger _logger;
private readonly IConfigurationManager _configurationManager;
private const string DefaultConfigPath = @"C:\ProgramData\Raytheon\InstrumentManagerService";
private static string DefaultPath;
public LpspChamberFactory(string defaultConfigPath = DefaultConfigPath)
: this(null, defaultConfigPath)
{
}
/// <summary>
/// COECommDeviceInstrumentFactory injection constructor
/// </summary>
/// <param name="configManager"></param>
/// <param name="simEngine"></param>
/// <param name="logger"></param>
[ImportingConstructor]
public LpspChamberFactory([Import(AllowDefault = false)] IConfigurationManager configManager,
[Import(AllowDefault = true)] string defaultConfigPath = null)
{
DefaultPath = defaultConfigPath;
_logger = LogManager.GetCurrentClassLogger();
if (NLog.LogManager.Configuration == null)
{
var assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(assemblyFolder + "\\nlog.config");
}
_configurationManager = configManager ?? GetConfigurationManager();
_supportedInterfaces.Add(typeof(ILspsChamber));
}
/// <summary>
/// Gets the instrument
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public IInstrument GetInstrument(string name)
{
try
{
_logger = LogManager.GetLogger(name);
return new LspsChamber(name, _configurationManager, _logger);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// Gets the instrument
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public object GetInstrument(string name, bool simulateHw)
{
try
{
_logger = LogManager.GetLogger(name);
return new LspsChamber(name, _configurationManager, _logger);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// Gets supported interfaces
/// </summary>
/// <returns></returns>
public ICollection<Type> GetSupportedInterfaces()
{
return _supportedInterfaces.ToArray();
}
/// <summary>
/// returns configuration based on the predefined path or default path c:/ProgramData/Raytheon/InstrumentManagerService
/// </summary>
/// <returns></returns>
private static IConfigurationManager GetConfigurationManager()
{
return string.IsNullOrEmpty(DefaultPath) ? new RaytheonConfigurationManager() : new RaytheonConfigurationManager(DefaultPath);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="$(SolutionDir)Solution.props" />
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<AssemblyName>Raytheon.Instruments.LspsChamber</AssemblyName>
<Product>LSPS Chamber implementation</Product>
<Description>LSPS Chamber implementation</Description>
<OutputType>Library</OutputType>
<!-- Static versioning (Suitable for Development) -->
<!-- Disable the line below for dynamic versioning -->
<Version>1.0.0</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="5.0.0" />
<PackageReference Include="Raytheon.Common" Version="1.0.0" />
<PackageReference Include="Raytheon.Instruments.LspsChamber.Contracts" Version="1.0.0" />
</ItemGroup>
<!-- Copy all *.dlls and *.pdb in the output folder to a temp folder -->
<Target Name="CopyFiles" AfterTargets="AfterBuild">
<ItemGroup>
<FILES_1 Include="$(OutDir)*.dll" />
<FILES_2 Include="$(OutDir)*.pdb" />
</ItemGroup>
<Copy SourceFiles="@(FILES_1)" DestinationFolder="$(HalTempFolder)" />
<Copy SourceFiles="@(FILES_2)" DestinationFolder="$(HalTempFolder)" />
</Target>
</Project>

View File

@@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
internal class LspsResponse
{
public enum CommandType
{
GET,
SET
}
public CommandType commandType_ = CommandType.GET;
public readonly bool successful_ = true;
// this text_ can be an error message for a SET command or can be a value from a GET command
public readonly string text_ = String.Empty;
public LspsResponse(string response)
{
string str = String.Empty;
Match regexMatch;
regexMatch = Regex.Match(response, @"result=([^\s]+).(.+)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
if (regexMatch.Success)
{
commandType_ = CommandType.SET;
if (regexMatch.Groups[1].Value == "0")
{
successful_ = false;
}
text_ = regexMatch.Groups[2].Value;
}
else if (Regex.IsMatch(response, @"error:.+", RegexOptions.IgnoreCase | RegexOptions.Singleline))
{
commandType_ = CommandType.SET;
successful_ = false;
text_ = response;
}
// process response for SET command
text_ = Regex.Replace(text_, @"error:.(.+)", "$1", RegexOptions.IgnoreCase | RegexOptions.Singleline);
text_ = Regex.Replace(text_, @"([^\r]+).+", "$1", RegexOptions.IgnoreCase | RegexOptions.Singleline);
// process response for GET command
if (commandType_ != CommandType.SET)
{
MatchCollection matches = Regex.Matches(response, @"[^\s=]+=[^\s=,]+", RegexOptions.IgnoreCase | RegexOptions.Singleline);
// if there are multiple data points, we return all the data in a string delimited by comma
if (matches.Count > 1)
{
text_ = String.Empty;
foreach (Match match in matches)
{
if (text_.Length > 0)
{
text_ += ",";
}
text_ += Regex.Replace(match.Value, @"[^=]+=([^=]+)", "$1", RegexOptions.IgnoreCase | RegexOptions.Singleline);
}
}
else
{
text_ = Regex.Replace(response, @"[^=]+=([^\r]+).+", "$1", RegexOptions.IgnoreCase | RegexOptions.Singleline);
}
}
}
}
}

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
public static class Autofill
{
public enum Command
{
COOLDOWN,
WARMUP,
TURN_OFF,
FORCE,
GET_STATE,
GET_TIME_TO_FILL
};
private const string name_ = "AUTOFILL";
public static string GetFullCommand(Enum command)
{
return $"{name_} {command.ToString()}";
}
}
}

View File

@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
public static class BlackBody
{
public enum Command
{
CONTROL_SETPOINT,
GET_TEMP,
GET_SETPOINT,
GET_HTR,
GET_STABILITY,
GET_CONTROL_STATE,
GET_RATE_OF_CHANGE,
GET_TEMP_ERROR,
GET_TEMPA,
GET_TEMPB,
GET_CONTROL_SETPOINT,
GET_STATUS,
GET_BIT
};
private const string name_ = "BB";
public static string GetFullCommand(Enum command)
{
return $"{name_} {command.ToString()}";
}
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
public static class ChamberVacuum
{
public enum Command
{
GET_CVAC,
GET_SVAC
};
private const string name_ = "CVAC";
public static string GetFullCommand(Enum command)
{
return $"{name_} {command.ToString()}";
}
}
}

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
public static class Chopper
{
public enum Command
{
CW_SET_SETPOINT,
CW_STOP_OPEN,
CW_STOP_CLOSED,
CW_TURN_OFF,
CW_GET_SETPOINT,
CW_GET_CHOP_FREQ,
CW_GET_STATE,
CW_GET_STATUS,
CW_GET_STABILITY,
GET_BIT
};
private const string name_ = "CHOPPER";
public static string GetFullCommand(Enum command)
{
return $"{name_} {command.ToString()}";
}
}
}

View File

@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
public static class GALIL
{
public enum Command
{
FW_HOME,
FW_SET_POS,
FW_GET_POS,
FW_GET_STATUS,
TW_HOME,
TW_SET_POS,
TW_GET_POS,
TW_GET_STATUS,
SM_HOME,
SM_STOP,
SM_SET_BEAM_ANGLES,
SM_GET_BEAM_ANGLES,
SM_SET_BEAM_SPEED,
SM_DRAW_CIRCLE_NUMREVS,
SM_SET_RIGHT_LEFT_ARROW_ANGLE,
SM_SET_UP_DOWN_ARROW_ANGLE,
SM_GET_AZ_STATUS,
SM_GET_EL_STATUS,
SM_LOAD_PROFILE_FROM_FILE,
SM_LOAD_PROFILE,
SM_MOVE_PROFILE,
SM_MOVE_TO_START_PROFILE,
SM_RESET_PROFILE,
SM_GET_PROFILE_SIZE,
SM_GET_PROFILE
};
private const string name_ = "GALIL";
public static string GetFullCommand(Enum command)
{
return $"{name_} {command.ToString()}";
}
}
}

View File

@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
public static class NIF
{
public enum InputIndex
{
UUT_GV_OPEN,
UUT_GV_CLOSE
}
public enum Command
{
CLOSE_UUT_GV,
OPEN_UUT_GV,
GET_STATUS,
GET_INPUT_INDEX,
GET_TEMP_INDEX
};
private const string name_ = "NIF";
public static string GetFullCommand(Enum command)
{
return $"{name_} {command.ToString()}";
}
}
}

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Raytheon.Instruments.LSPS
{
public static class RIO
{
public enum Command
{
GV_CLOSE,
GV_OPEN,
GET_GV_CLOSED_INPUT,
GET_GV_OPEN_INPUT,
GET_GV_CHAMBER_PRESSURE,
GET_GV_CANISTER_PRESSURE
};
private const string name_ = "RIO";
public static string GetFullCommand(Enum command)
{
return $"{name_} {command.ToString()}";
}
}
}