private void OnReceived(DataReceivedUnit unit) { var payload = ((ApiHandler)unit.ActionHandler).DataFrame.Payload; _homeId = new byte[] { payload[3], payload[4], payload[5], payload[6] }; var dsk = _dskNeededCallback(_homeId); if (!_isRunning && dsk != null && dsk.Item2 != null && dsk.Item2.Length >= 16) { SetRunning(); byte[] dskPart = new byte[8]; Array.Copy(dsk.Item2, 8, dskPart, 0, 8); IAddRemoveNode addNode = null; if (dsk.Item1 > 0) { //addNode = new ReplaceFailedNodeOperation(dsk.First, _setNodeStatusSignal, _timeoutMs, dskPart) { SequenceNumber = SequenceNumber, DskValue = dsk.Item2 }; addNode = new AddNodeOperation((Modes.NodeOptionNetworkWide | Modes.NodeHomeId), _setNodeStatusSignal, _timeoutMs, dskPart) { SequenceNumber = SequenceNumber, DskValue = dsk.Item2, GrantSchemesValue = dsk.Item3 }; } else { addNode = new AddNodeOperation((Modes.NodeOptionNetworkWide | Modes.NodeHomeId), _setNodeStatusSignal, _timeoutMs, dskPart) { SequenceNumber = SequenceNumber, DskValue = dsk.Item2, GrantSchemesValue = dsk.Item3 }; } var action = new InclusionTask(_network, addNode, true); action.CompletedCallback = (x) => { var act = x as ActionBase; if (act != null) { ReleaseRunning(); _busyCallback(false, dsk.Item2, act.Result); } }; unit.SetNextActionItems(new ActionSerialGroup(action, new SetSmartStartAction(true))); _busyCallback(true, null, null); } else { unit.SetNextActionItems(new SetSmartStartAction(true)); } }
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)" } }; }
public InclusionTask(NetworkViewPoint network, IAddRemoveNode addRemoveNode) : this(network, addRemoveNode, false) { }