public void SetMonitoringMode(
OperationContext context,
MonitoringMode monitoringMode,
IList<IMonitoredItem> monitoredItems,
IList<bool> processedItems,
IList<ServiceResult> errors)
{
if (context == null) throw new ArgumentNullException("context");
if (monitoredItems == null) throw new ArgumentNullException("monitoredItems");
if (errors == null) throw new ArgumentNullException("errors");
try
{
m_lock.Enter();
for (int ii = 0; ii < errors.Count; ii++)
{
// skip items that have already been processed.
if (processedItems[ii] || monitoredItems[ii] == null)
{
continue;
}
// check if the node manager created the item.
if (!Object.ReferenceEquals(this, monitoredItems[ii].NodeManager))
{
continue;
}
// owned by this node manager.
processedItems[ii] = true;
// validate monitored item.
MonitoredItem monitoredItem = null;
if (!m_monitoredItems.TryGetValue(monitoredItems[ii].Id, out monitoredItem))
{
errors[ii] = StatusCodes.BadMonitoredItemIdInvalid;
continue;
}
if (!Object.ReferenceEquals(monitoredItem, monitoredItems[ii]))
{
errors[ii] = StatusCodes.BadMonitoredItemIdInvalid;
continue;
}
// update monitoring mode.
MonitoringMode previousMode = monitoredItem.SetMonitoringMode(monitoringMode);
// need to provide an immediate update after enabling.
if (previousMode == MonitoringMode.Disabled && monitoringMode != MonitoringMode.Disabled)
{
DataValue initialValue = new DataValue();
initialValue.ServerTimestamp = DateTime.UtcNow;
initialValue.StatusCode = StatusCodes.BadWaitingForInitialData;
// read the initial value.
Node node = monitoredItem.ManagerHandle as Node;
if (node != null)
{
ServiceResult error = node.Read(context, monitoredItem.AttributeId, initialValue);
if (ServiceResult.IsBad(error))
{
initialValue.Value = null;
initialValue.StatusCode = error.StatusCode;
}
}
monitoredItem.QueueValue(initialValue, null);
}
// modify the item attributes.
m_samplingGroupManager.ModifyMonitoring(context, monitoredItem);
// item has been modified successfully.
// errors updating the sampling groups will be reported in notifications.
errors[ii] = StatusCodes.Good;
}
}
finally
{
m_lock.Exit();
}
// update all sampling groups.
m_samplingGroupManager.ApplyChanges();
}
#endregion