// 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 NLog; using Raytheon.Common; using Raytheon.Instruments; using Raytheon.Instruments.GeneralIO; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Reflection; using System.Threading; namespace MeasurementManagerLib { /// /// This class manages IDIO instruments and provides an abstraction /// public class DioMeasurementManager : IDisposable { #region PrivateClassMembers private SortedDictionary _signalNameToObjectMap = new SortedDictionary(); private static NLog.ILogger _logger; #endregion #region PublicClassFunctions /// /// constructor with the instrument manager /// /// General Instrument Manager public DioMeasurementManager(IInstrumentManager instrumentManager) { _logger = LogManager.GetCurrentClassLogger(); ICollection dioModuleList = instrumentManager.GetInstruments(typeof(IGeneralIO)); // populate the maps foreach (IGeneralIO dioModule in dioModuleList) { dioModule.Initialize(); List signalNames = dioModule.GetSignalNames(); foreach (string signalName in signalNames) { if (_signalNameToObjectMap.ContainsKey(signalName.ToUpper())) { throw new Exception("There is more than 1 DIO card that have the same signal name: " + signalName); } _signalNameToObjectMap[signalName.ToUpper()] = dioModule; } } } /// /// Dispose of this objects resources /// 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 } } } /// /// Get the state(0 or 1) of an input signal /// /// The signal to get the state of /// 0 if the signal is low, 1 if the signal is high public IODatatypes.BitState GetInputSignalState(string signalName) { return _signalNameToObjectMap[signalName.ToUpper()].GetBitState(signalName); } /// /// Set the state of an output signal /// /// The name of the output signal /// The state, 0 for low, 1 for high, 2 for logic Z /// number of ms to wait after setting signal public void SetOutputSignalState(string signalName, IODatatypes.BitState state, uint timeToSleepMs = 100) { _signalNameToObjectMap[signalName.ToUpper()].SetBit(signalName, state); // wait a bit Thread.Sleep((int)timeToSleepMs); } #endregion #region PrivateClassFunctions /// /// The Finalizer /// ~DioMeasurementManager() { Dispose(false); } /// /// /// /// protected virtual void Dispose(bool disposing) { if (disposing) { foreach (KeyValuePair entry in _signalNameToObjectMap) { try { entry.Value.Shutdown(); } catch (Exception err) { _logger?.Error(err.Message + "\r\n" + err.StackTrace); } } try { ErrorLogger.Instance().Dispose(); } catch (Exception) { // nothing to do } } } #endregion } }