public int[] SetItemSamplingRates(int[] serverHandles, int[] samplingRates, int[] revisedSamplingRates)
{
TraceState("SetItemSamplingRates", serverHandles.Length);
ThrowIfDisposed();
int[] errors = new int[serverHandles.Length];
ComDaGroupItem[] items = new ComDaGroupItem[serverHandles.Length];
lock (m_lock)
{
// update the filter for analog items that have not overriden the deadband.
for (int ii = 0; ii < serverHandles.Length; ii++)
{
ComDaGroupItem item = null;
if (!m_itemsByHandle.TryGetValue(serverHandles[ii], out item))
{
errors[ii] = ResultIds.E_INVALIDHANDLE;
continue;
}
item.MonitoredItem.SamplingInterval = (int)(samplingRates[ii]/2);
revisedSamplingRates[ii] = 0;
items[ii] = item;
}
// update the items on the server.
try
{
m_subscription.ApplyChanges();
}
catch (Exception e)
{
int error = ComUtils.GetErrorCode(e, ResultIds.E_FAIL);
for (int ii = 0; ii < items.Length; ii++)
{
if (items[ii] != null)
{
errors[ii] = error;
}
}
return errors;
}
// check results for monitored items.
for (int ii = 0; ii < items.Length; ii++)
{
ComDaGroupItem item = items[ii];
if (item == null)
{
continue;
}
if (ServiceResult.IsBad(item.MonitoredItem.Status.Error))
{
errors[ii] = ResultIds.E_FAIL;
continue;
}
item.SamplingRate = samplingRates[ii];
item.ActualSamplingRate = (int)(items[ii].MonitoredItem.Status.SamplingInterval);
// if 1/2 the sampling rate is accepted then it is possible to guarantee the sampling rate.
if (item.ActualSamplingRate < item.SamplingRate)
{
item.ActualSamplingRate = item.SamplingRate;
}
// can only guarantee a sampling rate of twice what the UA server can provide.
else
{
item.ActualSamplingRate *= 2;
}
revisedSamplingRates[ii] = item.ActualSamplingRate;
item.NextUpdateTime = HiResClock.UtcNow.Ticks + item.ActualSamplingRate*TimeSpan.TicksPerMillisecond;
if (revisedSamplingRates[ii] != samplingRates[ii])
{
errors[ii] = ResultIds.S_UNSUPPORTEDRATE;
}
TraceState(
"ItemSamplingUpdated",
this.ServerHandle,
item.ServerHandle,
item.ClientHandle,
m_subscription.CurrentPublishingEnabled,
m_subscription.CurrentPublishingInterval,
item.SamplingRate,
item.MonitoredItem.Status.SamplingInterval);
}
return errors;
}
}