X-Git-Url: https://irasnyder.com/gitweb/?a=blobdiff_plain;f=elevator.cpp;h=cbf9775e860babd1d5530d5eac8d4bf9032b427e;hb=637a3859106f650f9acfff7209efef3a73a3980a;hp=e50ee2e4c0805085c5aa2e462baa5923c6b24044;hpb=7d98e6f33037bde7cd6d0cac4c1bfff5ba214e75;p=cs356-p1-elevator.git diff --git a/elevator.cpp b/elevator.cpp index e50ee2e..cbf9775 100644 --- a/elevator.cpp +++ b/elevator.cpp @@ -1,21 +1,24 @@ #include "elevator.hpp" +#include "main.hpp" -Elevator::Elevator () +Elevator::Elevator (int elevator_number) : state_(STATE_IDLE) , wait_(0) , direction_(IDLE) , position_() , stops_() + , number_(elevator_number) { // Intentionally Left Empty } -Elevator::Elevator (int starting_floor) +Elevator::Elevator (int starting_floor, int elevator_number) : state_(STATE_IDLE) , wait_(0) , direction_(IDLE) , position_(starting_floor) , stops_() + , number_(elevator_number) { // Intentionally Left Empty } @@ -59,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; } @@ -92,12 +103,30 @@ float Elevator::distance_from (Position &pos) const return pos - position_; } +float Elevator::distance_from (Stop &s) const +{ + Direction d = s.getDirection(); + Position p = s.getPosition (); + + /* If direction doesn't matter, then only position does */ + if (d == ALL || direction_ == IDLE) + return distance_from (p); + + /* If we're not in the same direction, then we're "really far" away */ + if (d != direction_) + return INT_MAX; + + /* We must be in the correct direction, so pure distance is fine */ + return distance_from (p); +} + void Elevator::transition_move_up () { direction_ = 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; } @@ -107,12 +136,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 } @@ -139,19 +171,42 @@ void Elevator::transition_open_door () * * Otherwise, just clear this stop */ if (direction_ == UP && stops_above == 0) + { stops_.remove (Stop(position_, ALL)); + gui_unpress_request_button (number_, (int)position_); + 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_); + 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_); + 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_); + gui_unpress_request_button (number_, (int)position_); + } - // TODO: Call into GUI to open the door + // 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; } @@ -464,6 +519,9 @@ void Elevator::move () bool Elevator::is_idle () const { + if (stops_.size() != 0) + return false; + return direction_ == IDLE; }