mirror of
https://gitlab.com/klmp200/LO41.git
synced 2025-07-12 04:39:23 +00:00
Added useful functions for elevator IA
This commit is contained in:
@ -51,10 +51,10 @@ int get_number_of_passengers_Elevator(THIS(Elevator)){
|
||||
/**
|
||||
* 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 ).
|
||||
* @return the found floor as an int. If no passengers are in the elevator, returns -1.
|
||||
* @todo should consider passenger calling the elevator
|
||||
*/
|
||||
int get_next_floor_Elevator(THIS(Elevator)){
|
||||
int get_next_passenger_stop_Elevator(THIS(Elevator)){
|
||||
int i, next_floor, temp_floor;
|
||||
float min_diff;
|
||||
Element* temp_element;
|
||||
@ -63,7 +63,7 @@ int get_next_floor_Elevator(THIS(Elevator)){
|
||||
pthread_mutex_lock(&this->mutex_floor);
|
||||
|
||||
min_diff = INFINITY;
|
||||
next_floor = 0;
|
||||
next_floor = -1;
|
||||
|
||||
for(i=0;i<this->passengers->get_size(this->passengers);i++){
|
||||
temp_element = this->passengers->get_element(this->passengers, i);
|
||||
@ -105,14 +105,22 @@ void *runnable_Elevator(void * void_this){
|
||||
/* This is where the thread logic will be implemented */
|
||||
Elevator * this = (Elevator*) void_this;
|
||||
SharedData * data = GET_INSTANCE(SharedData);
|
||||
Building * building = data->main_building;
|
||||
|
||||
AGENT_OPTIONS
|
||||
|
||||
printf("Je suis l'ascenseur %s\n", this->name);
|
||||
for (;;){
|
||||
data->main_building->get_waiting_floors(data->main_building);
|
||||
data->main_building->signal_elevator_at_floor(data->main_building, this->get_floor(this));
|
||||
this->set_floor(this, this->get_next_floor(this));
|
||||
building->signal_elevator_at_floor(data->main_building, this->get_floor(this));
|
||||
if(this->target_floor == this->get_floor(this)){
|
||||
if(this->get_next_passenger_stop(this) != -1){
|
||||
this->target_floor = this->get_next_passenger_stop(this);
|
||||
}else if(building->get_next_call(building, this->floor) != -1){
|
||||
this->target_floor = building->get_next_call(building, this->floor);
|
||||
}
|
||||
|
||||
}
|
||||
this->set_floor(this, this->target_floor);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -122,21 +130,22 @@ Elevator *_init_Elevator(char * name){
|
||||
Elevator * new_elevator = malloc_or_die(sizeof(Elevator));
|
||||
new_elevator->name = strdup(name);
|
||||
new_elevator->passengers = NEW(List);
|
||||
new_elevator->target_floor = 0;
|
||||
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,
|
||||
set_state,
|
||||
get_floor,
|
||||
set_floor,
|
||||
repair
|
||||
runnable,
|
||||
get_number_of_passengers,
|
||||
get_next_passenger_stop,
|
||||
can_get_inside,
|
||||
add_passenger,
|
||||
get_state,
|
||||
set_state,
|
||||
get_floor,
|
||||
set_floor,
|
||||
repair
|
||||
);
|
||||
|
||||
new_elevator->set_floor(new_elevator, 0);
|
||||
|
@ -20,6 +20,7 @@ typedef struct o_Elevator {
|
||||
PRIVATE List * passengers;
|
||||
PRIVATE char * name;
|
||||
PRIVATE int floor;
|
||||
PRIVATE int target_floor;
|
||||
PRIVATE pthread_mutex_t mutex_passengers;
|
||||
PRIVATE pthread_mutex_t mutex_state;
|
||||
PRIVATE pthread_mutex_t mutex_floor;
|
||||
@ -28,7 +29,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 PRIVATE int (*get_next_passenger_stop)(_THIS(Elevator));
|
||||
|
||||
SYNCHRONIZE PUBLIC void (*repair)(_THIS(Elevator));
|
||||
SYNCHRONIZE PUBLIC int (*get_number_of_passengers)(_THIS(Elevator));
|
||||
|
Reference in New Issue
Block a user