Opc.Ua.Server.Subscription.ConditionRefresh C# (CSharp) Method

ConditionRefresh() public method

Refreshes the conditions.
public ConditionRefresh ( ) : void
return void
        public void ConditionRefresh()
        {
            ServerSystemContext systemContext = m_server.DefaultSystemContext.Copy(m_session);
            List<IEventMonitoredItem> monitoredItems = new List<IEventMonitoredItem>();

            lock (m_lock)
            {  
                // generate start event.
                RefreshStartEventState e = new RefreshStartEventState(null);
                            
                TranslationInfo message = new TranslationInfo(
                    "RefreshStartEvent",
                    "en-US",
                    "Condition refresh started for subscription {0}.",
                    m_id);

                e.Initialize(
                    systemContext,
                    null,
                    EventSeverity.Low,
                    new LocalizedText(message));
                
                e.SetChildValue(systemContext, BrowseNames.SourceNode, m_diagnosticsId, false);
                e.SetChildValue(systemContext, BrowseNames.SourceName, Utils.Format("Subscription/{0}", m_id), false);
                e.SetChildValue(systemContext, BrowseNames.ReceiveTime, DateTime.UtcNow, false);

                // build list of items to refresh.
                foreach (LinkedListNode<IMonitoredItem> monitoredItem in m_monitoredItems.Values)
                {
                    MonitoredItem eventMonitoredItem = monitoredItem.Value as MonitoredItem;

                    if (eventMonitoredItem.EventFilter != null)
                    {
                        // queue start refresh event.
                        eventMonitoredItem.QueueEvent(e, true);

                        // add to list that gets reported to the NodeManagers.
                        monitoredItems.Add(eventMonitoredItem);
                    }
                }

                // nothing to do if no event subscriptions.
                if (monitoredItems.Count == 0)
                {
                    return;
                }
            }
            
            // tell the NodeManagers to report the current state of the conditions.
            try
            {
                m_refreshInProgress = true;

                OperationContext operationContext = new OperationContext(m_session, DiagnosticsMasks.None);
                m_server.NodeManager.ConditionRefresh(operationContext, monitoredItems);
            }
            finally
            {
                m_refreshInProgress = false;
            }
            
            lock (m_lock)
            {  
                // generate start event.
                RefreshEndEventState e = new RefreshEndEventState(null);
                            
                TranslationInfo message = new TranslationInfo(
                    "RefreshEndEvent",
                    "en-US",
                    "Condition refresh completed for subscription {0}.",
                    m_id);

                e.Initialize(
                    systemContext,
                    null,
                    EventSeverity.Low,
                    new LocalizedText(message));
                
                e.SetChildValue(systemContext, BrowseNames.SourceNode, m_diagnosticsId, false);
                e.SetChildValue(systemContext, BrowseNames.SourceName, Utils.Format("Subscription/{0}", m_id), false);
                e.SetChildValue(systemContext, BrowseNames.ReceiveTime, DateTime.UtcNow, false);
                
                // send refresh end event.
                for (int ii = 0; ii < monitoredItems.Count; ii++)
                {
                    MonitoredItem monitoredItem = monitoredItems[ii] as MonitoredItem;

                    if (monitoredItem.EventFilter != null)
                    {
                        monitoredItem.QueueEvent(e, true);
                    }
                }
                    
                // TraceState("CONDITION REFRESH");
            }
        }