1
0
mirror of https://gitlab.com/klmp200/LO41.git synced 2024-11-22 08:43:22 +00:00

Merge branch 'bro' into 'master'

Bro

See merge request klmp200/LO41!4
This commit is contained in:
Aethor 2018-06-21 23:37:18 +00:00
commit bd6920d5e9
3 changed files with 30 additions and 17 deletions

View File

@ -31,7 +31,7 @@ int get_next_call_Building(THIS(Building), int elevator_floor){
int next_target = -1; int next_target = -1;
for(i=0; i<FLOORS; i++){ for(i=0; i<FLOORS; i++){
if(waiting_floors[i] > 0){ if(waiting_floors[i] > 0){
if(abs(elevator_floor - i) < best_diff){ if(abs(elevator_floor - i) < best_diff && elevator_floor != i/*beware*/){
best_diff = abs(elevator_floor - i); best_diff = abs(elevator_floor - i);
next_target = i; next_target = i;
} }

View File

@ -88,7 +88,7 @@ int get_next_passenger_stop_Elevator(THIS(Elevator)){
temp_element = this->passengers->get_element(this->passengers, i); temp_element = this->passengers->get_element(this->passengers, i);
temp_passenger = (Passenger*) temp_element->get_data(temp_element); temp_passenger = (Passenger*) temp_element->get_data(temp_element);
temp_floor = temp_passenger->get_destination(temp_passenger); temp_floor = temp_passenger->get_destination(temp_passenger);
if(abs(this->floor - temp_floor) < min_diff /*&& temp_floor != this->floor*/){ if(abs(this->floor - temp_floor) < min_diff && temp_floor != this->floor/*beware*/){
min_diff = abs(this->floor - temp_floor); min_diff = abs(this->floor - temp_floor);
next_floor = temp_floor; next_floor = temp_floor;
} }
@ -109,8 +109,8 @@ int can_get_inside_Elevator(THIS(Elevator), int floor){
permission = (this->passengers->get_size(this->passengers) < MAX_ELEVATOR_CAPACITY && permission = (this->passengers->get_size(this->passengers) < MAX_ELEVATOR_CAPACITY &&
/*this->state == WAITING &&*/ this->floor == floor); /*this->state == WAITING &&*/ this->floor == floor);
if(this->floor != floor) //if(this->floor != floor)
printf("DEBUG : Cause de la préemption : l'ascenseur %s n'est pas là !\n", this->name); //printf("DEBUG : Cause de la préemption : l'ascenseur %s n'est pas là !\n", this->name);
pthread_mutex_unlock(&this->mutex_floor); pthread_mutex_unlock(&this->mutex_floor);
pthread_mutex_unlock(&this->mutex_state); pthread_mutex_unlock(&this->mutex_state);
pthread_mutex_unlock(&this->mutex_passengers); pthread_mutex_unlock(&this->mutex_passengers);
@ -130,25 +130,38 @@ void *runnable_Elevator(void * void_this){
int next_call; int next_call;
int next_passenger_stop; int next_passenger_stop;
int i;
AGENT_OPTIONS AGENT_OPTIONS
printf("Initialisation de l'ascenseur %s\n", this->name); printf("Initialisation de l'ascenseur %s\n", this->name);
for (;;){ for (;;){
building->signal_elevator_at_floor(data->main_building, this->get_floor(this)); usleep(250000);
usleep(500000);
if(this->target_floor == this->get_floor(this)){ if(this->target_floor == this->get_floor(this)){
pthread_mutex_lock(&this->mutex_passengers);//on débarque les passagers
Element* temp_element = this->passengers->head;
while(temp_element != NULL){
Passenger* temp_passenger = ((Passenger*) temp_element->data);
if(temp_passenger->get_destination(temp_passenger) == this->get_floor(this)){
building->signal_elevator_at_floor(building, this->get_floor(this));
}
temp_element = temp_element->next;
}
pthread_mutex_unlock(&this->mutex_passengers);
for(i=0;i<building->waiting_floors[this->get_floor(this)];i++){ //on embarque les passagers
building->signal_elevator_at_floor(building, this->get_floor(this));
}
next_passenger_stop = this->get_next_passenger_stop(this); next_passenger_stop = this->get_next_passenger_stop(this);
next_call = building->get_next_call(building, this->floor); next_call = building->get_next_call(building, this->get_floor(this));
if (next_passenger_stop == this->get_floor(this) || next_call == this->get_floor(this)){
printf("Ascenseur %s attends pour déposer ou prendre un passager supplémentaire\n", this->name); //while pour attendre ?
}else{
if(next_passenger_stop != -1){ if(next_passenger_stop != -1){
this->target_floor = next_passenger_stop; this->target_floor = next_passenger_stop;
}else if(next_call != -1){ }else if(next_call != -1){
this->target_floor = next_call; this->target_floor = next_call;
} }
}
} }
if(this->get_floor(this) != this->target_floor){ if(this->get_floor(this) != this->target_floor){

View File

@ -11,7 +11,7 @@
#include "../Passenger/Passenger.h" #include "../Passenger/Passenger.h"
//#define MAX_ELEVATOR_CAPACITY 10 //#define MAX_ELEVATOR_CAPACITY 10
#define MAX_ELEVATOR_CAPACITY 10 #define MAX_ELEVATOR_CAPACITY 12
typedef enum {RUNNING, WAITING, SLEEPING, BROKEN} ELEVATOR_STATE; typedef enum {RUNNING, WAITING, SLEEPING, BROKEN} ELEVATOR_STATE;