private void ChangePhase(ISystemContext context, NodeId phaseId) { m_currentPhase = phaseId; m_rig.CurrentPhase.Value = phaseId; m_rig.CurrentPhase.ClearChangeMasks(context, false); try { // build the requests. List <DataSourceClient.WriteRequest> requests = new List <DataSourceClient.WriteRequest>(); for (int ii = 0; ii < m_tools.Count; ii++) { NodeId lockId = m_tools[ii].GetLockForPhase(m_currentPhase); if (NodeId.IsNull(lockId) || m_tools[ii].ActiveLockId == null) { continue; } m_tools[ii].ActiveLockId.Value = lockId.ToString(); RemoteNode remoteNode = null; if (m_remoteNodes.TryGetValue(m_tools[ii].ActiveLockId.NodeId, out remoteNode)) { DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest(); request.Index = 0; request.RemoteId = remoteNode.RemoteId; request.WriteValue = new WriteValue(); request.WriteValue.AttributeId = Attributes.Value; request.WriteValue.Value.Value = lockId.ToString(); requests.Add(request); } } // update the remote data source. List <ServiceResult> results = m_source.Write(requests); for (int ii = 0; ii < requests.Count; ii++) { if (ServiceResult.IsBad(results[ii])) { Utils.Trace("Update ActiveLockId failed: {0}", results[ii].ToString()); } } } catch (Exception e) { Utils.Trace("Could not update ActiveLockIds: {0}", e.Message); } }
/// <summary> /// Writes the value for the specified attributes. /// </summary> public override void Write( OperationContext context, IList<WriteValue> nodesToWrite, IList<ServiceResult> errors) { ServerSystemContext systemContext = SystemContext.Copy(context); IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>(); List<DataSourceClient.WriteRequest> writeRequests = new List<DataSourceClient.WriteRequest>(); lock (Lock) { for (int ii = 0; ii < nodesToWrite.Count; ii++) { WriteValue nodeToWrite = nodesToWrite[ii]; // skip items that have already been processed. if (nodeToWrite.Processed) { continue; } // check for valid handle. NodeHandle handle = GetManagerHandle(systemContext, nodeToWrite.NodeId, operationCache); if (handle == null) { continue; } // owned by this node manager. nodeToWrite.Processed = true; // index range is not supported. if (nodeToWrite.AttributeId != Attributes.Value) { if (!String.IsNullOrEmpty(nodeToWrite.IndexRange)) { errors[ii] = StatusCodes.BadWriteNotSupported; continue; } } // check if the node is a area in memory. if (handle.Node == null) { errors[ii] = StatusCodes.BadNodeIdUnknown; continue; } // check if the request if for a remote node. RemoteNode remoteNode = null; if (m_remoteNodes.TryGetValue(handle.NodeId, out remoteNode)) { // check for theorectical access. BaseVariableState variable = handle.Node as BaseVariableState; if (variable == null || nodeToWrite.AttributeId != Attributes.Value || (variable.AccessLevel & AccessLevels.CurrentWrite) == 0) { errors[ii] = StatusCodes.BadNotWritable; continue; } // check for access based on current user credentials. if (!CheckWriteAccess(systemContext, remoteNode)) { errors[ii] = StatusCodes.BadUserAccessDenied; continue; } DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest(); request.RemoteId = remoteNode.RemoteId; request.WriteValue = nodeToWrite; request.Index = ii; writeRequests.Add(request); errors[ii] = StatusCodes.BadNoCommunication; continue; } // write the attribute value. errors[ii] = handle.Node.WriteAttribute( systemContext, nodeToWrite.AttributeId, nodeToWrite.ParsedIndexRange, nodeToWrite.Value); // updates to source finished - report changes to monitored items. handle.Node.ClearChangeMasks(systemContext, false); } // check for nothing to do. if (writeRequests.Count == 0) { return; } } // update the remote data source. List<ServiceResult> results = m_source.Write(writeRequests); for (int ii = 0; ii < writeRequests.Count; ii++) { errors[writeRequests[ii].Index] = results[ii]; } }
private void ChangePhase(ISystemContext context, NodeId phaseId) { m_currentPhase = phaseId; m_rig.CurrentPhase.Value = phaseId; m_rig.CurrentPhase.ClearChangeMasks(context, false); try { // build the requests. List<DataSourceClient.WriteRequest> requests = new List<DataSourceClient.WriteRequest>(); for (int ii = 0; ii < m_tools.Count; ii++) { NodeId lockId = m_tools[ii].GetLockForPhase(m_currentPhase); if (NodeId.IsNull(lockId) || m_tools[ii].ActiveLockId == null) { continue; } m_tools[ii].ActiveLockId.Value = lockId.ToString(); RemoteNode remoteNode = null; if (m_remoteNodes.TryGetValue(m_tools[ii].ActiveLockId.NodeId, out remoteNode)) { DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest(); request.Index = 0; request.RemoteId = remoteNode.RemoteId; request.WriteValue = new WriteValue(); request.WriteValue.AttributeId = Attributes.Value; request.WriteValue.Value.Value = lockId.ToString(); requests.Add(request); } } // update the remote data source. List<ServiceResult> results = m_source.Write(requests); for (int ii = 0; ii < requests.Count; ii++) { if (ServiceResult.IsBad(results[ii])) { Utils.Trace("Update ActiveLockId failed: {0}", results[ii].ToString()); } } } catch (Exception e) { Utils.Trace("Could not update ActiveLockIds: {0}", e.Message); } }
/// <summary> /// Writes the value for the specified attributes. /// </summary> public override void Write( OperationContext context, IList <WriteValue> nodesToWrite, IList <ServiceResult> errors) { ServerSystemContext systemContext = SystemContext.Copy(context); IDictionary <NodeId, NodeState> operationCache = new NodeIdDictionary <NodeState>(); List <DataSourceClient.WriteRequest> writeRequests = new List <DataSourceClient.WriteRequest>(); lock (Lock) { for (int ii = 0; ii < nodesToWrite.Count; ii++) { WriteValue nodeToWrite = nodesToWrite[ii]; // skip items that have already been processed. if (nodeToWrite.Processed) { continue; } // check for valid handle. NodeHandle handle = GetManagerHandle(systemContext, nodeToWrite.NodeId, operationCache); if (handle == null) { continue; } // owned by this node manager. nodeToWrite.Processed = true; // index range is not supported. if (nodeToWrite.AttributeId != Attributes.Value) { if (!String.IsNullOrEmpty(nodeToWrite.IndexRange)) { errors[ii] = StatusCodes.BadWriteNotSupported; continue; } } // check if the node is a area in memory. if (handle.Node == null) { errors[ii] = StatusCodes.BadNodeIdUnknown; continue; } // check if the request if for a remote node. RemoteNode remoteNode = null; if (m_remoteNodes.TryGetValue(handle.NodeId, out remoteNode)) { // check for theorectical access. BaseVariableState variable = handle.Node as BaseVariableState; if (variable == null || nodeToWrite.AttributeId != Attributes.Value || (variable.AccessLevel & AccessLevels.CurrentWrite) == 0) { errors[ii] = StatusCodes.BadNotWritable; continue; } // check for access based on current user credentials. if (!CheckWriteAccess(systemContext, remoteNode)) { errors[ii] = StatusCodes.BadUserAccessDenied; continue; } DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest(); request.RemoteId = remoteNode.RemoteId; request.WriteValue = nodeToWrite; request.Index = ii; writeRequests.Add(request); errors[ii] = StatusCodes.BadNoCommunication; continue; } // write the attribute value. errors[ii] = handle.Node.WriteAttribute( systemContext, nodeToWrite.AttributeId, nodeToWrite.ParsedIndexRange, nodeToWrite.Value); // updates to source finished - report changes to monitored items. handle.Node.ClearChangeMasks(systemContext, false); } // check for nothing to do. if (writeRequests.Count == 0) { return; } } // update the remote data source. List <ServiceResult> results = m_source.Write(writeRequests); for (int ii = 0; ii < writeRequests.Count; ii++) { errors[writeRequests[ii].Index] = results[ii]; } }