示例#1
0
        public Elevator AddRequest(int floorNumber, FloorRequestDirection requestDirection, int destinationFloor, ElevatorCallback elvatorArrivedAtFloorCallback, ElevatorCallback servedRequestCallback)
        {
            Elevator       elevatorServedRequest   = null;
            AutoResetEvent waitforCompletionSignal = new AutoResetEvent(false);

            AddFloorRequest(floorNumber, requestDirection,
                            elevatorArrivedAtRequestFloor: (elevatorArrivedAtFloor) =>
            {
                elevatorArrivedAtFloor.AddRequest(destinationFloor: destinationFloor,
                                                  servedRequestCallback: (elevator) =>
                {
                    elevatorServedRequest = elevator;
                    Debug.WriteLine("Closing door after serving request");
                    servedRequestCallback(elevator);
                    waitforCompletionSignal.Set();
                });

                Debug.WriteLine("Closing door at arrived floor");

                elvatorArrivedAtFloorCallback(elevatorArrivedAtFloor);
            });


            waitforCompletionSignal.WaitOne();
            return(elevatorServedRequest);
        }
示例#2
0
        public void AddFloorRequest(int floorNumber, FloorRequestDirection requestDirection, ElevatorCallback elevatorArrivedAtRequestFloor)
        {
            if (requestDirection == FloorRequestDirection.UP)
            {
                _floors[floorNumber].SetMovingUpRequest(elevatorArrivedAtRequestFloor);
            }
            else
            {
                _floors[floorNumber].SetMovingDownRequest(elevatorArrivedAtRequestFloor);
            }

            Elevator elevatorInRequestFloor = _elevatorPicker.GetSutableElevator(_minFloor, _maxFloor, floorNumber, requestDirection, _elevators);

            elevatorInRequestFloor.AddRequest(floorNumber, elevatorArrivedAtRequestFloor);
        }
        private static Elevator GetElevatorInFloor(int actualFloor, int currentSearchingFloor, FloorRequestDirection requestDirection, List <Elevator> elevatorsList)
        {
            ElevatorState preferredElevatorState = FloorRequestDirection.Down == requestDirection ? ElevatorState.GoingDown : ElevatorState.GoingUp;

            Elevator elevatorSelected = null;

            //Checking if any elevator moving towards requested floor and in requested direction
            if ((requestDirection == FloorRequestDirection.UP && currentSearchingFloor <= actualFloor) || (requestDirection == FloorRequestDirection.Down && currentSearchingFloor >= actualFloor))
            {
                elevatorSelected = elevatorsList.FirstOrDefault(elevator => (elevator.CurrentFloor == currentSearchingFloor && elevator.State == preferredElevatorState));
            }

            //If no elevator moving in request direction then checking if any elevator in stopped current floor
            if (null == elevatorSelected)
            {
                elevatorSelected = elevatorsList.FirstOrDefault(elevator => (elevator.CurrentFloor == currentSearchingFloor && elevator.State == ElevatorState.Stopped));
            }

            return(elevatorSelected);
        }
        public Elevator GetSutableElevator(int minFloor, int maxfloor, int floorNumber, FloorRequestDirection requestDirection, List <Elevator> elevatorsList)
        {
            Elevator elevatorSelected = null;
            int      counter          = 0;

            while (floorNumber + counter <= maxfloor || floorNumber - counter >= minFloor)
            {
                if (floorNumber + counter <= maxfloor)
                {
                    elevatorSelected = GetElevatorInFloor(floorNumber, floorNumber + counter, requestDirection, elevatorsList);
                }

                if (elevatorSelected == null)
                {
                    if (floorNumber - counter >= minFloor)
                    {
                        elevatorSelected = GetElevatorInFloor(floorNumber, floorNumber - counter, requestDirection, elevatorsList);
                    }
                }

                if (elevatorSelected != null)
                {
                    return(elevatorSelected);
                }

                counter++;
            }

            return(elevatorSelected);
        }
示例#5
0
 //TODO: This is blocking request currently this can be changed async
 public Elevator AddRequest(int floorNumber, FloorRequestDirection requestDirection, int destinationFloor)
 {
     return(AddRequest(floorNumber, requestDirection, destinationFloor, elvatorArrivedAtFloorCallback: Elevator.CloseDoorsAction, servedRequestCallback: Elevator.CloseDoorsAction));
 }
示例#6
0
        public void GivenMultipleElevatorsInSameFloor_WhenRequestIsRaised_ThenNearestAndPrefrredStateElevatorIsSelected(int floor, FloorRequestDirection floorRequestDirection, int goingUpElevatorFloor, int goingDownElevatorFloor, int stoppedElevatorFloor, string expectedElevator)
        {
            //Arrange
            var floors = new SortedList <int, Floor>()
            {
                { 1, new Floor(1) }
            };
            ElevatorPicker elevatorPicker = new ElevatorPicker();

            var elevatorOne = new Mock <Elevator>(floors, "");

            elevatorOne.Setup(elevator => elevator.Name).Returns(() => "Elevator 1");
            elevatorOne.Setup(elevator => elevator.CurrentFloor).Returns(() => goingUpElevatorFloor);
            elevatorOne.Setup(elevator => elevator.State).Returns(() => ElevatorState.GoingUp);

            var elevatorTwo = new Mock <Elevator>(floors, "");

            elevatorTwo.Setup(elevator => elevator.Name).Returns(() => "Elevator 2");
            elevatorTwo.Setup(elevator => elevator.CurrentFloor).Returns(() => goingDownElevatorFloor);
            elevatorTwo.Setup(elevator => elevator.State).Returns(() => ElevatorState.GoingDown);

            var elevatorThree = new Mock <Elevator>(floors, "");

            elevatorThree.Setup(elevator => elevator.Name).Returns(() => "Elevator 3");
            elevatorThree.Setup(elevator => elevator.CurrentFloor).Returns(() => stoppedElevatorFloor);
            elevatorThree.Setup(elevator => elevator.State).Returns(() => ElevatorState.Stopped);

            List <Elevator> elevators = new List <Elevator>();

            elevators.Add(elevatorOne.Object);
            elevators.Add(elevatorTwo.Object);
            elevators.Add(elevatorThree.Object);


            //Act
            Elevator elevatorReturned = elevatorPicker.GetSutableElevator(minFloor: -2, maxfloor: 10, floorNumber: floor, requestDirection: floorRequestDirection, elevatorsList: elevators);


            //Assert
            Assert.Equal(expectedElevator, elevatorReturned.Name);
        }