Big changes
This commit is contained in:
@@ -0,0 +1,498 @@
|
||||
// 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 Raytheon.Instruments;
|
||||
using Raytheon.Common;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using ChillerCartMeasurementManagerLib;
|
||||
using NLog;
|
||||
|
||||
namespace MeasurementManagerLib
|
||||
{
|
||||
/// <summary>
|
||||
/// This class manages chiller instruments and provides an abstraction
|
||||
/// </summary>
|
||||
public class ChillerCartMeasurementManager : IDisposable
|
||||
{
|
||||
#region PublicMembers
|
||||
public delegate void ChillerDelegate(double temperature, double coolantSetpoint, int errorCode);
|
||||
public delegate void FlowMeterDelegate(double flow, int errorCode);
|
||||
public delegate void TemperatureDelegate(double temperature, int errorCode);
|
||||
#endregion
|
||||
|
||||
#region PrivateMembers
|
||||
private readonly IChiller _chiller;
|
||||
private readonly IFlowMeter _flowMeter;
|
||||
private readonly ITempMonitor _tempMonitor;
|
||||
private ChillerDataLogWorker _chillerDataLogWorker;
|
||||
private Thread _chillerDataLogThread;
|
||||
private FlowMeterDataLogWorker _flowMeterDataLogWorker;
|
||||
private Thread _flowMeterDataLogThread;
|
||||
private TempDataLogWorker _tempMonDataLogWorker;
|
||||
private Thread _tempMonDataLogThread;
|
||||
|
||||
private static NLog.ILogger _logger;
|
||||
|
||||
#endregion
|
||||
|
||||
#region PrivateFunctions
|
||||
|
||||
/// <summary>
|
||||
/// Dispose of this object's resources
|
||||
/// </summary>
|
||||
/// <param name="disposing">Currently disposing</param>
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
// stop the logging if it is still running
|
||||
try
|
||||
{
|
||||
ChillerLogStop();
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
|
||||
// stop the logging if it is still running
|
||||
try
|
||||
{
|
||||
FlowMeterLogStop();
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
|
||||
// stop the logging if it is still running
|
||||
try
|
||||
{
|
||||
TemperatureSensorLogStop();
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
|
||||
// dispose the thread
|
||||
try
|
||||
{
|
||||
if (_chillerDataLogWorker != null)
|
||||
{
|
||||
_chillerDataLogWorker.Dispose();
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
|
||||
// dispose the thread
|
||||
try
|
||||
{
|
||||
if (_flowMeterDataLogWorker != null)
|
||||
{
|
||||
_flowMeterDataLogWorker.Dispose();
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
|
||||
// dispose the thread
|
||||
try
|
||||
{
|
||||
if (_tempMonDataLogWorker != null)
|
||||
{
|
||||
_tempMonDataLogWorker.Dispose();
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
|
||||
// dispose other resources
|
||||
if (_chiller != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
_chiller.Shutdown();
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
if (_flowMeter != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
_flowMeter.Shutdown();
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
if (_tempMonitor != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
_tempMonitor.Shutdown();
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
ErrorLogger.Instance().Dispose();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// nothing to do
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The Finalizer
|
||||
/// </summary>
|
||||
~ChillerCartMeasurementManager()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region PublicFunctions
|
||||
|
||||
/// <summary>
|
||||
/// constructor that uses instrument manager to create an instrument
|
||||
/// </summary>
|
||||
/// <param name="instrumentManager"></param>
|
||||
/// <param name="chillerName"></param>
|
||||
/// <param name="flowMeeterName"></param>
|
||||
/// <param name="tempSensorName"></param>
|
||||
/// <param name="isThereHardware"></param>
|
||||
/// <param name="errorLog"></param>
|
||||
public ChillerCartMeasurementManager(IInstrumentManager instrumentManager, string chillerName, string flowMeeterName, string tempSensorName, string errorLog)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
// these gets created in the start logging functions
|
||||
_chillerDataLogWorker = null;
|
||||
_chillerDataLogThread = null;
|
||||
_flowMeterDataLogWorker = null;
|
||||
_flowMeterDataLogThread = null;
|
||||
_tempMonDataLogWorker = null;
|
||||
_tempMonDataLogThread = null;
|
||||
|
||||
_chiller = null;
|
||||
_flowMeter = null;
|
||||
_tempMonitor = null;
|
||||
|
||||
if (!string.IsNullOrEmpty(chillerName))
|
||||
{
|
||||
_chiller = instrumentManager.GetInstrument<IChiller>(chillerName);
|
||||
_chiller?.Initialize();
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(flowMeeterName))
|
||||
{
|
||||
_flowMeter = instrumentManager.GetInstrument<IFlowMeter>(flowMeeterName);
|
||||
_flowMeter?.Initialize();
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(tempSensorName))
|
||||
{
|
||||
_tempMonitor = instrumentManager.GetInstrument<ITempMonitor>(tempSensorName);
|
||||
_tempMonitor?.Initialize();
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public double ChillerGetCoolantTemperature()
|
||||
{
|
||||
return _chiller.GetCoolantTemperature();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public double ChillerGetCoolantTemperatureSetpoint()
|
||||
{
|
||||
return _chiller.GetCoolantSetpoint();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void ChillerDisableFlow()
|
||||
{
|
||||
_chiller.DisableFlow();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void ChillerEnableFlow()
|
||||
{
|
||||
_chiller.EnableFlow();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="filename"></param>
|
||||
/// <param name="threadRestTimeMs"></param>
|
||||
/// <param name="callback">An optional delegate for the host to receive the data</param>
|
||||
public void ChillerLogStart(string filename, int threadRestTimeMs, ChillerCartMeasurementManager.ChillerDelegate callback)
|
||||
{
|
||||
if (_chillerDataLogWorker != null)
|
||||
{
|
||||
//Should not be logging. Stop Logger
|
||||
ChillerLogStop();
|
||||
_chillerDataLogWorker.Dispose();
|
||||
}
|
||||
|
||||
//Start logging on a new thread. Also, start calling callback with requested data
|
||||
_chillerDataLogWorker = new ChillerDataLogWorker(this, filename, threadRestTimeMs, callback);
|
||||
_chillerDataLogThread = new Thread(_chillerDataLogWorker.DoWork);
|
||||
_chillerDataLogThread.Start();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void ChillerLogStop()
|
||||
{
|
||||
const int THREAD_QUIT_TIMEOUT = 3000;
|
||||
|
||||
//Is the logger running
|
||||
if (_chillerDataLogWorker != null)
|
||||
{
|
||||
_chillerDataLogWorker.QuitWork();
|
||||
|
||||
if ((_chillerDataLogThread != null) && (_chillerDataLogThread.IsAlive))
|
||||
{
|
||||
bool didThreadQuit = _chillerDataLogThread.Join(THREAD_QUIT_TIMEOUT);
|
||||
|
||||
if (didThreadQuit == false)
|
||||
{
|
||||
_logger?.Error("Logging Thread did not quit as expected, aborting it");
|
||||
_chillerDataLogThread.Abort();
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger?.Info("Logging Thread quit successfully after join");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger?.Info("Logging Thread quit successfully");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="setpoint"></param>
|
||||
public void ChillerSetCoolantTemperature(double setpoint)
|
||||
{
|
||||
_chiller.SetCoolantTemperature(setpoint);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
try
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger?.Error(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Do not rethrow. Exception from error logger that has already been garbage collected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="filename"></param>
|
||||
/// <param name="threadRestTimeMs"></param>
|
||||
/// <param name="callback">An optional delegate for the host to receive the data</param>
|
||||
public void FlowMeterLogStart(string filename, int threadRestTimeMs, ChillerCartMeasurementManager.FlowMeterDelegate callback)
|
||||
{
|
||||
if (_flowMeterDataLogWorker != null)
|
||||
{
|
||||
//Should not be logging. Stop logger
|
||||
FlowMeterLogStop();
|
||||
_flowMeterDataLogWorker.Dispose();
|
||||
}
|
||||
|
||||
//Start logging on a new thread. Also, start calling callback with requested data
|
||||
_flowMeterDataLogWorker = new FlowMeterDataLogWorker(this, filename, threadRestTimeMs, callback);
|
||||
_flowMeterDataLogThread = new Thread(_flowMeterDataLogWorker.DoWork);
|
||||
_flowMeterDataLogThread.Start();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void FlowMeterLogStop()
|
||||
{
|
||||
const int THREAD_QUIT_TIMEOUT = 5000;
|
||||
|
||||
//Are we logging
|
||||
if (_flowMeterDataLogWorker != null)
|
||||
{
|
||||
_flowMeterDataLogWorker.QuitWork();
|
||||
|
||||
if ((_flowMeterDataLogThread != null) && (_flowMeterDataLogThread.IsAlive))
|
||||
{
|
||||
bool didThreadQuit = _flowMeterDataLogThread.Join(THREAD_QUIT_TIMEOUT);
|
||||
|
||||
if (didThreadQuit == false)
|
||||
{
|
||||
_logger?.Error("Logging Thread did not quit as expected, aborting it");
|
||||
_flowMeterDataLogThread.Abort();
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger?.Info("Logging Thread quit successfully after join");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger?.Info("Logging Thread quit successfully");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public double FlowMeterReadFlow()
|
||||
{
|
||||
return _flowMeter.ReadFlow();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public double TemperatureSensorReadTemperature()
|
||||
{
|
||||
return _tempMonitor.ReadTemperature();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start the temperature sensor log thread
|
||||
/// </summary>
|
||||
/// <param name="filename"></param>
|
||||
/// <param name="threadRestTimeMs"></param>
|
||||
/// <param name="callback">An optional delegate for the host to receive the data</param>
|
||||
public void TemperatureSensorLogStart(string filename, int threadRestTimeMs, ChillerCartMeasurementManager.TemperatureDelegate callback)
|
||||
{
|
||||
if (_tempMonDataLogWorker != null)
|
||||
{
|
||||
//Should not be logging. Stop logger
|
||||
TemperatureSensorLogStop();
|
||||
_tempMonDataLogWorker.Dispose();
|
||||
}
|
||||
|
||||
//Start logging on a new thread. Also, start calling callback with requested data
|
||||
_tempMonDataLogWorker = new TempDataLogWorker(this, filename, threadRestTimeMs, callback);
|
||||
_tempMonDataLogThread = new Thread(_tempMonDataLogWorker.DoWork);
|
||||
_tempMonDataLogThread.Start();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stop the temperature sensor log thread
|
||||
/// </summary>
|
||||
public void TemperatureSensorLogStop()
|
||||
{
|
||||
const int THREAD_QUIT_TIMEOUT = 3000;
|
||||
|
||||
//Are we logging
|
||||
if (_tempMonDataLogWorker != null)
|
||||
{
|
||||
_tempMonDataLogWorker.QuitWork();
|
||||
|
||||
if ((_tempMonDataLogThread != null) && (_tempMonDataLogThread.IsAlive))
|
||||
{
|
||||
bool didThreadQuit = _tempMonDataLogThread.Join(THREAD_QUIT_TIMEOUT);
|
||||
|
||||
if (didThreadQuit == false)
|
||||
{
|
||||
_logger?.Error("Logging Thread did not quit as expected, aborting it");
|
||||
_tempMonDataLogThread.Abort();
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger?.Info("Logging Thread quit successfully after join");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger?.Info("Logging Thread quit successfully");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="$(SolutionDir)Solution.props" />
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
<AssemblyName>ChillerCartMeasurementManager</AssemblyName>
|
||||
<Product>Composable Test Software Library</Product>
|
||||
<Description>Chiller Cart Measurement Manager</Description>
|
||||
<OutputType>Library</OutputType>
|
||||
|
||||
<!-- Static versioning (Suitable for Development) -->
|
||||
<!-- Disable the line below for dynamic versioning -->
|
||||
<Version>1.1.0</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="NLog" Version="5.0.0" />
|
||||
<PackageReference Include="Raytheon.Common" Version="1.0.0" />
|
||||
<PackageReference Include="Raytheon.Instruments.InstrumentManager.Contracts" Version="1.8.0" />
|
||||
<PackageReference Include="Raytheon.Instruments.Chiller.Contracts" Version="1.0.3" />
|
||||
<PackageReference Include="Raytheon.Instruments.FlowMeter.Contracts" Version="1.0.3" />
|
||||
<PackageReference Include="Raytheon.Instruments.TempMonitor.Contracts" Version="1.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,209 @@
|
||||
// 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 Raytheon.Common;
|
||||
using System.IO;
|
||||
using MeasurementManagerLib;
|
||||
|
||||
namespace ChillerCartMeasurementManagerLib
|
||||
{
|
||||
/// <summary>
|
||||
/// A worker class that will periodically query the chiller for its status and log it out
|
||||
/// </summary>
|
||||
internal class ChillerDataLogWorker : IWorkerInterface
|
||||
{
|
||||
#region PrivateMembers
|
||||
private bool _threadQuitControl;
|
||||
private bool _createHeader;
|
||||
private AutoResetEvent _quitEvent;
|
||||
private StreamWriter _fileWriter;
|
||||
private readonly ChillerCartMeasurementManager _controller;
|
||||
private readonly ChillerCartMeasurementManager.ChillerDelegate _callback;
|
||||
private readonly string _logFileName;
|
||||
private readonly int _threadRestTimeMs;
|
||||
#endregion
|
||||
|
||||
#region PrivateFunctions
|
||||
/// <summary>
|
||||
/// Finalizer
|
||||
/// </summary>
|
||||
~ChillerDataLogWorker()
|
||||
{
|
||||
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="disposing"></param>
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_fileWriter.Dispose();
|
||||
|
||||
_quitEvent.Dispose();
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
try
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Do not rethrow. Exception from error logger that has already been garbage collected
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region PublicFunctions
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="controller"></param>
|
||||
/// <param name="logFileName"></param>
|
||||
/// <param name="threadRestTimeMs"></param>
|
||||
/// <param name="callback"></param>
|
||||
public ChillerDataLogWorker(ChillerCartMeasurementManager controller, string logFileName, int threadRestTimeMs, ChillerCartMeasurementManager.ChillerDelegate callback)
|
||||
{
|
||||
_threadQuitControl = false;
|
||||
_quitEvent = new AutoResetEvent(false);
|
||||
|
||||
_createHeader = true;
|
||||
|
||||
_controller = controller;
|
||||
|
||||
_callback = callback;
|
||||
_threadRestTimeMs = threadRestTimeMs;
|
||||
_logFileName = logFileName;
|
||||
|
||||
|
||||
//If file exists
|
||||
if (File.Exists(_logFileName))
|
||||
{
|
||||
_createHeader = false;
|
||||
}
|
||||
|
||||
//Create file or append to file
|
||||
_fileWriter = new StreamWriter(_logFileName, true);
|
||||
_fileWriter.AutoFlush = true;
|
||||
|
||||
//Create the header for the new file
|
||||
if (_createHeader)
|
||||
{
|
||||
_fileWriter.WriteLine("Time, Temperature, Temperature Setpoint");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Dispose of this object. Needed for releasing thread/comm resources
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
try
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
try
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Do not rethrow. Exception from error logger that has already been garbage collected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void DoWork()
|
||||
{
|
||||
try
|
||||
{
|
||||
while (_threadQuitControl == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_quitEvent.WaitOne(_threadRestTimeMs))
|
||||
{
|
||||
_threadQuitControl = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
double temperature = _controller.ChillerGetCoolantTemperature();
|
||||
double temperatureSetpoint = _controller.ChillerGetCoolantTemperatureSetpoint();
|
||||
|
||||
string logData = Util.GetTimeString() + ", Temperature: " + temperature.ToString() + ", TemperatureSetpoint: " + temperatureSetpoint.ToString();
|
||||
|
||||
_fileWriter.WriteLine(logData);
|
||||
|
||||
//Invoke the callback if valid
|
||||
if (_callback != null && _threadQuitControl == false)
|
||||
{
|
||||
_callback.Invoke(temperature, temperatureSetpoint, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string msg = e.Message;
|
||||
ErrorLogger.Instance().Write(msg + "\r\n" + e.StackTrace, ErrorLogger.LogLevel.ERROR);
|
||||
|
||||
_fileWriter.WriteLine(Util.GetTimeString() + ", " + msg);
|
||||
|
||||
//Send error code to callback if valid
|
||||
_callback?.Invoke(-1, -1, -1);
|
||||
}
|
||||
}
|
||||
ErrorLogger.Instance().Write("ChillerCartDataLogWorker::DoWork() - exiting", ErrorLogger.LogLevel.INFO);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
|
||||
//Send error code to callback if valid
|
||||
_callback?.Invoke(-1, -1, -1);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops the thread, closes the datalogger and calls move file
|
||||
/// </summary>
|
||||
public void QuitWork()
|
||||
{
|
||||
_threadQuitControl = true;
|
||||
|
||||
_quitEvent.Set();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
// 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 Raytheon.Common;
|
||||
using System.IO;
|
||||
using MeasurementManagerLib;
|
||||
|
||||
namespace ChillerCartMeasurementManagerLib
|
||||
{
|
||||
/// <summary>
|
||||
/// A worker class that will periodically query the flow meter for its status and log it out
|
||||
/// </summary>
|
||||
internal class FlowMeterDataLogWorker : IWorkerInterface
|
||||
{
|
||||
#region PrivateMembers
|
||||
private bool _threadQuitControl;
|
||||
private bool _createHeader;
|
||||
private AutoResetEvent _quitEvent;
|
||||
private StreamWriter _fileWriter;
|
||||
private readonly ChillerCartMeasurementManager _controller;
|
||||
private readonly ChillerCartMeasurementManager.FlowMeterDelegate _callback;
|
||||
private readonly string _logFileName;
|
||||
private readonly int _threadRestTimeMs;
|
||||
#endregion
|
||||
|
||||
#region PrivateFunctions
|
||||
/// <summary>
|
||||
/// Finalizer
|
||||
/// </summary>
|
||||
~FlowMeterDataLogWorker()
|
||||
{
|
||||
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="disposing"></param>
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_fileWriter.Dispose();
|
||||
|
||||
_quitEvent.Dispose();
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
try
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Do not rethrow. Exception from error logger that has already been garbage collected
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region PublicFunctions
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="controller"></param>
|
||||
/// <param name="logFileName"></param>
|
||||
/// <param name="threadRestTimeMs"></param>
|
||||
/// <param name="callback"></param>
|
||||
public FlowMeterDataLogWorker(ChillerCartMeasurementManager controller, string logFileName, int threadRestTimeMs, ChillerCartMeasurementManager.FlowMeterDelegate callback)
|
||||
{
|
||||
_threadQuitControl = false;
|
||||
_quitEvent = new AutoResetEvent(false);
|
||||
|
||||
_createHeader = true;
|
||||
|
||||
_controller = controller;
|
||||
|
||||
_callback = callback;
|
||||
_threadRestTimeMs = threadRestTimeMs;
|
||||
_logFileName = logFileName;
|
||||
|
||||
//If file exists
|
||||
if (File.Exists(_logFileName))
|
||||
{
|
||||
_createHeader = false;
|
||||
}
|
||||
|
||||
//Create file or append to file
|
||||
_fileWriter = new StreamWriter(_logFileName, true);
|
||||
_fileWriter.AutoFlush = true;
|
||||
|
||||
//Create the header for the new file
|
||||
if (_createHeader)
|
||||
{
|
||||
_fileWriter.WriteLine("Time, Flow");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dispose of this object. Needed for releasing thread/comm resources
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
try
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
try
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Do not rethrow. Exception from error logger that has already been garbage collected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void DoWork()
|
||||
{
|
||||
try
|
||||
{
|
||||
while (_threadQuitControl == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_quitEvent.WaitOne(_threadRestTimeMs))
|
||||
{
|
||||
_threadQuitControl = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
double flow = _controller.FlowMeterReadFlow();
|
||||
|
||||
string logData = Util.GetTimeString() + "," + flow.ToString();
|
||||
|
||||
_fileWriter.WriteLine(logData);
|
||||
|
||||
//Invoke the callback if valid
|
||||
if (_callback != null && _threadQuitControl == false)
|
||||
{
|
||||
_callback.Invoke(flow, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string msg = e.Message;
|
||||
|
||||
ErrorLogger.Instance().Write(msg + "\r\n" + e.StackTrace, ErrorLogger.LogLevel.ERROR);
|
||||
|
||||
_fileWriter.WriteLine(Util.GetTimeString() + ", " + msg);
|
||||
|
||||
//Invoke the callback if valid
|
||||
if (_callback != null && _threadQuitControl == false)
|
||||
{
|
||||
_callback.Invoke(-1, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
ErrorLogger.Instance().Write("FlowMeterDataLogWorker::DoWork() - exiting", ErrorLogger.LogLevel.INFO);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
|
||||
//Send error code to callback if valid
|
||||
if (_callback != null && _threadQuitControl == false)
|
||||
{
|
||||
_callback.Invoke(-1, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops the thread, closes the datalogger and calls move file
|
||||
/// </summary>
|
||||
public void QuitWork()
|
||||
{
|
||||
_threadQuitControl = true;
|
||||
|
||||
_quitEvent.Set();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,210 @@
|
||||
// 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 Raytheon.Common;
|
||||
using System.IO;
|
||||
using MeasurementManagerLib;
|
||||
|
||||
namespace ChillerCartMeasurementManagerLib
|
||||
{
|
||||
/// <summary>
|
||||
/// A worker class that will periodically query the temperature sensor for its status and log it out
|
||||
/// </summary>
|
||||
internal class TempDataLogWorker : IWorkerInterface
|
||||
{
|
||||
#region PrivateMembers
|
||||
private bool _threadQuitControl;
|
||||
private bool _createHeader;
|
||||
private AutoResetEvent _quitEvent;
|
||||
private StreamWriter _fileWriter;
|
||||
private readonly ChillerCartMeasurementManager _controller;
|
||||
private readonly ChillerCartMeasurementManager.TemperatureDelegate _callback;
|
||||
private readonly string _logFileName;
|
||||
private readonly int _threadRestTimeMs;
|
||||
|
||||
#endregion
|
||||
|
||||
#region PrivateFunctions
|
||||
/// <summary>
|
||||
/// Finalizer
|
||||
/// </summary>
|
||||
~TempDataLogWorker()
|
||||
{
|
||||
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="disposing"></param>
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_fileWriter.Dispose();
|
||||
|
||||
_quitEvent.Dispose();
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
try
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Do not rethrow. Exception from error logger that has already been garbage collected
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region PublicFunctions
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="controller"></param>
|
||||
/// <param name="logFileName"></param>
|
||||
/// <param name="threadRestTimeMs"></param>
|
||||
/// <param name="callback"></param>
|
||||
public TempDataLogWorker(ChillerCartMeasurementManager controller, string logFileName, int threadRestTimeMs, ChillerCartMeasurementManager.TemperatureDelegate callback)
|
||||
{
|
||||
_threadQuitControl = false;
|
||||
_quitEvent = new AutoResetEvent(false);
|
||||
|
||||
_createHeader = true;
|
||||
|
||||
_controller = controller;
|
||||
|
||||
_callback = callback;
|
||||
_threadRestTimeMs = threadRestTimeMs;
|
||||
_logFileName = logFileName;
|
||||
|
||||
//If file exists
|
||||
if (File.Exists(_logFileName))
|
||||
{
|
||||
_createHeader = false;
|
||||
}
|
||||
|
||||
//Create file or append to file
|
||||
_fileWriter = new StreamWriter(_logFileName, true);
|
||||
_fileWriter.AutoFlush = true;
|
||||
|
||||
//Create the header for the new file
|
||||
if (_createHeader)
|
||||
{
|
||||
_fileWriter.WriteLine("Time, Temperature, Temperature Setpoint");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Dispose of this object. Needed for releasing thread/comm resources
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
try
|
||||
{
|
||||
Dispose(true);
|
||||
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
try
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Do not rethrow. Exception from error logger that has already been garbage collected
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void DoWork()
|
||||
{
|
||||
try
|
||||
{
|
||||
while (_threadQuitControl == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_quitEvent.WaitOne(_threadRestTimeMs))
|
||||
{
|
||||
_threadQuitControl = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
double temp = _controller.TemperatureSensorReadTemperature();
|
||||
|
||||
string logData = Util.GetTimeString() + ", Flow: " + temp.ToString();
|
||||
|
||||
_fileWriter.WriteLine(logData);
|
||||
|
||||
//Invoke the callback if valid
|
||||
if (_callback != null && _threadQuitControl == false)
|
||||
{
|
||||
_callback.Invoke(temp, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string msg = e.Message;
|
||||
ErrorLogger.Instance().Write(msg + "\r\n" + e.StackTrace, ErrorLogger.LogLevel.ERROR);
|
||||
|
||||
_fileWriter.WriteLine(Util.GetTimeString() + ", " + msg);
|
||||
|
||||
//Send error code to callback if valid
|
||||
_callback?.Invoke(-1, -1);
|
||||
}
|
||||
}
|
||||
ErrorLogger.Instance().Write("TempDataLogWorker::DoWork() - exiting", ErrorLogger.LogLevel.INFO);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
|
||||
|
||||
//Send error code to callback if valid
|
||||
_callback(-1, -1);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops the thread, closes the datalogger and calls move file
|
||||
/// </summary>
|
||||
public void QuitWork()
|
||||
{
|
||||
_threadQuitControl = true;
|
||||
|
||||
_quitEvent.Set();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user