private static void Transmit(PlanRequest request, INode myNode) { // If last location is filled, execute the plan if (request.Plan.Entries.All(x => x.NodeID != null)) { request.Command = Request.Commands.EXECUTE; request.SourceID = myNode.Id; PlanExecuter.ExecutePlan(myNode, request); } else { uint?nextSeq = myNode.Router.NextSequential(myNode, request.Dir); if (nextSeq == null) { Router.CommDir newDir = request.Dir == Router.CommDir.CW ? Router.CommDir.CCW : Router.CommDir.CW; request.Dir = newDir; nextSeq = myNode.Router.NextSequential(myNode, newDir); } request.DestinationID = nextSeq; if (myNode.Router.NetworkMap.GetEntryByID(myNode.Id).Neighbours.Contains(nextSeq)) { myNode.CommsModule.SendAsync(nextSeq, request, Constants.COMMS_TIMEOUT, Constants.COMMS_ATTEMPTS); } else { uint?nextHop = myNode.Router.NextHop(myNode.Id, nextSeq); myNode.CommsModule.SendAsync(nextHop, request, Constants.COMMS_TIMEOUT, Constants.COMMS_ATTEMPTS); } } }
public Request(uint?sourceID, uint?destinationID, Commands command) { SourceID = sourceID; DestinationID = destinationID; Command = command; Dir = Router.CommDir.CW; MessageIdentifer = DateTime.Now.ToString() + " milli " + DateTime.Now.Millisecond; }
public Request(Request other) { SourceID = other.SourceID; DestinationID = other.DestinationID; Command = other.Command; MessageIdentifer = string.Copy(other.MessageIdentifer); ResponseExpected = other.ResponseExpected; AckExpected = other.AckExpected; Dir = other.Dir; DependencyRequests = other.DependencyRequests; }
private static async void CheckPropagation(bool propagationAllowed, DiscoveryRequest request, INode myNode) { DiscoveryRequest newRequest = request.DeepCopy(); //If the request is going in circles, finish when it has completed an entire cycle if (newRequest.SourceID == myNode.Id && request.SenderID != myNode.Id) { if (newRequest.Alterations.Any() && newRequest.EdgeDetected == false) { Recover(myNode); return; } return; } UpdateConstellationPlan(myNode); uint?nextSequentialNode = myNode.Router.NextSequential(myNode, newRequest.Dir); Router.CommDir oppositeCommDir = newRequest.Dir == Router.CommDir.CW ? Router.CommDir.CCW : Router.CommDir.CW; uint? nextSequentialNodeOpposite = myNode.Router.NextSequential(myNode, oppositeCommDir); if (propagationAllowed || newRequest.requireFullSync) { if (nextSequentialNode == null || nextSequentialNodeOpposite == null) { newRequest.SourceID = myNode.Id; if (newRequest.firstPassDone) { if (newRequest.Alterations.Any()) { Recover(myNode); } return; } if (newRequest.EdgeDetected == false) { newRequest.EdgeDetected = true; } else { newRequest.firstPassDone = true; if (newRequest.Alterations.Any()) { Recover(myNode); return; } } } //If there is no node in the current comms direction, reverse the direction. newRequest.DestinationID = nextSequentialNode ?? nextSequentialNodeOpposite; newRequest.Dir = nextSequentialNode != null ? newRequest.Dir : oppositeCommDir; await RelayMessage(newRequest, myNode); } else { if (newRequest.Alterations.Any()) { Recover(myNode); return; } } }