public DaValue[] SyncRead(uint maxAge, int[] serverHandles, bool isInitialRefresh, int[] clientHandles)
{
TraceState("SyncRead", maxAge, serverHandles.Length);
ThrowIfDisposed();
DaValue[] results = new DaValue[serverHandles.Length];
List<ComDaGroupItem> items = new List<ComDaGroupItem>(serverHandles.Length);
ReadValueIdCollection valuesToRead = new ReadValueIdCollection();
lock (m_lock)
{
// validate items.
for (int ii = 0; ii < serverHandles.Length; ii++)
{
results[ii] = new DaValue();
ComDaGroupItem item = null;
if (!m_itemsByHandle.TryGetValue(serverHandles[ii], out item))
{
results[ii].Error = ResultIds.E_INVALIDHANDLE;
continue;
}
if (clientHandles != null)
{
clientHandles[ii] = item.ClientHandle;
}
// check for cache read.
if (maxAge == UInt32.MaxValue)
{
// inactive items cannot be read from cache.
if (!item.Active || !m_active)
{
results[ii].Quality = OpcRcw.Da.Qualities.OPC_QUALITY_OUT_OF_SERVICE;
results[ii].Timestamp = DateTime.UtcNow;
continue;
}
// check if waiting for initial data.
if (item.CacheEntry == null)
{
results[ii].Quality = OpcRcw.Da.Qualities.OPC_QUALITY_WAITING_FOR_INITIAL_DATA;
results[ii].Timestamp = DateTime.UtcNow;
continue;
}
// get the latest value from the cache.
item.CacheEntry.GetLatest(results[ii]);
UpdateReadResult(item, results[ii]);
continue;
}
// apply max age.
if (maxAge > 0)
{
if (item.CacheEntry != null)
{
if (item.CacheEntry.CacheTimestamp.AddMilliseconds(maxAge) > DateTime.UtcNow)
{
item.CacheEntry.GetLatest(results[ii]);
UpdateReadResult(item, results[ii]);
continue;
}
}
}
// schedule read from device.
ReadValueId valueToRead = new ReadValueId();
valueToRead.NodeId = item.NodeId;
valueToRead.AttributeId = Attributes.Value;
valueToRead.Handle = ii;
valuesToRead.Add(valueToRead);
items.Add(item);
}
}
if (valuesToRead.Count == 0)
{
return results;
}
// read the values from the server.
DaValue[] remoteResults = m_manager.Read(valuesToRead);
// copy results.
for (int ii = 0; ii < valuesToRead.Count; ii++)
{
int index = (int)valuesToRead[ii].Handle;
if (isInitialRefresh)
{
UpdateCache(items[ii], remoteResults[ii], isInitialRefresh);
}
UpdateReadResult(items[ii], remoteResults[ii]);
results[(int)valuesToRead[ii].Handle] = remoteResults[ii];
}
return results;
}