private void EnqueueItem(EventArguments dataEvent)
 {
     lock (locker)
     {
         _eventQueue.Enqueue(dataEvent);
         Monitor.Pulse(locker);
     }
     _uposProperties.FirePropertyChanged("DataCount");
 }
 /// <summary>
 /// Enqueues an event to be fired. Use only from OPOSBase
 /// </summary>
 /// <param name="dataEvent">The event to enqueue</param>
 internal void EnqueueEvent(EventArguments dataEvent)
 {
     if (!dataEvent.IsImmediate)
     {
         EnqueueItem(dataEvent);
     }
     else
     {
         FireEvent(dataEvent);
     }
 }
 private void FireEvent(EventArguments enqueuedEvent)
 {
     if (enqueuedEvent is DataEventArguments arguments)
     {
         _uposProperties.FirePropertyChanged("DataCount");
         _oposDevice.SOData(arguments.Status);
     }
     else if (enqueuedEvent is DirectIOEventArguments directIoEventArguments)
     {
         _oposDevice.SODirectIO(directIoEventArguments.EventNumber, ref directIoEventArguments.NumericData, ref directIoEventArguments.StringData);
     }
     else if (enqueuedEvent is ErrorEventArguments errorEventArguments)
     {
         _oposDevice.SOError((int)errorEventArguments.ResultCode, errorEventArguments.ResultCodeExtended, (int)errorEventArguments.ErrorLocus, ref errorEventArguments.ErrorResponse);
     }
     else if (enqueuedEvent is OutputCompleteEventArguments outputCompleteEventArguments)
     {
         _oposDevice.SOOutputComplete(outputCompleteEventArguments.OutputID);
     }
     else if (enqueuedEvent is StatusUpdateEventArguments statusUpdateEventArguments)
     {
         _oposDevice.SOStatusUpdate(statusUpdateEventArguments.Status);
     }
 }