diff --git a/Elevator/Elevator.c b/Elevator/Elevator.c index 6a74df3..cdb4715 100644 --- a/Elevator/Elevator.c +++ b/Elevator/Elevator.c @@ -3,6 +3,7 @@ // #include +#include #include "Elevator.h" #include "../SharedData/SharedData.h" @@ -16,8 +17,8 @@ void _free__Elevator(THIS(Elevator)){ if (this->name != NULL) free(this->name); - pthread_mutex_unlock(&this->mutex_passenger); - pthread_mutex_destroy(&this->mutex_passenger); + pthread_mutex_unlock(&this->mutex_passengers); + pthread_mutex_destroy(&this->mutex_passengers); pthread_mutex_unlock(&this->mutex_state); pthread_mutex_destroy(&this->mutex_state); @@ -29,27 +30,60 @@ void _free__Elevator(THIS(Elevator)){ } void add_passenger_Elevator(THIS(Elevator), Passenger passenger){ - pthread_mutex_lock(&this->mutex_passenger); + pthread_mutex_lock(&this->mutex_passengers); this->passengers->insert_tail(this->passengers, ((void *)&passenger), sizeof(Passenger)); printf("L'ascenseur %s recoit le visiteur %s\nIl y a maintenant %d passagers dans l'ascenseur %s\n", this->name, passenger.type == VISITOR ? passenger.visitor->get_name(passenger.visitor) : passenger.resident->get_name(passenger.resident), this->passengers->get_size(this->passengers), this->name); if (this->passengers->get_size(this->passengers) >= MAX_ELEVATOR_CAPACITY) this->set_state(this, SLEEPING); - pthread_mutex_unlock(&this->mutex_passenger); + pthread_mutex_unlock(&this->mutex_passengers); } int get_number_of_passengers_Elevator(THIS(Elevator)){ int num; - pthread_mutex_lock(&this->mutex_passenger); + pthread_mutex_lock(&this->mutex_passengers); num = this->passengers->get_size(this->passengers); - pthread_mutex_unlock(&this->mutex_passenger); + pthread_mutex_unlock(&this->mutex_passengers); return num; } +/** + * Search the closest floor where the elevator should stop. In practice ( for now ), it means that this function returns the closest floor amongs it's passengers destinations. + * @THIS(Elevator) a pointer the current Elevator + * @return the found floor as an int. If no passengers are in the elevator, returns 0 ( as the elevator should come back to floor 0 ). + * @todo should consider passenger calling the elevator + */ +int get_next_floor_Elevator(THIS(Elevator)){ + int i, next_floor, temp_floor; + float min_diff; + Element* temp_element; + Passenger* temp_passenger; + pthread_mutex_lock(&this->mutex_passengers); + pthread_mutex_lock(&this->mutex_floor); + + min_diff = INFINITY; + next_floor = 0; + + for(i=0;ipassengers->get_size(this->passengers);i++){ + temp_element = this->passengers->get_element(this->passengers, i); + temp_passenger = (Passenger*) temp_element->get_data(temp_element); + temp_floor = temp_passenger->type == RESIDENT ? temp_passenger->resident->destination : temp_passenger->visitor->destination; + if(abs(this->floor - temp_floor) < min_diff){ + min_diff = abs(this->floor - temp_floor); + next_floor = temp_floor; + } + } + + pthread_mutex_unlock(&this->mutex_passengers); + pthread_mutex_unlock(&this->mutex_floor); + + return next_floor; +} + int can_get_inside_Elevator(THIS(Elevator), int floor){ int permission; - pthread_mutex_lock(&this->mutex_passenger); + pthread_mutex_lock(&this->mutex_passengers); pthread_mutex_lock(&this->mutex_state); pthread_mutex_lock(&this->mutex_floor); @@ -58,7 +92,7 @@ int can_get_inside_Elevator(THIS(Elevator), int floor){ pthread_mutex_unlock(&this->mutex_floor); pthread_mutex_unlock(&this->mutex_state); - pthread_mutex_unlock(&this->mutex_passenger); + pthread_mutex_unlock(&this->mutex_passengers); return permission; } @@ -84,13 +118,14 @@ Elevator *_init_Elevator(char * name){ Elevator * new_elevator = malloc_or_die(sizeof(Elevator)); new_elevator->name = strdup(name); new_elevator->passengers = NEW(List); - pthread_mutex_init(&new_elevator->mutex_passenger, NULL); + pthread_mutex_init(&new_elevator->mutex_passengers, NULL); pthread_mutex_init(&new_elevator->mutex_state, NULL); pthread_mutex_init(&new_elevator->mutex_floor, NULL); LINK_ALL(Elevator, new_elevator, runnable, get_number_of_passengers, + get_next_floor, can_get_inside, add_passenger, get_state, diff --git a/Elevator/Elevator.h b/Elevator/Elevator.h index 3a9c6dd..186e552 100644 --- a/Elevator/Elevator.h +++ b/Elevator/Elevator.h @@ -20,7 +20,7 @@ typedef struct o_Elevator { PRIVATE List * passengers; PRIVATE char * name; PRIVATE int floor; - PRIVATE pthread_mutex_t mutex_passenger; + PRIVATE pthread_mutex_t mutex_passengers; PRIVATE pthread_mutex_t mutex_state; PRIVATE pthread_mutex_t mutex_floor; @@ -28,6 +28,7 @@ typedef struct o_Elevator { SYNCHRONIZE PRIVATE void (*set_state)(_THIS(Elevator), ELEVATOR_STATE var); SYNCHRONIZE PRIVATE void (*set_floor)(_THIS(Elevator), int var); + SYNCHRONIZE PRIVATE int (*get_next_floor)(_THIS(Elevator)); SYNCHRONIZE PUBLIC void (*repair)(_THIS(Elevator)); SYNCHRONIZE PUBLIC int (*get_number_of_passengers)(_THIS(Elevator));