public int[] SetItemDeadbands(int[] serverHandles, float[] deadbands)
{
TraceState("SetItemDeadbands", serverHandles.Length);
ThrowIfDisposed();
int[] errors = new int[serverHandles.Length];
ComDaGroupItem[] items = new ComDaGroupItem[serverHandles.Length];
int count = 0;
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;
}
if (item.EuType >= 0 && item.EuType != (int)OpcRcw.Da.OPCEUTYPE.OPC_ANALOG)
{
errors[ii] = ResultIds.E_DEADBANDNOTSUPPORTED;
continue;
}
if (deadbands[ii] < 0 || deadbands[ii] > 100)
{
errors[ii] = ResultIds.E_INVALIDARG;
continue;
}
item.Deadband = deadbands[ii];
items[ii] = item;
count++;
}
}
if (count == 0)
{
return errors;
}
// need the EU Info if the deadband is specified.
m_manager.UpdateItemEuInfo(this, items);
lock (m_lock)
{
// need to check the EU type after updating the EU info.
for (int ii = 0; ii < items.Length; ii++)
{
ComDaGroupItem item = items[ii];
if (item != null && item.EuType != (int)OpcRcw.Da.OPCEUTYPE.OPC_ANALOG)
{
errors[ii] = ResultIds.E_DEADBANDNOTSUPPORTED;
items[ii] = null;
continue;
}
}
// update filters for selected items.
UpdateDeadbandFilters(items);
// 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))
{
item.MonitoredItem.Filter = item.MonitoredItem.Status.Filter;
DataChangeFilter filter = item.MonitoredItem.Filter as DataChangeFilter;
if (filter != null)
{
item.Deadband = (float)filter.DeadbandValue;
}
errors[ii] = ResultIds.E_FAIL;
continue;
}
}
return errors;
}
}