public void CheckAllocatedCapabilities() { // We ignore faults for unused capabilities that are currently not used to improve general model checking efficiency // For DCCA efficiency, it would be beneficial, however, to check for faults of all capabilities and I/O relations; // this is also how the ODP seems to work // Using ToArray() to prevent modifications of the list during iteration... foreach (var capability in AvailableCapabilities.ToArray()) { if (!CheckAllocatedCapability(capability)) { AvailableCapabilities.Remove(capability); } } foreach (var input in Inputs.ToArray()) { if (!CheckInput(input)) { Disconnect(input, this); } } foreach (var output in Outputs.ToArray()) { if (!CheckOutput(output)) { Disconnect(this, output); } } }
public override void Process(ProcessCapability capability) { if (Resource == null) { return; } if (_currentCapability != capability) { // Switch the capability; if we fail to do so, remove all other capabilities from the available ones and // trigger a reconfiguration if (Robot.SwitchCapability(capability)) { _currentCapability = capability; } else { AvailableCapabilities.RemoveAll(c => c != _currentCapability); CheckConstraints(); return; } } // Apply the capability; if we fail to do so, remove it from the available ones and trigger a reconfiguration if (!Robot.ApplyCapability()) { AvailableCapabilities.Remove(capability); CheckConstraints(); } else { if (Resource.State.Count() == Resource.Task.Capabilities.Length) { throw new InvalidOperationException(); } Resource.OnCapabilityApplied(); } }