Пример #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
    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;
    }
Пример #3
0
    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;
    }
Пример #4
0
    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;
            }
        }
    }