public DaValue[] ReadCurrentValues(Session session, HdaItemHandle itemHandle, uint[] attributeIds)
{
DaValue[] results = new DaValue[attributeIds.Length];
// check handle.
InternalHandle handle = itemHandle as InternalHandle;
if (handle == null)
{
for (int ii = 0; ii < results.Length; ii++)
{
results[ii] = new DaValue();
results[ii].Error = ResultIds.E_INVALIDHANDLE;
}
return results;
}
// look up the supported attributes for an item.
ReadValueIdCollection supportedAttributes = handle.Item.SupportedAttributes;
if (supportedAttributes == null)
{
handle.Item.SupportedAttributes = supportedAttributes = GetAvailableAttributes(session, handle.NodeId);
}
// build list of values to read.
ReadValueIdCollection valuesToRead = new ReadValueIdCollection();
List<int> indexes = new List<int>();
for (int ii = 0; ii < attributeIds.Length; ii++)
{
ReadValueId valueToRead = GetReadValueId(supportedAttributes, attributeIds[ii]);
if (valueToRead == null)
{
results[ii] = new DaValue();
results[ii].Error = ResultIds.E_INVALIDATTRID;
continue;
}
valuesToRead.Add(valueToRead);
indexes.Add(ii);
// need to fetch the value rank as well.
if (attributeIds[ii] == Constants.OPCHDA_DATA_TYPE)
{
valuesToRead.Add(GetReadValueId(supportedAttributes, ComHdaProxy.INTERNAL_ATTRIBUTE_VALUE_RANK));
indexes.Add(-1);
}
}
// nothing to do.
if (valuesToRead.Count == 0)
{
return results;
}
// read values from the UA server.
DataValueCollection values = null;
DiagnosticInfoCollection diagnosticInfos = null;
session.Read(
null,
0,
TimestampsToReturn.Neither,
valuesToRead,
out values,
out diagnosticInfos);
// validate response from the UA server.
ClientBase.ValidateResponse(values, valuesToRead);
ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToRead);
// assign a local handle to all valid items.
for (int ii = 0; ii < valuesToRead.Count; ii++)
{
int index = indexes[ii];
uint attributeId = (uint)valuesToRead[ii].Handle;
// check for values which are combined with other values to create the value (e.g. ValueRank).
if (index == -1)
{
continue;
}
results[index] = GetAttributeValue(session, attributeId, values, ii);
// only support current value for now.
if (results[index].Error == ResultIds.S_OK)
{
results[index].Error = ResultIds.S_CURRENTVALUE;
}
}
return results;
}