Пример #1
0
        private void JumpToNextRequest()
        {
            if (currRequests.Count == 0)
            {
                if (currOppositeRequests.Count > 0)
                {
                    currRequests = currOppositeRequests;
                }
                else if (currDelayedRequests.Count > 0)
                {
                    currRequests = currDelayedRequests;
                }
                else
                {
                    SetState(idleState);
                    return;
                }
            }

            currRequest = currRequests.Peek;

            if (currRequest.FloorNum == currFloorNum)
            {
                RequestNoLongerActual(currRequest, this);
                currRequests.Dequeue();
                JumpToNextRequest();

                if (currRequests.Count == 0)
                {
                    SetState(idleState);
                    return;
                }
            }

            SetState(movingState);
        }
Пример #2
0
        //todo: make it not that scary
        public void AddRequest(int desiredFloorNum, ElevatorDirection desiredDirection)
        {
            if (desiredFloorNum < 1 || !Floors.ContainsKey(desiredFloorNum))
            {
                return;
            }

            if (desiredDirection == ElevatorDirection.none) // from cabin btn
            {
                if (desiredFloorNum == currFloorNum)
                {
                    return;
                }

                desiredDirection = GetDirectionToRequestedFloor(desiredFloorNum);
                CabinFloorRequested.Invoke(desiredFloorNum);
            }

            var request = new Request(desiredDirection, desiredFloorNum);

            if (IsIdle)
            {
                if (request.Direction == ElevatorDirection.up)
                {
                    currRequests         = upRequests;
                    currOppositeRequests = downRequests;
                    currDelayedRequests  = upDelayedRequests;
                }
                else
                {
                    currRequests         = downRequests;
                    currOppositeRequests = upRequests;
                    currDelayedRequests  = downDelayedRequests;
                }

                currRequests.Enqueue(request);
                currRequest = request;
                SetState(movingState);
                PrintElevatorState();
                return;
            }

            if (request.Equals(currRequest))
            {
                RequestNoLongerActual.Invoke(currRequest, this);
            }
            else if (request.Direction != currRequest.Direction)
            {
                currOppositeRequests.Enqueue(request);
            }
            else if (movingDirection != request.Direction)
            {
                currRequests.Enqueue(request);
            }
            else if ((movingDirection == ElevatorDirection.up ? 1 : -1) * (request.FloorNum - currFloorNum) > 0)
            {
                currRequests.Enqueue(request);
            }
            else
            {
                currDelayedRequests.Enqueue(request);
            }

            if (IsIdle)
            {
                return;
            }

            if (currentState != doorsCycleState)
            {
                currRequest = currRequests.Peek;
            }

            PrintElevatorState();
        }