mirror of
https://gitlab.com/klmp200/LO41.git
synced 2024-11-24 10:04:21 +00:00
Added experimental "get_next_floor_Elevator" function
This commit is contained in:
parent
ef4e29f7c2
commit
c4048afe3b
@ -3,6 +3,7 @@
|
||||
//
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#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;i<this->passengers->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,
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user