BUGFIX: Elevators did not handle Requests in the correct order
[cs356-p1-elevator.git] / elevator.cpp
index 4a5eb37..038bc29 100644 (file)
@@ -1,4 +1,5 @@
 #include "elevator.hpp"
+#include "main.hpp"
 
 Elevator::Elevator (int elevator_number)
        : state_(STATE_IDLE)
@@ -61,6 +62,14 @@ bool Elevator::currently_at_stop () const
                if (*it == current)
                        return true;
 
+       /* Check if we are IDLE. If so, only the position needs to match */
+       if (direction_ == IDLE)
+       {
+               for (it = stops_.begin (); it != stops_.end (); it++)
+                       if (it->getPosition() == position_)
+                               return true;
+       }
+
        /* No match */
        return false;
 }
@@ -69,6 +78,9 @@ void Elevator::stop_at (Stop &stop)
 {
        StopList::iterator it;
 
+       if (stop.getDirection() == IDLE)
+               throw bad_direction();
+#if 0
        /* If this is an "ALL" Stop, it supercedes all others */
        if (stop.getDirection() == ALL)
        {
@@ -76,6 +88,7 @@ void Elevator::stop_at (Stop &stop)
                stops_.push_back (stop);
                return;
        }
+#endif
 
        /* Check if this stop already exists. If so, just leave */
        for (it = stops_.begin(); it != stops_.end(); it++)
@@ -117,6 +130,7 @@ void Elevator::transition_move_up ()
        position_ += ELEVATOR_STEP;
 
        // TODO: Call into the GUI to update the position
+       gui_update_position_label (number_, (float)position_, direction_);
        std::cout << "Updating the GUI with our position: " << position_ << std::endl;
 }
 
@@ -126,12 +140,15 @@ void Elevator::transition_move_down ()
        position_ -= ELEVATOR_STEP;
 
        // TODO: Call into the GUI to update the position
+       gui_update_position_label (number_, (float)position_, direction_);
        std::cout << "Updating the GUI with our position: " << position_ << std::endl;
 }
 
 void Elevator::transition_move_idle ()
 {
        direction_ = IDLE;
+       // TODO: Call into the GUI to update the position
+       gui_update_position_label (number_, (float)position_, direction_);
        // do not change position while IDLE
 }
 
@@ -153,24 +170,54 @@ void Elevator::transition_open_door ()
                        ++stops_below;
        }
 
+       std::cout << "Elevator: " << number_ << " stopping in direction=" << direction_ << std::endl;
+
+       /* Always unpress the in-elevator button for this stop, as well
+        * as clear the stop. This is like letting people off at a floor. */
+       gui_unpress_request_button (number_, (int)position_);
+       stops_.remove (Stop(position_, ALL));
+
+
        /* If we are going to switch direction, clear all stops here,
         * regardless of direction.
         *
         * Otherwise, just clear this stop */
        if      (direction_ == UP && stops_above == 0)
-               stops_.remove (Stop(position_, ALL));
+       {
+               stops_.remove (Stop(position_, UP));
+               stops_.remove (Stop(position_, DOWN));
+               gui_unpress_call_button ((int)position_, UP);
+               gui_unpress_call_button ((int)position_, DOWN);
+       }
        else if (direction_ == DOWN && stops_below == 0)
-               stops_.remove (Stop(position_, ALL));
+       {
+               stops_.remove (Stop(position_, UP));
+               stops_.remove (Stop(position_, DOWN));
+               gui_unpress_call_button ((int)position_, UP);
+               gui_unpress_call_button ((int)position_, DOWN);
+       }
+       else if (direction_ == IDLE)
+       {
+               stops_.remove (Stop(position_, UP));
+               stops_.remove (Stop(position_, DOWN));
+               gui_unpress_call_button ((int)position_, UP);
+               gui_unpress_call_button ((int)position_, DOWN);
+       }
        else
+       {
                stops_.remove (Stop(position_, direction_));
+               gui_unpress_call_button ((int)position_, direction_);
+       }
 
        // TODO: Call into the GUI to open the door
+       gui_open_door (number_, (int)position_);
        std::cout << "Opening Door" << std::endl;
 }
 
 void Elevator::transition_close_door ()
 {
        // TODO: Call into the GUI to close the door
+       gui_close_door (number_, (int)position_);
        std::cout << "Closing Door" << std::endl;
 }
 
@@ -483,7 +530,27 @@ void Elevator::move ()
 
 bool Elevator::is_idle () const
 {
+       if (stops_.size() != 0)
+               return false;
+
        return direction_ == IDLE;
 }
 
+int Elevator::getLoad () const
+{
+       return stops_.size ();
+}
+
+bool Elevator::willStopAt (int floor, Direction direction) const
+{
+       Stop s (floor, direction);
+       StopList::const_iterator it;
+
+       for (it=stops_.begin(); it != stops_.end(); it++)
+               if (*it == s)
+                       return true;
+
+       return false;
+}
+
 /* vim: set ts=4 sts=4 sw=4 noexpandtab textwidth=112: */