public Result <DataResponse> GetEventData(OpcUAQuery query, NodeId startNodeId, Opc.Ua.EventFilter eventFilter) { var nodeCache = _nodeCacheFactory.Create(_session); eventFilter.AddSelectClause(ObjectTypeIds.BaseEventType, "SourceNode"); eventFilter.AddSelectClause(ObjectTypeIds.BaseEventType, "EventType"); var eventFilterValues = GetEventFilterValues(startNodeId, eventFilter); if (eventFilterValues == null) { var monitorItem = AddMonitorItem(startNodeId, eventFilter); eventFilterValues = new EventFilterValues(monitorItem, query, eventFilter); if (!TryAddEventFilterValues(startNodeId, eventFilterValues)) { RemoveMonitorItem(monitorItem); eventFilterValues = null; } } lock (_eventData) { if (eventFilterValues == null) { eventFilterValues = GetEventFilterValues(startNodeId, eventFilter); } if (eventFilterValues != null) { return(_eventDataResponse.CreateEventSubscriptionDataResponse(eventFilterValues.Values.Values, query, nodeCache)); } } return(new Result <DataResponse>(StatusCodes.BadUnexpectedError, "")); }
private bool TryAddEventFilterValues(NodeId startNodeId, EventFilterValues eventFilterValues) { lock (_eventData) { List <EventFilterValues> l; if (!_eventData.TryGetValue(startNodeId, out l)) { l = new List <EventFilterValues>(); l.Add(eventFilterValues); _eventData.Add(startNodeId, l); return(true); } else { if (!l.Any(a => a.Filter.IsEqual(eventFilterValues.Filter))) { l.Add(eventFilterValues); return(true); } } } return(false); }