示例#1
0
    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);
            }
        }
    }
示例#2
0
    private async void ExecuteRequest(Request request, bool isDependency)
    {
        switch (request.Command)
        {
        case Request.Commands.GENERATE:
            PlanGenerator.GeneratePlan(this, request as PlanRequest);
            break;

        case Request.Commands.EXECUTE:
            PlanExecuter.ExecutePlan(this, request as PlanRequest);
            break;

        case Request.Commands.HEARTBEAT:
            Heartbeat.RespondToHeartbeat(this, request);
            break;

        case Request.Commands.PING:
            Ping.RespondToPing(this, request);
            break;

        case Request.Commands.DETECTFAILURE:
            FailureDetection.DetectFailure(this, request as DetectFailureRequest);
            break;

        case Request.Commands.DISCOVER:

            await Discovery.DiscoverAsync(this, request as DiscoveryRequest);

            break;

        case Request.Commands.POSITION:
            PositionResponse response = new PositionResponse(Id, request.SourceID, Response.ResponseCodes.OK, request.MessageIdentifer, Position);
            CommsModule.Send(request.SourceID, response);
            break;

        case Request.Commands.ADDITION:

            List <uint?>    neighbours = CommsModule.Discover();
            AdditionRequest addition   = (request as AdditionRequest).DeepCopy();

            List <ConstellationPlanField> fields = new List <ConstellationPlanField> {
                new ConstellationPlanField("DeltaV", 0, (x, y) => x.CompareTo(y))
            };
            addition.plan.Entries.Add(new ConstellationPlanEntry(Id, Position, fields, (x, y) => 1));
            ActivePlan = addition.plan;
            Router.UpdateNetworkMap(addition.plan);

            NodeAdditionResponse additionResponse = new NodeAdditionResponse(Id, request.SourceID, Response.ResponseCodes.OK, request.MessageIdentifer, Position, neighbours);
            CommsModule.Send(request.SourceID, additionResponse);
            break;

        case Request.Commands.UPDATENETWORKMAP:
            NetworkUpdateRequest updateRequest = request as NetworkUpdateRequest;

            //Remove any dead nodes from the networkmap
            Router.NetworkMap.Entries.RemoveAll(entry => updateRequest.DeadNodes.Contains(entry.ID));

            //Remove any dead nodes from neighbour lists
            foreach (NetworkMapEntry entry in Router.NetworkMap.Entries)
            {
                foreach (uint?deadNode in updateRequest.DeadNodes)
                {
                    entry.Neighbours.Remove(deadNode);
                }
            }
            break;

        default:
            throw new NotImplementedException(request.Command.ToString() + " was not implemented.");
        }
    }