Exemplo n.º 1
0
        /// <summary>
        /// Triggered when someone has pressed the down button at a floor.
        /// Note that passengers will press the button again if they fail to enter an elevator.
        /// Maybe tell an elevator to go to this floor?
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult DownButtonPressed(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);
            var floor      = skyscraper.Floors[skyscraperDto.EventRaisedFloorNumber];
            var elevators  = skyscraper.Elevators;

            foreach (var elevator in elevators)
            {
                // We use these two queues to keep track of new destinations so that we can create elevator commands
                elevator.NewDestinations.Clear();
                elevator.JumpQueueDestinations.Clear();
            }

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                floor.OnDownButtonPressed(elevators.ToArray());
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }

            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Triggered slightly before the elevator will pass a floor.
        /// A good time to decide whether to stop at that floor.
        /// Note that this event is not triggered for the destination floor.
        /// Direction is either "up" or "down".
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult PassingFloor(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                var eventRaisedElevatorIndex = skyscraperDto.EventRaisedElevatorIndex;
                var passingFloorNumber       = skyscraperDto.Elevators[eventRaisedElevatorIndex].PassingFloorNumber;
                var direction = skyscraperDto.Elevators[eventRaisedElevatorIndex].Direction;
                var eventArgs = new PassingFloorEventArgs
                {
                    PassingFloorNumber = passingFloorNumber,
                    Direction          = direction
                };
                skyscraper.Elevators[eventRaisedElevatorIndex].OnPassingFloor(eventArgs);
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }

            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Use ElevatorCommands for sending back to client.
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <param name="skyscraper"></param>
        /// <returns></returns>
        internal static ElevatorCommands CreateElevatorCommands(SkyscraperDto skyscraperDto, Skyscraper skyscraper)
        {
            var elevatorCommands      = new ElevatorCommands();
            var jumpQueueDestinations = skyscraper.Elevators[skyscraperDto.EventRaisedElevatorIndex].JumpQueueDestinations;
            var newDestinations       = skyscraper.Elevators[skyscraperDto.EventRaisedElevatorIndex].NewDestinations;



            while (jumpQueueDestinations.Count > 0)
            {
                AddGoToFloorCommands(skyscraperDto, jumpQueueDestinations, elevatorCommands, true);
            }

            while (newDestinations.Count > 0)
            {
                AddGoToFloorCommands(skyscraperDto, newDestinations, elevatorCommands, false);
            }

            foreach (var elevator in skyscraper.Elevators)
            {
                if (elevator.StopElevator)
                {
                    elevatorCommands.StopElevators.Add(new StopElevator(elevator.Index));
                    elevator.StopElevator = false; // This is not synced so must be reset here
                }
                elevatorCommands.SetUpIndicators.Add(new SetIndicatorCommand(elevator.Index, elevator.GoingUpIndicator));
                elevatorCommands.SetDownIndicators.Add(new SetIndicatorCommand(elevator.Index, elevator.GoingDownIndicator));

                if (elevator.IsDestinationQueueModified)
                {
                    elevatorCommands.DestinationQueueCommands.Add(new DestinationQueueCommand
                    {
                        ElevatorIndex    = elevator.Index,
                        DestinationQueue = elevator.DestinationQueue
                    });
                }
            }

            return(elevatorCommands);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Triggered when a passenger has pressed a button inside the elevator.
        /// This tells us which floor the passenger wants to go to.
        /// Maybe tell the elevator to go to that floor?
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult FloorButtonPressed(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                var eventRaisedElevatorIndex = skyscraperDto.EventRaisedElevatorIndex;
                var floorNumberPressed       = skyscraperDto.Elevators[eventRaisedElevatorIndex].FloorNumberPressed;
                skyscraper.Elevators[eventRaisedElevatorIndex].OnFloorButtonPressed(floorNumberPressed);
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }
            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }
Exemplo n.º 5
0
        /// <summary>
        /// Triggered when the elevator has completed all its tasks and is not doing anything.
        /// </summary>
        /// <param name="skyscraperDto"></param>
        /// <returns></returns>
        public ContentResult Idle(SkyscraperDto skyscraperDto)
        {
            var skyscraper = SyncSkyscraper(skyscraperDto);

            // This invokes the delegate from IPlayer
            ElevatorCommands elevatorCommands;

            try
            {
                skyscraper.Elevators[skyscraperDto.EventRaisedElevatorIndex].OnIdle();
                elevatorCommands = CreateElevatorCommands(skyscraperDto, skyscraper);
            }
            catch (System.Exception e)
            {
                elevatorCommands = new ElevatorCommands {
                    Message = e.Message
                };
            }


            var json = JsonConvert.SerializeObject(elevatorCommands);

            return(Content(json, "application/json"));
        }
Exemplo n.º 6
0
 private static void AddGoToFloorCommands(SkyscraperDto skyscraperDto, Queue <int> queue, ElevatorCommands elevatorCommands, bool jumpQueue)
 {
     if (queue.Count > 0)
     {
         var destination      = queue.Dequeue();
         var goToFloorCommand = new GoToFloorCommand(skyscraperDto.EventRaisedElevatorIndex, destination, jumpQueue);
         elevatorCommands.GoToFloors.Enqueue(goToFloorCommand);
     }
 }