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)" } }; }
protected override void OnHandledInternal(DataReceivedUnit ou) { byte nodeId = ReceivedAchData.SrcNodeId; byte[] command = ReceivedAchData.Command; if (command != null && command.Length > 1) { if (command[1] == COMMAND_CLASS_INCLUSION_CONTROLLER.INITIATE.ID && nodeIdToInclude == 0) { var initiateCommand = (COMMAND_CLASS_INCLUSION_CONTROLLER.INITIATE)command; if (initiateCommand.stepId == PROXY_INCLUSION || initiateCommand.stepId == PROXY_INCLUSION_REPLACE) { /*TO# 07220 - Delay before request Node Info*/ Thread.Sleep(2000); //if we're not SIS then ignore if (_securityManagerInfo.Network.SucNodeId == _securityManagerInfo.Network.NodeId) { //Start add node for example nodeIdToInclude = initiateCommand.nodeId; var isVirtualNodeOperation = new IsVirtualNodeOperation(nodeIdToInclude); if (ReceivedAchData.CommandType != CommandTypes.CmdApplicationCommandHandler_Bridge) { isVirtualNodeOperation.Token.SetCancelled(); } var stepId = initiateCommand.stepId; var sendDataComplete = new InclusionController.Complete(nodeId, TxOptions); sendDataComplete.SetCommandParameters(STEP_OK, stepId); var requestDataStep2 = new InclusionController.Initiate(0, nodeId, TxOptions, 20000); requestDataStep2.SetCommandParameters(nodeIdToInclude, S0_INCLUSION); var sendDataRejectComplete = new InclusionController.Complete(nodeId, TxOptions); sendDataRejectComplete.SetCommandParameters(STEP_USER_REJECTED, stepId); var addNodeOperation = new AddNodeS2Operation(_securityManagerInfo); addNodeOperation.SetInclusionControllerInitiateParameters(nodeIdToInclude); var setupNodeLifelineTask = new SetupNodeLifelineTask(_securityManagerInfo.Network); setupNodeLifelineTask.NodeId = _securityManagerInfo.Network.NodeId; setupNodeLifelineTask.SucNodeId = _securityManagerInfo.Network.NodeId; setupNodeLifelineTask.TargetNodeId = nodeIdToInclude; setupNodeLifelineTask.CompletedCallback = OnNodeInfoCompleted; var serialGroup = new ActionSerialGroup(OnInitiateFlowActionCompleted, isVirtualNodeOperation, new RequestNodeInfoOperation(nodeIdToInclude) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }, addNodeOperation, requestDataStep2, setupNodeLifelineTask, sendDataComplete); serialGroup.ActionUnitStop = new ActionUnit(sendDataRejectComplete); //hack serialGroup.Token.Result = new AddRemoveNodeResult(); serialGroup.CompletedCallback = OnS2SerialGroupCompleted; if (_inclusionControllerStatusUpdateCallback != null) { _inclusionControllerStatusUpdateCallback(serialGroup.Token, false); } ou.SetNextActionItems(serialGroup); } } else if (initiateCommand.stepId == S0_INCLUSION) { //only if asked from SIS if (_securityManagerInfo.Network.SucNodeId == nodeId) { InclusionController.Complete sendDataComplete = null; //Start S0 nodeIdToInclude = initiateCommand.nodeId; if (_securityManagerInfo.Network.HasSecurityScheme(SecuritySchemes.S0)) { sendDataComplete = new InclusionController.Complete(nodeId, TxOptions); sendDataComplete.SetCommandParameters(STEP_OK, S0_INCLUSION); var addNodeOperation = new AddNodeS0Operation(_securityManagerInfo); addNodeOperation.SetInclusionControllerInitiateParameters(nodeIdToInclude); var nodeInfoOperation = new RequestNodeInfoOperation(nodeIdToInclude); nodeInfoOperation.CompletedCallback = OnNodeInfoCompleted; var serialGroup = new ActionSerialGroup(new RequestNodeInfoOperation(nodeIdToInclude) { SubstituteSettings = new SubstituteSettings(SubstituteFlags.DenySecurity, 0) }, addNodeOperation, nodeInfoOperation, sendDataComplete); //hack serialGroup.Token.Result = new AddRemoveNodeResult(); ou.SetNextActionItems(serialGroup); } else { sendDataComplete = new InclusionController.Complete(nodeId, TxOptions); sendDataComplete.SetCommandParameters(STEP_NOT_SUPPORTED, S0_INCLUSION); ou.SetNextActionItems(sendDataComplete); } } } } else if (command[1] == COMMAND_CLASS_INCLUSION_CONTROLLER.COMPLETE.ID) { } } }