X-Git-Url: https://irasnyder.com/gitweb/?a=blobdiff_plain;f=elevator.cpp;h=038bc297cba2dbbe30cacdbc1674eef4e9021b49;hb=f95be7131a6221491745f0a001f45589aa6acca3;hp=92d66d218c3f53dc938c50e0945eb8e7f4d39b15;hpb=0317803aa62dcbeecd3e18a456894d11dcfd16e1;p=cs356-p1-elevator.git diff --git a/elevator.cpp b/elevator.cpp index 92d66d2..038bc29 100644 --- a/elevator.cpp +++ b/elevator.cpp @@ -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: */