Add the hacks to fix disabling of buttons
[cs356-p1-elevator.git] / elevator.cpp
index 92d66d2..038bc29 100644 (file)
@@ -78,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)
        {
@@ -85,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++)
@@ -166,28 +170,36 @@ 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));
-               gui_unpress_request_button (number_, (int)position_);
+               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));
-               gui_unpress_request_button (number_, (int)position_);
+               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_, ALL));
-               gui_unpress_request_button (number_, (int)position_);
+               stops_.remove (Stop(position_, UP));
+               stops_.remove (Stop(position_, DOWN));
                gui_unpress_call_button ((int)position_, UP);
                gui_unpress_call_button ((int)position_, DOWN);
        }
@@ -195,7 +207,6 @@ void Elevator::transition_open_door ()
        {
                stops_.remove (Stop(position_, direction_));
                gui_unpress_call_button ((int)position_, direction_);
-               gui_unpress_request_button (number_, (int)position_);
        }
 
        // TODO: Call into the GUI to open the door
@@ -530,4 +541,16 @@ 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: */