public InclusionTask(NetworkViewPoint network, IAddRemoveNode addRemoveNode, bool IsSmartStart) : base(false, null) { _network = network; _isSmartStart = IsSmartStart; if (addRemoveNode is AddNodeOperation) { _mode = (addRemoveNode as AddNodeOperation).InitMode; _nodeStatusCallback = (addRemoveNode as AddNodeOperation).NodeStatusCallback; _timeoutMs = (addRemoveNode as AddNodeOperation).TimeoutMs; } else { _mode = Modes.NodeAny; _timeoutMs = TIMEOUT; } _peerFilter = new FilterAchOperation(); _peerFilter.SetFilterNodeId(0xFF); _addNode = addRemoveNode; _addNode.NodeStatusCallback = OnNodeStatus; _memoryGetId = new MemoryGetIdOperation(); _getSucNodeId = new GetSucNodeIdOperation(); _isFailedSucNodeOperation = new IsFailedNodeOperation(0); _getSucNodeInfo = new RequestNodeInfoOperation(0); _requestSucNodeInfoGroup = new ActionSerialGroup(OnSucNodeInfoCompletedGroup, _getSucNodeId, _isFailedSucNodeOperation, _getSucNodeInfo) { Name = "RequestSucNodeInfoGroup (InclusionController)", CompletedCallback = OnRequestSucNodeInfoGroupCompleted }; _setupNodeLifelineTask = new SetupNodeLifelineTask(_network); _requestInclusionController = new InclusionController.Initiate(0, 0, _txOptions, 240000) { Name = "ReguestData (InclusionController)" }; _serialApiGetInitData = new SerialApiGetInitDataOperation(); SpecificResult.AddRemoveNode = _addNode.SpecificResult; SpecificResult.MemoryGetId = _memoryGetId.SpecificResult; SpecificResult.GetSucNodeId = _getSucNodeId.SpecificResult; SpecificResult.NodeInfo = _setupNodeLifelineTask.SpecificResult.NodeInfo; SpecificResult.SetWakeUpInterval = _setupNodeLifelineTask.SpecificResult.SetWakeUpInterval; _isFailedNodeOperation = new IsFailedNodeOperation(_addNode.SpecificResult.Id); _removeFailedNodeIdOperation = new RemoveFailedNodeIdOperation(_addNode.SpecificResult.Id); if (!_isSmartStart) { _isFailedNodeOperation.Token.SetCancelled(); _removeFailedNodeIdOperation.Token.SetCancelled(); } Actions = new ActionBase[] { _peerFilter, new ActionSerialGroup(OnActionCompleted, _memoryGetId, _requestSucNodeInfoGroup, _serialApiGetInitData, (ActionBase)_addNode, _isFailedNodeOperation, _removeFailedNodeIdOperation, _requestInclusionController, _setupNodeLifelineTask ) { Name = "Inclusion (Group)" } }; }
private void OnActionCompleted(ActionBase action, ActionResult result) { if (result is MemoryGetIdResult && result) { _setupNodeLifelineTask.NodeId = _memoryGetId.SpecificResult.NodeId; } else if (result is SerialApiGetInitDataResult && result) { if (_addNode is AddNodeOperation) { (_addNode as AddNodeOperation).NodesBefore = (result as SerialApiGetInitDataResult).IncludedNodes; } } else if (result is AddRemoveNodeResult) { if (result) { _setupNodeLifelineTask.TargetNodeId = _addNode.SpecificResult.Id; _setupNodeLifelineTask.BasicDeviceType = _addNode.SpecificResult.Basic; if (_addNode.SpecificResult.Id == _getSucNodeId.SpecificResult.SucNodeId) { _requestInclusionController.Token.SetCancelled(); } else { if (_addNode.SpecificResult.AddRemoveNodeStatus == AddRemoveNodeStatuses.Replicated) { _setupNodeLifelineTask.Token.SetCancelled(); _requestInclusionController.Token.SetCancelled(); } else { byte stepId = _addNode.SpecificResult.AddRemoveNodeStatus == AddRemoveNodeStatuses.Replaced ? PROXY_INCLUSION_REPLACE : PROXY_INCLUSION; _requestInclusionController.SetCommandParameters(_addNode.SpecificResult.Id, stepId); } } if ((result as AddRemoveNodeResult).SubstituteStatus == SubstituteStatuses.Failed && _isSmartStart) { if (_isFailedNodeOperation != null) { _isFailedNodeOperation.NodeId = _addNode.SpecificResult.Id; } else { _isFailedNodeOperation = new IsFailedNodeOperation(_addNode.SpecificResult.Id); } } else { _isFailedNodeOperation.Token.SetCancelled(); _removeFailedNodeIdOperation.Token.SetCancelled(); } } else { //this.Token.Result.TraceLog.Add(result.TraceLog); _setupNodeLifelineTask.Token.SetCancelled(); _requestInclusionController.Token.SetCancelled(); //if (result.State == ActionStates.Failed) //{ // SetStateFailed(null); //} //else if (result.State == ActionStates.Expired) //{ // SetStateExpired(null); //} } } else if (result is RequestDataResult && result) { var requestRes = (RequestDataResult)result; if (requestRes.Command != null && requestRes.Command.Length > 2 && requestRes.Command[0] == COMMAND_CLASS_INCLUSION_CONTROLLER.ID && requestRes.Command[1] == COMMAND_CLASS_INCLUSION_CONTROLLER.COMPLETE.ID) { COMMAND_CLASS_INCLUSION_CONTROLLER.COMPLETE cmd = requestRes.Command; if (cmd.status == 0x01) { SpecificResult.AddRemoveNode.SubstituteStatus = SubstituteStatuses.Done; } } } else if (result is IsFailedNodeResult) { if ((result as IsFailedNodeResult).RetValue) { _setupNodeLifelineTask.Token.SetCancelled(); SpecificResult.AddRemoveNode.AddRemoveNodeStatus = AddRemoveNodeStatuses.None; if (_removeFailedNodeIdOperation != null) { _removeFailedNodeIdOperation.ReplacedNodeId = _addNode.SpecificResult.Id; } else { _removeFailedNodeIdOperation = new RemoveFailedNodeIdOperation(_addNode.SpecificResult.Id); } } else { _removeFailedNodeIdOperation.Token.SetCancelled(); } } }