1 #include "elevatorcontroller.hpp"
3 ElevatorController::ElevatorController (int floors, int elevators)
4 : number_of_floors_(floors)
5 , number_of_elevators_(elevators)
9 std::srand ( std::time (NULL) );
11 /* Create and add all of the elevators */
12 for (int i=0; i<number_of_elevators_; i++)
13 elevators_.push_back (Elevator(i));
16 static int choose_random_number_in_range (int low, int high)
18 return std::rand () % high + low;
21 void ElevatorController::call_elevator_to (int floor, Direction direction)
23 std::cout << "Called elevator to: floor=" << floor << " direction=" << direction << std::endl;
25 /* Check the parameters */
26 if (floor < 0 || floor > number_of_floors_)
29 ElevatorList::iterator it;
30 std::vector<Elevator*> idle_elevators;
31 Stop requested_stop(floor, direction);
33 /* Find all idle Elevators */
34 for (it = elevators_.begin(); it != elevators_.end(); it++)
37 /* If we have an IDLE elevator that is currently sitting at the
38 * requested floor, we should obviously send that. */
39 if (it->distance_from (requested_stop) == 0)
41 it->stop_at (requested_stop);
45 /* Was not at the right floor, but still is a good cantidate */
46 idle_elevators.push_back (&(*it));
49 if (idle_elevators.size() > 0)
51 std::vector<Elevator*>::iterator idle_it;
53 float distance = INT_MAX;
56 /* Try to send the closest IDLE elevator */
57 for (idle_it=idle_elevators.begin(); idle_it!=idle_elevators.end(); idle_it++)
59 if ((*idle_it)->distance_from (requested_stop) < distance)
62 distance = (*idle_it)->distance_from (requested_stop);
69 e->stop_at (requested_stop);
73 /* No closest IDLE elevator was found, so choose one randomly */
74 int num = choose_random_number_in_range (0, idle_elevators.size());
76 idle_elevators.at (num) -> stop_at (requested_stop);
80 /* Find the Elevator which is closest to the requested Stop */
82 float distance = INT_MAX;
85 for (it = elevators_.begin(); it != elevators_.end(); it++)
87 if (it->distance_from (requested_stop) < distance)
90 distance = it->distance_from (requested_stop);
95 /* If we found one, send the closest Elevator */
98 e->stop_at (requested_stop);
102 /* Now we're having really bad luck. No elevators are idle, and none are closer than
103 * any other. A random choice will have to do. */
104 int num = choose_random_number_in_range (0, elevators_.size());
105 Elevator &e_ref = elevators_.at (num);
107 e_ref.stop_at (requested_stop);
110 void ElevatorController::elevator_request (int elevator_number, int floor)
112 std::cout << "Request that elevator=" << elevator_number << " stop at floor=" << floor << std::endl;
114 /* Check the parameters */
115 if (elevator_number < 0 || elevator_number > number_of_elevators_)
116 throw bad_elevator ();
118 if (floor < 0 || floor > number_of_floors_)
121 /* Construct the Stop to use */
124 /* Get the Elevator */
125 Elevator &e = elevators_.at (elevator_number);
127 /* Tell it where to stop */
131 void ElevatorController::move_elevators ()
133 ElevatorList::iterator it;
135 for (it = elevators_.begin(); it != elevators_.end(); it++)
139 /* vim: set ts=4 sts=4 sw=4 noet tw=112: */